盒子
盒子
文章目录
  1. 配置kubernetes的私有Registry
    1. 使用私有Registry的认证信息
    2. 使用预拉取方式
    3. 在Pod中指定ImagePullSecrets

自有主机上配置kubernetes的私有Registry

配置kubernetes的私有Registry

使用私有Registry的认证信息

在使用docker login [server]登录私有的Registry后,docker会把认证信息加密存储在$HOME/.docker/config.json文件里。之前在使用mesos/marathon集群时,都是通过marathon中的JSON中指定uri,即$HOME/.docker/config.json文件使marathon pull镜像时使用这个认证信息。

在kubernetes里同样,只要把认证信息文件放到docker的默认位置$HOME/.docker/config.json,也就算是已经配置过docker的认证信息。实际上kubelet pull镜像时就是使用docker的命令,自然会去读取这个认证文件。

需要配置认证信息,首先在一台node节点上登录:

1
docker login server

这样认证信息已经存储或更新到$HOME/.docker/config.json中,打开$HOME/.docker/config.json查看认证信息是否正确。

接下来获取kubernetes的node列表,如果只想获取所有node name的列表:

1
nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')

如果想获取所有node IP的列表:

1
nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}')

截止根据上面获取的列表,通过一个脚本去把上述的认证信息copy到列表的机器:

1
for n in $nodes; do scp ~/.docker/config.json root@$n:/root/.docker/config.json; done

然后通过创建一个包含私有镜像的pod来验证是否成功,关键一个yaml文件:

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF > /tmp/private-image-test-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
image: hub.fenxibao.com/base/node:7
imagePullPolicy: Always
command: [ "echo", "SUCCESS" ]
EOF

创建pod:

1
kubectl create -f /tmp/private-image-test-1.yaml

然后可以查看日志检查镜像有没有成功pull:

1
kubectl logs private-image-test-1

使用预拉取方式

这种方式也就是说提前在节点中把需要的镜像pull到主机本地,之后使kubernetes使用这个本地的镜像即可。

这种方式如上面所说,需要现在每个节点把镜像pull下来。接着在创建pod的时候指定imagePullPolicy的属性为IfNotPresentNever,这样节点上的镜像久可以被使用,也不需要从kubelet从私有Registry去pull。

在Pod中指定ImagePullSecrets

此种方式需要先配置一个secret,然后在创建pod时通过imagePullSecrets属性指定创建的secret。如果有多个registry即需要为每个分别创建一个secret。另外这种方式即通过引用pull secret方式只能在这个secret的namespace有效,因此如果有其他的namespace则需要每个namespace都这么配置一遍。

创建Secret

首先根据Docker的配置创建一个Secret:

1
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

其中myregistrykey就是创建的secret的名字,--docker-server指registry的服务地址,--docker-username指registry账号,--docker-password指密码,--docker-email指邮箱。

如果不便使用kubectl命令来创建secret,可以使用json或者yaml文件来创建。下面是一个yaml的示列:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson

其中注意的是对docker的配置文件(.docker/config.json)做base64编码,生成的字符串放在yaml中的.dockerconfigjson下,在设置其中的type为kubernetes.io/dockerconfigjson

在pod中引用secret
现在创建pods时添加imagePullSecrets属性来饮用secret,pod定义:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey

提交创建这个pod:

1
kubectl create -f /tmp/private-image-test-1.yaml

然后就可以查看日志验证是否成功。

支持一下
扫一扫,支持forsigner