Kubeadm1.14 證書調整
kubeadm部署的kubernets證書一直都是個詬病,預設都只有一年有效期,kubeadm 1.14.x安裝後有部分證書還是一年有效期,但個別證書已修改為10年有效期,但對我們使用來說,一年有效期還是一個比較的坑,需要進行調整。
修改kubeadm 1.14.x原始碼,調整證書過期時間
kubeadm1.14.x 安裝過後crt證書如下所示
/etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/front-proxy-ca.crt#10年有效期 /etc/kubernetes/pki/ca.crt#10年有效期 /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/front-proxy-client.crt#10年有效期 /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/ca.crt#10年有效期 /etc/kubernetes/pki/etcd/peer.crt#10年有效期 /etc/kubernetes/pki/etcd/healthcheck-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt
如上所示,除了標註說明的證書為10年有效期,其餘都是1年有效期,我們檢視下原先調整證書有效期的原始碼,克隆kubernetes 原始碼,切換到1.14.1 tag 檢視:
程式碼目錄:staging/src/k8s.io/client-go/util/cert/cert.go
const duration365d = time.Hour * 24 * 365 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(), //這裡已經調整為10年有效期 NotAfter:now.Add(duration365d * 10).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) }
如上所示,通過NewSelfSignedCACert
這個方法簽發的證書都預設為10年有效期了,但這個隻影響部分證書,但這樣還沒滿足我們的需求,個別證書的有效期調整,在經過對原始碼的分析後,找到了如下的邏輯:
發現部分證書是通過NewSignedCert
這個方法簽發,而這個方法簽發的證書預設只有一年有效期,檢視程式碼邏輯:
cmd/kubeadm/app/util/pkiutil/pki_helpers.go
const duration365d = time.Hour * 24 * 365 func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) { serial, err := rand.Int(rand.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(duration365d).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) }
至此,調整NewSignedCert
這個方法,重新進行編譯,將證書有效期調整為你想要的任何時間。
如何重新編譯kubeadm原始碼,請參考之前的文章,連結如下:Kubeadm證書過期時間調整
kubeadm 1.14 離線安裝教程
> kubeadm 1.14.x 離線一鍵安裝包教程&&地址:kubernetes 1.14 離線安裝地址
原文連結: