前言

本文Harbor高可用依照Harbor官网部署,主要思路如下,大家可以根据具体情况选择搭建。

一、Harbor部署前准备

本文仅说明高可用配置,其余部署请查看《kubernetes搭建Harbor无坑及Harbor仓库同步

.安装方式

  • helm安装
  • 直接使用博主整理好的编排文件安装(通过Helm生成)

1.helm安装

安装Helm请查看《kubernetes搭建Harbor无坑及Harbor仓库同步》,其中包含Helm安装。

1.1.下载 harbor-helm
git clone https://github.com/goharbor/harbor-helm.git
cd XXX/harbor-helm
1.2.修改value.yaml

database的Postgresql配置

database:
# if external database is used, set "type" to "external"
# and fill the connection informations in "external" section
type: external
internal:
image:
repository: goharbor/harbor-db
tag: v1.8.2-dev
# The initial superuser password for internal database
password: "changeit"
# resources:
# requests:
# memory: 256Mi
# cpu: 100m
nodeSelector: {}
tolerations: []
affinity: {}
external:
host: "stolon-proxy-service" #管理postgresql的stolon的service,因为都在Pod中可相互访问
port: "5432"
username: "postgres"
password: "password1"
coreDatabase: "registry"
clairDatabase: "clair"
notaryServerDatabase: "notaryserver"
notarySignerDatabase: "notarysigner"
sslmode: "disable"
## Additional deployment annotations
podAnnotations: {}

redis的配置

redis:
# if external Redis is used, set "type" to "external"
# and fill the connection informations in "external" section
type: external
internal:
image:
repository: goharbor/redis-photon
tag: v1.8.2-dev
# resources:
# requests:
# memory: 256Mi
# cpu: 100m
nodeSelector: {}
tolerations: []
affinity: {}
external:
host: "10.8.4.133" #haproxy的地址通过haproxy管理redis集群
port: "6379"
# The "coreDatabaseIndex" must be "0" as the library Harbor
# used doesn't support configuring it
coreDatabaseIndex: "0"
jobserviceDatabaseIndex: "1"
registryDatabaseIndex: "2"
chartmuseumDatabaseIndex: "3"
password: ""

修改Harbor其他组件replicas(副本数)

# 例如nginx的副本数更改
nginx:
image:
repository: goharbor/nginx-photon
tag: v1.8.2-dev
replicas: 3
1.3.准备Harbor所需的registry、notarysigner、notaryserver、clair数据库,Harbor会自动在其中建表。

执行sql语句脚本,供stolon-init-database-job.yaml使用

cat <<EOF > ./postgresql.sh
#!/bin/bash host="stolon-proxy-service"
user="postgres"
db="postgres"
export PGPASSWORD="password1" args=(
# force postgres to not use the local unix socket (test "external" connectibility)
--host "$host"
--username "$user"
--dbname "$db"
--quiet --no-align --tuples-only
) if select="$(echo 'SELECT 1' | psql "${args[@]}")" && [ "$select" = '1' ]; then
echo "====notaryserver==database==creating===="
psql -h stolon-proxy-service -p 5432 -U postgres -f "/docker-entrypoint-initdb.d/initial-notaryserver.sql"
echo "====notarysigner==database==creating===="
psql -h stolon-proxy-service -p 5432 -U postgres -f "/docker-entrypoint-initdb.d/initial-notarysigner.sql"
echo "====registry==database==creating===="
psql -h stolon-proxy-service -p 5432 -U postgres -f "/docker-entrypoint-initdb.d/initial-registry.sql"
echo "====clair==database==creating===="
psql -h stolon-proxy-service -p 5432 -U postgres -f "/docker-entrypoint-initdb.d/initial-clair.sql"
exit 0
fi
exit 1
EOF

创建registry数据库

cat <<EOF > ./initial-registry.sql
CREATE DATABASE registry ENCODING 'UTF8';
\c registry;
CREATE TABLE schema_migrations(version bigint not null primary key, dirty boolean not null);
EOF

