Kubelet 证书?动续期解决?案

丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述Kubelet 证书?动续期解决?案相关的知识,希望能为你提供帮助。
Kubelet 证书?动续期解决?案标签(空格分隔):kubernetes系列
[toc]
一:关于kubelet 证书的问题 1.1 k8s 证书问题

在?个 K8s 集群中,node 节点上的组件( kubelet 和 kube-proxy )需要与 master 节点(尤其是 kube- apiserver)进?通信时,为了确保通信本身的私密性和通信过程不被?扰,K8s 会使? TLS 加密通信。只要是证书,就会有到期时间,?到期了就需要续签,否则就?法正常通信,因此?旦启?了 TLS 认证 ,就会不得不时刻去关?证书到期的问题。 ? 1.4 版本后,K8s 推出了功能,以此证书签名和请求都可以通过 K8s 提供的 API 的?式 进?,这很?程度上节省了证书?成签名?作。当然随着的推出,对于集群证书的管理来说就更加简单 了,?条命令即可完成证书?命周期的管理。但是对于?进制包安装集群的场景来说,这个过程还是?较痛苦的。 ?般来说,我们会在?成 etcd 和 K8s 集群 ca 证书时,将证书有效期声明的较?(5~10年),但是在通过 apiserver CA 签发的 kubelet 证书时,会遵循默认的证书有效期 —— 8760h (即 1年)。如果证书过期了,就会在?志中出现 certificate has expired or is not yet valid的错误信息,node 节点将不能与master节点进?通信,这将对业务环境造成极?的灾难,于是乎我们就不得不时时刻刻去关注着证书什么时候,以便于更早的可以对其进?替换。 当需要管理的节点原来越多的时候,替换证书就会是?件?常繁琐的事情,我们当然会更加期望能以?种更加?便的?式去实现这?过程,因此也就引出了我们本?的话题 —— 如何去实现 Kubelet 证书的?动续签。

1.2 TLS bootstrapping 证书?动续期?案实施
事实上,? Kubernetes 1.8 版本开始就包含了?个 beta 特性 —— kubelet certificate rotation,在当前的证书有 效期到达总有效期的 70% ~ 90% 时,kubelet 便会发起?个的 CSR 请求从 apiserver 重新申请证书,新 证书可?后就会?动批准续签。注意: K8s 版本为 1.8 或更?时,kubelet certificate relation 会?动加载新证书,?需?动重启服务;K8s 版本低于 1.8 则需要?动重启服务才能加载新证书

1.3 配置 kubelet client/server 证书轮换
1)kube-controller-manager 配置参数所有 master 节点都需要操作。

Kubelet 证书?动续期解决?案

文章图片

修改配置文件:kube-controller-manager.conf?件路径: kubernetes/cfg/kube-controller-manager.conf ,完整配置?件内容如下: KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/data/application/kubernetes/logs \\ --leader-elect=true \\ --master=127.0.0.1:8080 \\ --bind-address=127.0.0.1 \\ --allocate-node-cidrs=true \\ --cluster-cidr=10.244.0.0/16 \\ --service-cluster-ip-range=10.0.0.0/16 \\ --cluster-signing-cert-file=/data/application/kubernetes/ssl/ca.pem \\ --cluster-signing-key-file=/data/application/kubernetes/ssl/ca-key.pem\\ --root-ca-file=/data/application/kubernetes/ssl/ca.pem \\ --service-account-private-key-file=/data/application/kubernetes/ssl/ca-key.pem \\ --experimental-cluster-signing-duration=87600h0m0s \\ --feature-gates=RotateKubeletServerCertificate=true"

【Kubelet 证书?动续期解决?案】
Kubelet 证书?动续期解决?案

文章图片

1.4 k8s 1.11 之前的版本
2)kubelet 配置参数 1.K8s 1.11 版本及以前(了解即可)注意: K8s 1.11 版本之前,RotateKubeletServerCertificate 默认是关闭的功能,需要在 kubelet 和 kube- controller-manager 中?动开启

Kubelet 证书?动续期解决?案

文章图片

修改配置?件: kubelet.conf 注意: 所有 node 节点都需要进?操作(包括作为 node 加?集群的 master 节点)。 vim kubernetes/cfg/kubelet.conf ----- KUBELET_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/data/application/kubernetes/logs \\ --hostname-override=t-k8sN-001 \\ --network-plugin=cni \\ --kubeconfig=/data/application/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig=/data/application/kubernetes/cfg/bootstrap.kubeconfig \\ --config=/data/application/kubernetes/cfg/kubelet-config.yml \\ --cert-dir=/data/application/kubernetes/ssl \\ --pod-infra-container-image=lizhenliang/pause-amd64:3.0 \\ --node-labels=node.kubernetes.io/k8s-node=true \\ --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true --rotate-certificates" -----

1.5 k8s 1.11 之后的版本
新增参数说明

Kubelet 证书?动续期解决?案

文章图片

修改配置?件 注意: 所有 node 节点都需要进?操作(包括作为 node 加?集群的 master 节点),以下两种?法选?种即可,推荐 yaml 声明 ?件路径: kubernetes/cfg/kubelet-config.yml ,追加内容如下:vim /opt/kubernetes/cfg/kubelet-config.yml ---- featureGates: RotateKubeletServerCertificate: true rotateCertificates: true serverTLSBootstrap: true ----

Kubelet 证书?动续期解决?案

文章图片

文件路径: kubernetes/cfg/kubelet.conf (不推荐,后期版本逐步废弃),?件内容如下:KUBELET_OPTS="--logtostderr=false \\ --v=2 \\ --log-dir=/data/application/kubernetes/logs \\ --hostname-override=t-k8sN-001 \\ --network-plugin=cni \\ --kubeconfig=/data/application/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig=/data/application/kubernetes/cfg/bootstrap.kubeconfig \\ --cert-dir=/data/application/kubernetes/ssl \\ --config=/data/application/kubernetes/cfg/kubelet-config.yml \\ --pod-infra-container-image=lizhenliang/pause-amd64:3.0 \\ --node-labels=node.kubernetes.io/k8s-node=true \\ --feature-gates=RotateKubeletServerCertificate=true \\ --rotate-certificates \\ --rotate-server-certificates"

1.6 创建 RBAC 规则
我们知道 kube-apiserver 会从 kubelet 处收到 CSR 请求,并对这些请求进?身份认证,但实际上真正负责签发证书的是 kube-controller-manager ,同时 controller-manager 还控制着证书的有效期。因此,想要实现?动续签证书,除了自动生成证书发起请求外,还得让controller-manager能够?动地批复接受到的CSR请求。当然,总不能什么 CSR 请求都批发,既然我们是要实现 kubelet证书的自动续签,就必须告知 controller-manager 只对 kubelet 发起的特定 CSR 请求进?批复。这需要通过 RBAC规则中的clusterole 来实现。 ClusterRole 实际上只是用于定义?种集群范围内的能力,这种能力需要我们通过声明资源来创建。对于自动批复 CSR,k8s 提供了以下3种 API 方法: nodeclient: ?动批复组?户(默认值,具体根据实际的 token.csv 为准) ?次申请证书的 CSR 请求(新节点,还没有证书)

Kubelet 证书?动续期解决?案

文章图片

selfnodeclient: 自动批复 system:nodes 组?户更新 kubelet ?身与 apiserver 通讯?证书的 CSR 请求 ( kubelet-client-xxxx.pem )selfnodeserver: 自动批复求system:nodes 组?户更新 kubelet 10250 端口API 鉴权?证书的 CSR 请求( kubelet.crt)

