기기 종료 및 전원 켜기

이 페이지에서는 Google Distributed Cloud (GDC) 에어 갭 어플라이언스를 종료하고 전원을 켜는 방법을 설명합니다. 예를 들어 기기를 새 위치로 이동합니다.

GDC 에어 갭 어플라이언스는 기기를 위치 간에 이동하기 위해 전송을 위해 기기를 종료해야 하는 일시적인 운영 위치에서 사용할 수 있습니다. 또한 발전기가 견고한 환경에서 전원을 공급할 수 있으므로 전원 장애로부터 기기를 복원해야 할 수도 있습니다.

시작하기 전에

계속하기 전에 모든 워크로드를 중지해야 합니다. 종료 중에 워크로드가 활성 상태인 경우 Google은 어떤 일이 발생하는지 보장할 수 없습니다.

기본 요건

  1. Google Distributed Cloud (GDC) 에어 갭 어플라이언스의 네트워크에 연결된 노트북 또는 워크스테이션에서 이 런북을 실행할 수 있습니다. 또는 기기 연결에 따라 노트북 또는 워크스테이션을 스위치에 연결할 수 있습니다.
  2. 루트 관리자 클러스터의 kubeconfig에 액세스할 수 있는지 확인합니다.
  3. export KUBECONFIG=PATH_TO_KUBECONFIG를 실행하여 올바른 KUBECONFIG 환경 변수를 설정합니다.
  4. SSH 키와 인증서가 있는지 확인합니다.

