클러스터 업데이트

클러스터를 만든 후에는 클러스터 구성의 일부 측면을 변경할 수 있습니다. 예를 들어 다음과 같은 작업을 할 수 있습니다.

  • 노드를 추가, 삭제 또는 교체합니다.
  • 클러스터에 주석을 추가하거나 삭제합니다.
  • 클러스터 및 노드 풀 리소스에서 변경 가능한 필드의 값을 수정합니다.
  • 다른 커스텀 리소스를 수정합니다.

bmctl 또는 Google Cloud CLI를 사용하여 클러스터를 업데이트할 수 있습니다. Terraform을 사용하여 관리자 또는 사용자 클러스터를 만든 경우 Terraform으로 클러스터를 업데이트할 수 있습니다. 다음에 유의하세요.

  • 클러스터 구성의 많은 측면을 변경할 수 없으며 클러스터를 만든 후에는 업데이트할 수 없습니다. 변경 가능한 필드와 변경할 수 없는 필드의 전체 목록은 클러스터 구성 필드 참조를 확인하세요. 필드 참조는 정렬 가능한 테이블입니다. 정렬 순서를 변경하려면 열 제목을 클릭하세요. 설명을 보려면 필드 이름을 클릭하세요.

  • gcloud CLI 및 Terraform은 관리자 및 사용자 클러스터 업데이트만 지원합니다. 다른 클러스터 유형을 업데이트하려면 bmctl을 사용해야 합니다.

  • gcloud CLI 및 Terraform은 클러스터 및 노드 풀 리소스에 대한 변경만 지원합니다. kubectl 또는 bmctl을 사용하여 클러스터에 영향을 미치는 다른 커스텀 리소스를 업데이트해야 합니다.

클러스터 업데이트 방법

일반적으로 클러스터를 업데이트하는 일련의 작업은 다음과 같습니다.

bmctl

  1. 클러스터 구성 파일에서 적용 가능한 필드 값을 변경합니다. 기본적으로 이 파일은 다음 위치에 있습니다:
    bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml

  2. bmctl update 명령어를 실행하여 클러스터를 업데이트합니다.

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 업데이트하려는 클러스터의 이름입니다.
    • KUBECONFIG: 관리자, 하이브리드 또는 독립형 클러스터의 경우 클러스터의 kubeconfig 파일 경로를 입력합니다. 사용자 클러스터의 경우 admin 클러스터의 kubeconfig 파일 경로를 입력합니다.

gcloud CLI

  1. 수정하려는 구성의 플래그만 지정합니다.

  2. 관련 업데이트 명령어를 실행합니다.

Terraform

  1. 클러스터 또는 노드 풀을 만드는 데 사용한 Terraform 구성 파일에서 해당 필드의 값을 변경합니다. 자세한 필드 설명은 Terraform 참고 문서를 확인하세요.

  2. terraform apply 명령어를 실행하여 구성을 업데이트합니다.

다음 섹션에서는 기존 클러스터를 업데이트하는 몇 가지 일반적인 예시를 설명합니다.

클러스터에서 노드 추가 또는 삭제

노드 풀은 클러스터 내에서 구성이 동일한 노드 그룹입니다. 노드는 항상 노드 풀에 속합니다. 새 노드를 클러스터에 추가하려면 특정 노드 풀에 추가해야 합니다. 노드 풀에서 노드를 삭제하면 클러스터에서 해당 노드가 같이 삭제됩니다.

Google Distributed Cloud에는 컨트롤 플레인, 부하 분산기, 워커 노드 풀이라는 3가지 종류의 노드 풀이 있습니다. 다음 섹션에서는 각 종류의 노드 풀에서 노드를 추가하거나 삭제하는 방법을 설명합니다.

bmctl

클러스터 구성 파일의 특정 섹션에 있는 노드의 IP 주소를 추가하거나 삭제하여 노드 풀에서 노드를 추가하거나 삭제합니다. 다음 목록에서는 특정 노드 풀에서 수정할 섹션을 보여줍니다.

  • 워커 노드 풀: NodePool 사양의 spec.nodes 섹션에 있는 노드의 IP 주소를 추가하거나 삭제합니다.
  • 컨트롤 플레인 노드 풀: Cluster 사양의 spec.controlPlane.nodePoolSpec.nodes 섹션에 있는 노드의 IP 주소를 추가하거나 삭제합니다.
  • 부하 분산기 노드 풀: Cluster 사양의 spec.loadBalancer.nodePoolSpec.nodes 섹션에 있는 노드의 IP 주소를 추가하거나 삭제합니다.

