您的位置:首页 > 运维架构 > 网站架构

【实践记录】 K8s部署Harbor高可用

2018-08-31 10:00 1006 查看

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: