K8S 如何使用 imagePullSecrets 列表处理 POD 定义中的多个远程 docker 寄存器

how does K8S handles multiple remote docker registeries in POD definition using imagePullSecrets list

我想访问多个远程注册表来拉取镜像。 在 k8s documentation 他们说:

(If you need access to multiple registries, you can create one secret for each registry. Kubelet will merge any imagePullSecrets into a single virtual .docker/config.json)

所以 POD 定义应该是这样的:

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: ...
  imagePullSecrets:
    - name: secret1
    - name: secret2
    - ....
    - name: secretN

现在我不确定K8S如何为每张图片选择正确的秘密?每次都会一一验证所有的秘密吗? K8S 将如何处理重试失败?如果特定数量的未经授权的重试可能导致 k8sor docker 注册表中的某些锁定状态?

/谢谢

Kubernetes 不会尝试所有秘密直到找到正确的。当您创建秘密时,您指的是它是一个 docker 注册表:

$ kubectl create secret docker-registry user1-secret --docker-server=https://index.docker.io/v1/ --docker-username=user1 --docker-password=PASSWORD456 --docker-email=user1@email.com

$ kubectl create secret docker-registry user2-secret --docker-server=https://index.docker.io/v1/  --docker-username=user2 --docker-password=PASSWORD123 --docker-email=user2@email.com

$ kubectl get secrets user1-secret -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJkb2NrZXIuZXhhbXBsZS5jb20iOnsidXNlcm5hbWUiOiJrdWJlIiwicGFzc3dvcmQiOiJQV19TVFJJTkciLCJlbWFpbCI6Im15QGVtYWlsLmNvbSIsImF1dGgiOiJhM1ZpWlRwUVYxOVRWRkpKVGtjPSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2020-01-13T13:15:52Z"
  name: user1-secret
  namespace: default
  resourceVersion: "1515301"
  selfLink: /api/v1/namespaces/default/secrets/user1-secret
  uid: d2f3bb0c-3606-11ea-a202-42010a8000ad
type: kubernetes.io/dockerconfigjson

如您所见,type is kubernetes.io/dockerconfigjson 告诉 Kubernetes 以不同的方式对待它。

因此,当您在 yaml 中将容器地址引用为 magic.example.com/magic-image 时,Kubernetes 将有足够的信息来连接这些点并使用正确的秘密来拉取您的图像。

apiVersion: v1
kind: Pod
metadata:
  name: busyboxes
  namespace: default
spec:
  imagePullSecrets:
  - name: user1-secret
  - name: user2-secret
  containers:
  - name: jenkins
    image: user1/jenkins
    imagePullPolicy: Always
  - name: busybox
    image: user2/busybox
    imagePullPolicy: Always    

因此,如本示例所述,可能有 2 个或更多 docker 注册表机密具有相同的 --docker-server 值。 Kubernetes 将设法无缝地处理它。

您可以使用以下脚本在一个密文中添加两个身份验证

#!/bin/bash

u1="user_1_here"
p1="password_1_here"
auth1=$(echo -n "$u1:$p1" | base64 -w0)

u2="user_2_here"
p2="password_2_here"
auth2=$(echo -n "$u2:$p2" | base64 -w0)

cat <<EOF > docker_config.json
{
  "auths": {
    "repo1_name_here": {
      "auth": "$auth1"
    },
    "repo2_name_here": {
      "auth": "$auth2"
    }
  }
}
EOF

base64 -w0 docker_config.json > docker_config_b64.json

cat <<EOF | kubectl apply -f -
apiVersion: v1
type: kubernetes.io/dockerconfigjson
kind: Secret
data:
  .dockerconfigjson: $(cat docker_config_b64.json)
metadata:
  name: specify_secret_name_here
  namespace: specify_namespace_here
EOF