Kubernetes 클러스터 유지관리

Google Distributed Cloud (GDC) 오프라인을 사용하면 GDC의 GKE를 사용하여 생성한 후 Kubernetes 클러스터를 관리할 수 있습니다. 이 서비스를 사용하면 변화하는 컨테이너 워크로드 요구사항에 적응할 수 있습니다.

시작하기 전에

Kubernetes 클러스터에서 노드 풀을 보고 관리하려면 다음 역할이 있어야 합니다.

  • 사용자 클러스터 관리자 (user-cluster-admin)
  • 사용자 클러스터 노드 뷰어 (user-cluster-node-viewer)

이러한 역할은 네임스페이스에 바인딩되지 않습니다.

Kubernetes 클러스터에 대해 명령어를 실행하려면 다음 리소스가 있어야 합니다.

  1. Kubernetes 클러스터 이름을 찾거나 플랫폼 관리자에게 클러스터 이름을 문의합니다.

  2. Kubernetes 클러스터의 kubeconfig 파일이 없는 경우 로그인하여 생성합니다.

  3. Kubernetes 클러스터의 kubeconfig 경로를 사용하여 이 안내의 KUBERNETES_CLUSTER_KUBECONFIG를 바꿉니다.

노드 유지보수 실행

노드를 복구하거나 유지보수해야 하는 경우 먼저 노드를 유지보수 모드로 설정하세요. 노드를 유지보수 모드로 전환하면 포드와 워크로드가 안전하게 드레이닝되고 포드 예약에서 노드가 제외됩니다. 유지보수 모드에서는 포드 트래픽을 방해할 위험 없이 노드에서 작업할 수 있습니다.

작동 방식

GDC 유지보수 모드는 특정 노드의 kubectl cordonkubectl drain 실행과 유사합니다. 다음은 유지보수 모드와 관련된 몇 가지 세부정보입니다.

  • 지정된 노드가 예약 불가능으로 표시됩니다. 이 작업은 kubectl cordon가 실행하는 작업입니다.
  • 지정된 노드에 노드 taint가 추가되어 노드에서 포드를 예약하거나 실행할 수 없음을 나타냅니다. 이 작업은 kubectl drain와 비슷합니다.
  • 포드가 종료될 때까지 노드가 중단되지 않도록 제한 시간 20분이 적용됩니다. 모든 taint를 허용하도록 구성되었거나 최종화가 있는 포드는 종료되지 않을 수 있습니다. GDC 클러스터는 모든 포드를 종료하려고 시도하지만 제한 시간이 초과되면 노드가 유지보수 모드로 전환됩니다. 이 제한 시간은 실행 중인 포드에서 업그레이드를 차단하지 못하게 합니다.
  • 노드에서 실행 중인 VM 기반 워크로드가 있으면 GDC 클러스터는 NodeSelector를 가상 머신 인스턴스 (VMI) 포드에 적용한 후 포드를 중지합니다. NodeSelector는 노드가 유지보수 모드에서 삭제될 때 VMI 포드가 동일한 노드에서 다시 시작되도록 합니다.

노드를 유지보수 모드로 전환

클러스터 구성 파일의 maintenanceBlocks 섹션에서 선택한 노드의 IP 주소 범위를 지정하여 유지보수 모드로 설정할 노드를 선택합니다. 선택한 노드가 Ready 상태이며 클러스터에서 작동해야 합니다.

