4.5. コントロールプレーンマシンの管理
コントロールプレーンマシンセット は、コンピュートマシンセットがコンピュートマシンに提供するものと同様の管理機能をコントロールプレーンマシンに提供します。クラスター上のコントロールプレーンマシンセットの可用性と初期ステータスは、クラウドプロバイダーと、インストールした OpenShift Container Platform のバージョンによって異なります。詳細は、コントロールプレーンマシンセットの概要 を参照してください。
4.5.1. クラスターへのコントロールプレーンノードの追加 リンクのコピーリンクがクリップボードにコピーされました!
ベアメタルインフラストラクチャーにクラスターをインストールする場合、クラスターのコントロールプレーンノードを最大 4 つまたは 5 つまで手動でスケーリングできます。この手順の例では、新しいコントロールプレーンノードとして node-5 を使用します。
前提条件
- 少なくとも 3 つのコントロールプレーンノードを持つ正常なクラスターをインストールした。
- インストール後のタスクとしてクラスターに追加するコントロールプレーンノードを 1 つ作成した。
手順
次のコマンドを入力して、新しいコントロールプレーンノードの保留中の証明書署名要求 (CSR) を取得します。
$ oc get csr | grep Pending次のコマンドを入力して、コントロールプレーンノードの保留中の CSR をすべて承認します。
$ oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}{{end}}{{end}}' | xargs --no-run-if-empty oc adm certificate approve重要インストールを完了するには、CSR を承認する必要があります。
次のコマンドを入力して、コントロールプレーンノードが
Readyステータスになっていることを確認します。$ oc get nodes注記installer-provisioned infrastructure では、etcd Operator が Machine API を利用してコントロールプレーンを管理し、etcd クォーラムを確保します。Machine API は
MachineCR を使用して、基盤となるコントロールプレーンノードを表現および管理します。BareMetalHostおよびMachineCR を作成し、それらをコントロールプレーンノードのNodeCR にリンクします。次の例に示すように、一意の
.metadata.name値を持つBareMetalHostCR を作成します。apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: node-5 namespace: openshift-machine-api spec: automatedCleaningMode: metadata bootMACAddress: 00:00:00:00:00:02 bootMode: UEFI customDeploy: method: install_coreos externallyProvisioned: true online: true userData: name: master-user-data-managed namespace: openshift-machine-api # ...次のコマンドを入力して、
BareMetalHostCR を適用します。$ oc apply -f <filename>1 - 1
- <filename> は
BareMetalHostCR の名前に置き換えます。
次の例に示すように、一意の
.metadata.name値を使用してMachineCR を作成します。apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: annotations: machine.openshift.io/instance-state: externally provisioned metal3.io/BareMetalHost: openshift-machine-api/node-5 finalizers: - machine.machine.openshift.io labels: machine.openshift.io/cluster-api-cluster: <cluster_name>1 machine.openshift.io/cluster-api-machine-role: master machine.openshift.io/cluster-api-machine-type: master name: node-5 namespace: openshift-machine-api spec: metadata: {} providerSpec: value: apiVersion: baremetal.cluster.k8s.io/v1alpha1 customDeploy: method: install_coreos hostSelector: {} image: checksum: "" url: "" kind: BareMetalMachineProviderSpec metadata: creationTimestamp: null userData: name: master-user-data-managed # ...- 1
<cluster_name>は、特定のクラスターの名前に置き換えます (例:test-day2-1-6qv96)。
次のコマンドを実行してクラスター名を取得します。
$ oc get infrastructure cluster -o=jsonpath='{.status.infrastructureName}{"\n"}'次のコマンドを入力して、
MachineCR を適用します。$ oc apply -f <filename>1 - 1
<filename>はMachineCR の名前に置き換えます。
link-machine-and-node.shスクリプトを実行して、BareMetalHost、Machine、およびNodeオブジェクトをリンクします。次の
link-machine-and-node.shスクリプトをローカルマシンにコピーします。#!/bin/bash # Credit goes to # https://bugzilla.redhat.com/show_bug.cgi?id=1801238. # This script will link Machine object # and Node object. This is needed # in order to have IP address of # the Node present in the status of the Machine. set -e machine="$1" node="$2" if [ -z "$machine" ] || [ -z "$node" ]; then echo "Usage: $0 MACHINE NODE" exit 1 fi node_name=$(echo "${node}" | cut -f2 -d':') oc proxy & proxy_pid=$! function kill_proxy { kill $proxy_pid } trap kill_proxy EXIT SIGINT HOST_PROXY_API_PATH="http://localhost:8001/apis/metal3.io/v1alpha1/namespaces/openshift-machine-api/baremetalhosts" function print_nics() { local ips local eob declare -a ips readarray -t ips < <(echo "${1}" \ | jq '.[] | select(. | .type == "InternalIP") | .address' \ | sed 's/"//g') eob=',' for (( i=0; i<${#ips[@]}; i++ )); do if [ $((i+1)) -eq ${#ips[@]} ]; then eob="" fi cat <<- EOF { "ip": "${ips[$i]}", "mac": "00:00:00:00:00:00", "model": "unknown", "speedGbps": 10, "vlanId": 0, "pxe": true, "name": "eth1" }${eob} EOF done } function wait_for_json() { local name local url local curl_opts local timeout local start_time local curr_time local time_diff name="$1" url="$2" timeout="$3" shift 3 curl_opts="$@" echo -n "Waiting for $name to respond" start_time=$(date +%s) until curl -g -X GET "$url" "${curl_opts[@]}" 2> /dev/null | jq '.' 2> /dev/null > /dev/null; do echo -n "." curr_time=$(date +%s) time_diff=$((curr_time - start_time)) if [[ $time_diff -gt $timeout ]]; then printf '\nTimed out waiting for %s' "${name}" return 1 fi sleep 5 done echo " Success!" return 0 } wait_for_json oc_proxy "${HOST_PROXY_API_PATH}" 10 -H "Accept: application/json" -H "Content-Type: application/json" addresses=$(oc get node -n openshift-machine-api "${node_name}" -o json | jq -c '.status.addresses') machine_data=$(oc get machines.machine.openshift.io -n openshift-machine-api -o json "${machine}") host=$(echo "$machine_data" | jq '.metadata.annotations["metal3.io/BareMetalHost"]' | cut -f2 -d/ | sed 's/"//g') if [ -z "$host" ]; then echo "Machine $machine is not linked to a host yet." 1>&2 exit 1 fi # The address structure on the host doesn't match the node, so extract # the values we want into separate variables so we can build the patch # we need. hostname=$(echo "${addresses}" | jq '.[] | select(. | .type == "Hostname") | .address' | sed 's/"//g') set +e read -r -d '' host_patch << EOF { "status": { "hardware": { "hostname": "${hostname}", "nics": [ $(print_nics "${addresses}") ], "systemVendor": { "manufacturer": "Red Hat", "productName": "product name", "serialNumber": "" }, "firmware": { "bios": { "date": "04/01/2014", "vendor": "SeaBIOS", "version": "1.11.0-2.el7" } }, "ramMebibytes": 0, "storage": [], "cpu": { "arch": "x86_64", "model": "Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz", "clockMegahertz": 2199.998, "count": 4, "flags": [] } } } } EOF set -e echo "PATCHING HOST" echo "${host_patch}" | jq . curl -s \ -X PATCH \ "${HOST_PROXY_API_PATH}/${host}/status" \ -H "Content-type: application/merge-patch+json" \ -d "${host_patch}" oc get baremetalhost -n openshift-machine-api -o yaml "${host}"次のコマンドを入力して、スクリプトを実行可能にします。
$ chmod +x link-machine-and-node.sh次のコマンドを入力して、スクリプトを実行します。
$ bash link-machine-and-node.sh node-5 node-5注記最初の
node-5インスタンスはマシンを表し、2 番目のインスタンスはノードを表します。
検証
既存のコントロールプレーンノードの 1 つを実行して、etcd のメンバーを確認します。
次のコマンドを入力して、コントロールプレーンノードへのリモートシェルセッションを開きます。
$ oc rsh -n openshift-etcd etcd-node-0etcd のメンバーをリスト表示します。
# etcdctl member list -w table
次のコマンドを入力して、etcd Operator の設定プロセスが完了するまで確認を続けます。期待される出力では、
PROGRESSING列にFalseと表示されます。$ oc get clusteroperator etcd次のコマンドを実行して、etcd の健全性を確認します。
コントロールプレーンノードへのリモートシェルセッションを開きます。
$ oc rsh -n openshift-etcd etcd-node-0エンドポイントの健全性を確認します。期待される出力では、エンドポイントに対して
is healthyと表示されます。# etcdctl endpoint health
次のコマンドを入力して、すべてのノードが準備完了状態であることを確認します。期待される出力では、各ノードエントリーの横に
Readyステータスが表示されます。$ oc get nodes次のコマンドを入力して、クラスター Operator がすべて利用可能であることを確認します。期待される出力では、各 Operator がリストされ、リストされた各 Operator の横に利用可能な状態を示す
Trueが表示されます。$ oc get ClusterOperators次のコマンドを入力して、クラスターのバージョンが正しいことを確認します。
$ oc get ClusterVersion出力例
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS version OpenShift Container Platform.5 True False 5h57m Cluster version is OpenShift Container Platform.5