예시: 워커 노드 삭제

다음은 워커 노드 두 개의 사양을 보여주는 클러스터 구성 파일 샘플입니다.

---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: nodepool1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: 192.0.2.1
  - address: 192.0.2.2

노드를 삭제하려면 다음 안내를 따르세요.

  1. (선택사항) 삭제할 노드에서 중요한 포드를 실행하는 경우 먼저 노드를 유지보수 모드로 전환합니다.

    NodePool 리소스의 status.nodesDrainedstatus.nodesDraining 필드를 확인하면 워커 노드의 노드 드레이닝 프로세스를 모니터링할 수 있습니다.

  2. 클러스터 구성 파일을 수정하여 노드의 IP 주소 항목을 삭제합니다.

  3. 클러스터를 업데이트합니다.

    bmctl update cluster1 \
        --kubeconfig=ADMIN_KUBECONFIG
    

gcloud CLI

update 명령어를 사용하여 노드를 추가하거나 삭제합니다. 사용되는 update 명령어와 IP 주소를 지정하는 플래그는 업데이트하려는 노드 풀 유형에 따라 다릅니다.

  • 워커 노드 풀: gcloud container bare-metal node-pools update를 실행하고 --node-configs 'node-ip=IP_ADDRESS' 플래그에 IP 주소를 지정합니다.

  • 관리자 클러스터의 컨트롤 플레인 노드 풀: gcloud container bare-metal admin-clusters update를 실행하고 --control-plane-node-configs 'node-ip=IP_ADDRESS' 플래그에 IP 주소를 지정합니다.

  • 사용자 클러스터의 컨트롤 플레인 노드 풀: gcloud container bare-metal clusters update를 실행하고 --control-plane-node-configs 'node-ip=IP_ADDRESS' 플래그에 IP 주소를 지정합니다.

  • 부하 분산기 노드 풀: gcloud container bare-metal clusters update를 실행하고 --metal-lb-load-balancer-node-configs 'node-ip=IP_ADDRESS' 또는 --bgp-load-balancer-node-configs 'node-ip=IP_ADDRESS' 플래그에 IP 주소를 지정합니다.

IP 주소를 지정하는 플래그에는 node-ip 하나만 허용됩니다. 노드 풀의 각 IP 주소에 해당 플래그를 포함합니다.

update 명령어는 모든 IP 주소를 지정한 IP 주소로 바꿉니다. 노드를 추가하려면 기존 노드의 IP 주소와 새 노드의 IP 주소를 update 명령어에 포함합니다. 마찬가지로 유지하려는 노드의 IP 주소만 포함하여 노드를 삭제합니다.

예시: 워커 노드 삭제

이 섹션에서는 예시 데이터를 사용하여 노드 풀에서 워커 노드를 삭제하는 방법을 보여줍니다. 유용한 gcloud CLI 추가 명령어는 다음 단계에도 포함됩니다.

  1. (선택사항) 삭제할 노드에서 중요한 포드를 실행하는 경우 먼저 노드를 유지보수 모드로 전환합니다.

    NodePool 리소스의 status.nodesDrainedstatus.nodesDraining 필드를 확인하면 워커 노드의 노드 드레이닝 프로세스를 모니터링할 수 있습니다.

  2. list 명령어를 실행하여 클러스터의 모든 노드 풀을 나열합니다.

    gcloud container bare-metal node-pools list \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1
    

    출력은 다음과 비슷합니다.

    NAME         LOCATION     STATE
    node-pool-1  us-central1  RUNNING
    node-pool-2  asia-east1   RUNNING
    
  3. describe 명령어를 실행하여 노드 풀의 모든 IP 주소를 나열합니다.

    gcloud container bare-metal node-pools describe node-pool-1 \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1
    

    다음 예시 출력은 가독성을 위해 잘려 있습니다.

    annotations:
      ...
      baremetal.cluster.gke.io/version: 1.30
    ...
    name: projects/example-project-12345/locations/us-central1/bareMetalClusters/abm-user-cluster1/bareMetalNodePools/node-pool-1
    nodePoolConfig:
      nodeConfigs:
      - nodeIp: 192.0.2.1
      - nodeIp: 192.0.2.2
      operatingSystem: LINUX
    state: RUNNING
    ...
    

    예시 출력에서 다음 사항에 유의하세요.

    • name 필드에는 노드 풀의 정규화된 이름이 포함됩니다. 명령어에 노드 풀 이름을 지정할 때 정규화된 이름 또는 노드 풀 이름을 지정할 수 있습니다(예: --cluster, --project, --location 플래그가 있는 node-pool-1).

    • nodeConfigs 섹션에는 노드의 IP 주소가 있는 nodeIp 필드 두 개가 포함됩니다.

  4. 다음 명령어를 실행하여 IP 주소 192.0.2.1이 있는 노드를 삭제합니다.

    gcloud container bare-metal node-pools update node-pool-1 \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1 \
        --node-configs='node-ip=192.0.2.2'
    

    update 명령어는 모든 IP 주소를 지정한 IP 주소로 바꿉니다. 192.0.2.1이 포함되어 있지 않으므로 노드가 삭제됩니다.

    이 명령어 출력은 다음과 비슷합니다.

    Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9] to complete
    

    예시 출력에서 operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9 문자열은 장기 실행 작업의 OPERATION_ID입니다. 다른 터미널 창에서 다음 명령어를 실행하여 작업 상태를 찾을 수 있습니다.

    gcloud container bare-metal operations describe operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9 \
        --project= example-project-12345 \
        --location=us-central1
    

    명령어를 자주 반복 실행하여 상태를 확인할 수 있습니다.

