如何向 Kubernetes 添加证书以允许从自定义 Harbor 存储库中提取图像?

如何向 Kubernetes 添加证书以允许从自定义 Harbor 存储库中提取图像?

我找到了各种关于如何添加证书以供 pod 本身使用的演练,但似乎找不到有关如何设置 Kubernetes 以允许自签名证书从集群内运行的 Harbor 实例中提取图像的信息。我已将 ca 证书导入系统的受信任证书(系统运行的是 Ubuntu 18.04),但我猜 Kubernetes 在某处使用它自己的受信任证书存储,类似于 Java 忽略系统的受信任证书并依赖密钥库文件的方式?

编辑 更具体地说,我试图部署一个存储在我的 Kubernetes 集群中运行的 Harbor 实例中的自定义 Docker 镜像。我已将 Harbor 的证书导入到我的主机系统操作系统中,并且可以运行:

docker login <url_to_harbor>
docker pull <url_to_harbor>/library/custom/image:latest

它在 CLI 中运行良好,但如果我尝试创建如下部署 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: custom
  template:
    metadata:
      labels:
        app: custom
    spec:
      containers:
      - name: custom
        image: <url_to_harbor>/library/custom/image:latest
...

并运行kubectl apply -f custom-deploy.yaml时,我得到以下错误:

custom-deployment-6ff68947f6-8jj2p            0/1     ImagePullBackOff   0          13s

如果我得到了有关失败的 Pod 的描述,我会看到:

  Warning  Failed          18s                kubelet, node3     Failed to pull image "<url_to_harbor>/library/custom/image:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://<url_to_harbor>/v2/: x509: certificate signed by unknown authority
  Warning  Failed          18s                kubelet, node3     Error: ErrImagePull

自从我导入 CA 证书后,我重启了主机。我通过将根 CA 证书文件移入/usr/local/share/ca-certificates然后运行来添加证书sudo update-ca-certificates

答案1

导入 CA 证书的方法是正确的,但你必须在每个集群节点上执行此操作:所有主节点和工作节点。Kubernetes 仅依赖于安装在底层操作系统上的 CA。

答案2

如果您不想在每个节点上安装 CA 证书,也可以运行 DaemonSet 来配置 ca 证书。请注意,这仅在 Kubernetes 配置了 containerd 运行时时才有效。

apiVersion: v1
kind: ConfigMap
metadata:
  name: trusted-ca
  namespace: kube-system
data:
  ca.crt: |+
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: setup-script
  namespace: kube-system
data:
  setup.sh: |
    echo "$TRUSTED_CERT" > /usr/local/share/ca-certificates/ca.crt && update-ca-certificates && systemctl restart containerd
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  namespace: kube-system
  name: node-custom-setup
  labels:
    k8s-app: node-custom-setup
spec:
  selector:
    matchLabels:
      k8s-app: node-custom-setup
  template:
    metadata:
      labels:
        k8s-app: node-custom-setup
    spec:
      hostPID: true
      hostNetwork: true
      initContainers:
      - name: init-node
        command: ["nsenter"]
        args: ["--mount=/proc/1/ns/mnt", "--", "sh", "-c", "$(SETUP_SCRIPT)"]
        image: debian
        env:
        - name: TRUSTED_CERT
          valueFrom:
            configMapKeyRef:
              name: trusted-ca
              key: ca.crt
        - name: SETUP_SCRIPT
          valueFrom:
            configMapKeyRef:
              name: setup-script
              key: setup.sh
        securityContext:
          privileged: true
      containers:
      - name: wait
        image: k8s.gcr.io/pause:3.1

来源:http://hypernephelist.com/2021/03/23/kubernetes-containerd-certificate.html

这些说明是在在 cri 中实现主机注册表目录在 containerd 1.5 中,因此如果运行新版本,可能无需重启即可进行配置。请参阅注册表配置 - 介绍

最后,如果您在云管理集群上运行,他们可能会提供用于管理 CA 证书的自定义配置。例如,AKS-自定义 CA

相关内容