Distributed Cloud Connected 문제 해결

Google은 Google Distributed Cloud connected 하드웨어를 원격으로 모니터링하고 유지보수합니다. 이를 위해 Google 엔지니어는 Distributed Cloud 연결 하드웨어에 대한 보안 셸 (SSH) 액세스 권한을 보유합니다. Google에서 문제를 감지하면 Google 엔지니어가 연락하여 문제를 해결합니다. 문제를 직접 확인한 경우 즉시 Google 지원팀에 문의하여 진단하고 해결하세요.

Distributed Cloud Connected 머신 연결

이 섹션에서는 Cloud Monitoring의 측정항목 탐색기 기능을 사용하여 Distributed Cloud에 연결된 머신의 인터넷 및 Google Cloud 연결을 확인하는 방법을 설명합니다.

이 절차에서는 다음 모니터링 측정항목을 사용합니다.

  • Machine Connected (/machine/connected): 기기가 Google Cloud에 연결되어 있는지 여부를 나타냅니다.

  • 네트워크 연결 (/machine/network/connectivity): 머신의 기본 네트워크 인터페이스에 인터넷 연결이 있는지 나타냅니다.

이 섹션의 단계를 완료하려면 다음 기본 요건을 충족해야 합니다.

  1. Google Cloud 콘솔 및 Distributed Cloud에 연결된 Google Cloud 프로젝트에 대한 액세스 권한
  2. Monitoring 측정항목을 볼 수 있는 Monitoring 뷰어 IAM 역할
  3. (선택사항) 반환된 결과를 필터링하기 위한 타겟 Distributed Cloud Connected 머신의 machine_id 값입니다.

측정항목 탐색기를 사용하여 머신 연결 확인

  1. 측정항목 탐색기로 이동합니다.

    1. Google Cloud 콘솔에서 Monitoring 섹션으로 이동합니다.

    2. 왼쪽 탐색 트리에서 측정항목 탐색기를 클릭합니다.

  2. 타겟 리소스 유형을 선택합니다.

    1. 측정항목 탐색기 페이지에서 쿼리 페이지로 이동합니다.

    2. 검색창을 사용하여 머신 리소스 유형을 검색합니다. 전체 리소스 식별자 edgecontainer.googleapis.com/Machine를 사용할 수도 있습니다.

    3. 반환된 결과에서 머신 리소스 유형을 클릭합니다.

  3. 머신이 Google Cloud에 연결되어 있는지 확인합니다.

    1. 측정항목 섹션에서 connected 값을 검색합니다.

    2. Machine Connected 측정항목을 선택합니다. 전체 경로는 edgecontainer.googleapis.com/machine/connected입니다.

    3. (선택사항) 필터 섹션을 사용하여 타겟 machine_id 값으로 필터링합니다.

    4. 표시되는 시간 차트에서 정상 선이 100%로 연속적으로 유지되는지 확인합니다. 이 값이 0% 또는 비정상인 시점에는 머신이 표시된 시간에 Google Cloud 와의 연결이 끊긴 것입니다.

  4. 머신의 인터넷 연결을 확인합니다.

    1. 측정항목 섹션에서 connectivity 값을 검색합니다.

    2. 네트워크 연결 측정항목을 선택합니다. 전체 경로는 edgecontainer.googleapis.com/machine/network/connectivity입니다.

    3. (선택사항) 필터 섹션을 사용하여 타겟 machine_id 값으로 필터링합니다.

    4. 표시되는 시간 차트에서 정상 선이 100%로 연속적으로 유지되는지 확인합니다. 이 값이 어느 시점에서든 0% 비정상이면 표시된 시간에 머신의 인터넷 연결이 끊긴 것입니다.

유효성 검사 결과 이해

다음 표에서는 측정항목 탐색기에서 반환되는 결과를 설명합니다.

