如何把自签名证书放到GKE集群的各个节点上?

How to put self-signed certificate to each node of GKE cluster?

我在 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 图片如何拉入 pods?

TL;DR:您需要对 GKE 中的节点执行的几乎所有修改,例如向服务器添加受信任的根证书,都可以使用 Daemonsets 完成。

用户 Sam Stoelinga created about how to perform what you are looking to do. The link can be found here.

有一个很棒的指南

总而言之,Sam 建议如何执行此更改的方法是使用 Daemonsets 在每个节点中分发证书。由于 Daemonsets 保证每个节点上始终有 1 个 pod,因此 POD 将负责将您的证书添加到节点,以便您可以从私有注册表中提取图像。

一般情况下,您自己添加节点是行不通的,因为如果GKE 需要重新创建您更改的节点将会丢失。这种使用 DS 的方法保证即使重新创建节点,由于 Daemonset 将在节点中安排这个“大修 pod”之一,您将始终拥有证书。

Sam 提出的步骤非常简单:

  1. 使用分发证书所需的命令创建映像。如果您使用 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 的几个帖子中有概述,例如 this one

  1. 将图像移动到您的节点当前可以访问的容器注册表,例如 GCR

  2. 使用将证书添加为具有 NET_ADMIN 能力(需要执行此操作)的特权的映像部署 DS,并在 POD 内装载主机的“/etc”文件夹。 Sam 添加了一个执行此操作的示例,这可能会有所帮助,但您可以使用自己的定义。 如果您在尝试部署特权 pod 时遇到问题,可能值得查看有关 Using PodSecurityPolicies

    的 GKE 文档