k8s无脑系列(五)-创建私有仓库(一)

liusaisoso 2020-03-08

k8s无脑系列-创建私有仓库(一)

1. 意义

  • 与CI/CD联动

  • 私有库属于公司/组织最重要的线上财产必须得到保护

2. 需要解决的问题

先提出问题,为什么需要Secret?

密码、令牌不能被随意公布。存到集群里,让需要的Pod或者其它资源(rc,pod等)可以拿到必须的令牌内容等等。甚至MySQL之类的密码都可以存储到Secret中。这里不做更多的讨论。仅限于用在私有仓库中这种情景。

2.1 k8s的Pod使用私有仓库时需要认证过程

比如使用阿里云私有仓库(啰嗦一句,自己搭建的一样,阿里的现成可用),虽然Docker可以通过设置/etc/daemon.json实现Pull的过程,但k8s在不通的Node去创建Pod就不行了。Emm,其实也不是不行,总不能给所有Node同步$HOME/.docker/config.json吧。另外不同的namespace为了安全不能用一个账户来操作私有仓库,所以分namespace的认证过程是必须的。

我们先用阿里云这个现成的私有仓库举例子,来观察整个过程。

使用私有仓库镜像时必须先登录

$docker login  registry.cn-hangzhou.aliyuncs.com

在$HOME/.docker/config.json可以看到

{
  "auths": {
    "registry.cn-beijing.aliyuncs.com": {
         "auth": "NzU0NDg5NTUxQHFxLmNvbTptb3dwaWgtd2lwbnlqLWt1bWtVNg=="
       }
     }
   }
$docker pull registry.cn-beijing.aliyuncs.com/smokelee/redis # 私有库

2.2 首先要创建k8s的Secret

假设现在已经有“私有仓库”比如:阿里云

  1. 命令行创建

    $kubectl create secret docker-registry registry-secret-aliyun --docker-server=registry.cn-beijing.aliyuncs.com  --docker-password=xxxxxxx

    参数说明:以下参数都可以通过执行下述命令得到说明

    $kubectl create secret docker-registry
    • docker-registry 该参数有三个值docker-registry、generic、tls
    • registry-secret-aliyun Secret的名称,什么名字都可以,随意
    • --docker-server 仓库地址
    • --docker-username 仓库账户名称
    • --docker-password 仓库密码

    验证

    $kubectl describe secret registry-secret-aliyun
    Name:         registry-secret-aliyun
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  kubernetes.io/dockerconfigjson
    
    Data
    ====
    .dockerconfigjson:  113 bytes
  2. yaml文件创建

    事实上,docker-registry类型的不能通过这种方式创建,这个yaml是用命令反向推出来的。就是演示。

    $kubectl get secret registry-secret-aliyun -o yaml
    apiVersion: v1
    type: kubernetes.io/dockerconfigjson
    kind: Secret
    metadata:
      name: registry-secret-aliyun
      namespace: default
    data:
      .dockerconfigjson: eyJhxxxxxx.......x19

2.3 资源文件使用Secret

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-ali
spec:
  replicas: 1
  selector:
    app: redis-pod-ali
  template:
    metadata:
      labels:
        app: redis-pod-ali
    spec:
      containers:
      - name: redis-ali
        image: registry.cn-beijing.aliyuncs.com/smokelee/redis # 私有镜像
        ports:
        - containerPort: 6379
      imagePullSecrets:
      - name: registry-secret-aliyun # 名字要与创建命令参数保持一致

查看是否已经被其它节点部署,注意node2是节点,此前并未下载过"registry.cn-beijing.aliyuncs.com/smokelee/redis" 这个私有镜像

$kubecel get pod redis-ali -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
mysql-rc-q5pps    1/1     Running   2          2d    10.244.1.7    node1.smokelee.com   <none>           <none>
redis-ali-6s52k   1/1     Running   0          3s    10.244.2.11   node2.smokelee.com   <none>           <none>

相关推荐