Harbor镜像仓库高可用部署方案(ARM64环境)

目标

    将harbor部署在k8s上,通过k8s service的机制,实现harbor的高可用,即当运行的某一habor容器的节点故障时,不会造成Harbor服务的中断。

    harbor官方提供了helm chart部署方案,以下基于harbor helm chart的部署进行说明。

harbor HAhttps://github.com/goharbor/harbor-helm/blob/v1.3.1/docs/High%20Availability.md

架构

(图取至网络)

Harbor组件说明

        目前harbor大部分组件均为无状态服务,所以可以简单的通过增加组件容器副本来实现组件分布到不同计算节点,同时,利用k8s service的机制来提供组件服务发现能力。

组件

描述

备注

core

harbor核心功能,包括认证、授权、项目管理等

 

jobservice

异步任务服务

 

portal

web ui服务

 

docker-registry

第三方镜像仓库服务,镜像存储

 

redis

第三方缓存服务

 

postgresql

第三方数据库服务

 

clair

第三方镜像漏洞扫描服务

暂不部署

notary

第三方内容信任服务

暂不部署

       

        关于存储层,所有存储均通过kubernetes的pvc方式提供给相关服务,而kubernetes集成xdfs或者glusterfs文件存储。

  1. jobservice和docker-registry的直接使用pvc方式,以多副本共享存储的方式实现高可用;
  2. redis和postgresql无法通过共享存储来直接实现高可用,需要另行提供高可用解决方案,本文提供了关于redis和postgresql的云原生部署方案。

Harbor HA部署

下载harbor chart

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会服务访问失败

Postgresql HA部署

采用开源社区的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;

Redis HA部署

采用开源社区基于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

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