1.7 K8s 1.8 版本前 (了解即可)
创建 clusterolevim approve-renewal-csr.yaml -----# A ClusterRole which instructs the CSR approver to approve a user requesting # node client credentials. kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: approve-node-client-csr rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/nodeclient"] verbs: ["create"] --- # A ClusterRole which instructs the CSR approver to approve a node renewing its # own client credentials. kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: approve-node-client-renewal-csr rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeclient"] verbs: ["create"] --- # A ClusterRole which instructs the CSR approver to approve a node requesting a # serving cert matching its client cert. kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: approve-node-server-renewal-csr rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeserver"] verbs: ["create"]---- 创建资源: kubectl apply -f approve-renewal-csr.yaml创建:ClusterRoleBinding 自动批准首次申请证书 还没有证书,所以是组system:node-bootsrapper 组 kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=approve- node-client-csr --group=system:node-bootstrapper自动批准更新 kubelet 自身与 apiserver 通讯用证书已有证书,所以是组system:nodes组kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=approve- node-client-renewal-csr --group=system:nodes自动批准更新 kubelet 10250 端口 API鉴权?证书 已有证书,所以是system:nodes组kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=approve- node-server-renewal-csr --group=system:nodes如上创建后可以通过 kubectl get clusterrolebinding|egrep "node-(.*)-auto" 进?查看,结果如下:

Kubelet 证书?动续期解决?案

文章图片

1.8 k8s 1.8 之后的版本
我们上?说到,K8s 提供了三种 ClusterRole 来进? CSR 的自动批复?作。在 K8s 1.8 版本前都需要手动创建,而从 1.8 版本起 kube-apiserver 会自动创建nodeclient 和 selfnodeclient ,所以我们只需要再? 动创建selfnodeserver就可以了。

Kubelet 证书?动续期解决?案

文章图片

创建clusteRole vim auto-approve-csr-clusterrole.yml# A ClusterRole which instructs the CSR approver to approve a node requesting # a serving cert matching its client cert. kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeserver"] verbs: ["create"]

创建ClusterRoleBinding vim auto-approve-csr-clusterrolebinding.yaml # 批复 "system:node-bootstrapper" 组的所有 CSR apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-client-auto-approve-csr subjects: - kind: Group name: system:node-bootstrapper apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: system:certificates.k8s.io:certificatesigningrequests:nodeclient apiGroup: rbac.authorization.k8s.io --- # 批复 "system:nodes" 组 kubelet 与 apiserver 通信证书续约请求 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-client-auto-renew-crt subjects: - kind: Group name: system:nodes apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient apiGroup: rbac.authorization.k8s.io --- # 批复 "system:nodes" 组 kubelet 10250端? API 鉴权证书续约请求 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-server-auto-renew-crt subjects: - kind: Group name: system:nodes apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver apiGroup: rbac.authorization.k8s.io

Kubelet 证书?动续期解决?案

文章图片

kubectl get clusterrolebinding|egrep "node-(.*)-auto"

Kubelet 证书?动续期解决?案

文章图片

二: 重启服务与删除证书 2.1 重启kube-controller-manger
重启kube-controller-manager 如果有多个master 就逐个重启systemctl daemon-reload systemctl restart kube-controller-manager.service

2.2 删掉kubelet的证书
查看默认证书时间 openssl x509 -in kubelet-client-current.pem -noout -text | grep "Not"

Kubelet 证书?动续期解决?案

文章图片

rm -rf /opt/kubernetes/ssl/kubelet*[所有节点的证书]重新启动 节点kubelet service kubelet restart

Kubelet 证书?动续期解决?案

文章图片

Kubelet 证书?动续期解决?案

文章图片

Kubelet 证书?动续期解决?案

文章图片

查看原 kubelet server 证书的有效期 会少了两个文件: kubelet.crt , kubelet.key 文件 默认情况下签发的 kubelet server 证书的有效期只有 1 年,并不受 kube-controller-manager 控制其证书有效期。

Kubelet 证书?动续期解决?案

文章图片

2.3 重新签发证书
重新签发证书: kubectl get csr

Kubelet 证书?动续期解决?案

文章图片

kubectl get csr|grep "Pending"|awk \'NR> 1{print $1}\'|xargs kubectl certificate approve kubectl certificate approve csr-f7jl6

Kubelet 证书?动续期解决?案

文章图片

Kubelet 证书?动续期解决?案

文章图片

证书管理: openssl x509 -in /opt/kubernetes/ssl/kubelet-client-current.pem -noout -text| grep Not

Kubelet 证书?动续期解决?案

文章图片


    推荐阅读