Build Harbour1.10.6高可用性クラスター
この記事の元のリンク:https://blog.csdn.net/xzk9381/article/details/110819978
1.クラスターモードの説明
Harbourは、次のクラスターモードをサポートしています。
- マスタースレーブ同期
- デュアルマスターレプリケーション
- 複数のハーバーインスタンスがバックエンドストレージを共有します
1.マスター/スレーブ同期
マスタースレーブ同期モードは、ハーバーが正式に提供するモードであり、ミラーがマスターハーバーにプッシュされている限り、ミラーを複数のスレーブノードに自動的にコピーできます。この方法は、大規模なミラースケール、多数のサーバーノード、および地理的な分散の問題に適用できます。メインのハーバーウェアハウスの単一ノードの障害は、複数のハーバーインスタンスを組み合わせてバックエンドストレージを共有することで解決できます。
2.デュアルマスターレプリケーション
デュアルマスターレプリケーションは、マスタースレーブ同期に基づいており、2つのハーバーノードで双方向の同期を実現して、データの整合性を確保します。負荷分散デバイスは、要求を2つのハーバーノードに分割します。一方のハーバーにミラーが追加されている限り、もう一方のハーバーに自動的に同期されます。
ただし、このアプローチには問題があります。一方のハーバーがダウンしている場合、もう一方のハーバーで新しいデータが変更されます。その後、障害が発生したノードが復元された後、新しく追加されたデータは同期されません。レプリケーション戦略を再開する必要があります。したがって、本番環境でこの方法を使用することはお勧めしません。
3.複数のハーバーインスタンスがバックエンドストレージを共有します
共有バックエンドストレージは、複数のハーバーが1つのストレージを使用できるようにし、同じRedisクラスターとデータベースクラスターを構成して、各ノードがアクセスするデータの一貫性を確保することです。次に、リクエストは負荷分散を通じてさまざまなハーバーインスタンスに配信されます。
さまざまなインスタンスでのセッション共有の問題については、外部Redisクラスターを構成することでこれを処理できます。新しいバージョンのHarborは、すでにセッションをRedisに保存しています。
この記事では、このクラスタリング方法を主に紹介しますが、Nginxサービスがハーバー内で開始されたため、このデプロイメントでは、ハーバーマルチインスタンスの前にNginx負荷分散サービスを構築しませんでしたが、VIPとKeepalivedをクラスターの高可用性を確保します。
2.設置前に注意が必要な事項
- ハーバーサーバー:10.211.55.11、10.211.55.12
1.データベース
クラスターの構築プロセスでは、Redisクラスターとデータベースクラスターを使用する必要があります。これら2つのクラスターの構築方法については、他の資料を参照してください。ソースコードを使用してPostgreSQL 12.5マスタースレーブクラスターをインストールします。これについては、この記事では説明していません。 。
Harbour 1.6以降、データベースはPostgreSQLのみをサポートすることに注意してください。したがって、この記事では、PostgreSQL12.5バージョンを使用して外部データベースに接続します。
さらに、Harbor 2.x以前は、Redisクラスターの構成はマスタースレーブモードのみをサポートし、2.xバージョン以降は、Sentinelクラスターの構成をサポートしますが、公式の使用をサポートするかどうかはわかりません。ハーバーソースコードパッケージで提供されているため、Redisクラスターモード。harbor.ymlファイルの例では、外部Redis構成に関する部分は次のとおりです。
# Uncomment external_redis if using external Redis server
# external_redis:
# # support redis, redis+sentinel
# # host for redis: <host_redis>:<port_redis>
# # host for redis+sentinel:
# # <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>
# host: redis:6379
# password:
# # sentinel_master_set must be set to support redis+sentinel
# #sentinel_master_set:
# # db_index 0 is for core, it's unchangeable
# registry_db_index: 1
# jobservice_db_index: 2
# chartmuseum_db_index: 3
# clair_db_index: 4
# trivy_db_index: 5
# idle_timeout_seconds: 30
したがって、RedisとPostgreSQLの両方がこのセットアッププロセスでマスタースレーブモードを使用しました。セットアップする前に、まずサーバーファイアウォールとSELinuxをオフにすることに注意してください。
2.共有ストレージ
今回構築した環境では、共有ストレージにcephfsを使用しています。特定の構築プロセスについては、Cephクラスター(nautilusバージョン)を構築するために他の資料CentOS7を参照してください。
cephfsを2台のマシンの/ opt / harbor_dataディレクトリにマウントします。このディレクトリはハーバーデータの保存に使用されます。
3、Docker環境をインストールします
Harbourは、docker-composeオーケストレーションに基づいて開始されたコンテナー環境であるため、最初に2つのサーバーにDockerをインストールします。Dockerのバイナリパッケージの最新バージョンをここから直接ダウンロードします。
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.13.tgz -O /root
バイナリパッケージを解凍した後、dockerディレクトリが取得され、このディレクトリ内のすべてのファイルが/ usr / binディレクトリにコピーされます。
mv /root/docker/* /usr/bin
次の内容の/usr/lib/systemd/system/docker.serviceファイルを作成します。
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
保存して終了したら、次のコマンドを実行してサービスファイルを有効にし、起動時に開始するようにDockerサービスを構成します。
systemctl daemon-reload && systemctl enable docker.service
第四に、docker-composeをインストールします
2つのサーバーで、次のコマンドを使用してdocker-compose環境をインストールします。
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
5、HTTPS証明書を作成します
HarbourはHTTPSを使用してミラーウェアハウスにアクセスすることを推奨しているため、最初にHTTPS証明書を作成します。手順は、次のとおりです。
1.CA証明書を生成します
まず、/ opt / harbor_dataディレクトリの下にsslディレクトリを作成します。
mkdir -p /opt/harbor_data/ssl
ディレクトリを入力し、opensslコマンドを使用してCA証明書の秘密鍵を生成します。
openssl genrsa -out ca.key 4096
この秘密鍵によると、CA権限証明書を生成します。
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.mrd.com" \
-key ca.key \
-out ca.crt
このうち、-days 3650は、証明書が10年間有効であることを表し、harbor.mrd.comは、ミラーウェアハウスがアクセスするドメイン名であり、実際のニーズに応じて変更できます。アクセスにIPアドレスを使用する場合は、ドメイン名をIPアドレスに置き換える必要があります。
2.サーバー証明書を生成します
次に、サーバー証明書が生成されます。これには通常、.crtファイルと.keyファイルが含まれています。最初に秘密鍵ファイルを生成します。できればドメイン名にちなんで名付けます。
openssl genrsa -out harbor.mrd.com.key 4096
秘密鍵ファイルに基づいて証明書署名要求ファイル(CSRファイル)を生成します。
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.mrd.com" \
-key harbor.mrd.com.key \
-out harbor.mrd.com.csr
次に、x509v3拡張ファイルを生成します。FQDNまたはIPアドレスを使用してハーバーホストに接続するかどうかに関係なく、このファイルを作成して、サブジェクト代替名(SAN)およびx509v3証明書拡張要件を満たす証明書ファイルをハーバーホスト用に生成できるようにする必要があります。DNSエントリを実際のハーバーアクセスドメイン名に変更します。
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.mrd.com
DNS.2=harbor.mrd.com
DNS.3=harbor.mrd.com
EOF
IPアドレスアクセスを使用している場合は
subjectAltName = @alt_names
、@ alt_namesでIPアドレスを変更する必要があります。
このv3.extファイルを使用して、サーバー証明書を生成します。
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.mrd.com.csr \
-out harbor.mrd.com.crt
このようにして、証明書の準備が完了し、sslディレクトリに次のファイルがあります。
[root@localhost ssl]# ll
总用量 28
-rw-r--r-- 1 root root 2033 11月 30 11:20 ca.crt
-rw-r--r-- 1 root root 3243 11月 30 11:20 ca.key
-rw-r--r-- 1 root root 17 11月 30 11:31 ca.srl
-rw-r--r-- 1 root root 2118 11月 30 11:31 harbor.mrd.com.crt
-rw-r--r-- 1 root root 1708 11月 30 11:25 harbor.mrd.com.csr
-rw-r--r-- 1 root root 3243 11月 30 11:25 harbor.mrd.com.key
-rw-r--r-- 1 root root 275 11月 30 11:31 v3.ext
3. Harbour、Docker、およびオペレーティングシステムに証明書を提供します
証明書が生成された後、各サービスが証明書を認識するためには、証明書ファイルを指定されたディレクトリにコピーする必要があります。
3.1Dockerサービス識別証明書を構成する
Dockerの証明書パスを構成して、docker loginコマンドが呼び出されたときに、証明書の問題によって引き起こされるエラーを回避するために安全な接続を確立できるようにします。
まず、次のディレクトリを作成します。
mkdir -p /etc/docker/certs.d/harbor.mrd.com
nginxのは、別のポート番号にデフォルトのポート443を変更する場合は、作成する必要があり
/etc/docker/certs.d/yourdomain.com:port
、および/またはetc/docker/certs.d/harbor_IP:port
ディレクトリ
Dockerデーモンは.crtファイルをCA証明書として解釈し、.certファイルをクライアント証明書として解釈するためです。したがって、今生成したharbor.mrd.com.crt証明書ファイルをharbor.mrd.com.certファイルに変換する必要があります。
openssl x509 -inform PEM -in harbor.mrd.com.crt -out harbor.mrd.com.cert
/ opt / harbor_data / sslディレクトリにあるCA証明書、サーバー証明書、および秘密鍵ファイルを/etc/docker/certs.d/harbor.mrd.comディレクトリにコピーします。
cp -pr ca.crt harbor.mrd.com.{
cert,key} /etc/docker/certs.d/harbor.mrd.com
Dockerサービスを再起動して次の操作を行います。
systemctl restart docker.service
この記事の元のリンク:https://blog.csdn.net/xzk9381/article/details/110819978
3.2オペレーティングシステムの識別証明書を構成する
証明書ファイルをシステム証明書パスにコピーします。
cp -pr harbor.mrd.com.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
3.3ハーバー識別証明書の構成
現在設定されている/ opt / harbor_data / sslディレクトリは2つのハーバーノードの共有ストレージディレクトリであるため、ハーバーを設定するときにこのディレクトリ内のファイルを指定するだけで済みます。
6つ目は、Harborが使用する必要のあるデータベースとユーザーを作成することです。
1.ライブラリとユーザーを作成します
外部PostgreSQLデータベースを使用するため、Harbourが使用するライブラリ名とユーザーを事前に作成しておく必要があります。PostgreSQLデータベースサーバーで、postgresユーザーを使用して次のコマンドを実行して作成します。
[postgres@localhost ~]$ psql
psql (12.5)
Type "help" for help.
postgres=# CREATE USER harbor with password 'harbor_admin';
CREATE ROLE
postgres=# CREATE DATABASE harbor;
CREATE DATABASE
postgres=# CREATE DATABASE harbor_clair;
CREATE DATABASE
postgres=# CREATE DATABASE harbor_notary_server;
CREATE DATABASE
postgres=# CREATE DATABASE harbor_notary_signer;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor to harbor;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_clair to harbor;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_notary_server to harbor;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_notary_signer to harbor;
GRANT
2.リモートアクセス許可を構成します
次に、作成したharborユーザーのリモートアクセス許可を構成し、PostgreSQLデータディレクトリの下のpg_hba.confファイルを変更して、次の行を追加します。
host all harbor 0.0.0.0/0 trust
この担当者は、harborユーザーを使用して任意のマシンがPostgreSQLデータベースにリモート接続できるようにします。構成が完了したら、データベースサービスを再起動します。
/etc/init.d/postgresql restart
3.タイムゾーンを構成します
特に注意が必要な点は、外部PostgreSQLデータベースを使用する場合、データベース構成ファイルpostgresql.confのタイムゾーン構成項目をUTCに設定する必要があります。そうしないと、HarborUIインターフェイスに表示されるタイムスタンプによって表示される時間が実際とは異なります。 8時間または13時間の時間。この問題は、ハーバーの内部コードロジックが原因であると考えられますが、まだ不明であるため、フォローアップの確認後に追加します。
timezone = 'UTC'
変更が完了したら、データベースを再起動します。
セブン、ハーバーをインストール
Harbour公式WebサイトからHarbor1.10.6のオフラインインストールパッケージをダウンロードします。
ダウンロードリンク:https://github.com/goharbor/harbor/releases/download/v1.10.6/harbor-offline-installer-v1.10.6.tgz
次の手順を実行して、両方のマシンにインストールします。
まず、オフラインパッケージを/ optディレクトリに解凍し、解凍したディレクトリに入り、harbor.ymlファイルを編集し、Harbourのホスト名をharbor.mrd.comに変更します。アクセスするドメイン名は、設定したドメイン名と一致している必要があります。証明書内:
hostname: harbor.mrd.com
HTTPS認証パスを構成します。
https:
port: 443
certificate: /opt/harbor_data/ssl/harbor.mrd.com.crt
private_key: /opt/harbor_data/ssl/harbor.mrd.com.key
Harbour管理者ユーザーのパスワードを設定します。
harbor_admin_password: Harbor_admin_for_ops
Harbourのデフォルト構成のデータベースアクセス情報に注釈を付けます。コンテンツのこの部分は、内部データベース設定へのHarbourアクセスに使用されます。注釈の後、Harborはデータベースコンテナーを個別に開始しません。
#database:.
#password: root123
#max_idle_conns: 50
#max_open_conns: 100
Harbourのデータストレージパスを変更し、2つのHarbourが使用する共有ストレージパスに設定します。
data_volume: /opt/harbor_data
ハーバーログのストレージパスを設定します。共有ストレージディレクトリに変更できます。2つのノードのログが同じログファイルにヒットしないようにするために、/ opt / harbor_dataなどのノードごとに個別のディレクトリを設定できます。 / logs / harbor_node1および/ opt / harbor_data / logs / harbor_node2次に、次の構成アイテムを変更します。
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /opt/harbor_data/logs/harbor_node1
外部PostgreSQLデータベース構成を追加します。
external_database:
harbor:
host: pg.mrd.com
port: 5432
db_name: harbor
username: harbor
password: harbor_admin
ssl_mode: disable
max_idle_conns: 50
max_open_conns: 200
clair:
host: pg.mrd.com
port: 5432
db_name: harbor_clair
username: harbor
password: harbor_admin
ssl_mode: disable
notary_signer:
host: pg.mrd.com
port: 5432
db_name: harbor_notary_signer
username: harbor
password: harbor_admin
ssl_mode: disable
notary_server:
host: pg.mrd.com
port: 5432
db_name: harbor_notary_server
username: harbor
password: harbor_admin
ssl_mode: disable
外部Redisデータベース構成を追加します。
external_redis:
host: redis.mrd.com
port: 6379
password: redispass_for_harbor
# db_index 0 is for core, it's unchangeable
registry_db_index: 1
jobservice_db_index: 2
chartmuseum_db_index: 3
clair_db_index: 4
変更が完了したら、保存して終了し、。/ prepareスクリプトを実行して、Harbor構成ファイルを初期化します。
[root@localhost harbor]# ./prepare
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /secret/keys/secretkey
Generated certificate, key file: /secret/core/private_key.pem, cert file: /secret/registry/root.crt
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
初期化が完了したら、。/ install.shスクリプトを実行して、Harborのインストールを開始します。インストールが完了したら、次のコマンドを使用してサービスステータスを表示できます。
[root@localhost harbor]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------
harbor-core /harbor/harbor_core Up (healthy)
harbor-jobservice /harbor/harbor_jobservice ... Up (healthy)
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy) 8080/tcp
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp
registry /home/harbor/entrypoint.sh Up (healthy) 5000/tcp
registryctl /home/harbor/start.sh Up (healthy)
8、KeepAlivedを構成します
2台のマシンにHarborをインストールした後、引き続きKeepalivedを構成し、ドメイン名harbor.mrd.comをVIPに解決して、Harbourクラスターの高可用性を保証できるようにします。キープアライブのセットアッププロセスはここでは説明されていません。他の資料を参照できます。Keepalivedのサービスヘルスチェックスクリプトについては、ハーバーコンテナに設定されているヘルスチェックポリシーを実際に参照できます。たとえば、ハーバーコアイメージに設定されているヘルスチェックポリシーを表示するには、次のコマンドを使用します。
[root@localhost ~]# docker images | grep harbor-core | awk '{print $3}' | xargs docker inspect | grep -A5 "Healthcheck"
"Healthcheck": {
"Test": [
"CMD-SHELL",
"curl --fail -s http://127.0.0.1:8080/api/ping || exit 1"
]
},
したがって、Keepalivedでサービスヘルスチェックスクリプトを設定する場合は、次のスクリプトコンテンツを使用できます。
#!/bin/bash
curl --fail -s http://127.0.0.1:80
if [ $? -ne 0 ];then
docker-compose -f /opt/harbor_compose/docker-compose.yml down -v
docker-compose -f /opt/harbor_compose/docker-compose.yml up -d
sleep 15
curl --fail -s http://127.0.0.1:80/api/ping || systemctl stop keepalived.service;ps aux | grep "/usr/sbin/keepalived" | grep -v grep | awk '{print $2}' | xargs kill -9
fi
この記事の元のリンク:https://blog.csdn.net/xzk9381/article/details/110819978