在k8s中搭建registry私有仓库

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

1
2
3
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资源:

1
2
3
4
5
6
7
8
9
10
11
12
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镜像。

1
2
3
$ 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文件。

1
2
3
$ ls
README.md registry-tls-rc.yaml registry-tls-svc.yaml
$

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

1
2
3
4
- 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块设备,这样就可以解决以上问题了。

1
2
3
4
5
6
7
8
9
10
11
12
- 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地址。

1
2
spec:
clusterIP: 10.123.123.88

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

1
2
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)。

----------------本文结束 感谢阅读----------------