创建notaryserver数据库

cat <<EOF > ./initial-notaryserver.sql
CREATE DATABASE notaryserver;
CREATE USER server;
alter user server with encrypted password 'password';
GRANT ALL PRIVILEGES ON DATABASE notaryserver TO server;
EOF

创建notarysigner数据库

cat <<EOF > ./initial-notarysigner.sql
CREATE DATABASE notarysigner;
CREATE USER signer;
alter user signer with encrypted password 'password';
GRANT ALL PRIVILEGES ON DATABASE notarysigner TO signer;
EOF

创建clair数据库

cat <<EOF > ./initial-clair.sql
CREATE DATABASE clair;
EOF

创建一个job的yaml(stolon-init-database-job.yaml),用于创建数据库,注意更改脚本的挂载位置,并复制脚本到各个节点或为node和yaml加上nodeselect标签,只在当前标签node下复制脚本

apiVersion: batch/v1
kind: Job
metadata:
name: stolon-init-database-job
spec:
template:
spec:
containers:
- name: stolon-proxy
image: sorintlab/stolon:master-pg10
command:
- "/bin/bash"
- "/docker-entrypoint-initdb.d/postgresql.sh"
volumeMounts:
- mountPath: /docker-entrypoint-initdb.d
name: database
restartPolicy: OnFailure #失败重启
volumes:
- name: database
hostPath:
path: /root/tmp/harbor/stolon/examples/kubernetes/sql
activeDeadlineSeconds: 600 #10分钟没有complete,不再重启并移除Pod
1.3.部署Postgresql、redis
  • 按照《kubernetes下Stolon部署高可用Postgresql》部署Postgresql,注意加入stolon-init-database-job.yaml。
  • 按照《kubernetes部署高可用redis》部署redis,之后用haproxy管理redis集群(不可直接使用redis的service暴露,service会访问到slave节点,redis副本是只读不可写的,在harbor中会有报错)
  • 部署haproxy
    1. 安装haproxy

      yum -y install haproxy

      cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-back

      vim /etc/haproxy/haproxy.cfg
    2. 加入配置
defaults REDIS
mode tcp
timeout connect 1m
timeout server 6m
timeout client 6m frontend ft_redis
bind 0.0.0.0:6379 name redis
default_backend bk_redis backend bk_redis
option tcp-check
tcp-check connect
tcp-check send PING\r\n
tcp-check expect string +PONG
tcp-check send info\ replication\r\n
tcp-check expect string role:master
tcp-check send QUIT\r\n
tcp-check expect string +OK
server R1 redis-0.redis-headless.default.svc.cluster.local:6379 check inter 1s
server R2 redis-1.redis-headless.default.svc.cluster.local:6379 check inter 1s
server R3 redis-2.redis-headless.default.svc.cluster.local:6379 check inter 1s listen admin_stats
stats enable
bind *:9090
mode http
option httplog
log global
maxconn 10
stats refresh 30s
stats uri /admin
stats realm haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE

systemctl start haproxy && systemctl enable haproxy && systemctl status haproxy

访问 harbor节点Ip:9090/admin如图所示,便成功

⚠️k8s master节点高可用可阅读《haproxy+keepalive实现master集群高可用

1.4.部署Harbor

安装harbor并将日志写入文件,可编辑文件保留.yaml编排文件,以便以后使用

helm install . --debug --name hub |sed 'w harbor.yaml'

或执行以下命令,编排chart不执行,作用生成编排文件,删除多余部分,进行使用

helm install . --debug --dry-run --name hub |sed 'w harbor.yaml'

2.通过整理好的编排文件执行

链接:https://pan.baidu.com/s/1cr1fnWGHc-70HAxx1YH4kg 密码:21a8

直接使用这个编排文件可能会有问题,最好勤劳以下使用helm跑,也可避免更改配置遗漏或错误的问题,适用用于实验,如若搭建请注意修改Volum、requestsource等Pod设置