노드 삭제가 실패하면 클러스터에서 강제로 삭제할 수 있습니다. 자세한 내용은 손상된 노드 강제 삭제를 참조하세요.

HA 컨트롤 플레인 노드 교체

bmctl

bmctl을 사용하여 모든 클러스터 유형의 고가용성(HA) 컨트롤 플레인 노드를 바꿀 수 있습니다.

클러스터의 노드를 바꾸려면 다음 단계를 따르세요.

  1. 클러스터 구성 파일에서 노드의 IP 주소를 삭제합니다.
  2. 클러스터를 업데이트합니다.
  3. 클러스터의 노드 상태를 확인합니다.
  4. 새 노드의 IP 주소를 동일한 클러스터 구성 파일에 추가합니다.
  5. 클러스터를 업데이트합니다.

예시: HA 컨트롤 플레인 노드 교체

다음은 사용자 클러스터의 컨트롤 플레인 노드 세 개를 보여주는 샘플 클러스터 구성 파일입니다.

---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: user-cluster
namespace: cluster-user-cluster
spec:
  controlPlane:
  nodePoolSpec:
    nodes:
    - address: 192.0.2.11
    - address: 192.0.2.12
    - address: 192.0.2.13

spec.controlPlane.nodePoolSpec.nodes 섹션에 나열된 마지막 노드를 바꾸려면 다음 단계를 수행하세요.

  1. 클러스터 구성 파일에서 IP 주소 항목을 삭제하여 노드를 삭제합니다. 이렇게 변경하면 클러스터 구성 파일이 다음과 같이 표시됩니다.

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
    name: user-cluster
    namespace: cluster-user-cluster
    spec:
      controlPlane:
      nodePoolSpec:
        nodes:
        - address: 192.0.2.11
        - address: 192.0.2.12
    
  2. 다음 명령어를 실행하여 클러스터를 업데이트합니다.

    bmctl update cluster -c CLUSTER_NAME \
      --kubeconfig=KUBECONFIG
    

    다음과 같이 변경하세요.

    • CLUSTER_NAME을 업데이트하려는 클러스터 이름으로 바꿉니다.
    • 클러스터가 자체 관리 클러스터(예: 관리자 또는 독립형 클러스터)인 경우 KUBECONFIG를 클러스터의 kubeconfig 파일 경로로 바꿉니다. 이 예시에서와 같이 클러스터가 사용자 클러스터인 경우 KUBECONFIGadmin 클러스터의 kubeconfig 파일 경로로 바꿉니다.
  3. bmctl update 명령어가 성공적으로 실행된 후 machine-preflightmachine-init 작업이 완료되는 데 다소 시간이 걸립니다. 이 문서의 업데이트 확인 섹션에 설명된 명령어를 실행하여 노드 및 해당 노드 풀의 상태를 볼 수 있습니다. 노드 풀 및 노드가 준비 상태가 되면 다음 단계로 진행할 수 있습니다.

  4. 새 컨트롤 플레인 노드의 IP 주소를 클러스터 구성 파일의 spec.controlPlane.nodePoolSpec.nodes 섹션에 추가하여 노드 풀에 새 컨트롤 플레인 노드를 추가합니다. 이렇게 변경하면 클러스터 구성 파일이 다음과 같이 표시됩니다.

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
    name: user-cluster
    namespace: cluster-user-cluster
    spec:
      controlPlane:
      nodePoolSpec:
        nodes:
        - address: 192.0.2.11
        - address: 192.0.2.12
        - address: 192.0.2.14
    
  5. 다음 명령어를 실행하여 클러스터를 업데이트합니다.

    bmctl update cluster -c CLUSTER_NAME \
      --kubeconfig=KUBECONFIG
    