노드를 유지보수 모드로 설정하려면 다음 안내를 따르세요.

  1. 클러스터 구성 파일을 수정하여 유지보수 모드로 설정할 노드를 선택합니다.

    원하는 편집기로 구성 파일을 수정하거나 다음 명령어를 실행하여 클러스터 커스텀 리소스를 직접 수정할 수 있습니다.

    kubectl edit cluster KUBERNETES_CLUSTER_NAME \
        -n KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Kubernetes 클러스터의 다음을 바꿉니다.

    • KUBERNETES_CLUSTER_NAME: 클러스터의 이름입니다.
    • KUBERNETES_CLUSTER_NAMESPACE: 클러스터의 네임스페이스입니다.
    • KUBERNETES_CLUSTER_KUBECONFIG: kubeconfig 파일의 경로입니다.

    클러스터 구성이 적용되면 클러스터는 해당 노드를 유지보수 모드로 전환합니다.

  2. maintenanceBlocks 섹션을 클러스터 구성 파일에 추가하여 유지보수 모드로 설정할 노드에 대해 단일 IP 주소 또는 주소 범위를 지정합니다.

    다음 샘플은 IP 주소 범위를 지정하여 여러 노드를 선택하는 방법을 보여줍니다.

    ...
    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
    spec:
      maintenanceBlocks:
        cidrBlocks:
        - 172.16.128.1-172.16.128.64
    ...
    
  3. 클러스터의 노드 상태를 가져옵니다.

    kubectl get nodes -n KUBERNETES_CLUSTER_NAME \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    응답은 다음과 같이 표시됩니다.

    NAME                STATUS                     ROLES    AGE     VERSION
    user-gdc-01        Ready                      master   2d22h   v1.23.5-gke.1502
    user-gdc-04        Ready                      none     2d22h   v1.23.5-gke.1502
    user-gdc-05        Ready,SchedulingDisabled   none     2d22h   v1.23.5-gke.1502
    user-gdc-06        Ready                      none     2d22h   v1.23.5-gke.1502
    

    SchedulingDisabled 상태는 노드가 유지보수 모드임을 나타냅니다.

  4. 유지보수 모드의 노드 수를 가져옵니다.

    kubectl get nodepools --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    응답은 다음 출력과 유사합니다.

    NAME   READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
    np1    3       0             0         1                  0
    

    이 샘플에서 UNDERMAINTENANCE 열은 한 노드가 유지보수 모드에 있음을 보여줍니다.

    클러스터는 노드가 유지보수 모드로 설정될 때 노드에 다음 taint도 추가합니다.

  • baremetal.cluster.gke.io/maintenance:NoExecute
  • baremetal.cluster.gke.io/maintenance:NoSchedule

노드 풀 크기 조절

GDC 환경의 모든 Kubernetes 클러스터는 워크로드 변경에 따라 확장되도록 노드 풀의 크기를 조절할 수 있습니다. Kubernetes 클러스터에서 노드 풀을 관리하려면 사용자 클러스터 관리자 (user-cluster-admin) 역할이 있어야 합니다. 이 역할은 네임스페이스에 바인딩되지 않습니다.

기존 클러스터에서 노드 풀을 확장하려면 다음 단계를 완료하세요.

콘솔

  1. 대시보드에서 수정할 클러스터가 있는 프로젝트를 선택합니다.
  2. 탐색 메뉴에서 Kubernetes Engine > 클러스터를 선택합니다.
  3. 노드 풀이 연결된 클러스터 이름을 선택합니다. 클러스터 세부정보 페이지가 표시됩니다.
  4. 노드 풀 탭을 클릭합니다.
  5. 크기를 조정할 노드 풀의 수정 아이콘을 선택합니다. 노드 풀 수정 프롬프트가 표시됩니다.
  6. 노드 풀에 필요한 새 노드 수를 반영하도록 노드 수 필드를 업데이트합니다. 워크로드 요구사항에 맞게 노드 수를 늘리거나 줄일 수 있습니다.

  7. 저장을 클릭합니다.

  8. 클러스터의 노드 풀 탭으로 다시 이동하여 크기가 조절된 노드 풀의 상태가 Ready이고 노드 수가 올바른지 확인합니다. 노드 풀이 사양에 따라 확장되는 데 몇 분 정도 걸릴 수 있습니다.

    콘솔을 사용하여 노드 풀이 준비되었는지 확인합니다.

