관리형 Anthos Service Mesh 문제 해결

이 문서에서는 일반적인 Anthos Service Mesh 문제와 해결 방법을 설명합니다. 예를 들어 포드가 istio.istio-system과 함께 삽입되면 설치 도구가 HTTP 400 상태 코드 및 클러스터 멤버십 오류와 같은 오류를 생성합니다.

Anthos Service Mesh 문제 해결에 추가 지원이 필요하면 지원 받기를 참조하세요.

비정상 오류로 보고되는 버전

관리형 Anthos Service Mesh에 Anthos Service Mesh 서비스 에이전트 Identity and Access Management(IAM) 역할 바인딩이 포함된 필수 Google 관리형 서비스 계정이 없는 경우 일반적인 Revision(s) reporting unhealthy 오류가 표시될 수 있습니다. 일반적으로 이는 Terraform, Puppet 또는 CI/CD 재구성을 통해 Anthos Service Mesh 서비스 에이전트 역할에 대한 권한이 취소될 때 발생합니다.

이 오류를 해결하는 단계는 Google Cloud 콘솔 또는 Google Cloud CLI 중 무엇을 사용하는지에 따라 다릅니다.

Google Cloud 콘솔

  1. Google Cloud 콘솔에서 IAM 및 관리자 > IAM으로 이동합니다.

  2. Google 제공 역할 부여 포함을 선택합니다.

  3. 주 구성원 목록을 검토합니다.

    필요한 IAM 역할이 있는 관리형 서비스 계정이 표시되면 올바르게 구성된 것입니다.

    필요한 IAM 역할이 있는 필수 관리형 서비스 계정이 목록에 없으면 필요한 Anthos Service Mesh 서비스 에이전트 IAM 역할 바인딩이 관리형 서비스 계정에 없는 것입니다.

  4. Google Cloud 콘솔에서 Anthos Service Mesh 관리형 서비스 계정에 Anthos Service Mesh 서비스 에이전트(roles/anthosservicemesh.serviceAgent) IAM 역할 바인딩을 부여합니다.

Google Cloud CLI

  1. Google Cloud CLI에서 다음 명령어를 실행하여 필수 IAM 역할이 구성되었는지 확인합니다.

    gcloud projects get-iam-policy PROJECT_ID  \
    --flatten="bindings[].members" \
    --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \
    --format='table(bindings.role)'
    
  2. ROLE 목록을 검토하세요.

    목록에 역할이 표시되면 올바르게 구성된 것입니다.

    목록에 역할이 표시되지 않으면 관리형 서비스 계정 역할이 모두 취소된 것입니다.

  3. 다음 명령어를 실행하여 Anthos Service Mesh 관리형 서비스 계정에 적절한 IAM 역할 바인딩을 할당합니다.

     gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
     --role="roles/anthosservicemesh.serviceAgent"
    

포드가 istiod.istio-system으로 삽입됨

이 오류는 istio-injection: enabled 라벨을 바꾸지 않은 경우에 발생할 수 있습니다.

또한 다음 명령어를 사용하여 변형 웹 webhook 구성을 확인합니다.

kubectl get mutatingwebhookconfiguration

...
istiod-asm-managed
…
# may include istio-sidecar-injector

kubectl get mutatingwebhookconfiguration   istio-sidecar-injector -o yaml

# Run debug commands
export T=$(echo '{"kind":"TokenRequest","apiVersion":"authentication.k8s.io/v1","spec":{"audiences":["istio-ca"], "expirationSeconds":2592000}}' | kubectl create --raw /api/v1/namespaces/default/serviceaccounts/default/token -f - | jq -j '.status.token')

export INJECT_URL=$(kubectl get mutatingwebhookconfiguration istiod-asmca -o json | jq -r .webhooks[0].clientConfig.url)
export ISTIOD_ADDR=$(echo $INJECT_URL | 'sed s/\/inject.*//')

curl -v -H"Authorization: Bearer $T" $ISTIOD_ADDR/debug/configz

설치 도구로 HTTP 400 오류 발생

설치 도구는 다음과 같이 HTTP 400 오류를 발생시킬 수 있습니다.

HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.

이 오류는 Kubernetes 클러스터에서 워크로드 아이덴티티를 사용 설정하지 않았을 때 발생할 수 있으며, 사용 설정하려면 다음 명령어를 사용하면 됩니다.

export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
    --workload-pool=$PROJECT_ID.svc.id.goog

관리형 데이터 영역 상태

다음 명령어는 관리형 데이터 영역의 상태를 표시합니다.

gcloud container fleet mesh describe --project PROJECT_ID

다음 표에는 가능한 모든 관리형 데이터 영역 상태가 나와 있습니다.

상태 코드 설명
ACTIVE OK 관리형 데이터 영역이 정상적으로 실행 중입니다.
DISABLED DISABLED 이를 사용하도록 구성된 네임스페이스나 버전이 없으면 관리형 데이터 영역이 이 상태가 됩니다. 안내를 따라 Fleet API를 통해 관리형 Anthos Service Mesh 사용 설정하거나 asmcli로 관리형 Anthos Service Mesh를 프로비저닝한 후 관리형 데이터 영역을 사용 설정합니다. 관리형 데이터 영역 상태 보고는 네임스페이스나 버전에 주석을 추가하여 관리형 데이터 영역을 사용 설정한 경우에만 사용 가능합니다. 개별 포드에 주석을 추가하면 해당 포드가 관리되지만 주석이 추가된 네임스페이스나 버전이 없으면 기능이 DISABLED 상태가 됩니다.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED 관리형 데이터 영역에는 활성 관리형 Anthos Service Mesh 제어 영역이 필요합니다.
PROVISIONING PROVISIONING 관리형 데이터 영역을 프로비저닝하는 중입니다. 이 상태가 10분 넘게 지속되면 오류가 발생했을 수 있으며 지원팀에 문의해야 합니다.
STALLED INTERNAL_ERROR 내부 오류 조건으로 인해 관리형 데이터 영역이 작동하지 못하도록 차단되었습니다. 문제가 지속되면 지원팀에 문의하세요.
NEEDS_ATTENTION UPGRADE_FAILURES 서비스를 정상 상태로 되돌리려면 관리형 데이터 영역에 수동으로 개입해야 합니다. 이 문제에 대한 자세한 내용과 해결 방법은 NEEDS_ATTENTION 상태를 참조하세요.

NEEDS_ATTENTION state

gcloud container fleet mesh describe 명령어에서 관리형 데이터 영역 상태가 NEEDS_ATTENTION 상태이고 코드가 UPGRADE_FAILURES인 경우 관리형 데이터 영역이 특정 워크로드를 업그레이드하지 않은 것입니다. 추가 분석을 위해 관리형 데이터 영역 서비스에서 이러한 워크로드에 dataplane-upgrade: failed 라벨을 지정합니다. 프록시를 업그레이드하려면 수동으로 다시 시작해야 합니다. 주의를 필요한 포드 목록을 가져오려면 다음 명령어를 실행합니다.

kubectl get pods --all-namespaces -l dataplane-upgrade=failed

클러스터 멤버십 오류(ID 공급업체가 지정되지 않음)

다음과 같은 클러스터 멤버십 오류와 함께 설치 도구가 실패할 수 있습니다.

asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.

이 오류는 클러스터를 등록하기 전에 GKE 워크로드 아이덴티티를 사용 설정하지 않은 경우에 발생할 수 있습니다. gcloud container fleet memberships register --enable-workload-identity 명령어를 사용하여 명령줄에서 클러스터를 다시 등록할 수 있습니다.

관리형 제어 영역 상태 확인

관리형 제어 영역 상태를 확인하려면 gcloud container fleet mesh describe --project FLEET_PROJECT_ID를 실행합니다.

응답의 membershipStates[].servicemesh.controlPlaneManagement.details 필드에 특정 오류가 설명되어 있을 수 있습니다.

자세한 내용은 관리형 제어 영역이 프로비저닝되거나 프로비저닝이 실패할 때 업데이트되는 클러스터의 ControlPlaneRevision 커스텀 리소스를 확인합니다.

리소스 상태를 검사하려면 NAME을 각 채널에 해당하는 asm-managed, asm-managed-stable, asm-managed-rapid 값으로 바꿉니다.

kubectl describe controlplanerevision NAME -n istio-system

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

    Name:         asm-managed

    …

    Status:
      Conditions:
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               The provisioning process has completed successfully
        Reason:                Provisioned
        Status:                True
        Type:                  Reconciled
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has finished
        Reason:                ProvisioningFinished
        Status:                True
        Type:                  ProvisioningFinished
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has not stalled
        Reason:                NotStalled
        Status:                False
        Type:                  Stalled

Reconciled 조건에 따라 관리형 제어 영역이 올바르게 실행되는지 여부가 결정됩니다. true이면 제어 영역이 성공적으로 실행됩니다. Stalled는 관리형 제어 영역 프로비저닝 프로세스에 오류가 발생했는지 여부를 결정합니다. Stalled이면 Message 필드에 특정 오류에 대한 추가 정보가 포함됩니다. 발생 가능한 오류에 대한 자세한 내용은 중단 코드를 참조하세요.

ControlPlaneRevision 중단 코드

ControlPlaneRevisions 상태에서 Stalled 조건이 true가 될 수 있는 이유는 다양합니다.

이유 메시지 설명
PreconditionFailed GKE 멤버십만 지원되지만 ${CLUSTER_NAME}은(는) GKE 클러스터가 아닙니다. 현재 클러스터가 GKE 클러스터로 표시되지 않습니다. 관리형 제어 영역이 GKE 클러스터에서만 작동합니다.
지원되지 않는 ControlPlaneRevision 이름: ${NAME} ControlPlaneRevision의 이름은 다음 중 하나여야 합니다.
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
지원되지 않는 ControlPlaneRevision 네임스페이스: ${NAMESPACE} ControlPlaneRevision의 네임스페이스는 istio-system이어야 합니다.
이름이 ${NAME}인 ControlPlaneRevision에 대해 지원되지 않는 채널 ${CHANNEL}. ${OTHER_CHANNEL} 필요 ControlPlaneRevision의 이름은 다음과 같이 ControlPlaneRevision의 채널과 일치해야 합니다.
  • asm-managed -> 일반
  • asm-managed-rapid -> 신속
  • asm-managed-stable -> 정식
채널을 생략하거나 비워 둘 수 없습니다. Channel은 ControlPlaneRevision의 필수 필드입니다. 커스텀 리소스에 없거나 비어 있습니다.
지원되지 않는 제어 영역 버전 유형: ${TYPE} managed_service는 ControlPlaneRevisionType의 유일한 허용 필드입니다.
지원되지 않는 Kubernetes 버전: ${VERSION} Kubernetes 버전 1.15 이상이 지원됩니다.
워크로드 아이덴티티가 사용 설정되지 않음 클러스터에서 워크로드 아이덴티티를 사용 설정하세요.
지원되지 않는 워크로드 풀: ${POOL} 워크로드 풀은 ${PROJECT_ID}.svc.id.goog 형식이어야 합니다.
클러스터 프로젝트와 Environ 프로젝트가 일치하지 않습니다. 클러스터는 Fleet에 등록된 동일한 프로젝트의 일부여야 합니다.
ProvisioningFailed 클러스터 리소스를 업데이트하는 중 오류 발생 Google에서 CRD 및 웹훅과 같은 클러스터 내 리소스를 업데이트할 수 없습니다.
MutatingWebhookConfiguration 'istiod-asm-managed'에는 URL이 예상된 ${EXPECTED_URL}을(를) 제외하고 ${EXISTING_URL}인 웹훅이 포함됩니다. Google은 설치 손상을 방지하기 위해 기존 웹훅을 덮어쓰지 않습니다. 이 작업을 수행하려면 이를 수동으로 업데이트하세요.
ValidatingWebhookConfiguration ${NAME}에 URL이 예상된 ${EXPECTED_URL}을(를) 제외하고 ${EXISTING_URL}인 웹훅이 포함됩니다. Google은 설치 손상을 방지하기 위해 기존 웹훅을 덮어쓰지 않습니다. 이 작업을 수행하려면 이를 수동으로 업데이트하세요.

관리형 Anthos Service Mesh를 GKE 클러스터에 연결할 수 없음

2022년 6월부터 2022년 9월까지 Google은 Google Kubernetes Engine(GKE)에서 승인된 네트워크, Cloud Run, Cloud Functions와 관련된 보안 작업을 완료했습니다. 이전에는 관리형 Anthos Service Mesh를 사용했지만 마이그레이션 전에 사용이 중지된 프로젝트에는 Cloud Run과 GKE 간의 통신에 필요한 API가 없습니다.

이 시나리오에서는 관리형 Anthos Service Mesh 프로비저닝이 실패하고 Cloud Logging에 다음 오류 메시지가 표시됩니다.

Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

다음 쿼리를 사용하여 이 메시지를 필터링합니다.

resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"

그동안 사이드카 삽입 및 Anthos Service Mesh 관련 Kubernetes 커스텀 리소스 배포도 실패하고 Cloud Logging에 다음 경고 메시지가 표시됩니다.

Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.

다음 쿼리를 사용하여 이 메시지를 필터링합니다.

resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"

문제를 해결하려면 다음 안내를 따르세요.

  1. 필요한 connectgateway API를 사용 설정합니다.

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. 관리형 Anthos Service Mesh를 다시 설치합니다.

  3. 워크로드에서 순차적 재시작을 수행합니다.