从私有仓库读取镜像时可能需要密钥,通用的做法是在每个命名空间创建ImagePullSecrets,在 Pod 上指定 ImagePullSecrets完成私有镜像的拉取。
创建ImagePullSecrets的命令
- kubectl create secret docker-registry myregistrykey --docker-server=DUMMY_SERVER \
- --docker-username=DUMMY_USERNAME --docker-password=DUMMY_DOCKER_PASSWORD \
- --docker-email=DUMMY_DOCKER_EMAIL
基于已有的docker login凭据创建secret
Kubernetes 集群使用 kubernetes.io/dockerconfigjson
类型的 Secret 来通过镜像仓库的身份验证,进而提取私有镜像。如果你已经运行了 docker login
命令,你可以复制该镜像仓库的凭证到 Kubernetes.
- kubectl create secret generic my-docker-register \
- --from-file=.dockerconfigjson=
\ - --type=kubernetes.io/dockerconfigjson
在所有命名空间创建secret的脚本
- #!/bin/bash
- ns_list=`kubectl get ns | awk '{print $1}' | grep -v NAME`
- for ns in $ns_list;
- do
- kubectl create secret docker-registry imagePullSecret-registry \
- --docker-server=服务器地址 \
- --docker-username=admin \
- --docker-password=****** \
- --docker-email=****** \
- -n $ns
- done;
每个命名空间都有一个名为 default
的服务账户资源,当你创建 Pod 时,如果没有指定服务账户,Pod 会被指定给命名空间中的 default
服务账户,通过把 ImagePullSecrets添加到默认账户default中,具体命令如下
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
在所有命名空间,批量添加的脚本如下
- #!/bin/bash
- ns_list=`kubectl get ns | awk '{print $1}' | grep -v NAME`
- for ns in $ns_list;
- do
- kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}' -n $ns
- done;
也可以手动编辑
你也可以使用 kubectl edit
,或者如下所示手动编辑 YAML 清单:
kubectl get serviceaccounts default -o yaml > ./sa.yaml
sa.yaml
文件的输出类似这样:
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- creationTimestamp: 2015-08-07T22:02:39Z
- name: default
- namespace: default
- resourceVersion: "243024"
- uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
- secrets:
- - name: default-token-uudge
使用你常用的编辑器(例如 vi
),打开 sa.yaml
文件,删除带有键名 resourceVersion
的行,添加带有 imagePullSecrets:
的行,最后保存文件。
所得到的 sa.yaml
文件类似于:
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- creationTimestamp: 2015-08-07T22:02:39Z
- name: default
- namespace: default
- uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
- secrets:
- - name: default-token-uudge
- imagePullSecrets:
- - name: myregistrykey
最后,使用新更新的 sa.yaml
文件替换服务账户。
kubectl replace serviceaccount default -f ./sa.yaml
现在,在当前命名空间中创建使用默认服务账户的新 Pod 时,新 Pod 会自动设置其 .spec.imagePullSecrets
字段
- kubectl run nginx --image=nginx --restart=Never
- kubectl get pod nginx -o=jsonpath='{.spec.imagePullSecrets[0].name}{"\n"}'
输出结果为
myregistrykey