gcloud CLI

gcloud CLI를 사용하여 관리자 및 사용자 클러스터의 고가용성(HA) 컨트롤 플레인 노드를 바꿀 수 있습니다.

클러스터의 노드를 바꾸려면 다음 단계를 따르세요.

  1. 해당 update 명령어를 실행하여 노드의 IP 주소를 삭제합니다.

    • 사용자 클러스터: gcloud container bare-metal clusters update
    • 관리자 클러스터: gcloud container bare-metal admin-clusters update
  2. gcloud container bare-metal operations describe OPERATION_ID를 실행하여 클러스터에서 노드 삭제 상태를 확인합니다.

  3. 해당 update 명령어를 실행하여 새 노드의 IP 주소를 추가합니다.

예시: HA 컨트롤 플레인 노드 교체

이 섹션에서는 예시 데이터를 사용하여 클러스터에서 컨트롤 플레인을 교체하는 방법을 보여줍니다. 유용한 gcloud CLI 추가 명령어는 다음 단계에도 포함됩니다.

  1. list 명령어를 실행하여 Google Cloud 프로젝트의 모든 사용자 클러스터를 나열합니다.

    gcloud container bare-metal clusters list \
        --project=example-project-12345 \
        --location=-
    

    --location=-을 설정하면 모든 리전의 모든 클러스터가 나열됩니다. 목록의 범위를 좁혀야 하는 경우 --location특정 리전으로 설정합니다.

    출력은 다음과 비슷합니다.

    NAME                 LOCATION      VERSION   ADMIN_CLUSTER        STATE
    abm-user-cluster1a   us-central1   1.30      abm-admin-cluster1   RUNNING
    abm-user-cluster1b   europe-west1  1.30      abm-admin-cluster1   RUNNING
    
  2. 클러스터에서 describe 명령어를 실행합니다.

    gcloud container bare-metal clusters describe abm-user-cluster1  \
        --project=example-project-12345 \
        --location=us-central1
    

    다음 예시 출력은 가독성을 위해 잘려 있습니다.

    ...
    controlPlane:
      controlPlaneNodePoolConfig:
        nodePoolConfig:
          nodeConfigs:
          - nodeIp: 192.0.2.11
          - nodeIp: 192.0.2.12
          - nodeIp: 192.0.2.13
          operatingSystem: LINUX
    ...
    name: projects/example-project-1234567/locations/us-central1/bareMetalClusters/abm-user-cluster1a
    ...
    

    예시 출력에서 다음 사항에 유의하세요.

    • name 필드에는 클러스터의 정규화된 이름이 포함됩니다. 명령어에 클러스터 이름을 지정할 때 정규화된 이름 또는 클러스터 이름을 지정할 수 있습니다(예: --project--location flags가 있는 abm-user-cluster1a).

    • nodeConfigs 섹션에는 컨트롤 플레인 노드의 IP 주소가 있는 3개의 nodeIp 필드가 포함됩니다.

  3. IP 주소가 192.0.2.13인 노드를 삭제합니다.

    gcloud container bare-metal cluster update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --control-plane-node-configs 'node-ip=192.0.2.11'
        --control-plane-node-configs 'node-ip=192.0.2.12'
    

    이 명령어 출력은 다음과 비슷합니다.

    Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1956154681749-6078d9def4030-76686d6e-9fcb1d7] to complete
    

    예시 출력에서 operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7 문자열은 장기 실행 작업의 OPERATION_ID입니다. 다른 터미널 창에서 다음 명령어를 실행하여 작업 상태를 찾을 수 있습니다.

    gcloud container bare-metal operations describe operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7 \
        --project= example-project-12345 \
        --location=us-central1
    

    명령어를 자주 반복 실행하여 상태를 확인할 수 있습니다.

  4. IP 주소 192.0.2.14를 사용하여 새 노드를 추가합니다.

    gcloud container bare-metal cluster update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --control-plane-node-configs 'node-ip=192.0.2.11'
        --control-plane-node-configs 'node-ip=192.0.2.12'
        --control-plane-node-configs 'node-ip=192.0.2.14'
    

업데이트 확인

kubectl

kubectl get 명령어를 사용하면 노드 및 각 노드 풀의 상태를 확인할 수 있습니다.

