K8S从私有仓库拉取镜像

通常来讲,我们在通过公共镜像仓库拉取docker镜像的时候,不需要任何的认证操作,但我们在构建了企业的私有镜像以后,就不得不在拉取镜像之前通过用户名密码来完成认证。

在docker单机环境中,我们可以直接在宿主机上执行docker login https://myhub.fdccloud.com类似这种命令的方式来完成认证。但在通过kubernetes来对docker做相关集群管理时,就不得不在所有的节点机上通过上面那种方式完成认证。这在大规模的应用架构中,是不可取的。

当然,我们有另外一种稍微简便的方法。事实上,在执行docker login https://xxxxx完成认证的时候,实际是在当前用户的家目录的.docker目录下生成了一个config.json文件。我们查看该文件的内容如下:

    {
    	"auths": {
    		"https://myhub.fdccloud.com": {
    			"auth": "xxxx",
    			"email": "yanw02@mysoft.com.cn"
    		},
    	}
    }

这个文件包含了认证信息。所以另一个可行的办法,就是直接将该文件通过自动化的方式,推送到所有节点机的相应目录即可。但在实际的测试中,这种方式推送的节点仍然会偶尔出现认证失败的情况,具体什么原因目前尚不清楚。

kubernetes提供多种针对私有仓库认证的方式,在这里,我只说明其中的一种方法,也是我实际使用的方法,通过k8s的secret来实现。

  1. 在k8s master上通过docker login登录registry,生成config.json文件。然后执行如下命令,将文件转换成base64编码:
    cat /root/.docker/config.json|base64 -w 0
  1. 生成registrykey-myhub.yml的配置文件,内容如下:
    apiVersion: v1
    kind: Secret
    metadata:
      name: registrykey-myhub
      namespace: default
    type: kubernetes.io/dockerconfigjson
    data:
      .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJodHRwczovL215aHViLmZkY2Nsb3VkLmNvbS8iOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2VFhsemIyWjBPVFU1TXpnPSIsCgkJCSJlbWFpbCI6ICJ5YW53MDJAbXlzb2Z0LmNvbS5jbiIKCQl9Cgl9Cn0=
    
    #创建secret:
    kubectl create -f registrykey-myhub.yml
  1. 在创建pod时,指定imagePullSecrets,示例如下:
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: sqltools-ycz
      labels:
        name: sqltools-ycz
    spec:
      replicas: 1
      selector:
        name: sqltools-ycz
      template:
        metadata:
          labels:
            name: sqltools-ycz
        spec:
          containers:
          - name: sqltools-ycz
            image: myhub.fdccloud.com/common/sqltools
            ports:
            - containerPort: 80
            env:
            - name: DB_HOST
              value: "mysql-ycz.default.svc.cluster.local"
            - name: DB_NAME
              value: "config"
            - name: DB_USERNAME
              value: "ycz"
            - name: DB_PASSWORD
              value: "77TqrfPaMbwaZXYu"
            - name: CACHE_HOST
              value: "memcached-ycz.default.svc.cluster.local"
            - name: CACHE_PORT
              value: "11211"
            - name: CACHE_PREFIX
              value: "ycz"
          nodeSelector:
            kubernetes.io/hostname: k8s-master
          imagePullSecrets:
          - name: registrykey-myhub

官方文档配置说明如下:
https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

需要说明的是,按照官方文档的配置,验证是失败的,这一点确实是很奇怪。

原文地址:https://www.cnblogs.com/breezey/p/9105622.html