12.9. コントロールプレーンマシンの手動スケーリング


ベアメタルインフラストラクチャーにクラスターをインストールする場合、クラスターのコントロールプレーンノードを手動で 4 つまたは 5 つにスケールアップできます。劣化(degraded)状態からクラスターを回復したり、ディープレベルのデバッグを実行したり、複雑なシナリオでコントロールプレーンの安定性とセキュリティーを確保したりする必要がある場合、このユースケースを考えてみましょう。

重要

Red Hat は、ベアメタルインフラストラクチャーでのみ 4 つまたは 5 つのコントロールプレーンノードを持つクラスターをサポートします。

12.9.1. コントロールプレーンノードのクラスターへの追加

ベアメタルインフラストラクチャーにクラスターをインストールする場合、クラスターのコントロールプレーンノードを手動で 4 つまたは 5 つにスケールアップできます。手順の例では、node- 5 を新規コントロールプレーンノードとして使用します。

前提条件

  • 少なくとも 3 つのコントロールプレーンノードを持つ正常なクラスターをインストールした。
  • インストール後のタスクとしてクラスターに追加する単一のコントロールプレーンノードを作成している。

手順

  1. 次のコマンドを入力して、新しいコントロールプレーンノードの保留中の証明書署名要求(CSR)を取得します。

    $ oc get csr | grep Pending
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを入力して、コントロールプレーンノードの保留中のすべての 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
    Copy to Clipboard Toggle word wrap
    重要

    インストールを完了するには、CSR を承認する必要があります。

  3. 次のコマンドを入力して、コントロールプレーンノードが Ready ステータスであることを確認します。

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
    注記

    インストーラーでプロビジョニングされるインフラストラクチャーでは、etcd Operator はマシン API に依存してコントロールプレーンを管理し、etcd クォーラムを確認します。続いて、マシン API は Machine CR を使用して基礎となるコントロールプレーンノードを表現および管理します。

  4. BareMetalHost および Machine CR を作成し、それらをコントロールプレーンノードの Node CR にリンクします。

    1. 次の例に示すように、一意の .metadata.name 値を使用して BareMetalHost CR を作成します。

      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
      # ...
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを入力して、BareMetalHost CR を適用します。

      $ oc apply -f <filename> 
      1
      Copy to Clipboard Toggle word wrap
      1
      <filename> は BareMetalHost CR の名前に置き換えます。
    3. 以下の例のように、一意の .metadata.name 値を使用して Machine CR を作成します。

      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
      # ...
      Copy to Clipboard Toggle word wrap
      1
      <cluster_name> は特定のクラスターの名前に置き換えます (例: test-day2-1-6qv96)
    4. 次のコマンドを実行して、クラスター名を取得します。

      $ oc get infrastructure cluster -o=jsonpath='{.status.infrastructureName}{"\n"}'
      Copy to Clipboard Toggle word wrap
    5. 次のコマンドを入力して、Machine CR を適用します。

      $ oc apply -f <filename> 
      1
      Copy to Clipboard Toggle word wrap
      1
      <filename>Machine CR の名前に置き換えます。
    6. link-machine-and-node.sh スクリプトを実行して、BareMetalHostMachine、および Node オブジェクトをリンクします。

      1. 以下の 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}"
        Copy to Clipboard Toggle word wrap
      2. 次のコマンドを入力して、スクリプトを実行可能にします。

        $ chmod +x link-machine-and-node.sh
        Copy to Clipboard Toggle word wrap
      3. 次のコマンドを入力して、スクリプトを実行します。

        $ bash link-machine-and-node.sh node-5 node-5
        Copy to Clipboard Toggle word wrap
        注記

        最初の node-5 インスタンスはマシンを表し、2 つ目のインスタンスはノードを表します。

検証

  1. 既存のコントロールプレーンノードのいずれかを実行して、etcd のメンバーを確認します。

    1. 次のコマンドを入力して、コントロールプレーンノードへのリモートシェルセッションを開きます。

      $ oc rsh -n openshift-etcd etcd-node-0
      Copy to Clipboard Toggle word wrap
    2. etcd メンバーを一覧表示します。

      # etcdctl member list -w table
      Copy to Clipboard Toggle word wrap
  2. 次のコマンドを入力して、完了するまで etcd Operator 設定プロセスを確認します。予期される出力には、PROGRESSING 列の下に False が表示されます。

    $ oc get clusteroperator etcd
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを実行して etcd の正常性を確認します。

    1. コントロールプレーンノードへのリモートシェルセッションを開きます。

      $ oc rsh -n openshift-etcd etcd-node-0
      Copy to Clipboard Toggle word wrap
    2. エンドポイントの正常性を確認します。予想される出力 は、エンドポイントの正常であること を示します。

      # etcdctl endpoint health
      Copy to Clipboard Toggle word wrap
  4. 次のコマンドを入力して、すべてのノードが準備状態にあることを確認します。予想される出力には、各ノードエントリーの横に Ready ステータスが表示されます。

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
  5. 次のコマンドを入力して、クラスター Operator がすべて使用可能であることを確認します。予想される出力には、各 Operator が表示され、一覧表示される各 Operator の横にある True として available ステータスが表示されます。

    $ oc get ClusterOperators
    Copy to Clipboard Toggle word wrap
  6. 次のコマンドを入力して、クラスターのバージョンが正しいことを確認します。

    $ oc get ClusterVersion
    Copy to Clipboard Toggle word wrap

    出力例

    NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    version   OpenShift Container Platform.5    True        False         5h57m   Cluster version is OpenShift Container Platform.5
    Copy to Clipboard Toggle word wrap

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat