通过 kubeadm 创建集群后,其默认生成的证书有效期为 1 年,目测很多同学都遇到过证书过期的坑。之前写了一篇博客 K8S 证书过期后,kubeadm 重新生成证书 介绍如何在过期后重新生成证书。但重新生成后的证书有效期依然只有一年,每年都重新生成一遍的话未免太过麻烦,本篇博客就介绍下如何一劳永逸的解决证书签名有效期的问题。


修改默认有效期的方法很简单,其一年的有效期是在源码中写死的,因此我们只需要下载源码将默认有效期修改一下,然后重新编译生成 kubeadm 命令就可以了。

这里麻烦的是 K8S 不同版本之间的源码可能不太一样,因此修改的地方也不一样。网上的资料各不相同,因此在这里做一下总结。源码的变化主要是 1.14 和之后的版本,对于有效期的设置其文件不同,这里用 v1.14.3 和 v1.18.8 两个版本做简单介绍。

一. 源码修改

根据自己使用的版本去 Github kubernetes release 下载对应的源码并解压,然后修改源码。

 wget https://github.com/kubernetes/kubernetes/archive/v1.18.8.tar.gz
 tar zxvf v1.18.8.tar.gz
 cd kubernetes-1.18.8
1. v.1.14.3版本
  • 修改自签名证书的有效期

这里需要修改 cmd/kubeadm/app/util/pkiutil/pki_helpers.go 文件,该文件下可以找到下面的常量定义和日期设置

const (
    duration365d = time.Hour * 24 * 365
)

 NotBefore:    caCert.NotBefore,
 NotAfter:     time.Now().Add(duration365d ).UTC(),

我们将 NotAfter修改为 70 年:

 NotBefore:    caCert.NotBefore,
 NotAfter:     time.Now().Add(duration365d * 70 ).UTC(),
  • 修改 CA 证书的有效期

对于 CA 证书,需要修改 vendor/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(),
                // ca 证书默认是 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)
}
  • 修改后

我们将 CA 的证书也改为 70 年

func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
        now := time.Now()
        tmpl := x509.Certificate{
               ...
                NotBefore:             now.UTC(),
                // ca 证书修改为是 70 年
                NotAfter:              now.Add(duration365d * 70).UTC(),
       ...
}

修改完后运行 make WHAT=cmd/kubeadm 命令重新编译即可。

# ubuntu @ node2 in ~/kubernetes-1.14.3 [22:16:40]
$ make WHAT=cmd/kubeadm
+++ [0821 22:18:47] Building go targets for linux/amd64:
    cmd/kubeadm

编译完成后生成的命令在 _output 目录下:

# ubuntu @ node2 in ~/kubernetes-1.14.3 [22:04:42]
$ cd _output/local/bin/linux/amd64
# ubuntu @ node2 in ~/kubernetes-1.14.3/_output/local/bin/linux/amd64 [22:05:20]
$ ll
total 75M
-rwxrwxr-x 1 ubuntu ubuntu 6.5M Aug 21 22:02 conversion-gen
-rwxrwxr-x 1 ubuntu ubuntu 6.5M Aug 21 22:02 deepcopy-gen
-rwxrwxr-x 1 ubuntu ubuntu 6.5M Aug 21 22:02 defaulter-gen
-rwxrwxr-x 1 ubuntu ubuntu 2.0M Aug 21 22:03 go-bindata
-rwxrwxr-x 1 ubuntu ubuntu 4.5M Aug 21 22:02 go2make
-rwxrwxr-x 1 ubuntu ubuntu  38M Aug 21 22:04 kubeadm
-rwxrwxr-x 1 ubuntu ubuntu  12M Aug 21 22:03 openapi-gen

将新生成的 kubeadm 命令拷贝覆盖掉原来的,然后重新生成一遍证书,v1.14.3 还没有 kubeadm alpha certs check-expiration 命令,我们可以通过 openssl 命令查看证书的有效期,如下,可以看到 CA 和自签名证书的有效期都变为 70 年了。

# ubuntu @ node2 in /etc/kubernetes/pki [22:21:11]
$ openssl x509 -in front-proxy-client.crt   -noout -text  |grep Not
            Not Before: Aug 21 14:20:43 2020 GMT
            Not After : Aug  4 14:20:43 2090 GMT

# ubuntu @ node2 in /etc/kubernetes/pki [22:21:13]
$ openssl x509 -in ca.crt  -noout -text  |grep Not
            Not Before: Aug 21 14:20:42 2020 GMT
            Not After : Aug  4 14:20:42 2090 GMT

2. v.18.8 版本

v1.18.8 版本的修改和 1.14 版本略有不同,主要是 1.18 版本将签名证书的默认期限作为常量抽了出来。

  • 修改自签名证书的有效期

1.18 版本需要修改 vim cmd/kubeadm/app/constants/constants.go 文件,如下,其 CertificateValidity 默认是一年,这里我改成了 70 年。

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 * 70
  • 修改 CA 证书的有效期

对于 CA 证书的修改没有变化,还是需要修改 vendor/k8s.io/client-go/util/cert/cert.go 文件,这里不再重复。

完成后重新编译生成 kubeadm 命令,替换原来的命令并重新生成证书和配置就可以了,我重新生成的配置有效期如下,可以看到已经变成了 70 年:

$ sudo kubeadm alpha certs  check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Aug 05, 2090 08:39 UTC   69y                                     no
apiserver                  Aug 05, 2090 08:39 UTC   69y             ca                      no
apiserver-etcd-client      Aug 05, 2090 08:39 UTC   69y             etcd-ca                 no
apiserver-kubelet-client   Aug 05, 2090 08:39 UTC   69y             ca                      no
controller-manager.conf    Aug 05, 2090 08:39 UTC   69y                                     no
etcd-healthcheck-client    Aug 05, 2090 08:39 UTC   69y             etcd-ca                 no
etcd-peer                  Aug 05, 2090 08:39 UTC   69y             etcd-ca                 no
etcd-server                Aug 05, 2090 08:39 UTC   69y             etcd-ca                 no
front-proxy-client         Aug 05, 2090 08:39 UTC   69y             front-proxy-ca          no
scheduler.conf             Aug 05, 2090 08:39 UTC   69y                                     no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Aug 05, 2090 08:39 UTC   69y             no
etcd-ca                 Aug 05, 2090 08:39 UTC   69y             no
front-proxy-ca          Aug 05, 2090 08:39 UTC   69y             no

以上就是两个版本的修改证书有效期的方式了,算是一劳永逸解决了证书问题。


老铁都看到这了来一波点赞、评论、关注三连可好

我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