k8s集群中搭建registry的重要性就多说了,大家都懂的:),我们这样干:
下载k8s安装包解压,registry相关文件在 kubernetes/cluster/addons/registry 文件夹下面,用TLS方式部署。普通方式需要修改docker的启动参数和重启docker,线上环境这么折腾不太合适。
步骤基本按照目录下的 README.md 说明文档进行:
1、用本地文件的方式创建secret,registry容器后面会挂载secret资源里面的证书文件。证书是机构颁发证书的nginx使用的版本,我试了很多种自签证书的方法,到最后都是通不过,手上有机构颁布的证书何乐而不为,域名是reg.mydomain.com。
1 | kubectl --namespace=kube-system create secret generic registry-tls-secret \ |
注意:在执行命令的当前目录下有reg.mydomain.com.crt和reg.mydomain.com.key证书文件,不然需要指定路径。
创建完成后,可以查看刚创建的名为registry-tls-secret的secret资源:
1 | kubectl describe secret registry-tls-secret --namespace kube-system |
还需要将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镜像。
1 | $ docker pull registry:2 |
当然了还有更简单的方法,不需要每个节点都有registry镜像,就是k8s可以根据node的标签,将pod调度到指定的node上面,先给node打标签,然后创建pod的rc文件加入nodeSelector定义即可。
3、创建pod和service
k8s安装包kubernetes/cluster/addons/registry/tls 目录下面有对应的说明文档和yaml文件。
1 | $ ls |
rc文件我按需求修改了3处地方,证书的公私钥文件名与registry-tls-secret中定义的一致:
1 | - name: REGISTRY_HTTP_TLS_CERTIFICATE |
挂载点image-store挂载的卷默认用的是node的本地文件系统,由于pod运行节点不固定性(可以指定pod运行的node,但是不够灵活,如果指定的node只有一个,那么就会有单节点故障问题,如果大于2个可选node,那么本地文件系统提交的image怎么转移),挂载卷采用了ceph集群提供的rdb块设备,这样就可以解决以上问题了。
1 | - name: image-store |
svc文件修改了一处地方,就是加入clusterIP定义固定registry的IP地址。
1 | spec: |
最后用kubectl由文件创建rc和svc。
1 | kubectl create -f registry-tls-rc.yaml |
4、每个节点本地hosts文件加入reg.mydomain.com的记录,就可以用于pull和push仓库中的镜像(pull和push的url是reg.mydomain.com:5000)。