修改 K8S 证书默认有效期
通过 kubeadm 创建集群后,其默认生成的证书有效期为 1 年,目测很多同学都遇到过证书过期的坑。之前写了一篇博客 K8S 证书过期后,kubeadm 重新生成证书 介绍如何在过期后重新生成证书。但重新生成后的证书有效期依然只有一年,每年都重新生成一遍的话未免太过麻烦,本篇博客就介绍下如何一劳永逸的解决证书签名有效期的问题。修改默认有效期的方法很简单,其一年的有效期是在源码中写死的,因此我们只
通过 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 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。
更多推荐
所有评论(0)