블레이드 종료

  1. kubectl get nodes -A -o wide를 실행하여 노드 정보를 가져옵니다.

  2. 다음 명령어를 모든 노드 에 대해 하나씩 실행하여 BareMetalHost 동기화를 일시중지합니다. NODE_NAME을 이전 단계에서 가져온 노드 이름으로 바꿉니다.

    kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=true" --overwrite
    

    출력은 다음 예시와 같이 표시됩니다.

    baremetalhost.metal3.io/**-**-bm01 annotated
    baremetalhost.metal3.io/**-**-bm02 annotated
    baremetalhost.metal3.io/**-**-bm03 annotated
    
  3. ONTAP Select (OTS) 사용자 인증 정보를 가져옵니다. 나중에 OTS 노드를 종료하려면 이러한 사용자 인증 정보가 필요합니다.

    다음 명령어를 실행하여 MGMTIP (관리 IP) 열 아래에 나열된 OTS 관리 IP 주소를 식별합니다.

     export KUBECONFIG=/root/release/root-admin/kube-admin-remote-kubeconfig
    
     kubectl get storagecluster -n gpc-system
    

    다음 명령어를 실행하여 OTS 관리자 비밀번호를 검색합니다.

     export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    
     # Find the secret name
     SECRET_NAME=$(kubectl get secrets -n gpc-system -o name | grep 'ontap-.*-stge01-credential')
    
     # Decode the password from that secret
     OTS_PASSWORD=$(kubectl get $SECRET_NAME -n gpc-system -o jsonpath='{.data.netapp_password}' | base64 --decode)
    
     echo $OTS_PASSWORD
    

    OTS 관리 IP 및 비밀번호를 저장합니다.

  4. 모든 노드를 하나씩 차단합니다.

    kubectl cordon NODE_NAME
    

    출력은 다음 예시와 같이 표시됩니다.

    node/**-**-bm01 cordoned
    node/**-**-bm02 cordoned
    node/**-**-bm03 cordoned
    
  5. ONTAP Select (OTS) 노드 종료

    검색한 관리 IP 주소와 관리자 비밀번호를 사용하여 OTS 클러스터에 대한 SSH 연결을 설정합니다.

     ssh admin@<ots-management-ip>
    

    OTS 노드 (VM)를 종료합니다. 다음은 그 예시입니다.

     bn-aa-stge01::> cluster show
     Node                  Health  Eligibility
     --------------------- ------- ------------
     bn-aa-stge01-01       true    true
     bn-aa-stge01-02       true    true
    
     bn-aa-stge01::> set diag
    
     Warning: These diagnostic commands are for use by NetApp personnel only.
     Do you want to continue? {y|n}: y
    
     bn-aa-stge01::> system node halt -node *
    
  6. etcd 리더 노드와 팔로어 노드를 확인하려면 모든 노드에 대해 이 단계를 하나씩 실행합니다.

    1. kubectl get nodes -A -o wide의 출력에서 INTERNAL-IP 열 아래의 값을 기록하여 SSH의 대상 IP를 찾습니다. SSH 연결을 설정합니다.

      ssh root@INTERNAL-IP
      
    2. 현재 노드가 etcd 리더인지 팔로어인지 확인하려면 SSH 터미널 내에서 다음 명령어를 실행합니다.

      ETCDCTL_API=3 etcdctl \
          --cacert /etc/kubernetes/pki/etcd/ca.crt \
          --cert /etc/kubernetes/pki/etcd/server.crt \
          --key /etc/kubernetes/pki/etcd/server.key \
          --write-out=table endpoint status
      

      IS LEADER 필드에 주의하세요.

      출력은 etcd 리더 노드의 경우 다음 예시와 같이 표시됩니다.

      [root@**-**-bm0* ~]# ETCDCTL_API=3 etcdctl \
      >      --cacert /etc/kubernetes/pki/etcd/ca.crt \
      >      --cert /etc/kubernetes/pki/etcd/server.crt \
      >      --key /etc/kubernetes/pki/etcd/server.key \
      >      --write-out=table endpoint status
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |    ENDPOINT    |        ID        |   VERSION    | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      | ************** | **************** | 3.4.30-gke.1 |  162 MB |      true |      false |      3641 |   12957958 |           12957958 |        |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      

      출력은 두 개의 etcd 팔로어 노드의 경우 다음 예시와 같이 표시됩니다.

      [root@**-**-bm0* ~]# ETCDCTL_API=3 etcdctl \
      >      --cacert /etc/kubernetes/pki/etcd/ca.crt \
      >      --cert /etc/kubernetes/pki/etcd/server.crt \
      >      --key /etc/kubernetes/pki/etcd/server.key \
      >      --write-out=table endpoint status
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |    ENDPOINT    |        ID        |   VERSION    | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      | ************** | **************** | 3.4.30-gke.1 |  163 MB |     false |      false |      3641 |   12957404 |           12957404 |        |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      

      노드의 etcd 리더 및 etcd 팔로어 상태를 기록해 둡니다.

  7. 두 개의 etcd 팔로어 노드를 드레이닝합니다. etcd 리더 노드를 드레이닝하지 마세요.

    kubectl drain NODE_NAME --delete-emptydir-data --grace-period 900 --ignore-daemonsets --disable-eviction
    

    출력은 다음과 같이 표시될 수 있습니다.

    node/**-**-bm01 already cordoned
    WARNING: ignoring DaemonSet-managed Pods: kube-system/anetd-krj2z, kube-system/etcd-defrag-xh469, kube-system/ipam-controller-manager-2f4dz, kube-system/istio-cni-node-cgqv4, kube-system/kube-proxy-5mwf2, kube-system/localpv-mn2jh, kube-system/metallb-speaker-6l7sv, mon-system/mon-node-exporter-backend-nd8mp, netapp-trident/netapp-trident-node-linux-rrlmd, obs-system/anthos-audit-logs-forwarder-tpfqv, obs-system/anthos-log-forwarder-npjh4, obs-system/kube-control-plane-metrics-proxy-wp8nh, obs-system/log-failure-detector-crbnv, obs-system/oplogs-forwarder-sqwvj, vm-system/macvtap-v9pgp, vm-system/virt-handler-86khx
    pod/grafana-0 deleted
    pod/capi-kubeadm-bootstrap-controller-manager-1.30.400-gke.136lvgtf deleted
    pod/grafana-0 deleted
    pod/grafana-proxy-server-86d8fc4758-mkc4f deleted
    .
    .
    .
    
    node/**-**-bm02 already cordoned
    WARNING: ignoring DaemonSet-managed Pods: kube-system/anetd-v75jz, kube-system/etcd-defrag-t5jnc, kube-system/ipam-controller-manager-5958m, kube-system/istio-cni-node-ggv4c, kube-system/kube-proxy-r6x46, kube-system/localpv-g56xc, kube-system/metallb-speaker-tmw72, mon-system/mon-node-exporter-backend-9rs7k, netapp-trident/netapp-trident-node-linux-9jmfp, obs-system/anthos-audit-logs-forwarder-bwns9, obs-system/anthos-log-forwarder-lbskj, obs-system/kube-control-plane-metrics-proxy-grthl, obs-system/log-failure-detector-dzh4v, obs-system/oplogs-forwarder-vdn7z, vm-system/macvtap-mjwtc, vm-system/virt-handler-dlqvv
    pod/vai-web-plugin-backend-5dfd6d6597-nxxgn
    pod/vai-web-plugin-frontend-6b5468968b-mrr7g
    pod/grafana-proxy-server-64b759fbf6-b8pl8
    pod/iam-bundledidp-backend-0
    .
    .
    .
    
  8. 두 개의 etcd 팔로어 노드를 단계적으로 종료합니다. 두 노드 모두에 대해 다음 단계를 하나씩 따릅니다.

  9. iLO를 사용하여 NODE_NAME을 사용 중지합니다.

    1. iLO의 사용자 이름을 검색합니다.

      kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.username}" | base64 --decode
      
    2. iLO의 비밀번호를 검색합니다.

      kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.password}" | base64 --decode
      
    3. BMC-IP 열의 값에서 NODE_NAMEBMC-IP 주소를 검색합니다.

      kubectl get servers -A
      
    4. 이전 단계에서 가져온 BMC-IP 주소를 방문하고 가져온 사용자 이름과 비밀번호를 입력하여 로그인합니다.

    5. 상단 행의 첫 번째 버튼 위로 마우스를 가져갑니다. Power: ON이 표시됩니다. 클릭합니다. 드롭다운 메뉴가 표시되면 Momentary Press라는 첫 번째 항목을 클릭합니다. 버튼 색상이 녹색에서 주황색으로 변경됩니다. 즉, 노드가 종료됩니다. 버튼 색상이 노란색으로 변경되어 머신이 꺼졌음을 나타낼 때까지 기다립니다. 몇 분 정도 걸립니다.

  10. 두 etcd 팔로어 노드가 모두 종료된 후 마지막으로 etcd 리더 노드에 대해 7단계를 반복합니다.

전송을 위해 YubiKey 삭제

설치가 완료된 후 시스템을 전송해야 하는 경우 YubiKey를 삭제하고 YubiKey를 별도로 전송합니다. 키에 직접 태그를 지정해야 합니다.

전원 켜기 및 연결

하드 종료와 같이 전원이 예기치 않게 손실된 경우 기기가 자동으로 다시 시작됩니다. 이 경우 1~6단계를 건너뛰고 7단계부터 시작해야 합니다. 예기치 않은 전원 손실 후 다시 시작한 후에도 데이터가 손실될 수 있습니다.

실행 계획

  1. 각 노드에 YubiKey를 삽입합니다.

  2. GDC 에어 갭 어플라이언스 머신을 전원에 연결하고 노드 **-**-bm03의 전원 버튼을 눌러 OTS 중재자 서버를 시작합니다.

  3. 노드 **-**-bm03을 사용할 수 있게 되면 SCSI 타겟 하위 시스템 (SCST) 서비스의 상태를 확인하여 OTS 중재자 서버가 활성 상태인지 확인합니다. 이 서비스는 Active: active (running)을 표시해야 합니다.

    sudo systemctl status scst.service
    
  4. 나머지 두 노드의 전원 버튼을 순서에 관계없이 누릅니다.

  5. 노드의 전원이 켜진 후 컨트롤 플레인이 연결될 때까지 몇 분 정도 기다립니다. kubectl은 30분 이내에 컨트롤 플레인에 연결할 수 있습니다.

  6. kubectl get nodes -A를 실행하여 노드 이름을 가져옵니다.

  7. 예약을 사용 설정하려면 각 노드를 차단 해제합니다.

    kubectl uncordon `NODE_NAME`
    
  8. 각 노드의 베어메탈 호스트 동기화를 재개합니다.

    kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=false" --overwrite
    
  9. kubectl get nodes -A를 사용하여 노드의 상태를 확인합니다.

    • 모든 노드가 Ready 상태이면 조정 프로세스가 완료될 때까지 2시간 동안 기다립니다. 출력은 다음과 같이 표시될 수 있습니다.

      NAME         STATUS     ROLES           AGE     VERSION
      **-**-bm01   Ready      control-plane   4d13h   v1.30.6-gke.300
      **-**-bm02   Ready      control-plane   4d13h   v1.30.6-gke.300
      **-**-bm03   Ready      control-plane   4d13h   v1.30.6-gke.300
      

      이 경우 추가 작업이 필요하지 않습니다.

    • 그렇지 않고 하나 이상의 노드가 'NotReady' 상태이면 일부 서비스를 다시 시작하여 클러스터를 준비합니다. 출력은 다음과 같이 표시될 수 있습니다.

      NAME         STATUS     ROLES           AGE     VERSION
      **-**-bm01   Ready      control-plane   4d13h   v1.30.6-gke.300
      **-**-bm02   Ready      control-plane   4d13h   v1.30.6-gke.300
      **-**-bm03   NotReady   control-plane   4d13h   v1.30.6-gke.300
      

      이 경우 준비되지 않은 노드의 이름을 기록해 두고 다음 단계로 진행합니다.

  10. NotReady 노드에 대한 SSH 연결을 설정합니다. SSH의 대상 IP 주소는 kubectl get nodes -A -o wide의 출력에서 INTERNAL-IP 열 아래의 값입니다.

    ssh root@INTERNAL-IP
    
  11. NotReady 노드에서 containerdkubelet 서비스를 다시 시작합니다. 다음 명령어는 Google Distributed Cloud (GDC) 에어 갭 어플라이언스에 연결된 고객의 노트북 또는 워크스테이션이 아닌 노드에서 실행해야 합니다.

    systemctl stop containerd
    systemctl daemon-reload
    systemctl restart containerd
    systemctl stop kubelet
    systemctl start kubelet
    
  12. containerdkubelet 서비스의 상태를 확인하려면 NotReady 노드에서 다음 명령어를 실행합니다.

    systemctl status kubelet
    systemctl status containerd
    

    출력은 다음과 같이 표시될 수 있습니다.

    # systemctl status kubelet kubelet.service - kubelet: The Kubernetes Node Agent
    Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
            └─00-standalone_containerd.conf, 10-kubeadm.conf
    Active: active (running) since Thu 2025-03-27 07:58:27 UTC; 34s ago
    .
    .
    .
    
    # systemctl status containerd containerd.service - containerd container runtime
    Loaded: loaded (/etc/systemd/system/containerd.service; disabled; vendor preset: disabled)
    Active: active (running) since Thu 2025-03-27 07:58:17 UTC; 52s ago
    .
    .
    .
    

    다시 시작한 후 containerdkubelet 서비스가 제대로 실행되고 있으면 조정이 완료될 때까지 2시간 동안 기다립니다.