예를 들어 다음 명령어는 클러스터 네임스페이스 cluster-my-cluster의 노드 풀 상태를 보여줍니다.

kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io

시스템에서 다음과 비슷한 결과를 반환합니다.

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
cluster-my-cluster      3       0             0         0                  0
cluster-my-cluster-lb   2       0             0         0                  0
np1                     3       0             0         0                  0

Reconciling=1은 조정 단계가 아직 진행 중임을 의미합니다. 상태가 Reconciling=0으로 변경될 때까지 기다려야 합니다.

다음 명령어를 실행하여 클러스터의 노드 상태를 확인할 수도 있습니다.

kubectl get nodes --kubeconfig=KUBECONFIG

gcloud CLI

앞에서 설명한 것처럼 update 명령어를 실행한 후 gcloud container bare-metal operations describe OPERATIONS_ID를 사용하여 작업 상태를 확인할 수 있습니다. 이 명령어의 결과에는 노드의 상태가 표시됩니다. 예를 들면 다음과 같습니다.

  ...
  metrics:
  - intValue: '1'
    metric: NODES_RECONCILING
  - intValue: '2'
    metric: NODES_HEALTHY
  - intValue: '0'
    metric: NODES_FAILED
  - intValue: '0'
    metric: NODES_IN_MAINTENANCE
  - intValue: '3'
    metric: NODES_TOTAL
  stage: HEALTH_CHECK
...

노드 풀을 업데이트하는 데 사용하는 도구에 관계없이 이전에 나왔던 해당 describe 명령어를 실행하여 노드 풀의 현재 상태를 가져올 수 있습니다.

클러스터 진단 방법에 대한 자세한 내용은 클러스터 진단을 위한 스냅샷 만들기를 참조하세요.

부하 분산기 주소 풀

bmctl

addressPools 섹션에는 MetalLB 및 경계 경로 프로토콜(BGP) 번들 부하 분산기의 부하 분산 풀을 지정하는 필드가 포함되어 있습니다. 언제든지 부하 분산 주소 풀을 추가할 수 있지만 기존 주소 풀을 삭제할 수는 없습니다. Google Distributed Cloud 버전 1.16.0부터 언제든지 addressPools.avoidBuggyIPsaddressPools.manualAssign의 값을 수정할 수 있습니다.

addressPools:
- name: pool1
  addresses:
  - 198.51.100.0-198.51.100.4
  - 198.51.100.240/28
- name: pool2
  addresses:
  - 198.51.100.224/28

gcloud CLI

번들 부하 분산기의 부하 분산 주소 풀을 언제든지 추가할 수 있지만 기존 주소 풀은 삭제할 수 없습니다. 주소 풀을 추가하기 위해 gcloud container bare-metal clusters update에 지정하는 플래그는 번들 부하 분산기의 유형에 따라 달라집니다.

  • MetalLB(레이어 2): --metal-lb-address-pools 플래그를 사용합니다.
  • 경계 게이트웨이 프로토콜(BGP): --bgp-address-pools 플래그를 사용합니다.

플래그 값의 형식은 다음과 같습니다.

'pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \

값에 pool, avoid-buggy-ip, manual-assign, addresses 키워드로 시작하는 세그먼트가 있습니다. 각 세그먼트는 쉼표로 구분합니다.

  • pool: 풀에 대해 선택한 이름입니다.

  • avoid-buggy-ips: True로 설정하면 IP 주소 관리(IPAM) 컨트롤러가 .0 또는 .255로 끝나는 IP 주소를 서비스에 할당하지 않습니다. 이렇게 하면 버그가 있는 소비자 기기가 특수한 IP 주소로 전송된 트래픽을 실수로 차단하는 문제를 방지할 수 있습니다. 지정되지 않은 경우 기본값은 False입니다. Google Distributed Cloud 버전 1.16.0부터 기존 주소 풀에서 이 값을 수정할 수 있습니다.

  • manual-assign: IPAM 컨트롤러가 이 풀의 IP 주소를 서비스에 자동으로 할당하지 않도록 하려면 True로 설정합니다. 그러면 개발자는 LoadBalancer 유형의 서비스를 만들고 풀에서 주소 중 하나를 수동으로 지정할 수 있습니다. 지정하지 않으면 manual-assignFalse로 설정됩니다. Google Distributed Cloud 버전 1.16.0부터 기존 주소 풀에서 이 값을 수정할 수 있습니다.

  • addresses 목록에서 각 주소는 CIDR 범위이거나 하이픈으로 연결된 범위 형식이어야 합니다. 인그레스 VIP와 같이 풀에 단일 IP 주소를 지정하려면 /32를 CIDR 표기법으로 사용합니다(예: 192.0.2.1/32).