머신 상태 진단 해결 방법
정상
'머신 연결됨' 측정항목 값이 1입니다.
'네트워크 연결' 측정항목 값이 1입니다.
정상 작동 없음
연결 해제됨
'머신 연결됨' 측정항목 값은 0
'네트워크 연결' 측정항목 값은 1
머신이 인터넷에 연결되어 있지만 Google Cloud에 연결할 수 없습니다. Google 서비스 및 API 엔드포인트의 [방화벽 규칙](distributed-cloud/connected/1.11.0/docs/requirements#connected_management_and_monitoring_traffic)을 확인합니다. Distributed Cloud 연결 에이전트가 머신에서 실행 중인지 확인합니다.
격리됨
'머신 연결됨' 측정항목 값이 0
'네트워크 연결' 측정항목 값이 0
머신이 인터넷에 연결되어 있지 않습니다. 전원 및 네트워크 케이블 연결, 로컬 네트워크 구성, 머신 LED 상태를 확인합니다. VLAN 및 라우팅 구성을 확인합니다.
간헐적
'머신 연결됨' 측정항목 값이 01 사이에서 번갈아 표시됨
'네트워크 연결' 측정항목 값이 01 사이에서 번갈아 표시됨
불안정한 네트워크 연결, 패킷 손실 또는 과도한 지연 시간 로컬 네트워크에 혼잡이 있는지, 하드웨어에 결함이 있는지 확인합니다.

두 측정항목 중 하나의 0 값이 지속적으로 표시되면 표에 설명된 문제 해결 단계에 따라 문제를 해결하세요. 문제가 계속되면 영향을 받는 컴퓨터의 machine_id 값과 서비스 중단 타임스탬프를 포함하여 Google 지원팀에 문의하세요.

VPN 연결에서 사용하는 Cloud Router 리소스의 BGP 세션이 손상됨

분산 Cloud VPN 연결은 해당 Cloud Router 리소스에서 설정하고 관리하는 BGP 세션을 사용하여 분산 클라우드 연결 클러스터와 Google Cloud간의 경로를 공지합니다. 분산 클라우드 VPN 연결과 연결된 Cloud Router 리소스의 구성을 수정하면 해당 연결이 작동하지 않을 수 있습니다.

영향을 받는 Cloud Router에서 손상된 BGP 세션 구성을 복구하려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 손상된 BGP 세션의 이름을 가져옵니다. 예를 들면 다음과 같습니다.

    INTERFACE=anthos-mcc-34987234
    
  2. 손상된 BGP 세션의 피어 BGP 및 Cloud Router BGP IP 주소와 영향을 받는 Distributed Cloud VPN 연결에서 사용되는 피어 ASN을 가져옵니다. 예를 들면 다음과 같습니다.

    GDCE_BGP_IP=168.254.208.74
    CLOUD_ROUTER_BGP_IP=168.254.208.73
    PEER_ASN=65506
    

    BGP 세션을 삭제한 경우 Distributed Cloud 연결 클러스터에서 다음 정보를 가져오세요.

    1. 클러스터 사용자 인증 정보를 가져옵니다.

      gcloud edge-cloud container clusters get-credentials CLUSTER_ID \
        --location REGION \
        --project PROJECT_ID
      

      다음을 바꿉니다.

      • CLUSTER_ID: 대상 클러스터의 이름입니다.
      • REGION: 대상 클러스터가 생성된 Google Cloud 리전입니다.
      • PROJECT_ID: 대상 Google Cloud 프로젝트의 ID입니다.
    2. MultiClusterConnectivityConfig 리소스의 구성을 가져옵니다.

      kubectl get multiclusterconnectivityconfig -A
      

      이 명령어는 다음과 유사한 출력을 반환합니다.

       NAMESPACE     NAME                   LOCAL ASN              PEER ASN
       kube-system   MultiClusterConfig1    65505                   65506
       ```
      
    3. 피어 BGP IP 주소, Cloud Router IP 주소, BGP 세션 ASN을 가져옵니다.

      kubectl describe multiclusterconnectivityconfig -n kube-system MCC_CONFIG_NAME   
      

      MCC_CONFIG_NAME을 이전 단계에서 가져온 MultiClusterConfigResource의 이름으로 바꿉니다.

      이 명령어는 다음과 유사한 출력을 반환합니다.

       ​​Spec:
       Asns:
         Peer:  65505
         Self:  65506 # GDCE ASN
       Tunnels:
         Ike Key:
           Name:       MCC_CONFIG_NAME-0
           Namespace:  kube-system
         Peer:
           Bgp IP:      169.254.208.73 # Cloud Router BGP IP
           Private IP:  34.157.98.148
           Public IP:   34.157.98.148
         Self:
           Bgp IP:      169.254.208.74 # GDCE BGP IP
           Private IP:  10.100.29.49
           Public IP:   208.117.254.68
       ```
      
  3. Google Cloud 콘솔에서 손상된 VPN 터널의 이름, 리전,Google Cloud 프로젝트 이름을 가져옵니다. 예를 들면 다음과 같습니다.

    VPN_TUNNEL=VPNTunnel1
    REGION=US-East1
    VPC_PROJECT_ID=VPC-Project-1
    
  4. Cloud Router 구성에서 손상된 BGP 세션을 삭제합니다.

  5. 새 Cloud Router 인터페이스를 만듭니다.

    gcloud compute routers add-interface --interface-name=INTERFACE_NAME \
       --vpn-tunnel=TUNNEL_NAME \ 
       --ip-address=ROUTER_BGP_IP \
       --project=VPC_PROJECT_ID \
       --region=REGION \
       --mask-length=30
    

    다음을 바꿉니다.

    • INTERFACE_NAME: 이 인터페이스를 고유하게 식별하는 설명 이름입니다.
    • TUNNEL_NAME: 이전 단계에서 가져온 VPN 터널의 이름입니다.
    • ROUTER_BGP_IP: 이 절차의 앞부분에서 획득한 Cloud Router의 BGP IP 주소입니다.
    • VPC_PROJECT_ID: 타겟 VPCGoogle Cloud 프로젝트의 ID입니다.
    • REGION: 대상 VPC Google Cloud 프로젝트가 생성된 Google Cloud 리전입니다.
  6. BGP 피어를 만듭니다.

    gcloud compute routers add-bgp-peer --interface=INTERFACE_NAME \
       --peer-name=TUNNEL_NAME \
       --region REGION \
       --project=VPC_PROJECT_ID \
       --peer-ip-address=GDCE_BGP_IP \
       --peer-asn=GDCE_BGP_ASN \
       --advertised-route-priority=100 \
       --advertisement-mode=DEFAULT
    

    다음을 바꿉니다.

    • INTERFACE_NAME: 이전 단계에서 만든 인터페이스의 이름입니다.
    • TUNNEL_NAME: 이전 단계에서 인터페이스를 만드는 데 사용한 VPN 터널의 이름입니다.
    • REGION: 대상 VPC Google Cloud 프로젝트가 생성된 Google Cloud 리전입니다.
    • VPC_PROJECT_ID: 타겟 VPCGoogle Cloud 프로젝트의 ID입니다.
    • GDCE_BGP_IP: 이 절차의 앞부분에서 가져온 Distributed Cloud 피어 BGP IP 주소입니다.
    • GDCE_BGP_ASN: 이 절차의 앞부분에서 획득한 분산 클라우드 피어 BGP ASN입니다.

이 시점에서 BGP 세션이 다시 작동됩니다.

가상 머신이 Pending 상태로 멈춤

다음 중 하나가 발생하면 가상 머신 워크로드가 Pending 상태에서 멈추고 노드에 예약되지 않을 수 있습니다.

  • Distributed Cloud Connected가 CPU 시간, 메모리, 디스크 공간과 같은 요청된 리소스를 가상 머신에 할당할 수 없습니다.
  • 가상 머신의 구성에 오류가 있습니다.
  • 가상 머신의 스토리지에 결함이 있습니다.
  • 타겟 노드가 오염되었습니다.

이 문제를 해결하려면 다음 단계를 따르세요.

  1. 클러스터 사용자 인증 정보 가져오기에 설명된 대로 클러스터 사용자 인증 정보를 가져옵니다.

  2. 영향을 받는 가상 머신에 대한 정보를 확인합니다.

    kubectl describe virtualmachine VM_NAME -n NAMESPACE
    

    다음을 바꿉니다.

    • VM_NAME: 대상 가상 머신의 이름입니다.
    • NAMESPACE: 대상 가상 머신의 네임스페이스입니다.

    이 명령어는 다음과 유사한 출력을 반환합니다.

    Status:
    ...
    State:                    Pending
    ...
    Events:
    Type     Reason                  Age   From                       Message
    ----     ------                  ----  ----                       -------
    Normal   SuccessfulCreate        15m   virtualmachine-controller  Created virtual machine my-stuck-vm
    Warning  DiskProvisioningFailed  14m   virtualmachine-controller  Failed to provision disk: DataVolume my-stuck-vm-data-disk not ready
    Warning  PVCNotBound             14m   virtualmachine-controller  PersistentVolumeClaim my-stuck-vm-data-disk is in phase Pending
    Warning  VMINotCreated           10m   virtualmachine-controller  VirtualMachineInstance cannot be created: dependencies not ready
    

    명령어의 출력에는 리소스 제약, 예약 실패, 스토리지 오류 및 기타 문제를 나타낼 수 있는 메시지가 포함됩니다.

  3. 다음 섹션에 설명된 대로 출력을 검사하여 예약 실패의 원인을 확인합니다.

리소스 부족

CPU, 메모리, 디스크 공간과 같은 리소스가 부족하다는 메시지가 표시될 수 있습니다. 예를 들면 다음과 같습니다.

5/8 nodes are available: 3 Insufficient memory, 3 Insufficient CPU.

이 문제를 해결하려면 영향을 받는 가상 머신과 노드에서 예약된 다른 워크로드에 할당된 리소스를 확인한 후 비즈니스 요구사항에 따라 다음을 실행하세요.

  • 노드에 예약된 다른 워크로드를 축소합니다.
  • 영향을 받는 가상 머신에 할당된 리소스의 양을 줄입니다.
  • 영향을 받는 클러스터에 머신을 더 추가합니다.

taint된 노드

타겟 노드가 오염되었다는 메시지가 표시될 수 있습니다. 예를 들면 다음과 같습니다.

5/8 nodes are available: 3 node(s) had taint {<taint-key>:<taint-value>}, that the pod didn't tolerate.

이 문제를 해결하려면 다음 단계를 따르세요.

  1. 다음 명령어를 사용하여 노드의 taint를 확인합니다.

    kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
    

    이 명령어는 다음과 유사한 출력을 반환합니다.

    NAME                           TAINTS
    node-name-1   [map[effect:PreferNoSchedule key:node-role.kubernetes.io/master] map[effect:PreferNoSchedule key:node-role.kubernetes.io/control-plane]]
    node-name-2   <none>
    
  2. 다음 중 하나를 수행합니다.

스토리지 오류

가상 머신의 스토리지에 오류가 있음을 나타내는 메시지가 표시될 수 있습니다. 예를 들면 다음과 같습니다.

5/8 nodes are available: 3 node(s) had volume node affinity conflict, 3 node(s) had unbound immediate PersistentVolumeClaims.

이 메시지는 해당 영구 볼륨이 타겟 노드에 마운트되지 않았음을 나타낼 수 있습니다.

이 문제를 해결하려면 다음 단계를 따르세요.

  1. 다음 명령어를 사용하여 영향을 받는 가상 머신의 네임스페이스에 있는 영구 볼륨 클레임 (PVC)의 상태를 가져옵니다.

    kubectl get pvc -n NAMESPACE
    

    NAMESPACE을 대상 네임스페이스의 이름으로 바꿉니다.

    이 명령어는 다음과 유사한 출력을 반환합니다.

    NAME                                               STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS            AGE
    windows-robin-disk-0                               Bound     pvc-b1a1d264-84bf-4e58-857d-f37f629d5082   25Gi       RWX            robin-block-immediate   30h
    windows-robin-disk-1                               Bound     pvc-0130b9a8-7fed-4df0-8226-d79273792a16   25Gi       RWX            robin-block-immediate   30h
    windows-robin-vm-0-restored-windows-robin-disk-0   Pending                                                                        gce-pd-gkebackup-in     26m
    
  2. 해당 PVC의 상태가 Bound인지 확인합니다. 상태가 Pending이면 스토리지 하위 시스템에서 볼륨 프로비저닝에 실패한 것입니다. 이러한 경우 저장소 하위 시스템 구성을 문제 해결하고 적절한 StorageClass를 사용할 수 있는지 확인해야 합니다.