0%

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

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

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

创建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 --docker-email=admin@harbor.com

第二种方式: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

如何使用刚刚创建的docker-registry呢?两种方式:

  • 一种是每次在创建pod或者deployment时指定imagePullSecrets
  • 一种是在该namespaceserviceaccount【默认default,如果是别的serviceaccount,需要在创建pod时指定spec.serviceAccount】中指定imagePullSecrets,这样用该serviceaccount创建的pod会自动加上。
spec:
  imagePullSecrets:
  - name: test-registry-secret

第一种

每次创建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

第二种

以创建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定义中附加上下面这样的密钥认证信息了。

最后测试一下吧。