Helm 图表部署和私有 docker 存储库

Helm chart deployment and private docker repository

我有一个包含大量图片的私人 Docker 存储库。我正在使用 Helm 将它们部署到 Kubernetes 集群。

Helm values.yaml 包含存储库凭据:

image:
  repository: <repo>
  tag: <version tag>
  pullPolicy: IfNotPresent
  imageCredentials:
    registry: <repo>
    username: <username>
    password: <pw>

完成 helm 安装后

helm install myhelmchart --values values.yaml --version

广告连播的状态是 Init:ErrImagePull。 kubectl describe pods 给出了这个错误:

Failed to pull image "image:tag": rpc error: code = Unknown desc = Error response from daemon: Get [image]/manifests/[version]: unauthorized: authentication required

这取决于您的 helm chart 的输出。您可以使用 helm template 查看生成的 kubernetes 资源,而无需实际部署它。使用来自私人 docker 注册表的图像归结为两个步骤:

  1. 确保您有一个 secret resource 用于私有存储库。注意这里的类型是kubernetes.io/dockerconfigjson或者kubernetes.io/dockercfg.

    描述了如何使用来自 helm 的模板创建它 here

  2. 在使用该私有存储库中的图像的 pod 中引用该秘密,如下所示:

连播 resource/template:

spec:
  containers:
  - name: some-pod
    image: <image>
  imagePullSecrets:
  - name: <name-of your secret>

您可以先在没有 helm 的情况下手动构建资源。这有助于验证资源本身是否正确。然后您可以调整 helm 模板以根据您的值输出正确的资源。

imageCredentials 需要处于根级别,如下所示:

image:
  repository: <repo>
  tag: <version tag>
  pullPolicy: IfNotPresent
imageCredentials:
  registry: <repo>
  username: <username>
  password: <pw>

因为

{{- define "imagePullSecret" }}
{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.imageCredentials.registry (printf "%s:%s" .Values.imageCredentials.username .Values.imageCredentials.password | b64enc) | b64enc }}
{{- end }}

引用 .Values.imageCredentials.* 而不是 .Values.image.imageCredentials.*.

此外,您还需要添加

imagePullSecrets:
- name: {{ .Values.imageCredentials.name }}

到从私有注册表中拉取镜像的模板(例如 pod 或部署)。由于引用了 .Values.imageCredentials.name,您的代码段中未定义该名称,因此您需要添加它,如下所示:

image:
  repository: <repo>
  tag: <version tag>
  pullPolicy: IfNotPresent
imageCredentials:
  name: <registry_name>_credentials
  registry: <repo>
  username: <username>
  password: <pw>