Harbor镜像仓库高可用部署方案(ARM64环境)
将harbor部署在k8s上,通过k8s service的机制,实现harbor的高可用,即当运行的某一habor容器的节点故障时,不会造成Harbor服务的中断。
harbor官方提供了helm chart部署方案,以下基于harbor helm chart的部署进行说明。
harbor HA(https://github.com/goharbor/harbor-helm/blob/v1.3.1/docs/High%20Availability.md)
(图取至网络)
目前harbor大部分组件均为无状态服务,所以可以简单的通过增加组件容器副本来实现组件分布到不同计算节点,同时,利用k8s service的机制来提供组件服务发现能力。
组件 |
描述 |
备注 |
core |
harbor核心功能,包括认证、授权、项目管理等 |
|
jobservice |
异步任务服务 |
|
portal |
web ui服务 |
|
docker-registry |
第三方镜像仓库服务,镜像存储 |
|
redis |
第三方缓存服务 |
|
postgresql |
第三方数据库服务 |
|
clair |
第三方镜像漏洞扫描服务 |
暂不部署 |
notary |
第三方内容信任服务 |
暂不部署 |
关于存储层,所有存储均通过kubernetes的pvc方式提供给相关服务,而kubernetes集成xdfs或者glusterfs文件存储。
helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar
cd harbor
编辑values.yaml
修改expose.tls.secretName,设置成自己的tls证书的secretName,该secret下应该包括“tls.crt”,”tls.key”,”ca.crt”文件
修改expose.ingress.hosts.core,设置镜像仓库的外网域名,注意tls的证书要与域名匹配
修改externalURL,该值应该与expose.ingress.hosts.core一致
修改persistence. persistentVolumeClaim. registry.accessMode,设置成ReadWriteMany
修改persistence. persistentVolumeClaim. registry. size,按实际需求设置镜像仓库存储的大小
修改persistence. persistentVolumeClaim. jobservice. accessMode,设置成ReadWriteMany
修改persistence. persistentVolumeClaim. database. accessMode,设置成ReadWriteMany
修改persistence. persistentVolumeClaim. database. size,设置成100Gi
修改persistence. persistentVolumeClaim. redis. accessMode,设置成ReadWriteMany
修改harborAdminPassword,该值为admin用户默认密码
替换所有xxxx.image.repository属性中的goharbor为toyangdon,由于harbor官方镜像仓库中目前并没有arm镜像,因此使用个人构建的arm镜像,示例:
repository: goharbor/nginx-photon 改为 repository: toyangdon/nginx-photon
修改所有xxxx.image.tag,设置v1.10.0,除了registry.registry.image.tag改v2.7.1-patch-2819-2553-v1.10.0
修改所有xxx.image.replicas为2
修改chartmuseum.enabled为false
修改clair.enabled为false
修改notary.enabled为false
修改database.type为external,表示使用外部数据库
修改database.external.host/port/username/password,按实际情况修改。需在数据库中预先创建名为registry的database
修改redis.type为external,表示使用外部redis
修改redis.external.host/port,按实际情况修改
在kubernetes上创建namespace
kubectl create namespace docker-registry
通过helm将harbor部署到docker-registry命名空间
helm install v1-10-0 --namespace=docker-registry .
注意:
当前k8s集群使用的traefik,ingress要支持https的话,需要在traefik的配置文件中配置相关tls证书,否则部署的harbor会服务访问失败
采用开源社区的stolon方案
https://github.com/sorintlab/stolon
stolon架构图
1、下载部署文件
git clone -b v0.16.0 --depth 1 https://github.com/sorintlab/stolon
2、构建arm版stolon镜像(可选)
cd stolon
make PGVERSION=10 TAG=stolon:v0.16.0-pg10 docker #在arm环境下运行即可构建arm镜像
注意:golang编译时如果由于国内网络拉不到仓库,可以修改dockerfile,加入ENV GOPROXY=https://goproxy.io 即可
当前已经构建的好arm64版本镜像,并推送到docker hub中了,镜像名为toyangdon/stolon:v0.16.0-pg10
3、创建role、role-binding
a. 修改examples/kubernetes/role.yaml、role-binding.yaml 中的所有namespace属性为docker-registry
b. kubectl apply -f examples/kubernetes/role.yaml
kubectl apply -f examples/kubernetes/role-binding.yaml
4、初始化集群
kubectl run -i -t stolonctl --image=toyangdon/stolon:v0.16.0-pg10 --restart=Never --rm -n docker-registry -- bash -c 'stolonctl --cluster-name=kube-stolon --store-backend=kubernetes --kube-resource-kind=configmap --kube-namespace=docker-registry init -y'
5、部署sentinel
修改examples/kubernetes/stolon-sentinel.yaml文件中的image属性,改为自己构建的镜像(可以直接使用toyangdon/ stolon:v0.16.0-pg10
)
kubectl create -f examples/kubernetes/stolon-sentinel.yaml -n docker-registry
6、部署keeper
修改examples/kubernetes/secret.yaml中的password属性值,可以设置为password2020的base64值,Z3JlYXR3YWxsMjAyMAo= (echo "password2020"|base64)
修改examples/Kubernetes/stolon-keeper.yaml文件中的image属性,改为自己构建的镜像,删除volume.alpha.kubernetes.io/storage-class行,表示使用默认的storage-class
执行
kubectl apply -f examples/kubernetes/stolon-keeper.yaml -n docker-registry
kubectl apply -f examples/kubernetes/secret.yaml -n docker-registry
7.部署proxies
修改examples/Kubernetes/stolon-proxy.yaml文件中的image属性,改为自己构建的镜像,
kubectl create -f examples/kubernetes/stolon-proxy.yaml -n docker-registry
kubectl apply -f examples/kubernetes/stolon-proxy-service.yaml -n docker-registry
8.创建registry数据库
kubectl exec -it stolon-keeper-0 -n docker-registry bash
psql --host stolon-proxy-service --port 5432 postgres -U stolon -W
按提示输入密码 password2020
create database registry;
采用开源社区基于helm提供的redis sentinel方案
https://github.com/helm/charts/tree/master/stable/redis-ha
helm repo add stable https://apphub.aliyuncs.com/stable
helm template v3 stable/redis-ha --set image.tag=3-alpine --version 4.3.3 --set haproxy.enabled=true --namespace docker-registry >redis.yaml
修改redis.yaml文件中的image: koalaman/shellcheck:0.5.0为image: koalaman/shellcheck:latest
修改redis.yaml文件中的
min-replicas-to-write: 1
min-replicas-max-lag: 5
改为
min-slaves-to-write 0
min-slaves-max-lag 5
修改redis.yaml文件中关于haproxy的tcp timeout配置
timeout:
connect: 30s
server: 3600s
client: 3600s
执行
kubectl apply -f redis.yaml -n docker-registry
集群内通过v3-redis-ha-haproxy:6379即可访问redis sentinel集群
直接使用附件中的yaml文件部署
1、kubectl create ns docker-registry #创建docker-registry命名空间
2、创建存放harbor https 相关证书的secret,secret名为harbor-https,域名为registry.yannic.com
示例:
kubectl create secret tls harbor-https --cert=tls.crt --key=tls.key -n docker-registry
tls.crt和tls.key分别为相关证书,需要事先自行申请或者创建
自建证书示例:
openssl genrsa -out tls.key 2048
openssl req -new -out tls.csr -key tls.key -subj '/CN=registry.yannic.com'
openssl x509 -req -days 3650 -in tls.csr -signkey tls.key -out tls.crt
3、拷贝相关yaml文件到服务器上(harbor.yaml\redis.yaml\stolon.yaml),按实际需要修改harbor.yaml 中的registry PersistentVolumeClaim中request storage大小,执行
kubectl apply -f . -n docker-registry #等待容器启动
(yaml文件见附件)
4、kubectl run -i -t stolonctl --image=toyangdon/stolon:v0.16.0-pg10 --restart=Never --rm -n docker-registry -- bash -c 'stolonctl --cluster-name=kube-stolon --store-backend=kubernetes --kube-resource-kind=configmap --kube-namespace=docker-registry init -y'
5、创建registry数据库(注意,postgresql的初始化启动要一定时间,启动完后才能连接上数据库)
kubectl exec -it stolon-keeper-0 -n docker-registry bash
psql --host stolon-proxy-service --port 5432 postgres -U stolon -W
按提示输入密码 password2020
create database registry;
\q
exit
6、等待harbor相关组件自动初始化启动完成(可以手动触发harbor-core的重启)
7、如果使用的k8s集群使用traefik ingress,需配置traefik支持https访问
(traefik yaml文件见附件)
kubectl create secret tls traefik-certs --cert=tls.crt --key=tls.key -n docker-registry
8、访问harbor。配置hosts文件,添加一条域名解析,用于访问harbor ingress,
示例10.10.101.86 registry.yannic.com #10.10.101.86 为k8s 任意计算节点ip
浏览器上输入https://registry.yannic.com,进行harbor管理页面
默认账号、密码:admin/Harbor12345