Build Harbour1.10.6高可用性クラスター

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

おすすめ

転載: blog.csdn.net/xzk9381/article/details/110819978