k8s与harbor联合使用【k8s拉取harbor中镜像】

前提:已经搭建K8s集群、harbor服务,且已经在机器上配置可以从harbor中拉取上传镜像。

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

  • 创建docker-registry,有两种方式,命令行和YAML

第一种方式:命令行

kubectl create secret docker-registry test-deri-registry-secret --namespace=test-namespace \ 
--docker-server=hub.test.org.cn --docker-username=test2019 \ 
--docker-password=tests12019 [email protected]

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

{
	"auths": {
		"hub.test.org.cn:443": {
			"auth": "YWRtaW46RGVxasdXXnsada"
		}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.4 (linux)"
	}
}

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

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

编写test-registry-secret.yaml

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

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

使用命令查看结果

kubectl get secret -n test-namespace
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: test-registry-secret

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

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

可以看到当前的Image pull secrets:   ,需要为它指定成刚刚我们创建的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:              
Annotations:         
Image pull secrets:  test-registry-secret
Mountable secrets:   default-token-5fcn5
Tokens:              default-token-5fcn5
Events:              

接下来在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

最后测试一下吧。

你可能感兴趣的:(kubernetes,Harbor)