在k8s中搭建registry私有仓库

k8s集群中搭建registry的重要性就多说了,大家都懂的:),我们这样干:
下载k8s安装包解压,registry相关文件在 kubernetes/cluster/addons/registry 文件夹下面,用TLS方式部署。普通方式需要修改docker的启动参数和重启docker,线上环境这么折腾不太合适。
步骤基本按照目录下的 README.md 说明文档进行:
1、用本地文件的方式创建secret,registry容器后面会挂载secret资源里面的证书文件。证书是机构颁发证书的nginx使用的版本,我试了很多种自签证书的方法,到最后都是通不过,手上有机构颁布的证书何乐而不为,域名是reg.mydomain.com。

        
kubectl --namespace=kube-system create secret generic registry-tls-secret --from-file=reg.mydomain.com.crt=reg.mydomain.com.crt --from-file=reg.mydomain.com.key=reg.mydomain.com.key
        

注意:在执行命令的当前目录下有reg.mydomain.com.crt和reg.mydomain.com.key证书文件,不然需要指定路径。
创建完成后,可以查看刚创建的名为registry-tls-secret的secret资源:

        
kubectl describe secret registry-tls-secret --namespace kube-system
Name:        registry-tls-secret
Namespace:    kube-system
Labels:        <none>
Annotations:    <none>

Type:    Opaque

Data
====
reg.mydomain.com.crt:    6486 bytes
reg.mydomain.com.key:    1678 bytes
        

还需要将reg.hoodinn.com.crt证书拷贝到集群每个node的/etc/docker/certs.d/reg.mydomain.com/ 目录下。

2、获取registry 镜像,需要该节点有公网IP,k8s调度器通过一系列的算法计算出pod调度部署到某node节点,没有确定性。那么需要在每个节点都pull registry 镜像,但是集群内部的node基本都是没有公网IP的,可以用 docker save 和 docker load 一番腾挪让每个节点都有registry镜像。
docker pull registry:2
docker save -o registry2.tar registry:2
docker load –input registry2.tar
当然了还有更简单的方法,不需要每个节点都有registry镜像,就是k8s可以根据node的标签,将pod调度到指定的node上面,先给node打标签,然后创建pod的rc文件加入nodeSelector定义即可。

3、创建pod和service
k8s安装包kubernetes/cluster/addons/registry/tls 目录下面有对应的说明文档和yaml文件。

     
➜  tls ls
README.md             registry-tls-rc.yaml  registry-tls-svc.yaml
➜  tls
        

rc文件我按需求修改了3处地方,证书的公私钥文件名与registry-tls-secret中定义的一致:

      
        - name: REGISTRY_HTTP_TLS_CERTIFICATE
          value: /certs/reg.mydomain.com.crt
        - name: REGISTRY_HTTP_TLS_KEY
          value: /certs/reg.mydomain.com.key
        

挂载点image-store挂载的卷默认用的是node的本地文件系统,由于pod运行节点不固定性(可以指定pod运行的node,但是不够灵活,如果指定的node只有一个,那么就会有单节点故障问题,如果大于2个可选node,那么本地文件系统提交的image怎么转移),挂载卷采用了ceph集群提供的rdb块设备,这样就可以解决以上问题了。

      
      - name: image-store
        rbd:
          monitors:
          - 10.8.8.18:6789
          - 10.8.8.28:6789
          - 10.8.8.38:6789
          pool: rbd
          image: dockreg
          user: admin
          keyring: "/etc/ceph/ceph.client.admin.keyring"
          fsType: ext4
          readOnly: false
        

svc文件修改了一处地方,就是加入clusterIP定义固定registry的IP地址。

      
spec:
  clusterIP: 10.123.123.88
        

最后用kubectl由文件创建rc和svc。

kubectl create -f registry-tls-rc.yaml
kubectl create -f registry-tls-svc.yaml
    

4、每个节点本地hosts文件加入reg.mydomain.com的记录,就可以用于pull和push仓库中的镜像(pull和push的url是reg.mydomain.com:5000)。

文章出处: https://www.xiaomastack.com/2016/08/03/k8s-registry/

发表评论:

你的电子邮件地址将不会被公开.

+ 78 = 87