다음 문법 규칙에 유의하세요.

  • 전체 값은 작은따옴표로 묶어야 합니다.
  • 공백은 허용되지 않습니다.
  • 각 IP 주소 범위를 세미콜론으로 구분합니다.

다음 예시와 같이 플래그 인스턴스를 두 개 이상 지정할 수 있습니다.

--metal-lb-address-pools='pool=pool2,avoid-buggy-ips=False,manual-assign=True,addresses=198.51.100.0/30;198.51.100.64-198.51.100.72'
--metal-lb-address-pools='pool=pool3,avoid-buggy-ips=True,manual-assign=True,addresses=203.0.113.0/28'

부하 분산기 주소 풀에 대한 자세한 내용은 번들 부하 분산 구성의 loadBalancer.addressPools를 참조하세요.

부적절한 클러스터 삭제 방지

bmctl

클러스터 구성 파일에 baremetal.cluster.gke.io/prevent-deletion: "true" 주석을 추가하면 클러스터가 삭제되지 않습니다. 예를 들어 kubectl delete cluster 또는 bmctl reset cluster를 실행하면 오류가 발생합니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: ci-10c3c6f4d9c698e
  namespace: cluster-ci-10c3c6f4d9c698e
  annotations:
    baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
  clusterNetwork:

gcloud CLI

--add-annotations 플래그를 baremetal.cluster.gke.io/prevent-deletion="true" 값으로 지정하면 클러스터 삭제를 방지할 수 있습니다. 예를 들면 다음과 같습니다.

  1. 실수로 인한 클러스터 삭제를 방지하기 위해 주석을 추가합니다.

    gcloud container bare-metal clusters update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --add-annotations=baremetal.cluster.gke.io/prevent-deletion="true"
    
  2. 사용자 클러스터 삭제를 시도합니다.

    gcloud container bare-metal clusters delete abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --force \
        --allow-missing
    

    명령어 결과는 다음과 비슷합니다.

    ERROR: (gcloud.container.bare-metal.clusters.delete) INVALID_ARGUMENT:
    invalid request: admission webhook "vcluster.kb.io" denied the request:
    annotations[baremetal.cluster.gke.io/prevent-deletion]: Invalid value:
    "true": Annotation "baremetal.cluster.gke.io/prevent-deletion" should be
    removed in order to delete this cluster
    

    주석을 삭제하려면 update 명령어에 --remove-annotations=baremetal.cluster.gke.io/prevent-deletion="true"를 지정합니다.

프리플라이트 검사 우회

이 기능은 bmctl update에서만 사용할 수 있습니다.

bypassPreflightCheck 필드의 기본값은 false입니다. 클러스터 구성 파일에서 이 필드를 true로 설정하면 기존 클러스터에 리소스를 적용할 때 내부 프리플라이트 검사가 무시됩니다.

  apiVersion: baremetal.cluster.gke.io/v1
  kind: Cluster
  metadata:
    name: cluster1
    namespace: cluster-cluster1
    annotations:
      baremetal.cluster.gke.io/private-mode: "true"
  spec:
    bypassPreflightCheck: true

클러스터 관리자 추가 또는 삭제

bmctl

클러스터 구성 파일의 clusterSecurity.authorization.clusterAdmin.gcpAccounts 섹션에서 이메일 주소를 지정하여 사용자 또는 서비스 계정을 사용자 클러스터의 클러스터 관리자로 추가하거나 삭제할 수 있습니다. 계정에는 클러스터에 대한 클러스터 관리자 역할이 부여되어 클러스터에 대한 전체 액세스 권한이 제공됩니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  clusterSecurity:
    authorization:
      clusterAdmin:
        gcpAccounts:
        - alex@example.com
        - hao@example.com
        - my-sa@example-project-12345.iam.gserviceaccount.com

사용자 클러스터를 업데이트하여 계정을 추가할 때는 목록에 모든 계정(기존 계정과 새 계정 모두)을 포함해야 합니다. bmctl update가 구성 파일에 지정된 목록으로 목록을 덮어쓰기 때문입니다. 계정을 삭제하려면 클러스터 구성 파일에서 계정을 삭제하고 bmctl update를 실행합니다.

gcloud CLI

--admin-users 플래그에 이메일 주소를 지정하여 사용자 또는 서비스 계정을 클러스터 관리자로 추가하거나 삭제할 수 있습니다. 플래그에는 하나의 이메일 주소만 허용됩니다. 여러 사용자를 추가하려면 각 플래그에 계정을 하나 지정합니다. 예를 들면 다음과 같습니다.

