首页 > 解决方案 > 如何将自签名证书放入 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 的?

标签: dockerkubernetesgoogle-cloud-platformgoogle-kubernetes-engine

解决方案


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

用户Sam Stoelinga创建了一个关于如何执行您想要做的事情的惊人指南。链接可以在这里找到。

总而言之,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 中的几篇文章中进行概述,如下所示

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

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


推荐阅读