通常在实际的项目中用kubernetes做开发的时候,会用到私有的registry(镜像仓库),比如:在创建应用的时候,镜像用的就是私有仓库的镜像。但是通常会有一个问题,如果你的私有的镜像仓库做了认证和授权,kubernetes在创建应用的时候去获取私有仓库镜像就会失败,会报没有认证的错误。有两种方式去解决。
- 在k8s中的每个集群中的node节点中去docker login 登录。显然这种方式不合理。
- 通过k8s的secret来做。
下面我主要讲解的就是第二种方式。
首先在其中一个node上登录私有仓库
docker login hub.yfcloud.io
登录成功后会在/root/.docker目录下生产config.json文件,然后执行如下命令:
cat /root/.docker/config.json | base64
该命令会将你的认证信息通过base64编码,生成一个编码之后的字符串,在linux中terminal中看到是两行,但是其实质是一行,所以之后要用到的这个字符串需要合并为一行。
在kubernetes中的master节点中创建secret 元素:
apiVersion: v1
kind: Secret
metadata:
name: hub.yfcloud.io.key
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJkb2NrZXIuY29vY2xhLm9yZyI6IHsKCQkJImF1dGgiOiAiWkdWMk9tUnZZMnRsY2c9PSIsCgkJCSJlbWFpbCI6ICIiCgkJfQoJfQp9
其中name你可以随便取,推荐用私有仓库地址.key的方式命名。
之后在创建其他元素的时候指定:imagesPullSecrets即可。例如:
pod:
apiVersion: v1
kind: Pod
metadata:
name: go-web
spec:
containers:
- name: go-web
image: hub.yfcloud.io/go-web
imagePullSecrets:
- name: hub.yfcloud.io.key
replicationController:
apiVersion: v1
kind: ReplicationController
metadata:
name: go-web
labels:
name: go-web
spec:
replicas: 1
selector:
name: go-web
template:
metadata:
labels:
name: go-web
spec:
containers:
- name: go-web
image: hub.yfcloud.io/go-web
ports:
- containerPort: 9080
resources:
limits:
cpu: 100m
memory: 100Mi
imagePullSecrets:
- name: hub.yfcloud.io.key
其中要修改k8s部署各个节点(未验证, 应该是只修改 master 上即可) /etc/docker/daemon.json, "insecure-registries": ["hub.yfcloud.io"] 重启 docker, systemctl restart docker
|