クラスター管理ネットワークを使用したインストール
クラスタ管理ネットワークを使用してクラスタを起動するには、次の手順を実行します。クラスター管理ネットワークは、支援インストーラーが統合ロード バランサーとイングレスをクラスターにインストールする導入を指します。
図 1 は、負荷分散装置(図示せず)がクラスタ内に統合されている、ベア メタル サーバーまたは仮想マシン上で実行されている 3 つの制御プレーン ノードと 2 つのワーカー ノードのクラスタを示しています。支援型インストーラトラフィックとKubernetesコントロールプレーントラフィックは、172.16.0.0/24ファブリック仮想ネットワークを使用します。Contrail コントロール プレーン トラフィックとユーザー データ プレーン トラフィックは、10.16.0.0/24 ファブリック仮想ネットワークを使用します。
別のマシンは、アシストインストーラークライアントとして機能します。アシスト・インストーラー・クライアントは、curl コマンドを使用して、アシスト・インストーラー・サービスに対する API 呼び出しを発行してクラスターを作成する場所です。この手順の例では、Assisted Installer クライアント マシンを使用してサブネットの DNS/DHCP サーバーをホストします。
ローカル管理者は、両方の図で別のネットワークにアタッチされているのが示されています。これは、ローカル管理者が企業 LAN からファブリックとクラスタを管理する多くのインストールで一般的です。以下の手順では、ローカル管理者ステーションをローカルコンピューターと呼んでいます。
すべてのノードを接続するのはデータセンターファブリックで、この例では2つのサブネットとして示されています。実際の導入では、データセンターファブリックは、クラスターの物理接続を提供するスパイン/リーフスイッチのネットワークです。
Apstraが管理するデータセンターでは、基盤となるファブリックスイッチ間で作成するオーバーレイ仮想ネットワークを通じて、この接続性を指定します。
この手順では、Red Hat がホストする Assisted Installer サービスを使用し、ホストを起動する前にクラスターを登録する、より一般的な早期バインディングの使用事例について説明します。
- Assisted Installer クライアント マシンにログインします。Assisted Installer クライアント マシンは、Assisted Installer API 呼び出しをアシスト インストーラー サービスに発行する場所です。
- 後のステップで使用する環境変数を設定して、導入を準備します。
- クラスター内のノードへのアクセスに使用する SSH キーを作成します。キーを環境変数に保存します。
root@ai-client:~# ssh-keygen
この例では、SSHキーをデフォルトの場所 ~/.ssh/id_rsa.pubに保存します。export CLUSTER_SSHKEY=$(cat ~/.ssh/id_rsa.pub)
- Red Hat アカウントのイメージ プル シークレットをローカル コンピューターにダウンロードします。プル シークレットを使用すると、OpenShift コンポーネントのコンテナ イメージを提供するサービスとレジストリにインストールしてアクセスできます。
Red Hat の Hosted Assisted Installer を使用している場合は、ダウンロード ページからプル シークレット ファイル(プルシークレット)を ダウンロード できます。プルシークレットファイルを Assisted Installer クライアント マシンにコピーします。この例では、プルシークレットを pull-secret.txt と呼ばれるファイルに格納しています。
空白を取り除き、内容を JSON 文字列形式に変換し、次のように環境変数に保存します。
export PULL_SECRET=$(sed '/^[[:space:]]*$/d' pull-secret.txt | jq -R .)
- Red Hat アカウントからオフライン アクセス トークンをコピーします。OpenShift クラスター マネージャー API トークンを使用すると、(支援インストーラー クライアント マシン上で)Red Hat がホストするアシスト インストーラー API サービスとやり取りできます。
トークンは、ローカル環境変数にコピーアンドペーストできる文字列です。Red Hat の Hosted Assisted Installer を使用している場合は、 ダウンロード ページから API トークンをコピーできます。
export OFFLINE_ACCESS_TOKEN='<paste offline access token here>'
- OFFLINE_ACCESS_TOKENからトークンを生成(更新)します。この生成されたトークンは、API コマンドを発行するたびに使用します。
export TOKEN=$(curl --silent --data-urlencode "grant_type=refresh_token" --data-urlencode "client_id=cloud-services" --data-urlencode "refresh_token=${OFFLINE_ACCESS_TOKEN}" https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token | jq -r .access_token)
メモ:このトークンは定期的に期限切れになります。このトークンの有効期限が切れると、API コマンドを発行するたびに HTTP 400 応答が返されます。期限切れになったときにトークンを更新するか、または期限切れ前に定期的にトークンを更新します。トークンが期限切れになったときにトークンを更新しても何の害もありません。
- 残りの環境変数を設定します。
表 1 は、前の手順で説明したものも含め、この手順で設定する必要がある環境変数をすべて示しています。
表 1: 環境変数 変数の 説明 の例 CLUSTER_SSHKEY あなたが生成した(パブリック)sshキー。このキーはすべてのクラスタ ノードにインストールされます。 – PULL_SECRET ダウンロードし、削除し、JSON 文字列形式に変換したシークレットを取得します。 – OFFLINE_ACCESS_TOKEN コピーした OpenShift クラスター マネージャー API トークン。 – トークン OFFLINE_ACCESS_TOKENから生成(更新)したトークン。 – CLUSTER_NAME クラスターを呼び出す名前。Red Hat ハイブリッド クラウド コンソール UI に表示される名前です。 メモ:この名前は小文字にする必要があります。
クラスタ CLUSTER_DOMAIN クラスターに割り当てる基本ドメイン。クラスタオブジェクトには、このドメインの名前が割り当てられます。 contrail.lan CLUSTER_NET オーバーレイクラスターネットワーク。ポッドには、このネットワークにIPアドレスが割り当てられます。 10.128.0.0/14 CLUSTER_SVC_NET オーバーレイサービスネットワーク。このネットワークにはサービスにIPアドレスが割り当てられます。 172.31.0.0/16 CLUSTER_HOST_PFX CLUSTER_NETから IP アドレスを割り当てるためのサブネット プレフィックス長。これは、ポッドIPアドレスの割り当てに使用するCLUSTER_NET IPアドレスのサブセットを定義します。 23 CLUSTER_MACHINE_NET ホストが接続するマシン ネットワーク。これが、Kubernetes コントロール プレーン トラフィック用のファブリック仮想ネットワークです。 172.16.0.0/24 CLUSTER_API_VIP API エンドポイントに割り当てる仮想 IP アドレス。これは、内部ロードバランサーがAPIトラフィックをバックエンドノードに分散するために使用するフロントエンドIPアドレスです。
CLUSTER_MACHINE_NET内で使用されていない IP アドレスを選択します。
172.16.0.100 CLUSTER_INGRESS_VIP イングレスとして割り当てる仮想IPアドレス。これは、内部ロードバランサーがアプリケーショントラフィックをバックエンドノードに分散するために使用するフロントエンドIPアドレスです。
CLUSTER_MACHINE_NET内で使用されていない IP アドレスを選択します。
172.16.0.101 AI_URL 支援インストーラー サービスの URL。この例では、Red Hat のホスト型支援インストーラーを使用します。 https://api.openshift.com
- クラスター内のノードへのアクセスに使用する SSH キーを作成します。キーを環境変数に保存します。
- アシストインストーラー・サービスにクラスターを登録します。登録すると、作成するクラスターの属性について Assisted Installer サービスに伝えます。応答として、支援インストーラー サービスは、クラスター リソースを作成し、そのクラスター リソースを一意に識別するクラスター識別子を返します。
- 作成するクラスターを記述するファイルを作成します。この例では、deployment.jsonというファイル名を付けます。
cat << EOF > ./deployment.json { "kind": "Cluster", "name": "$CLUSTER_NAME", "openshift_version": "<openshift_version>", "ocp_release_image": "quay.io/openshift-release-dev/ocp-release:<coreOS_version>-x86_64", "base_dns_domain": "$CLUSTER_DOMAIN", "hyperthreading": "all", "machine_networks": [{"cidr": "$CLUSTER_MACHINE_NET"}], "ingress_vip": "$CLUSTER_INGRESS_VIP", "cluster_network_cidr": "$CLUSTER_NET", "cluster_network_host_prefix": $CLUSTER_HOST_PFX, "service_network_cidr": "$CLUSTER_SVC_NET", "user_managed_networking": false, "vip_dhcp_allocation": false, "ssh_public_key": "$CLUSTER_SSHKEY", "pull_secret": $PULL_SECRET } EOF
メモ:使用する(例えば)の https://www.juniper.net/documentation/us/en/software/cn-cloud-native23.1/cn2-tested-integrations/index.html <openshift_version> にリストされている(例
4.12.0
えば4.12
)を指定<coreOS_version>してください。また、指定した<openshift_version>情報が、インストールするCN2リリースと互換性があることを確認してください。 - クラスターを登録し、CLUSTER_IDを環境変数に保存します。先ほど作成した deployment.json ファイルを参照してください。
export CLUSTER_ID=$(curl -s -X POST "$AI_URL/api/assisted-install/v2/clusters" -d @./deployment.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id')
- クラスター属性を更新して、ネットワーク技術としてクラスターにCN2を使用するよう指定します。
curl --header "Content-Type: application/json" --request PATCH --data '"{\"networking\":{\"networkType\":\"Contrail\"}}"' -H "Authorization: Bearer $TOKEN" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/install-config
- 変更を確認します。
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/install-config | jq -r
クラスターの登録が完了したら、ブラウザーを Red Hat Hybrid Cloud Console( https://console.redhat.com/openshift)に向けて、インストールの進行状況を確認できます。クラスタ名またはクラスタIDでクラスタを検索できます。 - 作成するクラスターを記述するファイルを作成します。この例では、deployment.jsonというファイル名を付けます。
- ディスカバリーブート ISO を生成します。この ISO を使用して、クラスター内のノードを起動します。
ISO は、設定するインフラストラクチャ環境に基づいてインフラストラクチャに合わせてカスタマイズされています。
- インフラストラクチャ環境を説明するファイルを作成します。この例では infra-jsonと名前を付けます
cat << EOF > ./infra-envs.json { "name": "$CLUSTER_NAME", "ssh_authorized_key": "$CLUSTER_SSHKEY", "pull_secret": $PULL_SECRET, "image_type": "full-iso", "cluster_id": "$CLUSTER_ID", "openshift_version": "4.12", "cpu_architecture": "x86_64" } EOF
- 指定されたインフラストラクチャ環境に基づいて検出ブート ISO を構築するように、Assisted Installer サービスに指示します。先ほど作成した infra-jsons.json ファイルを参照してください。その代わりに、アシストインストーラサービスが、保存する必要のあるInfraEnv識別子を割り当てます。
export INFRA_ENVS_ID=$(curl -s -X POST "$AI_URL/api/assisted-install/v2/infra-envs" -d @infra-envs.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id')
- 拡張 API サーバーの適切な証明書を ISO にパッチを適用します。
これは、点火ファイルを適用することで行います。以下の内容を infra-ignition.json ファイルにコピーします。コンテンツには、拡張 API サーバーを適切な証明書で構成するエンコード済みスクリプトが含まれています。
{"ignition_config_override": "{\"ignition\":{\"version\":\"3.1.0\"},\"systemd\":{\"units\":[{\"name\":\"ca-patch.service\",\"enabled\":true,\"contents\":\"[Service]\\nType=oneshot\\nExecStart=/usr/local/bin/ca-patch.sh\\n\\n[Install]\\nWantedBy=multi-user.target\"}]},\"storage\":{\"files\":[{\"path\":\"/usr/local/bin/ca-patch.sh\",\"mode\":720,\"contents\":{\"source\":\"data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKc3VjY2Vzcz0wCnVudGlsIFsgJHN1Y2Nlc3MgLWd0IDEgXTsgZG8KICB0bXA9JChta3RlbXApCiAgY2F0IDw8RU9GPiR7dG1wfSB8fCB0cnVlCmRhdGE6CiAgcmVxdWVzdGhlYWRlci1jbGllbnQtY2EtZmlsZTogfAokKHdoaWxlIElGUz0gcmVhZCAtYSBsaW5lOyBkbyBlY2hvICIgICAgJGxpbmUiOyBkb25lIDwgPChjYXQgL2V0Yy9rdWJlcm5ldGVzL2Jvb3RzdHJhcC1zZWNyZXRzL2FnZ3JlZ2F0b3ItY2EuY3J0KSkKRU9GCiAgS1VCRUNPTkZJRz0vZXRjL2t1YmVybmV0ZXMvYm9vdHN0cmFwLXNlY3JldHMva3ViZWNvbmZpZyBrdWJlY3RsIC1uIGt1YmUtc3lzdGVtIHBhdGNoIGNvbmZpZ21hcCBleHRlbnNpb24tYXBpc2VydmVyLWF1dGhlbnRpY2F0aW9uIC0tcGF0Y2gtZmlsZSAke3RtcH0KICBpZiBbWyAkPyAtZXEgMCBdXTsgdGhlbgoJcm0gJHt0bXB9CglzdWNjZXNzPTIKICBmaQogIHJtICR7dG1wfQogIHNsZWVwIDYwCmRvbmUK\"}}]},\"kernelArguments\":{\"shouldExist\":[\"ipv6.disable=1\"]}}"}
作成した点火ファイルを適用します。curl -s -X PATCH $AI_URL/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID -d @infra-ignition.json --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r '.id'
- ISO をダウンロードします。この例では ai-liveiso-$CLUSTER_ID.iso と呼び、名前のクラスタ識別子を参照しています。
export IMAGE_URL=$(curl -H "Authorization: Bearer $TOKEN" -L "$AI_URL/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID/downloads/image-url" | jq -r '.url') curl -H "Authorization: Bearer $TOKEN" -L "$IMAGE_URL" -o /var/lib/libvirt/images/ai-liveiso-$CLUSTER_ID.iso
- インフラストラクチャ環境を説明するファイルを作成します。この例では infra-jsonと名前を付けます
- ディスカバリー ブート ISO で 3 つのコントロール プレーン ノードを起動します。
- インフラストラクチャにとって最も便利なブート方法を選択します。Red Hat ホスト型 Assisted Installer サービスにアクセスできるネットワークに接続されたマシンが起動していることを確認します。
図 1 に示すネットワークの例では、ノードには 2 つのインターフェイスがあり、1 つは 172.16.0.0/24 ネットワークに、もう 1 つのインターフェイスは 10.16.0.0/24 ネットワークに接続されています。
- クラスターのステータスを確認します。
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.status'
ノードが正常に立ち上がると、ステータスは 準備完了 であることを示す必要があります。 - 検証ステータスを確認します。
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.validations_info' | jq .
検証ステータスには、クラスターが適切に定義されているかどうかが表示されます。出力にエラーはないはずです。 - ホストを確認します。
curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts'
起動したすべてのノードの詳細が出力されます。ホスト ID など、特定の情報をcurl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts[].id'
およびホストロール:curl -s -X GET --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -H "get_unregistered_clusters: false" $AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID?with_hosts=true | jq -r '.hosts[].role'
- ロールが割り当てられていることを確認します。
ブラウザーで Red Hat Hybrid Cloud Console (https://console.redhat.com/openshift) にアクセスし、クラスターをクリックしてクラスターの詳細を確認します。クラスタ名またはクラスタID別にクラスタを検索できます。
ノード(ホスト)が立ち上がり、ロールがコントロールプレーンノードとして正常に割り当てられている場合にのみ、次のステップに進みます。3つのコントロールプレーンノードのみを起動したので、UIにコントロール プレーン、ワーカーとして割り当てられたロールが表示されます。
- インフラストラクチャにとって最も便利なブート方法を選択します。Red Hat ホスト型 Assisted Installer サービスにアクセスできるネットワークに接続されたマシンが起動していることを確認します。
- API トラフィックの仮想 IP アドレスを設定します。
curl -X PATCH "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d "{ \"api_vip\": \"$CLUSTER_API_VIP\"}"
- ステップ 5 を繰り返してワーカー ノードを起動します。
ホストロールをクエリーすると、 自動割り当て 状態のワーカーノードが表示されます。これは予想されます。支援インストーラー サービスは、クラスターのインストール時にこれらのノードの役割を後で割り当てます。
- DPDK データ パスを使用してワーカー ノードを実行している場合は、DPDK データ パスを実行している各ワーカー ノードに次のようにラベル付けします。
curl --location --request PATCH $AI_URL'/api/assisted-install/v2/infra-envs/$INFRA_ENVS_ID/hosts/$HOST_ID --header 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --data-raw '{"node_labels":[{"key": "agent-mode","value": "dpdk"},{"key": "node-role.kubernetes.io/dpdk","value" : ""}]}'
- CN2マニフェスト(インストールする前にダウンロードした)を、アシストインストーラサービスにアップロードします。クラスター管理ネットワークに固有のマニフェストを必ず追加してください。
便宜のために、以下のbashスクリプトを使用することができます。スクリプトは、 マニフェスト ディレクトリに マニフェストを配置したことを前提としています。このスクリプトを使用する場合は、以下を確認してください。
- サブディレクトリから使用するすべてのマニフェストを含め、このディレクトリで使用するすべてのマニフェストを配置します。
- このディレクトリには¶他のYAMLファイルは置きません
スクリプトはマニフェストディレクトリ内のすべての*.yamlファイルをループし、base64でエンコードしてクラスターに適用します。
#!/bin/bash MANIFESTS=(manifests/*.yaml) total=${#MANIFESTS[@]} i=0 for file in "${MANIFESTS[@]}"; do i=$(( i + 1 )) eval "CONTRAIL_B64_MANIFEST=$(cat $file | base64 -w0)"; eval "BASEFILE=$(basename $file)"; eval "echo '{\"file_name\":\"$BASEFILE\", \"folder\":\"manifests\", \"content\":\"$CONTRAIL_B64_MANIFEST\"}' > $file.b64"; printf "\nProcessing file: $file\n" curl -s -X POST "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/manifests" -d @$file.b64 --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" done echo echo echo "Total Manifests: $total" echo echo "Manifest List:" curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/manifests" --header "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq -r
- クラスタのインストールを開始します。
curl -X POST "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/actions/install" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" | jq
支援インストーラー サービスは、定義したクラスター リソースに基づいてクラスターを作成します。まず、Assistedインストーラは、コントロールプレーンノードの1つをブートストラップノードとして割り当て、次に他のノードを準備します。1つずつ、非ブートストラップノードがクラスタに再起動し、非ブートストラップコントロールプレーンノードが最初に再起動され、次にワーカーノード、最後にブートストラップノードが再起動されます。
インストールには1時間以上かかる場合があります。Red Hat Hybrid Cloud Console(https://console.redhat.com/openshift)でインストール状況を確認できます。
Red Hat Hybrid Cloud Console にインストールの停止が表示される場合は、ユーザー名 core を使用して各ノードにログインし、ホストでドメイン名(特に DNS/DHCP サーバーで設定したドメイン名、Red Hat Assisted Installer Service、Juniper Networks リポジトリ ドメイン名)を解決できることを確認します。最も一般的なインストールの問題は、不正なDNS設定などのネットワーク設定エラーに遡ることができます。また、一部の環境では、ノードが再起動する代わりにシャットダウンすることがあります。この場合、シャットダウンしたノードを手動で起動します。
- クラスターの kubeconfig をダウンロードします。
- kubeconfig をローカルの kubeconfig ファイルにダウンロードします。
curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/downloads/credentials?file_name=kubeconfig" -H "accept: application/octet-stream" -H "Authorization: Bearer $TOKEN" > kubeconfig
- kubeconfig を ~/.kube/config にコピーします。kubeconfig はデフォルトの ~/.kube/config の場所である必要があります。後で使用するコマンドでは、kubeconfig がデフォルトの場所であることが想定されるためcontrailstatusです。
- kubeconfig をローカルの kubeconfig ファイルにダウンロードします。
- インストールを確認します。
- すべてのポッドのステータスを確認します。すべてのポッドが実行中または完了済みのいずれかの状態であることを確認します。
kubectl get -pods -A -o wide
- 実行中または完了状態にないポッドについては、kubectl describe コマンドを使用してさらに調査してください。
kubectl describe pod <pod name> -n <namespace>
一般的な問題は、画像のダウンロードに失敗することです。この場合:
- ネットワークがジュニパーネットワークスリポジトリに到達できることを確認する
- 障害が発生したポッドが存在するノードがDNSサーバーにアクセスするように設定されていることを確認します。
- 障害が発生したポッドが存在するノードが、ホスト名でリポジトリに ping を実行できることを確認する
- すべてのポッドのステータスを確認します。すべてのポッドが実行中または完了済みのいずれかの状態であることを確認します。
- (オプション)OpenShift Web コンソールにログインして、クラスターを監視します。
Web コンソールの URL の形式は 、https://console-openshift-console.apps..<cluster-name><cluster-domain>.
- Web コンソールにアクセスするブラウザーが、Web コンソール URL にアクセスできるマシン上であることを確認します。そのマシンの /etc/hosts ファイルに、そのコンソールのホスト名のエントリーを追加する必要がある場合があります。このマッピングは、インストールする前に DNS サーバーで構成した *.apps.mycluster.contrail.lan マッピングであることを思い出してください。
- kubeadmin パスワードをダウンロードします。
curl -s -X GET "$AI_URL/api/assisted-install/v2/clusters/$CLUSTER_ID/downloads/credentials?file_name=kubeadmin-password" -H "accept: application/octet-stream" -H "Authorization: Bearer $TOKEN"
- ユーザー名 kubeadmin とダウンロードしたパスワードを使用して OpenShift Web コンソールにログインします。