【实践记录】 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.yamlstorage.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 logindocker 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值