gcloud container bare-metal clusters update abm-user-cluster1a \
    --project=example-project-12345 \
    --location=us-central1 \
    --admin-users=alex@example.com \
    --admin-users=hao@example.com
    --admin-users=my-sa@example-project-12345.iam.gserviceaccount.com

update 명령어는 권한 부여 목록 전체를 덮어씁니다. 클러스터 관리자가 될 모든 기존 사용자와 신규 사용자를 지정합니다.

로그인 사용자 설정

루트가 아닌 사용자 이름을 지정하여 클러스터의 노드 머신에 대한 비밀번호가 없는 sudo 기능 액세스를 사용하도록 할 수 있습니다. 지정된 사용자에 대해 SSH 키 sshPrivateKeyPath가 작동해야 합니다. 클러스터 만들기 및 업데이트 작업은 노드 머신에 지정된 사용자 및 SSH 키로 액세스할 수 있는지 확인합니다.

bmctl

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  nodeAccess:
    loginUser: abm

gcloud CLI

--login-user 플래그에서 노드 머신에 액세스하는 데 사용할 사용자를 지정합니다. 예를 들면 다음과 같습니다.

gcloud container bare-metal clusters update abm-user-cluster1a \
    --project=example-project-12345 \
    --location=us-central1 \
    --login-user=abm

사용자에 대해 비밀번호가 없는 sudo 액세스를 사용 설정하려면 각 클러스터 노드 머신에서 다음 단계를 수행합니다.

  1. sudo visudo를 사용하여 수정할 sudoers 파일을 엽니다.

    sudo visudo -f /etc/sudoers
    

    visudo 명령어는 sudoers 파일을 잠가 동시 수정을 방지하고 저장 시 파일 문법의 유효성을 검사합니다.

  2. 로그인 사용자의 경우 다음과 같이 sudoers 파일에 항목을 추가합니다.

    USERNAME ALL=(ALL) NOPASSWD: ALL
    
  3. 파일을 닫고 저장합니다.

  4. 로그인 사용자 권한으로 명령어를 실행하려면 다음 명령어를 실행합니다.

    su - USERNAME
    
  5. 로그인 사용자가 sudo 명령어를 실행하는 데 비밀번호가 필요하지 않은지 확인하려면 다음 sudo 명령어를 실행합니다.

    sudo ip a
    

고급 네트워킹

클러스터가 생성된 후 다양한 커스텀 리소스에 고급 네트워킹 기능을 구성합니다. 커스텀 리소스와 관련 네트워킹 기능을 사용하려면 클러스터를 create 고급 네트워킹을 사용 설정해야 합니다.

bmctl

클러스터를 만들 때 클러스터 구성에서 clusterNetwork.advancedNetworkingtrue로 설정합니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  clusterNetwork:
    ...
    advancedNetworking: true
    ...

gcloud CLI

클러스터를 만들 때 gcloud container bare-metal clusters create 명령어에 --enable-advanced-networking 플래그를 포함합니다.

고급 네트워킹이 사용 설정된 클러스터를 만든 후에는 kubectl apply를 사용하여 이 섹션에서 설명하는 커스텀 리소스를 구성할 수 있습니다.

NetworkGatewayGroup

NetworkGatewayGroup 커스텀 리소스는 이그레스 NAT 게이트웨이BGP를 사용하는 번들 부하 분산 기능과 같은 고급 네트워킹 기능의 유동 IP 주소를 제공하는 데 사용됩니다.

apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

BGP 부하 분산

클러스터 리소스와 기타 커스텀 리소스에서 경계 게이트웨이 프로토콜(BGP) 부하 분산을 구성합니다. gcloud container bare-metal clusters createupdate 명령어는 클러스터 리소스의 BGP 구성을 지원하지만 커스텀 리소스는 지원하지 않습니다.

BGP로 번들 부하 분산기를 구성하면 데이터 영역 부하 분산은 기본적으로 컨트롤 플레인 피어링에 지정된 피어와 동일한 외부 피어를 사용합니다. 또는 BGPLoadBalancer 커스텀 리소스 및 BGPPeer 커스텀 리소스를 사용하여 데이터 영역 부하 분산을 개별적으로 구성할 수 있습니다. 자세한 내용은 BGP로 번들 부하 분산기 구성을 참조하세요.

BGPLoadBalancer

apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"

BGPPeer

apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

서비스 네트워크 범위 늘리기