API

  1. 대화형 편집기를 사용하여 kubectl CLI로 Cluster 커스텀 리소스 사양을 엽니다.

    kubectl edit clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME -n platform \
          --kubeconfig MANAGEMENT_API_SERVER
    

    다음을 바꿉니다.

    • KUBERNETES_CLUSTER_NAME: 노드 풀을 호스팅하는 클러스터의 이름입니다.
    • MANAGEMENT_API_SERVER: Kubernetes 클러스터가 호스팅되는 영역 API 서버의 kubeconfig 경로입니다. 타겟 영역의 API 서버용 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
  2. 크기를 조절할 노드 풀의 nodeCount 필드를 업데이트합니다.

    nodePools:
    ...
    - machineTypeName: n2-standard-2-gdc
      name: nodepool-1
      nodeCount: NUMBER_OF_WORKER_NODES
    

    NUMBER_OF_WORKER_NODES을 노드 풀에서 프로비저닝할 업데이트된 워커 노드 수로 바꿉니다.

  3. 파일을 저장하고 편집기를 종료합니다.

  4. 노드 풀의 구성을 확인하여 노드 확장 완료 여부를 확인합니다.

    kubectl get clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME -n platform -o json \
        --kubeconfig MANAGEMENT_API_SERVER | jq .status.workerNodePoolStatuses
    

    readyNodes 번호가 노드 풀에 설정한 노드 수를 반영하는지 확인합니다. 노드 풀이 사양에 따라 확장되는 데 몇 분 정도 걸릴 수 있습니다.

프로젝트 계층 구조에서 클러스터 이동

프로젝트는 서비스 인스턴스의 논리적 그룹화를 제공합니다. GDC 프로젝트 계층 구조에서 Kubernetes 클러스터를 추가 및 삭제하여 서비스를 적절하게 그룹화할 수 있습니다.

클러스터에 프로젝트 연결

GDC 콘솔에서 클러스터를 만들 때 컨테이너 워크로드를 클러스터에 성공적으로 배포하려면 먼저 프로젝트를 하나 이상 연결해야 합니다. 기존 클러스터에 프로젝트를 추가해야 하는 경우 다음 단계를 완료하세요.

  1. 탐색 메뉴에서 Kubernetes Engine > 클러스터를 선택합니다.
  2. 클러스터 목록에서 클러스터를 클릭하여 클러스터 세부정보 페이지를 엽니다.
  3. 프로젝트 연결을 선택합니다.
  4. 프로젝트 목록에서 추가할 수 있는 프로젝트를 선택합니다. 저장을 클릭합니다.

클러스터에서 프로젝트 분리

기존 Kubernetes 클러스터에서 프로젝트를 분리하려면 다음 단계를 완료하세요.

  1. 탐색 메뉴에서 Kubernetes Engine > 클러스터를 선택합니다.
  2. 클러스터 목록에서 클러스터를 클릭하여 클러스터 세부정보 페이지를 엽니다.
  3. 클러스터에서 분리할 프로젝트의 분리를 클릭합니다.

조직의 모든 클러스터 보기

조직에서 사용할 수 있는 모든 Kubernetes 클러스터와 상태, Kubernetes 버전, 기타 세부정보를 확인할 수 있습니다. Kubernetes 클러스터는 영역 리소스이므로 영역별로만 클러스터를 나열할 수 있습니다.

콘솔

  • 탐색 메뉴에서 Kubernetes Engine > 클러스터를 선택합니다.

    조직에서 사용할 수 있는 모든 클러스터가 상태 및 기타 정보와 함께 표시됩니다.

    조직의 각 Kubernetes 클러스터의 상태 및 기타 정보를 보여주는 클러스터 세부정보 페이지

kubectl

  • 조직에서 영역의 사용 가능한 Kubernetes 클러스터를 나열합니다.

    kubectl get clusters.cluster.gdc.goog -n platform \
        --kubeconfig MANAGEMENT_API_SERVER
    

    MANAGEMENT_API_SERVER를 영역 API 서버의 kubeconfig 경로로 바꿉니다. 타겟 영역의 API 서버에 대한 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.

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

    NAME        STATE     K8S VERSION
    user-vm-1   Running   1.25.10-gke.2100
    user-test   Running   1.26.5-gke.2100
    

