概要:

要想k8s从harbor中拉取镜像,需要有harbor的用户、密码、服务器信息,然后在k8s指定namespace中创建docker-registry类型。

创建docker-registry

有两种方式,命令行和YAML

第一种方式:命令行

kubectl create secret docker-registry secret名称 --namespace=test-namespace \ 
--docker-server=harborIP --docker-username=账号 \ 
--docker-password=密码 --docker-email=邮箱

第二种方式:YAML,需要有一台已经成功登录过harbor服务器的机器,使用命令'cat ~/.docker/config.json',确认是否有harbor服务器的认证信息,例如

{
	"auths": {
		"173.16.243.114:80": {
			"auth": "YWRtaW46VGpocWNubWQ="
		}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.9 (linux)"
	}
}

接下来k8s也可以直接使用该认证信息,使用命令'cat ~/.docker/config.json |base64 -w 0'将该认证信息BASE64编码【以下示例密文都是瞎写的,请使用自己返回的结果】。

[root@master ~]# cat .docker/config.json |base64 -w 0

得到一串密文

创建secret

test-registry-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: test-registry-secret
  namespace: test-deri
data:
  .dockerconfigjson: 密文内容
type: kubernetes.io/dockerconfigjson

使用命令'kubectl create -f test-registry-secret.yaml或者在dashboard中用上述YAML即可创建docker-registry。

使用命令查看结果

kubectl get secret -n test-namespace2
kubectl describe secret test-registry-secret -n test-namespace

配置

如何使用刚刚创建的docker-registry呢?两种方式,一种是每次在创建pod或者deployment时指定imagePullSecrets,或者在该namespace的serviceaccount【默认default,如果是别的serviceaccount,需要在创建pod时指定spec.serviceAccount】中指定imagePullSecrets,这样用该serviceaccount创建的pod会自动加上

spec:

imagePullSecrets:

- name: secret名称

以创建namespace时自动创建的serviceaccount default为例,首先查看default的详细情况

[root@master ~]# kubectl describe sa test-deri -n test-namespace
Name:                test-deri
Namespace:           test-namespace
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   test-deri-token-rmxbn
Tokens:              test-deri-token-rmxbn
Events:              <none>

可以看到当前的Image pull secrets: <none> ,需要为它指定成刚刚我们创建的secret。使用命令

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "test-registry-secret"}]}' -n test-namespace

或者使用命令

kubectl edit sa default -n test-namespace

在打开的YAML文件中添加两行,保存退出。

imagePullSecrets:
- name: test-registry-secret

最后再次查看default的详细情况,可以看到 Image pull secrets: test-registry-secret

[root@master ~]# kubectl describe sa default -n test-namespace
Name:                default
Namespace:           test-namespace
Labels:              <none>
Annotations:         <none>
Image pull secrets:  test-registry-secret
Mountable secrets:   default-token-5fcn5
Tokens:              default-token-5fcn5
Events:              <none>

接下来在test-namespace命名空间下用default这个serviceaccount创建的任何pods容器,都会自动在pod定义中附加上下面这样的密钥认证信息了。

另一种方式,每次创建pod时指定secret,例如

apiVersion: v1
kind: Pod
metadata:
  name: test-baresystem
  namespace: test-namespace
spec:
  containers:
    - name: test-baresystem
      image: hub.test.org.cn/dev-project/centos6-bare-system:v0
      ports:
      - containerPort: 8080
        hostPort: 30001
  imagePullSecrets:
    - name: test-registry-secret