【实践记录】 K8s部署Harbor高可用
Vmware的Harbor镜像库集成了Docker的Registry功能外,提供了丰富的界面和同步镜像库的功能,为项目中存储和管理镜像提供了良好的基础环境。
安装共享存储
Registry的镜像数据使用文件系统存储,即使服务器磁盘已做RAID,也需在架构上保证在物理机和虚拟机出问题时能快速恢复。因此利用K8s挂载存储是较好的方法。这里我们选择Glusterfs做共享存储。
每台机器上安装并启动Glusterfs(Ubuntu系统):
apt-get install glusterfs-server
service glusterfs-server start组件集群(在其中一台机——通常是主服务器——上执行)
gluster peer probe
<other-ip-or-hostname>
gluster peer status这里使用replica复制存储,在提供存储的机器上建立目录和挂载磁盘
mkdir -p /sharedata/glusterdata/harbordata gluster volume create harbordata replica 2 \ 172.18.63.22:/sharedata/glusterdata/harbordata/ \ 172.18.63.24:/sharedata/glusterdata/harbordata/ force gluster volume info
- 在管理节点把共享存储mount到一个目录上。以后对文件的管理通过该mount目录进行管理而不能直接操作实际存储服务器上的文件。
mkdir -p /mnt/harbordata
mount -t glusterfs 172.18.63.22:harbordata /mnt/harbordata
gluster volume start harbordata
gluster volume status
安装K8s
这里使用Rancher2.0的RKE安装一个K8s集群并配置好kubectl。编写Yaml和部署实例
获取Harbor 1.5(实际安装的是1.2)的源码
git clone https://github.com/goharbor/harbor.git
修改
make/harbor.cfg
配置进入
/harbor-release-1.5.0/make/kubernetes
目录- 新建文件夹glusterfs
mkdir glusterfs
- 编辑 harbor-gluster.yaml 为K8s添加gluster的endpoint和service
apiVersion: v1 kind: Endpoints metadata: name: ep-glusterfs-harbor-r2 namespace: ci-cd subsets: - addresses: - ip: 172.18.63.24 ports: - port: 49152 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: ep-glusterfs-harbor-r2 namespace: ci-cd spec: ports: - port: 49152 protocol: TCP targetPort: 49152 sessionAffinity: None type: ClusterIP
- 编辑pv 目录下的
registy.pv.yaml
、storage.pv.yaml
把存储改为glusterfs.
spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain glusterfs: endpoints: "ep-glusterfs-harbor-r2" path: "harbordata" readOnly: false
- 配置mysql也使用共享存储 (mysql/mysql.deploy.yaml)
volumeMounts: - name: mysql-storage mountPath: /var/lib/mysql subPath: "storage" volumes: - name: mysql-storage persistentVolumeClaim: claimName: storage-pvc
- 配置Registry使用共享存储(registry/registry.deploy.yaml)
volumeMounts: - name: storage mountPath: /etc/registry subPath: "config" - name: storage mountPath: /storage subPath: "registry" volumes: - name: storage persistentVolumeClaim: claimName: registry-pvc
除jobservice和mysql外,其他按需要调整实例个数
生成configmap文件
python make/kubernetes/k8s-prepare
- 配置ingress:官方提供的配置相当简单,实际使用时有很多问题。主要是上传缓存大小没配,一般镜像单层可达到几百m,上传会失败。如果ui、registry起多个实例,其默认没有共享session,必须设置sticky。我们给ingress添加annotation。
metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: 1024m nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" ingress.kubernetes.io/ssl-redirect: "false" name: harbor namespace: ci-cd
如果要让命令行docker命令能访问,还需要暴露registry的5000端口
spec: backend: serviceName: registry servicePort: 5000
- 按顺序启动服务
# create pv & pvc kubectl apply -f make/kubernetes/glusterfs/harbor-gluster.yaml kubectl apply -f make/kubernetes/pv/log.pv.yaml kubectl apply -f make/kubernetes/pv/registry.pv.yaml kubectl apply -f make/kubernetes/pv/storage.pv.yaml kubectl apply -f make/kubernetes/pv/log.pvc.yaml kubectl apply -f make/kubernetes/pv/registry.pvc.yaml kubectl apply -f make/kubernetes/pv/storage.pvc.yaml > # create config map kubectl apply -f make/kubernetes/jobservice/jobservice.cm.yaml kubectl apply -f make/kubernetes/mysql/mysql.cm.yaml kubectl apply -f make/kubernetes/registry/registry.cm.yaml kubectl apply -f make/kubernetes/ui/ui.cm.yaml kubectl apply -f make/kubernetes/adminserver/adminserver.cm.yaml # create service kubectl apply -f make/kubernetes/jobservice/jobservice.svc.yaml kubectl apply -f make/kubernetes/mysql/mysql.svc.yaml kubectl apply -f make/kubernetes/registry/registry.svc.yaml kubectl apply -f make/kubernetes/ui/ui.svc.yaml kubectl apply -f make/kubernetes/adminserver/adminserver.svc.yaml # create k8s deployment kubectl apply -f make/kubernetes/registry/registry.deploy.yaml kubectl apply -f make/kubernetes/mysql/mysql.deploy.yaml kubectl apply -f make/kubernetes/jobservice/jobservice.deploy.yaml kubectl apply -f make/kubernetes/ui/ui.deploy.yaml kubectl apply -f make/kubernetes/adminserver/adminserver.deploy.yaml # create k8s ingress kubectl apply -f make/kubernetes/ingress.yaml
用配置好的域名访问harbor。这里没有配置ssl,所以需要为机器添加insecure-registry(在
/etc/docker/daemon.json中添加,然后重启daemon和docker)
用
docker login、
docker push ***、
docker pull ***等命令测试是否工作正常。
下一步工作
尝试使用1.5.1的镜像替换1.2的镜像,发现需要调整配置,后续再慢慢调。
按照官方文档已不建议使用yaml,而是用helm进行安装。后续尝试用helm安装。
参考
[1] https://github.com/goharbor/harbor/blob/master/docs/kubernetes_deployment.md
[2] http://www.xtecher.com/Mobile/Article/view?aid=4981
[3] https://github.com/helm/helm/releases
[4] http://www.cnblogs.com/sweetchildomine/p/9343745.html
[5] https://blog.csdn.net/qq_39591494/article/details/79852787
[6] https://blog.csdn.net/liukuan73/article/details/79634524
- Redis实践(四)高可用的集群+哨兵部署 下的jedis开发
- Kubernetes1.91(K8s)安装部署过程(三)--创建高可用etcd集群
- kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录
- MySQL高可用架构-MMM环境部署记录
- 再探使用kubeadm部署高可用的k8s集群-01引言
- 实践:在CentOS7.3部署 keepalived 高可用nginx(负载均衡)
- 【Ruby on Rails Tutorial笔记】将第一个Rails应用部署到 Heroku实践遇到的问题及解决过程记录
- Redis实践(二)高可用的集群+哨兵部署
- Redis实践(二)高可用的集群+哨兵部署
- Redis实践(四)高可用的集群+哨兵部署 下的jedis开发
- MySQL高可用方案-PXC环境部署记录
- 使用kubeadm部署k8s集群02-配置etcd高可用
- harbor 高可用部署
- MySQL高可用架构-MHA环境部署记录
- Centos下部署DRBD+NFS+Keepalived高可用环境记录
- Centos下SFTP双机高可用环境部署记录
- k8s(1master+2node)+dashboard+heapster部署实践
- Mac OS X 10.5快速系统部署实践-制作核心系统镜像(1) v1
- BPEL部署实例详细教程--2014最新实践