k8s 拉取私有镜像仓库

k8s 部署的时候如何拉去私有镜像库的镜像?

简介

  • 通常 deployment / statefulset 中是这样的
  • 这儿的 imagePullSecrets 就指定了拉取密钥
    1
    2
    3
    4
    5
    6
    7
    spec:
    containers:
    - name: xxx
    image: registry.cn-shanghai.aliyuncs.com/xxx/xxxx:latest
    imagePullPolicy: Always
    imagePullSecrets:
    - name: aliyun-docker

密钥如何生成?

  • 创建一个 secret:
    1
    kubectl create secret docker-registry regsecret --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
  • 在这里:
    • 是你的私有仓库的FQDN.
    • 是你的 Docker 用户名.
    • 是你的 Docker 密码.
    • 是你的 Docker 邮箱.

导出密钥

1
kubectl get secret regsecret --output=yaml
  • 输出类似这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    apiVersion: v1
    data:
    .dockercfg: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
    kind: Secret
    metadata:
    ...
    name: regsecret
    ...
    type: kubernetes.io/dockercfg
  • .dockercfg 的值是一个经过 base64 加密的数据。

  • 把这串 base64 加密的数据复制到一个名为 secret64 的文件里.

  • 重要: 确保你的 secret64 的文件内容没有任何换行。

  • 想知道 .dockercfg 的内容是什么意思,只要将 secret 数据转换成可读格式即可:

    1
    base64 -d secret64
  • 输出类似这样:

    1
    {"yourprivateregistry.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}

    注意到 secret 数据其实包含了你的 config.json 文件里的验证口令。

tips

  • 建议先通过 kubectl create secret 命令本地生成密钥,然后再通过 kubectl get secret xxx --output=yaml 命令将其导出。