4.5. 제어 평면 머신 관리


컨트롤 플레인 머신 세트는 컴퓨팅 머신에 제공하는 컴퓨팅 머신 세트와 유사한 지원되는 컨트롤 플레인 시스템에 대한 관리 기능을 제공합니다. 클러스터의 제어 평면 머신 세트의 가용성과 초기 상태는 클라우드 공급자와 설치한 OpenShift Container Platform 버전에 따라 달라집니다. 자세한 내용은 제어 평면 머신 세트 시작하기를 참조하세요.

4.5.1. 클러스터에 제어 평면 노드 추가

베어 메탈 인프라에 클러스터를 설치하는 경우 클러스터의 제어 평면 노드를 최대 4~5개까지 수동으로 확장할 수 있습니다. 절차의 예에서는 새로운 제어 평면 노드로 노드 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. 다음 명령을 입력하여 제어 평면 노드가 준비 상태인지 확인하세요.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
    참고

    설치 프로그램이 제공하는 인프라에서 etcd 운영자는 Machine API를 사용하여 제어 평면을 관리하고 etcd 쿼럼을 보장합니다. 그러면 Machine API는 Machine CR을 사용하여 기본 제어 평면 노드를 표현하고 관리합니다.

  4. BareMetalHostMachine CR을 생성하고 이를 제어 평면 노드의 노드 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
      <파일 이름>을 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
      <파일 이름>을 Machine CR의 이름으로 바꾸세요.
    6. link-machine-and-node.sh 스크립트를 실행하여 BareMetalHost , MachineNode 객체를 연결합니다.

      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
        참고

        첫 번째 노드-5 인스턴스는 머신을 나타내고, 두 번째 인스턴스는 노드를 나타냅니다.

검증

  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. 다음 명령을 입력하여 모든 노드가 준비되었는지 확인하세요. 예상되는 출력은 각 노드 항목 옆에 준비 상태를 표시합니다.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 입력하여 클러스터 운영자가 모두 사용 가능한지 확인하세요. 예상 출력에는 각 연산자가 나열되고, 나열된 각 연산자 옆에 사용 가능한 상태가 True 로 표시됩니다.

    $ 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은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat