kubernetes怎么更新过期证书?
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,环境介绍:#centos7.7#kubernetes 1.16.0#Step 1:查看证书过期时间(一年有效期)openssl x509 -in /etc/kubernetes/pki/apiserv
千家信息网最后更新 2025年12月03日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安全错误
数据库的锁怎样保障安全
网络技术有很多
网络安全研究有哪些方面
安康软件开发方案
xbox one香港服务器
人工管理阶段数据库的特点
dm数据库 用户创建失败
liux软件开发
绝地求生刺激战场服务器大小
数据库附加失败824
科技发展与互联网的关系
软件开发行业是否有等级评价
数据库系统工程师课程视频
javaee大数据库
软件开发有什么细节需要注意
离石区乡村振兴数据库
南京动作捕捉软件开发
联想服务器关机快捷键
SAGE数据库怎么引用
不属于mpp数据库
eclipese导入数据库
人事管理系统数据库设计
在北京做软件开发工资待遇
淘宝小站还需要数据库吗
数据库更新 redis
微信营销第三方软件开发
我的世界1.18的服务器
公司电脑怎么做代理服务器
数据库动态查询图片
网络安全网评文章
学生阿里云服务器配置