kubernetes怎么更新过期证书?
发表于:2025-02-12 作者:千家信息网编辑
千家信息网最后更新 2025年02月12日,环境介绍:#centos7.7#kubernetes 1.16.0#Step 1:查看证书过期时间(一年有效期)openssl x509 -in /etc/kubernetes/pki/apiserv
千家信息网最后更新 2025年02月12日kubernetes怎么更新过期证书?
环境介绍:
#centos7.7#kubernetes 1.16.0
#Step 1:查看证书过期时间(一年有效期)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not ' Not Before: May 24 03:31:50 2019 GMT Not After : May 23 03:31:50 2020 GMT
#Step 2:下载1.16.0源码
# 下载kubernetes v1.16.0源码,修改关键部分代码的证书生产有效期# github下载源码:https://github.com/kubernetes/kubernetes# 到release下载想到的版本源码,这里我下载v1.16.0
# step 3:解压并且修改源代码
查看网上的资料主要有两个地方需要修改
vim ./staging/src/k8s.io/client-go/util/cert/cert.go# 这个方法里面NotAfter: now.Add(duration365d * 10).UTC()# 默认有效期就是10年,改成50年func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) { now := time.Now() tmpl := x509.Certificate{ SerialNumber: new(big.Int).SetInt64(0), Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: cfg.Organization, }, NotBefore: now.UTC(), // NotAfter: now.Add(duration365d * 10).UTC(), NotAfter: now.Add(duration365d * 50).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, IsCA: true, } certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes)}docker run --rm -it -v /root/kubernetes-1.16.0:/go/src/k8s.io/kubernetes \mirrorgooglecontainers/kube-cross:v1.12.10-1 bashvim cmd/kubeadm/app/util/pkiutil/pki_helpers.go# 这个方法里面看到NotAfter: time.Now().Add(kubeadmconstants.CertificateValidity).UTC()# 参数里面是一个常量kubeadmconstants.CertificateValidity# 所以这里可以不修改,我去看看源码能不能找到这个常量的赋值位置#func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) { serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64))# if err != nil {# return nil, err# } # if len(cfg.CommonName) == 0 {# return nil, errors.New("must specify a CommonName")# } # if len(cfg.Usages) == 0 {# return nil, errors.New("must specify at least one ExtKeyUsage")# } # # certTmpl := x509.Certificate{# Subject: pkix.Name{# CommonName: cfg.CommonName,# Organization: cfg.Organization,# }, # DNSNames: cfg.AltNames.DNSNames,# IPAddresses: cfg.AltNames.IPs,# SerialNumber: serial,# NotBefore: caCert.NotBefore,# NotAfter: time.Now().Add(kubeadmconstants.CertificateValidity).UTC(),# KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,# ExtKeyUsage: cfg.Usages,# } # certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey)# if err != nil {# return nil, err# } # return x509.ParseCertificate(certDERBytes)#} 结果在这里找到kubeadmconstants.CertificateValidity的定义vim ./cmd/kubeadm/app/constants/constants.go// 就是这个常量定义CertificateValidity,我改成*50年const ( // KubernetesDir is the directory Kubernetes owns for storing various configuration files KubernetesDir = "/etc/kubernetes" // ManifestsSubDirName defines directory name to store manifests ManifestsSubDirName = "manifests" // TempDirForKubeadm defines temporary directory for kubeadm // should be joined with KubernetesDir. TempDirForKubeadm = "tmp" // CertificateValidity defines the validity for all the signed certificates generated by kubeadm // CertificateValidity = time.Hour * 24 * 365 CertificateValidity = time.Hour * 24 * 365 * 50 // CACertAndKeyBaseName defines certificate authority base name CACertAndKeyBaseName = "ca" // CACertName defines certificate name CACertName = "ca.crt" // CAKeyName defines certificate name CAKeyName = "ca.key"源代码改好了,接下来就是编译kubeadm了
#Step 4:编译kubeadm
刚开始尝试服务器安装yum -y install go环境,执行make方法编译,发现特别慢,而且编译显示的内容也不对(get "gotest.tools/gotestsum":found meta tag get.metaImport{...}等内容),(也可能是golang版本是13不支持的原因但是没有测试)只能尝试下载容器,在容器里面编译,通过网上找资料,发现官网原来有提供一个k8s.gcr.io/kube-cross的容器用于对代码做编译。
由于我不能***,如果不能***的用户,到https://hub.docker.com搜索 kube-cross关键字,我找了一个版本比较新的mirrorgooglecontainers/kube-cross:v1.12.10-1镜像,v1.12.10-1应该就是镜像里面go环境的版本。
注:在使用mirrorgooglecontainers/kube-cross:v1.12.10-1编译之前,我试过下载一个go版本是v.1.11.x的镜像,编译会报错,大概意思是我下载的kubernetes源码必须用v1.12.x才能编译。
拉取镜像docker pull mirrorgooglecontainers/kube-cross:v1.12.10-1# 运行容器,并进入到容器内部docker run --rm -it -v 你修改源码后的kubernetes根目录:/go/src/k8s.io/kubernetes \mirrorgooglecontainers/kube-cross:v1.12.10-1 bash#例如我的源代码放到了/root/kubernetes-1.16.0下docker run --rm -it -v /root/kubernetes-1.16.0:/go/src/k8s.io/kubernetes \mirrorgooglecontainers/kube-cross:v1.12.10-1 bash# cd到容器内部的挂载路径,可以ls -al查看一下里面的文件是不是主机挂载目录的源码文件cd /go/src/k8s.io/kubernetes# 编译kubeadm, 这里主要编译kubeadm 即可make all WHAT=cmd/kubeadm GOFLAGS=-v#部分编译过程节选,用make编译不出现以下过程的可能是出问题了#k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers#k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/vsphere#k8s.io/kubernetes/vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/mock#k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/gce#k8s.io/kubernetes/pkg/volume/vsphere_volume#k8s.io/kubernetes/pkg/cloudprovider/providers#k8s.io/kubernetes/pkg/volume/gcepd#。。。。。。。。# 编译kubelet# make all WHAT=cmd/kubelet GOFLAGS=-v# 编译kubectl# make all WHAT=cmd/kubectl GOFLAGS=-v#编译完产物在 _output/bin/kubeadm 目录下,#其中bin是使用了软连接#真实路径是_output/local/bin/linux/amd64/kubeadm编译成功后,可以退出容器,能看到挂载路径中已经有编译好的kubeadm路径./_output/local/bin/linux/amd64/kubeadm#例:/root/kubernetes-1.16.0/_output/local/bin/linux/amd64
#Step 5:替换掉正在使用的kubeadm
cp /usr/bin/kubeadm /usr/bin/kubeadm.bakcp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
#Step 6:执行命令更新证书
可以先备份证书,证书在/etc/kubernetes/pki,我这里就不备份了1、检查证书到期时间kubeadm alpha certs check-expirationCERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGEDadmin.conf Nov 20, 2069 04:30 UTC 49y no apiserver Nov 20, 2069 04:30 UTC 49y no apiserver-etcd-client Nov 20, 2069 04:30 UTC 49y no apiserver-kubelet-client Nov 20, 2069 04:30 UTC 49y no controller-manager.conf Nov 20, 2069 04:30 UTC 49y no etcd-healthcheck-client Nov 20, 2069 04:30 UTC 49y no etcd-peer Nov 20, 2069 04:30 UTC 49y no etcd-server Nov 20, 2069 04:30 UTC 49y no front-proxy-client Nov 20, 2069 04:30 UTC 49y no scheduler.conf Nov 20, 2069 04:30 UTC 49y no #使用renew命令即可更新证书,续订全部证书(适用于1.14版本及以上:需要外网环境)#***如果是在断网的情况下必须把有效期改好,再部署设备,否则后期证书过期手动更新证书非常麻烦,切记,切记,切记kubeadm alpha certs renew all #如果你是旧版 kubeadm版本,那么可以用这个脚本来更新你的证书,生成证书默认有效期为10年(3650天),你可以更改脚本里面的CAER_DAYS变量来达到你想要的证书有效期,单位是"天"#下载地址:https://github.com/yuyicai/update-kube-cert/blob/master/README.md#更新kubeadm生成的证书有效期为10年
低版本证书手动更新
#下面为低版本更新仅供参考没有测试#更新证书(适用于1.13版本及以下)#在1.13版本及之前,需要使用kubeadm alpha phase certs来生成新的证书##移动老的证书#注意是: 必须移动,不然会使用现有的证书,不会重新生成!##cd /etc/kubernetes#mkdir -p pki.bak/etcd#mkdir conf.bak#mv pki/apiserver* ./pki.bak/#mv pki/front-proxy-client.* ./pki.bak/#mv pki/etcd/healthcheck-client.* ./pki.bak/etcd/#mv pki/etcd/peer.* ./pki.bak/etcd/#mv pki/etcd/server.* ./pki.bak/etcd/#mv ./admin.conf ./conf.bak/#mv ./kubelet.conf ./conf.bak/#mv ./controller-manager.conf ./conf.bak/#mv ./scheduler.conf ./conf.bak/#注意ca的不动!##生成新的证书#建议不要重新生成ca证书,因为更新了ca证书,集群节点就需要手工操作,才能让集群正常(会涉及重新join)##kubeadm alpha phase certs etcd-healthcheck-client --config /tmp/cluster.yaml##kubeadm alpha phase certs etcd-peer --config /tmp/cluster.yaml##kubeadm alpha phase certs etcd-server --config /tmp/cluster.yaml##kubeadm alpha phase certs front-proxy-client--config /tmp/cluster.yaml##kubeadm alpha phase certs apiserver-etcd-client --config /tmp/cluster.yaml##kubeadm alpha phase certs apiserver-kubelet-client --config /tmp/cluster.yaml##kubeadm alpha phase certs apiserver --config /tmp/cluster.yaml##kubeadm alpha phase certs sa --config /tmp/cluster.yaml#更新kubeconfig文件#生成新的配置文件##kubeadm alpha phase kubeconfig all --apiserver-advertise-address=${MASTER_API_SERVER_IP}#将新生成的admin配置文件覆盖掉原本的admin文件##mv $HOME/.kube/config $HOME/.kube/config.old#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config#chown $(id -u):$(id -g) $HOME/.kube/config#sudo chmod 777 $HOME/.kube/config#完成后重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器##如果有多台master,则将第一台生成的相关证书拷贝到其余master即可。##查看证书更新后的使用周期## openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '# Not Before: May 24 03:31:50 2019 GMT# Not After : Sep 9 02:36:46 2020 GMT##参考#https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/
证书更新完毕就不用担心k8s证书过期问题了。
证书
编译
更新
版本
容器
源码
生成
有效
有效期
文件
就是
环境
路径
镜像
常量
方法
源代码
代码
关键
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器的硬件如何管理工具
软件开发公司分哪些部门
热血江湖服务器不稳定
冕宁县网络安全监察部门地址
网络安全与执法专
大小单双彩票软件开发
网络技术部男生节横幅
软件开发对应的测试
byte 怎么存如数据库
徐汇区推广网络技术有哪些
第三方网络技术五星服务
软件开发报价由谁报
移动网络安全应用威胁
无线网络技术的发展与展望
忍者必须死3玩哪个服务器
校园网络安全设计网络拓扑图
食神软件开发
流放之路英文数据库
数据库系统结构 分布式
如何学好通信网络技术
山东飞信软件开发
查xrd谱图的数据库
万方期刊数据库
网络安全和运维级别区别
软件开发成果对照表
南宁软件开发平均工资
喋血复仇国服服务器
理正数据库耕植土
mono数据库异步处理
数据库技术是一门学科