使用kubernetes中搭建registry私有仓库

kubernetes集群中搭建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,kubernetes调度器通过一系列的算法计算出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镜像,就是kubernetes可以根据node的标签,将pod调度到指定的node上面,先给node打标签,然后创建pod的rc文件加入nodeSelector定义即可。

3、创建pod和service

kubernetes安装包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.hoodinn.com:5000)。

分享到:更多 ()