초기 한도보다 많은 서비스를 만들려면 IPv4 서비스 CIDR 마스크를 줄여 클러스터의 서비스 네트워크를 늘리면 됩니다. 마스크('/' 뒤의 값)를 줄이면 네트워크 범위가 더 커집니다. IPv4 서비스 CIDR의 범위만 늘릴 수 있습니다. 네트워크 범위를 줄일 수는 없습니다. 즉, 마스크('/' 뒤에 있는 값)를 늘릴 수 없습니다.

bmctl

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  ...
  clusterNetwork:
    services:
      cidrBlocks:
        - 192.0.2.0/14
  ...

gcloud CLI

사용자 클러스터에서 IPv4 서비스 CIDR 범위를 늘리려면 --island-mode-service-address-cidr-blocks 플래그에 새 범위를 지정합니다.

gcloud container bare-metal clusters update cluster1 \
    --project=example-project-12345 \
    --location=us-central1 \
    --island-mode-service-address-cidr-blocks=192.0.2.0/14

kubelet 이미지 가져오기 설정 구성

kubelet은 클러스터의 각 노드에서 실행됩니다. kubelet은 노드의 컨테이너를 모니터링하고 정상 상태인지 확인합니다. 필요한 경우 kubelet은 Container Registry에서 이미지를 쿼리하고 가져옵니다.

kubelet 구성을 수동으로 업데이트하고 모든 클러스터 노드 간에 동기화된 상태로 유지하는 것은 어려울 수 있습니다. 더군다나 클러스터를 업그레이드하면 노드의 수동 kubelet 구성 변경 사항이 손실됩니다.

동기화된 업데이트를 더 쉽게 그리고 영구적으로 제공하기 위해 Google Distributed Cloud를 사용하면 컨트롤 플레인 노드, 부하 분산기 노드, 워커 노드와 같이 각 클러스터 노드 풀에 대해 몇 가지 kubelet 설정을 지정할 수 있습니다. 이 설정은 특정 풀의 모든 노드에 적용되며 클러스터 업그레이드를 통해 유지됩니다. 이 설정의 필드는 변경할 수 있으므로 클러스터를 만드는 동안에도 언제든지 업데이트할 수 있습니다.

bmctl

다음 지원되는 필드는 kubelet의 Container Registry 가져오기 작업을 제어합니다.

  • registryBurst (기본값: 10)
  • registryPullQPS (기본값: 5)
  • serializeImagePulls (기본값: true)

각 kubelet 구성 필드에 대한 자세한 내용은 클러스터 구성 필드 참조를 확인하세요.

다음과 같은 노드 풀에 대해 클러스터 사양의 kubeletConfig 섹션과 NodePool 사양에서 이러한 필드를 지정할 수 있습니다.

다음 예시에서는 클러스터 구성 파일에 기본값이 포함된 추가 필드를 보여줍니다. 참고로 preview.baremetal.cluster.gke.io/custom-kubelet: "enable" 주석은 필수 항목입니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    preview.baremetal.cluster.gke.io/custom-kubelet: "enable"
spec:
  ...
  controlPlane:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
  loadBalancer:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: node-pool-new
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  ...
  kubeletConfig:
    registryBurst: 10
    registryPullQPS: 5
    serializeImagePulls: true

각각의 경우 설정이 풀의 모든 노드에 적용됩니다.

gcloud CLI

다음 플래그는 kubelet의 Container Registry 가져오기 작업을 제어합니다.

사용 방법

다음은 이미지 가져오기를 조정할 때 고려해야 할 사항입니다.

  • 이미지는 기본적으로 연속으로 가져오기 때문에 시간이 오래 걸리는 이미지 가져오기는 노드에 예약된 다른 모든 이미지 가져오기를 지연시킬 수 있습니다. 이미지 가져오기 지연은 업그레이드 프로세스를 차단할 수 있습니다(특히 새 Google Distributed Cloud 이미지를 노드에 배포해야 하는 경우). 이미지 가져오기 지연의 영향을 받는 경우 직렬 이미지 가져오기를 사용 중지하여 병렬 이미지 가져오기를 허용할 수 있습니다.

  • pull QPS exceeded와 같이 이미지 가져오기 제한 오류가 발생하면 이미지 가져오기 처리량을 늘리기 위해 *-registry-pull-qps*-registry-burst를 늘리는 것이 좋습니다. 이 두 필드는 가져오기 속도와 큐 크기를 조정하며 다른 제한 관련 문제를 해결하는 데 도움이 될 수 있습니다. 음수 값은 허용되지 않습니다.

참고 문서