本页展示如何手动轮换证书机构(CA)证书。
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
您的 Kubernetes 服务器版本必须不低于版本 v1.13. 要获知版本信息,请输入 kubectl version
。
注意:
确保备份你的证书目录、配置文件以及其他必要文件。
这里的方法假定 Kubernetes 的控制面通过运行多个 API 服务器以高可用配置模式运行。 另一假定是 API 服务器可体面地终止,因而客户端可以彻底地与一个 API 服务器断开 连接并连接到另一个 API 服务器。
如果集群中只有一个 API 服务器,则在 API 服务器重启期间会经历服务中断期。
ca.crt
、ca.key
、front-proxy-ca.crt
和 front-proxy-client.key
)分发到所有控制面节点,放在其 Kubernetes 证书目录下。--root-ca-file
标志,使之同时包含老的和新的 CA,之后重启组件。自此刻起,所创建的所有服务账号都会获得同时包含老的 CA 和新的 CA 的 Secret。
说明: kube-controller-manager 标志
--client-ca-file
和 --cluster-signing-cert-file
所引用的文件 不能是 CA 证书包。如果这些标志和 --root-ca-file
指向同一个 ca.crt
包文件(包含老的和新的 CA 证书), 你将会收到出错信息。 要解决这个问题,可以将新的 CA 证书复制到单独的文件中,并将 --client-ca-file
和 --cluster-signing-cert-file
标志指向该副本。一旦 ca.crt
不再是证书包文件,就可以恢复有问题的标志指向 ca.crt
并删除该副本。
如果在 API 服务器使用新的 CA 之前启动了新的 Pod,这些 Pod 也会获得此更新并且同时信任老的和新的 CA 证书。
base64_encoded_ca="$(base64 -w0 <path to file containing both old and new CAs>)"
for namespace in $(kubectl get ns --no-headers | awk "{print $1}"); do
for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do
kubectl get $token --namespace "$namespace" -o yaml |
/bin/sed "s/(ca.crt:).*/1 ${base64_encoded_ca}/" |
kubectl apply -f -
done
done
kube-proxy
、coredns
等),以便这些 Pod 能够使用 来自 ServiceAccount Secret 中的、已更新的证书机构数据。coredns
、kube-proxy
和其他使用集群内配置的 Pod 都正按预期方式工作。kube-apiserver
配置的 --client-ca-file
和 --kubelet-certificate-authority
标志所指的文件。kube-scheduler
配置的 --client-ca-file
标志所指的文件。client-certificate-data
和 client-key-data
中的内容,更新用户账号的证书。另外,还要更新 kubeconfig 文件中的 certificate-authority-data
节,使之包含 Base64 编码的老的和新的证书机构数据。
如果你的 kubelet 并未使用客户端证书轮换,则在所有节点上更新 kubelet.conf 中 client-certificate-data 和 client-key-data 以及 kubelet 客户端证书文件(通常位于 /var/lib/kubelet/pki 目录下)
由于 Pod 既信任老的 CA 也信任新的 CA,Pod 中的客户端会经历短暂的连接断开状态, 之后再连接到使用新的 CA 所签名的证书的新的 API 服务器。
说明: 要使用 openssl 命令行为集群生成新的证书和私钥,可参阅 证书(openssl)。 你也可以使用cfssl.
示例:
for namespace in $(kubectl get namespace -o jsonpath="{.items[*].metadata.name}"); do
for name in $(kubectl get deployments -n $namespace -o jsonpath="{.items[*].metadata.name}"); do
kubectl patch deployment -n ${namespace} ${name} -p "{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}";
done
for name in $(kubectl get daemonset -n $namespace -o jsonpath="{.items[*].metadata.name}"); do
kubectl patch daemonset -n ${namespace} ${name} -p "{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}";
done
done
kube-public
名字空间下的 ConfigMap cluster-info
,使之包含新的 CA 证书。base64_encoded_ca="$(base64 -w0 /etc/kubernetes/pki/ca.crt)"
kubectl get cm/cluster-info --namespace kube-public -o yaml |
/bin/sed "s/(certificate-authority-data:).*/1 ${base64_encoded_ca}/" |
kubectl apply -f -
您可以使用任何文本编辑器与命令行工具来构建Flutter应用程序。 不过,我们建议使用我们的编辑器插件之一,以获得更好的体验。通...
云函数的运行环境是 Node.js,我们可以在云函数中使用Nodejs内置模块以及使用 npm 安装第三方依赖来帮助我们更快的开发。借助于...
本指南描述了在安卓模拟器上运行 React Native 安卓应用程序所需要的开发环境的基本安装步骤。在这里我们不讨论诸如 IDE 的开发...
jQuery Mobile 简介jQuery Mobile 是一个用于创建移动端web应用的的前端框架。 学习本教程前你需要先了解 在开始学习 jQuery Mob...
jQuery Mobile 列表视图 jQuery Mobile 列表视图jQuery Mobile 中的列表视图是标准的HTML 列表; 有序(ol) 和 无序(ul).列表视图...
jQuery Mobile 触摸事件 jQuery Mobile提供了可定制的触摸事件,虽然这些事件只有在用户使用支持触摸功能的设备来访问jQuery Mob...
jQuery Mobile 弹窗弹窗是一个非常流行的对话框,弹窗可以覆盖在页面上展示。弹窗可用于显示一段文本,图片,地图或其他内容。创...
在Android中,图像是可绘制资源的一种类型。Android支持另一个可绘制资源,称为可绘制颜色资源,其基本上是颜色矩形。例子要定义...
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。IN操作符语法IN[Collection-of-values]语法说明:S.No.语...
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节...