docker - 如何将自签名证书放入 GKE 集群的每个节点?
问题描述
我在 GKE 中有一个 Kubernetes 集群。在集群内部有一个私有的 docker 注册服务。通过运行以下命令在 docker 映像中生成此服务的证书:
openssl req -x509 -newkey rsa:4096 -days 365 -nodes -sha256 -keyout /certs/tls.key -out /certs/tls.crt -subj "/CN=registry-proxy"
当任何使用此私有注册表中的图像的 pod 尝试提取图像时,我会收到错误消息:
x509: certificate signed by unknown authority
有没有办法将自签名证书放到集群中的所有 GKE 节点上来解决问题?
更新
我按照@ArmandoCuevas 在评论中的建议将 CA 证书放入每个 GKE 节点,但这没有帮助,仍然出现错误x509: certificate signed by unknown authority
。什么可能导致它?docker 镜像是如何被拉入 pod 的?
解决方案
TL;DR:您需要对 GKE 中的节点执行的几乎所有修改,例如向服务器添加受信任的根证书,都可以使用 Daemonsets 完成。
用户Sam Stoelinga创建了一个关于如何执行您想要做的事情的惊人指南。链接可以在这里找到。
总而言之,Sam 建议如何执行此更改的方式是使用 Daemonsets 在每个节点中分发证书。由于 Daemonsets 保证每个节点上始终有 1 个 pod,因此 POD 将负责将您的证书添加到节点,以便您可以从私有注册表中提取图像。
通常由您自己添加节点是行不通的,因为如果 GKE 需要重新创建您更改的节点将会丢失。这种使用 DS 的方法保证即使重新创建节点,由于 Daemonset 将在节点中安排一个“大修 pod”,您将始终拥有适当的证书。
Sam 提出的步骤非常简单:
- 使用分发证书所需的命令创建一个映像。如果您使用的是 Ubuntu 节点或 COS 节点,此步骤可能会有所不同。如果您使用的是 COS 节点,那么在使用 COS 时您的 pod 需要运行的命令由 SAM 完美概述:
cp /myCA.pem /mnt/etc/ssl/certs
nsenter --target 1 --mount update-ca-certificates
nsenter --target 1 --mount systemctl restart docker
如果您正在运行 Ubuntu 节点,这些命令会在 Ask Ubuntu 中的几篇文章中进行概述,如下所示。
将映像移动到您的节点当前可以访问的容器注册表,例如GCR。
使用将证书添加为具有 NET_ADMIN 功能(执行此操作所需)的特权的映像部署 DS,并在 POD 内安装主机的“/etc”文件夹。Sam 添加了一个这样做的示例,这可能会有所帮助,但您可以使用自己的定义。如果您在尝试部署特权 pod 时遇到问题,可能值得查看有关使用 PodSecurityPolicies的 GKE 文档
推荐阅读
- javascript - 来自 onChange 提交的 React event.preventDefault() 不会阻止刷新
- javascript - 为什么我的 React 组件中的变量没有按预期增加?
- java - Java HttpResponse 提取数据
- java - 整数 'K' 在 for 循环中不会正确计数。我该如何解决?
- reactjs - 在 createAsyncThunk 中的 onSubmit 中传递字符串的问题
- javascript - 不要使用“新”来解决副作用
- html - 图像和文本元素的间距
- javascript - 基于带有字符分隔符的文本构建数组
- javascript - 如何将 Android SDK .aar 文件用于 ionic 项目,以便将 .aar 文件中的 Java 类之间的通信转换为 ionic JavaScript 文件 任何建议
- python - 如何从 Matplotlib 的列表中绘制自定义颜色条?