实现方案
1、在高可用k8s集群上复用k8s的vip,registry的域名dockerhub.kubekey.local指向这个vip;
2、在部署了keepalived的节点上同样部署registry;
3、Registry本地保存镜像的目录/mnt/registry挂载后端的共享文件存储glusterfs,实现所有registry所在节点保存的镜像一致性;
4、当node节点上拉取镜像时,通过vip所在节点的registry拉取镜像;当vip漂移至其他节点,则通过vip漂移后所在节点上的registry拉取镜像。
搭建过程
部署haproxy+keepalived(略)
部署在master1/master2/master3节点上
部署glusterfs
第1步, 在所有storage服务器上(不包括client)安装glusterfs-server软件包,并启动服务
下面的命令所有存储服务器都要做,本环境master1/master2/master3即为服务端也做客户端使用。
执行yum 本地安装glusterfs
# yum localinstall gluster_rpm/*.rpm -y
# systemctl start glusterd
# systemctl enable glusterd
# systemctl status glusterd
第2步, 所有storage服务器建立连接,成为一个集群
3个storage服务器建立连接不用两两连接,只需要找其中1个,连接另外2个各一次
下面在192.168.10.102(master3)上操作
# gluster peer probe 192.168.10.100
# gluster peer probe 192.168.10.101 ---这里使用ip,主机名,主机名别名都可以
然后在所有存储上都可以使用下面命令来验证检查
# gluster peer status
第3步, 所有storage服务器准备存储目录(可以用单独的分区,也可以使用根分区)
这里用根分区来做实验
但生产环境肯定是不建议数据盘和系统盘在一起的
# mkdir -p /data/gv0
第4步, 创建存储卷(在任意一个storage服务器上做)
改变的操作(create,delete,start,stop)等只需要在任意一个storage服务器上操作,查看的操作(info)等可以在所有storage服务器上操作
下面命令在192.168.10.102(master3)上操作
因为在根分区创建所以需要force参数强制
replica 3表示是在3台上做复制模式(类似raid1)
# gluster volume create gv0 replica 3 192.168.10.100:/data/gv0/ 192.168.10.101:/data/gv0/ 192.168.10.102:/data/gv0/ force
第5步, 启动存储卷
# gluster volume start gv0
第6步, client安装软件
客户端上操作
client# yum install glusterfs glusterfs-fuse -y (第一步已完成离线安装)
说明:
fuse(Filesystem in Userspace): 用户空间文件系统,是一个客户端挂载远程文件存储的模块
第7步, client挂载使用
注意:客户端也需要在/etc/hosts文件里绑定存储节点的主机名才可以挂载
在master1/master2/master3节点上分别执行
# mkdir /mnt/registry
# mount -t glusterfs 192.168.10.100:gv0 /mnt/registry/
除了使用mount挂载,还可以使用/etc/fstab自动挂载
添加:192.168.10.100:/gv0 /mnt/registry glusterfs defaults,_netdev 0 0
部署registry
说明:
社区kubekey只支持在单一节点上部署registry,本地做了改造,修改了两处代码,在多节点部署验证通过。
kubekey参考模板:config-kubekey.yaml
apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Cluster metadata: name: sample spec: hosts: - {name: master1, address: 192.168.10.100, internalAddress: 192.168.10.100, user: root, password: "xxxxxx"} - {name: master2, address: 192.168.10.101, internalAddress: 192.168.10.101, user: root, password: "xxxxxx"} - {name: master3, address: 192.168.10.102, internalAddress: 192.168.10.102, user: root, password: "xxxxxx"} roleGroups: etcd: - master1 - master2 - master3 control-plane: - master1 - master2 - master3 worker: - master1 - master2 - master3 registry: - master1 - master2 - master3 controlPlaneEndpoint: ## Internal loadbalancer for apiservers # internalLoadbalancer: haproxy
domain: lb.kubesphere.local address: "192.168.10.110" port: 7443 kubernetes: version: v1.22.9 clusterName: cluster.local autoRenewCerts: true containerManager: containerd kata: enabled: true
etcd: type: kubekey network: plugin: kubeovn kubePodsCIDR: 10.233.64.0/18 kubeServiceCIDR: 10.233.0.0/18 multusCNI: enabled: false registry: # 如需使用 kk 部署 harbor, 可将该参数设置为 harbor,不设置该参数且需使用 kk 创建容器镜像仓库,将默认使用docker registry。 #type: harbor # 如使用 kk 部署的 harbor 或其他需要登录的仓库,可设置对应仓库的auths,如使用 kk 创建的 docker registry 仓库,则无需配置该参数。 # 注意:如使用 kk 部署 harbor,该参数请于 harbor 启动后设置。 auths: "dockerhub.kubekey.local": # username: admin # password: Harbor12345 cafile: /etc/docker/certs.d/dockerhub.kubekey.local/ca.crt certfile: /etc/docker/certs.d/dockerhub.kubekey.local/dockerhub.kubekey.local.cert keyfile: /etc/docker/certs.d/dockerhub.kubekey.local/dockerhub.kubekey.local.key # 设置集群部署时使用的私有仓库 privateRegistry: "dockerhub.kubekey.local" namespaceOverride: "" registryMirrors: [] insecureRegistries: [] addons: [] |