GKE์šฉ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ธ์ฆ ๋ฌธ์ œ ํ•ด๊ฒฐ

์ด ๋ฌธ์„œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ID ์˜ค๋ฅ˜์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํฌ๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl describe pod

ํฌ๋“œ๊ฐ€ ์ธ์ฆ์„œ์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜์ง€ ์•Š์Œ

Google Kubernetes Engine (GKE) ์›Œํฌ๋กœ๋“œ ํฌ๋“œ๊ฐ€ ๋งˆ์šดํŠธ๋œ ์ธ์ฆ์„œ๋กœ ๋ฐฐํฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl describe pod POD_NAME -n POD_NAMESPACE

๊ถŒํ•œ ๊ด€๋ จ ์˜ค๋ฅ˜

์ด ์„น์…˜์—์„œ๋Š” ์ž˜๋ชป๋œ ๊ถŒํ•œ๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ์ค‘์— ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋จ: GKE Auth์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Permission denied while issuing the certificate: failed to issue the certificate from the GKE Auth: rpc error: code = PermissionDenied desc = Permission 'privateca.certificates.createForSelf' denied on 'projects/PROJECT_NUMBER/locations/REGION/caPools/ CA_POOL_ID'

์›Œํฌ๋กœ๋“œ ID ํ’€์— ํ•˜์œ„ CA ํ’€์˜ CA Service Workload Certificate Requester ์—ญํ•  (roles/privateca.workloadCertificateRequester)์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ’€์— ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
   --project=CA_POOL_PROJECT_ID \
   --location=REGION \
   --role=roles/privateca.workloadCertificateRequester \
   --member="principal://iam.googleapis.com/projects/CA_POOL_PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog"

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€ ID
  • CA_POOL_PROJECT_ID: ๋ฃจํŠธ CA ํ’€์˜ ํ”„๋กœ์ ํŠธ ID
  • REGION: ํ•˜์œ„ CA ๋ฆฌ์ „
  • CA_POOL_PROJECT_NUMBER: CA ํ’€ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ
  • PROJECT_ID: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ํ”„๋กœ์ ํŠธ ID

๋ณผ๋ฅจ์˜ MountVolume.SetUp ์‹คํŒจ

์ด ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MountVolume.SetUp failed for volume "fleet-spiffe-credentials" : rpc error: code = Internal desc = unable to mount volume: while creating volume: while loading trust bundles: rpc error: code = Internal desc = while getting trust map from the trustBundleWatcher: rpc error: code = Internal desc = no GKEClusterTrustBundle objects found with fleet WIP nickname fleet-project/svc.id.goog

์ด ์˜ค๋ฅ˜๋Š” ์›Œํฌ๋กœ๋“œ ID ํ’€์— ํ•˜์œ„ CA ํ’€์˜ ๋น„๊ณต๊ฐœ CA ํ’€ ๋ฆฌ๋” ์—ญํ•  (roles/privateca.poolReader)์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ’€์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ณ  ์‹ ๋ขฐ ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
 --location=REGION \
 --role=roles/privateca.poolReader \
 --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog"

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€ ID
  • REGION: ํ•˜์œ„ CA ๋ฆฌ์ „
  • PROJECT_NUMBER: ์›Œํฌ๋กœ๋“œ ID ํ’€ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ
  • PROJECT_ID: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ํ”„๋กœ์ ํŠธ ID

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๋ขฐ ๋ฒˆ๋“ค์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl get gkeclustertrustbundle

์‹ ๋ขฐ ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋ฉด ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

NAME                                         AGE
svc.id.goog-PROJECT_ID.svc.id.goog   5m35s

์ถœ๋ ฅ์—์„œ PROJECT_ID๋Š” ์‹ ๋ขฐ ๋ฃจํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ•จ๋Œ€์˜ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์˜ค๋ฅ˜

์ด ์„น์…˜์˜ ์˜ค๋ฅ˜๋Š” ์ธ์ฆ์„œ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ID ์ธ์ฆ์„œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pod ๋งˆ์šดํŠธ ๋ณผ๋ฅจ์—์„œ ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. pod์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

    # Open the pod sh interface
    kubectl exec -it $pod_name -n $pod_namespace -- sh
    
  2. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํŒŒ์ผ์„ ๋‚˜์—ดํ•˜๊ณ  ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    # Look up the volume contents:
    ls -la /var/run/secrets/workload-spiffe-credentials
    cat /var/run/secrets/workload-spiffe-credentials/certificates.pem
    cat /var/run/secrets/workload-spiffe-credentials/ca_certificates.pem
    cat /var/run/secrets/workload-spiffe-credentials/private_key.pem
    cat /var/run/secrets/workload-spiffe-credentials/trust_bundles.json
    

Google Cloud ์ฝ˜์†”์„ ํ†ตํ•ด `gke-metadata-server ์ปจํ…Œ์ด๋„ˆ์˜ k8s_container ๋กœ๊ทธ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ํฌ๋“œ์˜ ์ธ์ฆ์„œ ํ”„๋กœ๋น„์ €๋‹ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ์ค‘์— ์ „์ œ ์กฐ๊ฑด์ด ์‹คํŒจํ•จ

Pod ์„ค๋ช…์—๋Š” ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Failed precondition while issuing the certificate: failed to issue the certificate from the GKE Auth: rpc error: code = FailedPrecondition

์ด ์˜ค๋ฅ˜๋Š” ์›Œํฌ๋กœ๋“œ ID ํ’€์ด ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ (CIC)์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด CIC๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ ID ํ’€์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.