업데이트 가능한 속성 보기

각 Kubernetes 클러스터에는 생성된 후 변경할 수 있는 속성 집합이 있습니다. Cluster 커스텀 리소스의 spec에 있는 변경 가능한 속성만 변경할 수 있습니다. spec의 일부 속성은 클러스터가 프로비저닝된 후 업데이트할 수 없습니다. 업데이트 가능한 속성을 보려면 다음 단계를 완료하세요.

콘솔

  1. 탐색 메뉴에서 Kubernetes Engine > 클러스터를 선택합니다.

  2. Kubernetes 클러스터 목록에서 클러스터 이름을 클릭하여 속성을 확인합니다.

  3. 수정 가능한 속성에는 수정 아이콘이 있습니다.

kubectl

  • Cluster 사양의 속성 목록과 각 속성에 해당하는 유효한 값을 확인합니다.

    kubectl explain clusters.cluster.gdc.goog.spec \
        --kubeconfig MANAGEMENT_API_SERVER
    

    MANAGEMENT_API_SERVER를 영역 API 서버의 kubeconfig 경로로 바꿉니다. 타겟 영역의 API 서버에 대한 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.

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

    KIND:     Cluster
    VERSION:  cluster.gdc.goog/v1
    
    RESOURCE: spec <Object>
    
    DESCRIPTION:
        <empty>
    
    FIELDS:
      clusterNetwork    <Object>
        The cluster network configuration. If unset, the default configurations
        with pod and service CIDR sizes are used. Optional. Mutable.
    
      initialVersion    <Object>
        The GDC air-gapped version information of the user cluster during cluster creation.
        Optional. Default to use the latest applicable version. Immutable.
    
      loadBalancer  <Object>
        The load balancer configuration. If unset, the default configuration with
        the ingress service IP address size is used. Optional. Mutable.
    
      nodePools <[]Object>
        The list of node pools for the cluster worker nodes. Optional. Mutable.
    
      releaseChannel    <Object>
        The release channel a cluster is subscribed to. When a cluster is
        subscribed to a release channel, GDC maintains the cluster versions for
        users. Optional. Mutable.
    

    GDC 콘솔 또는 kubectl CLI를 사용하여 이러한 설정을 업데이트합니다. 예를 들어 노드 풀의 크기를 조절할 수 있습니다.

인그레스 서비스 IP 주소 크기 조정

Kubernetes 클러스터를 만든 후 인그레스 서비스 IP 주소 크기를 확장할 수 있습니다.

  1. 대화형 편집기를 사용하여 kubectl CLI로 Cluster 커스텀 리소스 사양을 엽니다.

    kubectl edit clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME -n platform \
        --kubeconfig MANAGEMENT_API_SERVER
    

    다음을 바꿉니다.

    • KUBERNETES_CLUSTER_NAME: IP 주소를 제공하는 클러스터의 이름입니다.
    • MANAGEMENT_API_SERVER: Kubernetes 클러스터가 호스팅되는 영역 API 서버의 kubeconfig 경로입니다. 타겟 영역의 API 서버용 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
  2. ingressServiceIPSize 필드를 새 IP 주소 크기로 업데이트합니다.

    ...
    spec:
    ...
      loadBalancer:
        ingressServiceIPSize: INGRESS_SERVICE_IP_SIZE
    ...
    

    INGRESS_SERVICE_IP_SIZE를 업데이트된 인그레스 서비스 IP 주소 크기로 바꿉니다.

  3. 파일을 저장하고 편집기를 종료합니다.

수신 서비스 IP 주소 크기에 설정된 제한은 없습니다. 요청한 IP 주소 수는 조직에 따라 충족됩니다. 요청을 처리할 수 없는 경우 클러스터에서 오류를 보고합니다.

Kubernetes 클러스터 업그레이드

Kubernetes 클러스터를 자동 또는 수동으로 업그레이드할 수 있습니다. 클러스터 업그레이드 방법에 관한 자세한 내용은 클러스터 업그레이드 섹션을 참고하세요.