kubernetes部署高可用Harbor的更多相关文章

  1. kubernetes部署高可用redis

    本文redis通过helm搭建,提供redis高可用完整的编排,关于Helm的搭建和使用请查看文章<helm的搭建及使用>,其中前一章介绍了Helm搭建,并提供了Helm搭建Harbor的 ...

  2. kubernetes kubeadm部署高可用集群

    k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...

  3. 附012.Kubeadm部署高可用Kubernetes

    一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...

  4. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  5. k8s部署高可用Ingress

    部署高可用Ingress 官网地址https://kubernetes.github.io/ingress-nginx/deploy/ 获取ingress的编排文件 wget https://raw. ...

  6. 关于Kubernetes Master高可用的一些策略

    关于Kubernetes Master高可用的一些策略 Kubernetes高可用也许是完成了初步的技术评估,打算将生产环境迁移进Kubernetes集群之前普遍面临的问题. 为了减少因为服务器当机引 ...

  7. Quartz学习笔记:集群部署&高可用

    Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...

  8. 生产环境搭建高可用Harbor(包括恢复演练实操)

    生产环境搭建高可用Harbor(包括恢复演练实操) 前言 因资源成本问题,本Harbor高可用架构为最小开销方案,如果资源充足,可以将PG.Redis全部使用使用云厂商集群模式. 同时为了配置简单,并 ...

  9. kubernetes集群部署高可用Postgresql的Stolon方案

    目录 前言 ....前言 本文选用Stolon的方式搭建Postgresql高可用方案,主要为Harbor提供高可用数据库,Harbor搭建可查看kubernetes搭建Harbor无坑及Harbor ...

随机推荐

  1. cs231n---循环神经网络

    1 RNN介绍 (1)一对多,多对一,多对多的任务 传统的神经网络只能处理一对一的任务,而RNN可以处理一对多,多对一,多对多的任务: 其中,一些典型的应用如下: Image Captioning:i ...

  2. cs231n---CNN架构

    1 LeNet-5 (1998) 第一个被提出的卷积网络架构,深度较浅,用于手写数字识别. 2 AlexNet (2012) 架构为: CONV1 ->MAX POOL1 ->NORM1 ...

  3. 在centos6系列vps装Tomcat8.0

    In the following tutorial you will learn how to install and set-up Apache Tomcat 8 on your CentOS 6 ...

  4. 番茄日志发布1.0.3版本-增加Kafka支持

    番茄日志(TomatoLog)能做什么 可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集.分析.处理日志的过程. ...

  5. vue入门:用户管理demo1

    该demo由前端请求后台服务器获取数据进行渲染 使用到的技术点 1.使用到的vue指令:{{}} v-if v-for v-model 2.使用到的事件:@click 点击事件, @keyup.ent ...

  6. 小白学习day2------比较运算

    1 算术运算 加+ 2+3=5 减 - 3-2=1 乘 * 2*3=6 除 / 6/2=3 取膜 % 余数 幂 ** 2**3=8 整除 // 9//4=2 2 比较运算 == 判断是否等于 != , ...

  7. ionic $state.go() 传参

    例子: $state.go("tab.home" , {"hello": "world"}) 重点: 接受参数的页面--tab.home,需 ...

  8. unity编辑器扩展_03(在组件中右击创建一个选项,并通过该选项修改该组件下面的字段的值)

    在组件中右击创建一个选项代码: [MenuItem("CONTEXT/PlayerHealth/InitHealth")]    static void Test5()    {  ...

  9. 2019-07-26-hexo博客图片问题

    本人的解决方案 *** 将hexo的主页配置文件中的_config.yml里的post_asset_folder设置为true. 在git bash里运行npm install hexo-asset- ...

  10. hdu-6601 Keen On Everything But Triangle

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=6601 Description N sticks are arranged in a row, and ...