解决kubeadm部署的k8s 集群证书过期
K8S CA证书是10年,但是组件证书的日期只有1年,为了证书一直可用状态需要更新,目前主流的一共有3种:
1、版本升级,只要升级就会让各个证书延期1年,官方设置1年有效期的目的就是希望用户在一年内能升级1次;
2、通过命令续期 (这种只能延长一年);
3、编译源码Kubeadm,证书有效期可自定义;
本实验环境是单master集群环境,如果是多master集群环境那么需要将master上更新的证书分发到各个节点上!
此文档采用K8s 1.18.3版本,不保证其他版本也适用,建议自行测试。
一、查看证书过期时间
1.1 方式一
个人搭建的集群不知道为什么,使用上述命令无法查看ca的证书有效期,所以记录上方式二!
1.2 方式二
do openssl x509 -in $item -text -noout| grep Not; | |
echo ======================$item===============; | |
done |
也可以一个一个的进行查看:
二、通过命令续期
2.1 修改集群内所有机器的时间,模拟证书在过期的边缘
2.2 查看证书有效期
为了更直观的看到证书的有效期!
[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 Mar 03, 2022 16:02 UTC 2d no | |
apiserver Mar 03, 2022 16:02 UTC 2d ca no | |
apiserver-etcd-client Mar 03, 2022 16:02 UTC 2d etcd-ca no | |
apiserver-kubelet-client Mar 03, 2022 16:02 UTC 2d ca no | |
controller-manager.conf Mar 03, 2022 16:02 UTC 2d no | |
etcd-healthcheck-client Mar 03, 2022 16:02 UTC 2d etcd-ca no | |
etcd-peer Mar 03, 2022 16:02 UTC 2d etcd-ca no | |
etcd-server Mar 03, 2022 16:02 UTC 2d etcd-ca no | |
front-proxy-client Mar 03, 2022 16:02 UTC 2d front-proxy-ca no | |
scheduler.conf Mar 03, 2022 16:02 UTC 2d no | |
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED | |
ca Mar 01, 2031 16:02 UTC 9y no | |
etcd-ca Mar 01, 2031 16:02 UTC 9y no | |
front-proxy-ca Mar 01, 2031 16:02 UTC 9y no |
如果证书过期的话,就会出现以下情况:
Unable to connect to the server: x509: certificate has expired or is not yet valid |
2.3 备份原有数据
apiServer: | |
extraArgs: | |
authorization-mode: Node,RBAC | |
timeoutForControlPlane: 4m0s | |
apiVersion: kubeadm.k8s.io/v1beta2 | |
certificatesDir: /etc/kubernetes/pki | |
clusterName: kubernetes | |
controllerManager: {} | |
dns: | |
type: CoreDNS | |
etcd: | |
local: | |
dataDir: /var/lib/etcd | |
imageRepository: registry.aliyuncs.com/google_containers | |
kind: ClusterConfiguration | |
kubernetesVersion: v1.18.3 | |
networking: | |
dnsDomain: cluster.local | |
podSubnet: 10.244.0.0/16 | |
serviceSubnet: 10.96.0.0/12 | |
scheduler: {} |
2.4 备份证书
备份主要就是为了升级失败之后,便于回滚!
admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf |
2.5 更新证书
2.6 确认证书有效期
CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED | |
admin.conf Mar 01, 2023 04:02 UTC 364d no | |
apiserver Mar 01, 2023 04:02 UTC 364d no | |
apiserver-etcd-client Mar 01, 2023 04:02 UTC 364d no | |
apiserver-kubelet-client Mar 01, 2023 04:02 UTC 364d no | |
controller-manager.conf Mar 01, 2023 04:02 UTC 364d no | |
etcd-healthcheck-client Mar 01, 2023 04:02 UTC 364d no | |
etcd-peer Mar 01, 2023 04:02 UTC 364d no | |
etcd-server Mar 01, 2023 04:02 UTC 364d no | |
front-proxy-client Mar 01, 2023 04:02 UTC 364d no | |
scheduler.conf Mar 01, 2023 04:02 UTC 364d no |
2.7 更新kubeconfig文件
2.8 更新客户端证书
2.9 重启相关的pod
也可以干脆一点,直接重启docker即可!
2.10 查看pod是否运行正常
NAMESPACE NAME READY STATUS RESTARTS AGE | |
kube-system coredns-58cc8c89f4-8lq2k 1/1 Running 1 363d | |
kube-system coredns-58cc8c89f4-hz774 1/1 Running 1 363d | |
kube-system etcd-k8s-master 1/1 Running 1 363d | |
kube-system kube-apiserver-k8s-master 1/1 Running 1 363d | |
kube-system kube-controller-manager-k8s-master 1/1 Running 1 363d | |
kube-system kube-flannel-ds-amd64-fh9nx 1/1 Running 1 363d | |
kube-system kube-flannel-ds-amd64-gmjth 1/1 Running 1 363d | |
kube-system kube-flannel-ds-amd64-mvtdg 1/1 Running 1 363d | |
kube-system kube-proxy-8dtfw 1/1 Running 1 363d | |
kube-system kube-proxy-9xwgb 1/1 Running 1 363d | |
kube-system kube-proxy-zcdvn 1/1 Running 1 363d | |
kube-system kube-scheduler-k8s-master 1/1 Running 1 363d |
2.11 更新节点上kubelet证书有效期
kubelet 的配置文件master节点可以和node节点共用!
三、编译源码kubeadm,证书时间自定义
3.1 备份集群配置
kubeadm version: &version.Info{Major:"1", Minor:"16", GitVersion:"v1.18.3", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:15:39Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"} | |
3.2 获取对应的kubeadm源码
3.3 修改CA证书有效期
65 NotBefore: now.UTC(), | |
66 NotAfter: now.Add(duration365d * 100).UTC(), # 默认是10,改成100 | |
67 KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, | |
68 BasicConstraintsValid: true, | |
69 IsCA: true, |
3.4 修改其他证书有效期
46 CertificateValidity = time.Hour * 24 * 365 * 100 |
3.5 安装go环境进行编译
go version go1.13.9 linux/amd64 |
3.6 go设置国内代理
Golang V1.13之后支持通过设置变量GOPROXY来修改代理地址,默认的代理服务器,https://proxy.golang.org在国内访问经常出现timeout!详见:https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md
在终端执行即可!
3.7 编译kubeadm
3.8 替换kubeadm指令
3.9 更新集群证书
# 更新证书(若有多个master,则需要在所有master上执行) | |
W0904 07:23:15.938694 59308 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] | |
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed | |
certificate for serving the Kubernetes API renewed | |
certificate the apiserver uses to access etcd renewed | |
certificate for the API server to connect to kubelet renewed | |
certificate embedded in the kubeconfig file for the controller manager to use renewed | |
certificate for liveness probes to healthcheck etcd renewed | |
certificate for etcd nodes to communicate with each other renewed | |
certificate for serving etcd renewed | |
certificate for the front proxy client renewed | |
certificate embedded in the kubeconfig file for the scheduler manager to use renewed |
3.10 更新kubeconfig文件
W0904 07:25:41.882636 61426 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] | |
[kubeconfig] Using kubeconfig folder "/etc/kubernetes" | |
[kubeconfig] Writing "admin.conf" kubeconfig file | |
[kubeconfig] Writing "kubelet.conf" kubeconfig file | |
[kubeconfig] Writing "controller-manager.conf" kubeconfig file | |
[kubeconfig] Writing "scheduler.conf" kubeconfig file |
3.11 重启相关pod
在所有Master上执行重启kube-apiserver、kube-controller、kube-scheduler、etcd这4个容器,以便使证书生效。
3.12 替换admin文件
3.13 确认指令正常
$ kubectl get pod -A | |
NAMESPACE NAME READY STATUS RESTARTS AGE | |
kube-system calico-kube-controllers-5b8b769fcd-cpls6 1/1 Running 0 13h | |
kube-system calico-node-2hk5w 1/1 Running 0 13h | |
kube-system calico-node-bwmmk 1/1 Running 0 13h | |
kube-system calico-node-gvldn 1/1 Running 0 13h | |
kube-system coredns-546565776c-g7j2f 1/1 Running 0 13h | |
kube-system coredns-546565776c-wtxt4 1/1 Running 0 13h | |
kube-system etcd-k8s-master 1/1 Running 0 13h | |
kube-system kube-apiserver-k8s-master 1/1 Running 0 13h | |
kube-system kube-controller-manager-k8s-master 1/1 Running 1 13h | |
kube-system kube-proxy-bwkv6 1/1 Running 0 13h | |
kube-system kube-proxy-jdzps 1/1 Running 0 13h | |
kube-system kube-proxy-xjpxf 1/1 Running 0 13h | |
kube-system kube-scheduler-k8s-master 1/1 Running 0 13h | |
kube-system kuboard-7986796cf8-mk66v 1/1 Running 0 12h | |
kube-system metrics-server-7f96bbcc66-qldnm 1/1 Running 0 12h |
3.14 确认证书更新成功
[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 Mar 03, 2121 16:02 UTC 2d no | |
apiserver Mar 03, 2121 16:02 UTC 2d ca no | |
apiserver-etcd-client Mar 03, 2121 16:02 UTC 2d etcd-ca no | |
apiserver-kubelet-client Mar 03, 2121 16:02 UTC 2d ca no | |
controller-manager.conf Mar 03, 2121 16:02 UTC 2d no | |
etcd-healthcheck-client Mar 03, 2121 16:02 UTC 2d etcd-ca no | |
etcd-peer Mar 03, 2121 16:02 UTC 2d etcd-ca no | |
etcd-server Mar 03, 2121 16:02 UTC 2d etcd-ca no | |
front-proxy-client Mar 03, 2121 16:02 UTC 2d front-proxy-ca no | |
scheduler.conf Mar 03, 2121 16:02 UTC 2d no | |
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED | |
ca Mar 01, 2031 16:02 UTC 9y no | |
etcd-ca Mar 01, 2031 16:02 UTC 9y no | |
front-proxy-ca Mar 01, 2031 16:02 UTC 9y no |
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************