ID 및 승인 문제 해결

이 문서에서는 ID 및 승인 문제와 관련된 문제 해결 안내를 제공합니다.

gcloud anthos auth를 최신 상태로 유지

gcloud anthos auth 설치 구성요소가 최신 버전인지 확인하면 일반적인 여러 문제를 방지할 수 있습니다.

gcloud anthos auth 명령어에는 gcloud 핵심 구성요소와 별도의 패키지 anthos-auth 구성요소에 논리가 포함되어 있으므로 확인해야 하는 사항이 두 가지입니다.

gcloud를 업데이트합니다.

gcloud components update

anthos-auth를 업데이트합니다.

gcloud components install anthos-auth

잘못된 제공업체 구성

ID 공급업체 구성이 잘못된 경우 로그인을 클릭하면 ID 공급업체의 오류 화면이 표시됩니다. 공급업체별 안내에 따라 제공업체 또는 클러스터를 올바르게 구성합니다.

잘못된 권한

인증 절차를 완료했지만 클러스터의 세부정보가 여전히 표시되지 않는 경우 OIDC와 함께 사용한 계정에 올바른 RBAC 권한을 부여했는지 확인하세요. 이 계정은 Google Cloud 콘솔에 액세스하는 계정과 다른 계정일 수 있습니다.

갱신 토큰 누락

승인 서버에서 동의를 요청하지만 필요한 인증 매개변수가 제공되지 않으면 다음 오류가 발생합니다.

Error: missing 'RefreshToken' field in 'OAuth2Token' in credentials struct

이 문제를 해결하려면 클러스터 구성 파일에서 prompt=consentauthentication.oidc.extraParams 필드에 추가합니다. 그런 다음 클라이언트 인증 파일을 다시 생성합니다.

갱신 토큰 만료

이 문제는 kubeconfig 파일의 갱신 토큰이 만료되면 발생합니다.

Unable to connect to the server: Get {DISCOVERY_ENDPOINT}: x509:
    certificate signed by unknown authority

이 문제를 해결하려면 login 명령어를 다시 실행합니다.

gkectl create-login-config가 clientconfig를 가져올 수 없음

gkectl create-login-config에 전달된 kubeconfig 파일이 사용자 클러스터 파일이 아니거나 클러스터를 만드는 동안 ClientConfig 커스텀 리소스가 발생되지 않았을 때 이 문제가 발생합니다.

Error getting clientconfig using KUBECONFIG

이 문제를 해결하려면 사용자 클러스터에 올바른 kubeconfig 파일이 있는지 확인합니다. 그런 다음 ClientConfig 객체가 클러스터에 있는지 확인합니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG  get clientconfig default -n kube-public

중복된 클러스터 이름으로 인해 gkectl create-login-config 실패

대상 파일에 이미 존재하는 클러스터 이름이 포함된 로그인 구성 데이터를 쓰려고 하면 이 문제가 발생합니다. 각 로그인 구성 파일에는 고유한 클러스터 이름이 포함되어야 합니다.

error merging with file MERGE_FILE because MERGE_FILE contains a
  cluster with the same name as the one read from KUBECONFIG. Please write to
  a new output file

이 문제를 해결하려면 --output 플래그를 사용하여 새 대상 파일을 지정합니다.

--output을 제공하지 않으면 로그인 구성 데이터가 현재 디렉터리의 kubectl-anthos-config.yaml 파일에 작성됩니다.

gcloud anthos auth login 실패, proxyconnect tcp 오류

이 문제는 https_proxy 또는 HTTPS_PROXY 환경 변수 구성에 오류가 있으면 발생합니다. 환경 변수에 https://가 지정된 경우 프록시가 SOCK5와 같은 기타 프로토콜을 사용하여 HTTPS 연결을 처리하도록 구성되어 있으면 GoLang HTTP 클라이언트 라이브러리가 실패할 수 있습니다.

가능한 오류 메시지:

proxyconnect tcp: tls: first record does not look like a TLS handshake

이 문제를 해결하려면 https_proxyHTTPS_PROXY 환경 변수를 수정하여 https:// prefix를 생략합니다. Windows에서는 시스템 환경 변수를 수정합니다. 예를 들어 https_proxy 환경 변수의 값을 https://webproxy.example.com:8000에서 webproxy.example.com:8000으로 변경합니다.

