资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

kubernetes怎么更新过期证书?-创新互联

环境介绍:

创新互联长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为亳州企业提供专业的网站设计制作、成都网站建设,亳州网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。#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 bash vim 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.bak cp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm

#Step 6:执行命令更新证书

可以先备份证书,证书在/etc/kubernetes/pki,我这里就不备份了 1、检查证书到期时间 kubeadm alpha certs check-expiration CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED admin.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证书过期问题了。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:kubernetes怎么更新过期证书?-创新互联
文章路径:http://www.cdkjz.cn/article/cecpsp.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220