使用docker从私有仓库拉取经销,可以使用docker login [私有仓库地址] 然后输入用户名和密码登录后就可以拉取镜像了,但如果使用k8s时,node 节点过多,难道需要跑到每个node节点去执行一次登录么?当然不是.这里就牵扯到k8s中的一个secret的东西.
Secret 有三种类型:
- Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
- Opaque :base64编码格式的Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
这里主要介绍第三种kubernetes.io/dockerconfigjson 如何使用.当使用k8s命令启动pod时,出现了
rpc error: code = Unknown desc = Error response from daemon: pull access denied for 222.212.85.199:12375/gzlt/gzlt, repository does not exist or may require 'docker login'
rpc error: code = Unknown desc = Error response from daemon: pull access denied for 222.212.85.199:12375/gzlt/gzlt, repository does not exist or may require 'docker login'
这样的错误提示,一般就是没有通过身份验证.,这时,就需要设置验证信息,来告诉docker,然后通过验证后拉取镜像.
首先通过kubectl 命令创建secret
kubectl create secret docker-registry [secret名称] --docker-server=[私有仓库ip:端口] --docker-username=[用户名] --docker-password=[密码] --namespace=[k8s命名空间]
这里选择docker-registry类型创建secret
需要注意的是: --namespace 参数和后面使用此secret 的pod 有密切的关系.如果他们不在同一个命名空间,也是不会验证成功的.
然后就是在创建pod的yaml文件中添加secret
apiVersion: v1
kind : ReplicationController
metadata:
name :
namespace:
spec:
replicas: 2
selector :
app :
template:
metadata:
labels :
app :
spec:
containers:
- name :
image :
imagePullPolicy: IfNotPresent
ports :
- name: webservice
containerPort: 8088
- name:
containerPort: 9081
imagePullSecrets:
- name: [secret名称] --这里就配置你刚才创建的secret 的名称即可
然后再次创建pod 就可以了.
ps: 网上还有很多创建secret 的方法,这里就不说了,毕竟也没有使用过.感兴趣的可以自己再去多了解一下.