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