gcloud anthos auth login으로 생성된 kubeconfig를 사용할 때 클러스터 액세스 실패

이 문제는 Kubernetes API 서버에서 사용자를 승인할 수 없으면 발생합니다. 이는 적절한 RBAC가 없거나 잘못된 경우 또는 클러스터의 OIDC 구성에 오류가 있는 경우에 발생할 수 있습니다.

Unauthorized

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

  1. gcloud anthos auth login으로 생성된 kubeconfig 파일에서 id-token 값을 복사합니다.

    kind: Config
    …
    users:
    — name: …
      user:
        auth-provider:
          config:
            id-token: xxxxyyyy
    
  2. jwt-cli를 설치하고 다음을 실행합니다.

    jwt ID_TOKEN
    
  3. OIDC 구성을 확인합니다.

    사용자 클러스터 구성 파일의 authentication.oidcgroupusername 필드가 있습니다. 이러한 필드는 Kubernetes API 서버에서 --oidc-group-claim--oidc-username-claim 플래그를 설정하는 데 사용됩니다. API 서버에 토큰이 있으면 이 서버에서 토큰을 Anthos ID 서비스로 전달합니다. 이를 통해 추출된 group-claimusername-claim이 다시 AIP 서버로 반환됩니다. API 서버는 응답을 사용하여 해당 그룹이나 사용자에게 올바른 권한이 있는지 확인합니다.

    클러스터 구성 파일의 authentication.oidc 섹션에서 groupuser에 설정된 클레임이 ID 토큰에 있는지 확인합니다.

  4. 적용된 RBAC를 확인합니다.

    username-claim으로 지정된 사용자 또는 이전 단계의 group-claim에 나열된 그룹 중 하나에 대한 올바른 권한을 보유한 RBAC가 있는지 확인합니다. RBAC의 사용자 또는 그룹 이름에는 사용자 클러스터 구성 파일에 지정된 usernameprefix 또는 groupprefix를 프리픽스로 지정해야 합니다.

    usernameprefix가 비어 있고 usernameemail 이외의 값이면 프리픽스 기본값은 issuerurl#입니다. 사용자 이름 프리픽스를 중지하려면 usernameprefix-로 설정합니다.

    사용자 및 그룹 프리픽스에 대한 자세한 내용은 OIDC로 인증을 참조하세요.

    Kubernetes API 서버는 백슬래시를 이스케이프 문자로 취급합니다. 따라서 사용자 또는 그룹 이름에 \\가 포함되어 있으면 ID 토큰을 파싱할 때 API 서버에서 이를 단일 \로 읽습니다. 따라서 이 사용자 또는 그룹에 적용된 RBAC 역할 결합은 백슬래시를 하나만 포함해야 하며 그렇지 않으면 Unauthorized 오류가 표시될 수 있습니다.

    클러스터 구성 파일:

    oidc:
      ...
      username: "unique_name"
      usernameprefix: "-"
      group: "group"
      groupprefix: "oidc:"
    

    ID 토큰:

    {
      ...
      "email": "cluster-developer@example.com",
      "unique_name": "EXAMPLE\\cluster-developer",
      "group": [
        "Domain Users",
        "EXAMPLE\\developers"
      ],
    ...
    }
    

    다음 RBAC binding은 이 그룹과 사용자에게 pod-reader 클러스터 역할을 부여합니다. 이때 이름 필드에 이중 슬래시 대신 단일 슬래시를 사용한다는 것에 유의하세요.

    그룹 ClusterRoleBinding:

    apiVersion:
    kind: ClusterRoleBinding
    metadata:
      name: example-binding
    subjects:
    — kind: Group
      name: "oidc:EXAMPLE\developers"
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    

    사용자 ClusterRoleBinding:

    apiVersion:
    kind: ClusterRoleBinding
    metadata:
      name: example-binding
    subjects:
    — kind: User
      name: "EXAMPLE\cluster-developer"
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    
  5. Kubernetes API 서버 로그를 확인합니다.

    Kubernetes API 서버에 구성된 OIDC 플러그인이 올바르게 시작되지 않으면 ID 토큰이 표시될 때 API 서버에서 Unauthorized 오류를 반환합니다. API 서버의 OIDC 플러그인에 문제가 있는지 확인하려면 다음을 실행하세요.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs statefulset/kube-apiserver -n USER_CLUSTER_NAME