์™ธ๋ถ€ ID ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GKE์— ์ธ์ฆ


์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์™ธ๋ถ€ ID ๊ณต๊ธ‰์—…์ฒด(IdP)์—์„œ Google Kubernetes Engine(GKE) ํด๋Ÿฌ์Šคํ„ฐ๋กœ์˜ ์ธ์ฆ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋Š” OpenID Connect(OIDC) ๋˜๋Š” ๋ณด์•ˆ ๋ณด์žฅ ๋งˆํฌ์—… ์–ธ์–ด(SAML) 2.0์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ IdP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ ๊ด€๋ฆฌ์ž, ์šด์˜์ž, ID ๋ฐ ๊ณ„์ • ๊ด€๋ฆฌ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋ฅผ ์ฝ๊ธฐ ์ „์— ๋‹ค์Œ ์ธ์ฆ ๋ฐ OpenID ๊ฐœ๋…์„ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GKE์˜ ์™ธ๋ถ€ IdP ์ธ์ฆ ๋ฐฉ๋ฒ•

๊ถŒ์žฅ - ์ง์› ID ์ œํœด

์ง์› ID ์ œํœด๋Š” OIDC ๋˜๋Š” SAML 2.0์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ IdP์—์„œ Google Cloud ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” IAM ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ง์› ID ์ œํœด๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, Autopilot ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ Standard ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ˜ธํ™˜๋˜๊ณ  Google Cloud์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง์› ID ์ œํœด์— ๊ด€ํ•œ IAM ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ - GKE์šฉ ID ์„œ๋น„์Šค

GKE Standard ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋งŒ GKE๋Š” GKE์šฉ ID ์„œ๋น„์Šค๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. GKE์šฉ ID ์„œ๋น„์Šค๋Š” OIDC IdP๋กœ ์ œํ•œ๋˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. GKE์—์„œ๋Š” GKE์šฉ ID ์„œ๋น„์Šค ๋Œ€์‹  ์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • Google Kubernetes Engine API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Google Kubernetes Engine API ์‚ฌ์šฉ ์„ค์ •
  • ์ด ํƒœ์Šคํฌ์— Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด gcloud CLI๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”. ์ด์ „์— gcloud CLI๋ฅผ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ gcloud components update๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ณ ๋ ค์‚ฌํ•ญ

์ธ๋ ฅ ID ์ œํœด ๋ฐ GKE์šฉ ID ์„œ๋น„์Šค ๋ชจ๋‘์—์„œ ํ—ค๋“œ๋ฆฌ์Šค ์‹œ์Šคํ…œ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์ธ์ฆ ํ๋ฆ„์€ ์‚ฌ์šฉ์ž ๋™์˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์Šน์ธํ•˜๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

GKE์—์„œ ์ง์› ID ์ œํœด ์‚ฌ์šฉ

GKE ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ์กฐ์ง ๋ฐ ์™ธ๋ถ€ IdP์— ์ง์› ID ์ œํœด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง์› ID ์ œํœด ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  2. ์™ธ๋ถ€ IdP์—์„œ Google Cloud ์ง์› ID ์ œํœด ์ฝ˜์†”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ˜์†”์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ์„ค์ •(์ œํœด)์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. ๋‹ค์Œ ์Šน์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

    1. ์ œํœด ID๋กœ gcloud CLI์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
    2. gcloud container clusters get-credentials๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํŠน์ • ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•˜๋„๋ก kubectl์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

RBAC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ๊ตฌ์„ฑ

Google Cloud ๋Š” ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์› ID ํ’€์˜ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. Kubernetes RBAC ์ •์ฑ… ๋˜๋Š” IAM ์ •์ฑ…์—์„œ ์ด๋Ÿฌํ•œ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์™€ ๊ฐ™์ด ๊ฐœ์ธ ๋˜๋Š” ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ID ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž
๋‹จ์ผ ์‚ฌ์šฉ์ž
principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/subject/SUBJECT_ATTRIBUTE_VALUE

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

  • WORKFORCE_IDENTITY_POOL: ์ง์› ID ํ’€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • SUBJECT_ATTRIBUTE_VALUE: ID ํ† ํฐ์˜ ์ฃผ์ฒด ์–ด์„ค์…˜์— ์žˆ๋Š” ์†์„ฑ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SAML 2.0 ์–ด์„ค์…˜์˜ NameID ํ•„๋“œ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com
๊ทธ๋ฃน์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž
principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_IDENTITY_POOL/group/GROUP_NAME

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

  • WORKFORCE_IDENTITY_POOL: ์ง์› ID ํ’€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • GROUP_NAME: ์ธ์ฆ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ์„ฑ์›์ธ ๊ทธ๋ฃน์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. IdP ํ† ํฐ์˜ ์–ด์„ค์…˜์—๋Š” Google Cloud google.groups ์†์„ฑ์— ๋Œ€ํ•œ ์†์„ฑ ๋งคํ•‘์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre

์ง์› ID ์ œํœด์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋Š” IAM ์ •์ฑ…์—์„œ ์ง์› ํ’€ ์‚ฌ์šฉ์ž ํ‘œํ˜„์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” IdP ํ† ํฐ์— access_level="sensitive" ์†์„ฑ์ด ์žˆ๋Š” full-time-employees ์ง์› ํ’€์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋ณด์•ˆ ๋น„๋ฐ€์— ๋Œ€ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ClusterRole ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ secret-viewer-cluster-role.yaml๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-viewer
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    

    ์ด ClusterRole์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ชจ๋“  ์ฃผ ๊ตฌ์„ฑ์›์€ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ secret-viewer-cluster-role-binding.yaml๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name:  users-view-secrets
    subjects:
    - kind: Group
      name: principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/attribute.access_level/sensitive
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-viewer
      apiGroup: rbac.authorization.k8s.io
    

    ์ด ClusterRoleBinding์€ access_level="sensitive" ์†์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ secret-viewer ClusterRole์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  3. ClusterRole ๋ฐ ClusterRoleBinding์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f secret-viewer-cluster-role.yaml
    kubectl apply -f secret-viewer-cluster-role-binding.yaml
    

ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๊ทธ์ธ ๋ฐ ์ธ์ฆ

  1. ์‚ฌ์šฉ์ž๊ฐ€ Google Cloud์— ๋Œ€ํ•ด Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•˜๋„๋ก kubectl์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud container clusters get-credentials
    

GKE ํด๋Ÿฌ์Šคํ„ฐ์šฉ ID ์„œ๋น„์Šค๋ฅผ ์ง์› ID ์ œํœด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๊ธฐ์กด GKE ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง์› ID ์ œํœด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์„ธ์š”. ์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋™์ผํ•œ ์ฃผ ๊ตฌ์„ฑ์›์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

GKE์šฉ ID ์„œ๋น„์Šค ๊ตฌ๋ฌธ ์ง์› ID ์ œํœด ๊ตฌ๋ฌธ
amal@example.com principal://iam.googleapis.com/locations/global/workforcePools/full-time-employees/subject/amal@example.com
sre-group principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre-group

์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ์กฐ์ง ๋ฐ ์™ธ๋ถ€ IdP์— ์ง์› ID ์ œํœด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง์› ID ์ œํœด ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ์ง์› ID ์ œํœด ์‹๋ณ„์ž ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ์˜ RoleBinding ๋ฐ ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์—…๋ฐ์ดํŠธ: gke-identity-service-migrator ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GoogleCloudPlatform/gke-utilities ์ €์žฅ์†Œ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

      ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” GKE์šฉ ID ์„œ๋น„์Šค ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด RBAC ๋ฐ”์ธ๋”ฉ์„ ์ฐพ์•„ ํ•ด๋‹น ์ง์› ID ์ œํœด ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    • ์ˆ˜๋™ ์—…๋ฐ์ดํŠธ: ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์ง์› ID ์ œํœด ์‹๋ณ„์ž ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ ์‚ฌ๋ณธ์„ ๋ณ„๋„๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  3. RoleBinding ๋ฐ ClusterRoleBinding์˜ ์—…๋ฐ์ดํŠธ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  4. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•  ๋•Œ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

  5. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ค๋ž˜๋œ RBAC ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  6. GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

GKE์šฉ ID ์„œ๋น„์Šค ์‚ฌ์šฉ

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” GKE Standard ๋ชจ๋“œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋Ÿฌ์Šคํ„ฐ์˜ RBAC ์ •์ฑ…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GKE์šฉ ID ์„œ๋น„์Šค์—์„œ ์ƒ์„ฑ๋œ Kubernetes ๊ฐ์ฒด

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ๋•Œ ์ƒ์„ฑ๋œ Kubernetes ๊ฐ์ฒด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ๊ฐ์ฒด
anthos-identity-service Namespace
GKE์šฉ ID ์„œ๋น„์Šค ๋ฐฐํฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
kube-public Namespace
default ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-envoy LoadBalancer
OIDC ์š”์ฒญ์˜ ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ IP ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—†๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ์—๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ€์ƒ ํ”„๋ผ์ด๋น— ํด๋ผ์šฐ๋“œ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-service ClusterIP
gke-oidc-envoy ๋ฐฐํฌ์™€ gke-oidc-service ๋ฐฐํฌ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-envoy Deployment
gke-oidc-envoy LoadBalancer์— ๋…ธ์ถœ๋œ ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. gke-oidc-service์™€ ํ†ต์‹ ํ•˜์—ฌ ID ํ† ํฐ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. Kubernetes API ์„œ๋ฒ„์˜ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋ฉฐ API ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์žฅํ•ฉ๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-service Deployment
ID ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ClientConfig ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์›นํ›… ๊ฒ€์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-operator Deployment
ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ๋ฐ gke-oidc-envoy LoadBalancer๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
gke-oidc-certs Secret
LoadBalancer์— ๋Œ€ํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ ๊ธฐ๊ด€(CA) ๋ฐ TLS ์ธ์ฆ์„œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
anthos-identity-service ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
default ClientConfig CRD
์„ ํ˜ธ ์ธ์ฆ ๋ฐฉ๋ฒ•, ID ๊ณต๊ธ‰์—…์ฒด ๊ตฌ์„ฑ, ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ํด๋ ˆ์ž„ ๋งคํ•‘๊ณผ ๊ฐ™์€ OIDC ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ID ํ† ํฐ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ ์ „ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ OIDC ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
kube-public ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค ์‚ฌ์šฉ ์„ค์ •

๊ธฐ๋ณธ์ ์œผ๋กœ Identity and Access Management(IAM)๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ์„ ์œ„ํ•œ ID ๊ณต๊ธ‰์—…์ฒด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํƒ€์‚ฌ ID ๊ณต๊ธ‰์—…์ฒด๋กœ OIDC๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๊ทœ ๋˜๋Š” ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค ์‚ฌ์šฉ ์„ค์ •

GKE์šฉ ID ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

gcloud container clusters create CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME์„ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค ์‚ฌ์šฉ ์„ค์ •

๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

gcloud container clusters update CLUSTER_NAME \
    --enable-identity-service

CLUSTER_NAME์„ ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

GKE์šฉ ID ์„œ๋น„์Šค ๊ตฌ์„ฑ

default ClientConfig๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ˆ˜์ •ํ•˜์—ฌ GKE์šฉ ID ์„œ๋น„์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. default ClientConfig๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml
    
  2. ์›ํ•˜๋Š” ์„ค์ •์œผ๋กœ spec.authentication ์„น์…˜์„ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

    apiVersion: authentication.gke.io/v2alpha1
    kind: ClientConfig
    metadata:
      name: default
      namespace: kube-public
    spec:
      name: cluster-name
      server: https://192.168.0.1:6443
      authentication:
      - name: oidc
        oidc:
          clientID: CLIENT_ID
          certificateAuthorityData: OIDC_PROVIDER_CERTIFICATE
          extraParams: EXTRA_PARAMS
          issuerURI:  ISSUER_URI
          cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
          kubectlRedirectURI: KUBECTL_REDIRECT_URL
          scopes: SCOPES
          userClaim: USER
          groupsClaim: GROUPS
          userPrefix: USER_PREFIX
          groupPrefix: GROUP_PREFIX
    

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

    • CLIENT_ID: OIDC ๊ณต๊ธ‰์—…์ฒด์— ๋Œ€ํ•ด ์ธ์ฆ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ID์ž…๋‹ˆ๋‹ค.
    • OIDC_PROVIDER_CERTIFICATE: (์„ ํƒ์‚ฌํ•ญ) OIDC ๊ณต๊ธ‰์—…์ฒด์— ๋Œ€ํ•œ PEM ์ธ์ฆ์„œ์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” OIDC ๊ณต๊ธ‰์—…์ฒด๊ฐ€ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GKE์šฉ ID ์„œ๋น„์Šค์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๊ฐœ ๋ฃจํŠธ ์ง‘ํ•ฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • EXTRA_PARAMS: OIDC ์ œ๊ณต์—…์ฒด์— ์ „์†กํ•  ์ถ”๊ฐ€์ ์ธ ํ‚ค-๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
      • ๊ทธ๋ฃน์„ ์Šน์ธํ•˜๋ ค๋ฉด resource=token-groups-claim์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
      • Microsoft Azure ๋ฐ Okta๋ฅผ ์ธ์ฆํ•˜๋ ค๋ฉด prompt=consent๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • Cloud ID์˜ ๊ฒฝ์šฐ prompt=consent,access_type=offline์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
    • ISSUER_URI: OIDC ์Šน์ธ ์š”์ฒญ์„ ์ „์†กํ•  URL์ž…๋‹ˆ๋‹ค(์˜ˆ์‹œ: https://example.com/adfs). Kubernetes API ์„œ๋ฒ„๋Š” ์ด URL์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœ ํ‚ค๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. URI๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud ID์˜ ๊ฒฝ์šฐ https://accounts.google.com์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
    • KUBECTL_REDIRECT_URL: ์Šน์ธ์„ ์œ„ํ•ด kubectl oidc login์— ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ๋””๋ ‰์…˜ URL์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ http://localhost:PORT/callback ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ PORT๋Š” ๊ฐœ๋ฐœ์ž ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ 1024 ์ด์ƒ์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค(์˜ˆ: http://localhost:10000/callback). ์ด URL์„ OIDC ์ œ๊ณต์—…์ฒด์— ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URL๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Google ID๋ฅผ OIDC ๊ณต๊ธ‰์—…์ฒด๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฆฌ๋””๋ ‰์…˜ URI ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • SCOPES: OIDC ์ œ๊ณต์—…์ฒด์— ์ „์†กํ•  ์ถ”๊ฐ€์ ์ธ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
      • Microsoft Azure ๋ฐ Okta์—๋Š” offline_access ๋ฒ”์œ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
      • Cloud ID์˜ ๊ฒฝ์šฐ openid, email์„ ์‚ฌ์šฉํ•˜์—ฌ email ํด๋ ˆ์ž„์— ์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋œ ID ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • USER: ID ํ† ํฐ์˜ ์‚ฌ์šฉ์ž ํด๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
    • GROUPS: ID ํ† ํฐ์˜ ๊ทธ๋ฃน ํด๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
    • USER_PREFIX: ๊ธฐ์กด ์ด๋ฆ„๊ณผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ํด๋ ˆ์ž„์— ์ถ”๊ฐ€๋œ ํ”„๋ฆฌํ”ฝ์Šค์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐœ๊ธ‰์ž ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ Kubernetes API server์— ์ œ๊ณต๋œ userID ์•ž์— ๋ถ™์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ํด๋ ˆ์ž„์ด email์ด ์•„๋‹Œ ๊ฒฝ์šฐ). ๊ทธ ๊ฒฐ๊ณผ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋Š” ISSUER_URI#USER๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž๋Š” USER_PREFIX๋ฅผ -๋กœ ์„ค์ •ํ•˜์—ฌ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • GROUP_PREFIX: ๊ธฐ์กด ์ด๋ฆ„๊ณผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃน ํด๋ ˆ์ž„์— ์ถ”๊ฐ€๋˜๋Š” ํ”„๋ฆฌํ”ฝ์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฆ„์ด foobar์ธ ๊ทธ๋ฃน์ด 2๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ gid- ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๊ฒฐ๊ณผ ๊ทธ๋ฃน์€ gid-foobar์ž…๋‹ˆ๋‹ค.
  3. ์—…๋ฐ์ดํŠธ๋œ ๊ตฌ์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f client-config.yaml
    

    ์ด ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๋ฉด GKE์šฉ ID ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰๋˜๊ณ  gke-oidc-envoy ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ๋’ค์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. spec.server ํ•„๋“œ์˜ IP ์ฃผ์†Œ๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ IP ์ฃผ์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. spec.server ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด kubectl ๋ช…๋ น์–ด๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. client-config.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    cp client-config.yaml login-config.yaml
    
  5. spec.authentication.oidc ์„น์…˜์˜ clientSecret ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ login-config.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    clientSecret: CLIENT_SECRET
    

    CLIENT_SECRET๋ฅผ OIDC ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ OIDC ์ œ๊ณต์—…์ฒด ์‚ฌ์ด์˜ ๊ณต์œ  ๋ณด์•ˆ ๋น„๋ฐ€๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  6. ์—…๋ฐ์ดํŠธ๋œ login-config.yaml ํŒŒ์ผ์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

์—„๊ฒฉํ•œ ์ •์ฑ…์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ GKE์šฉ ID ์„œ๋น„์Šค ๊ตฌ์„ฑ

๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ์—„๊ฒฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ClientConfig ๊ฒ€์ฆ ์›นํ›…๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก TCP ํฌํŠธ 15000์— ๋Œ€ํ•ด ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. gke-oidc-envoy๊ฐ€ ๋‚ด๋ถ€ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋กœ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉด ์ด๋ฅผ VPC์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ์ •์ฑ…์ด ์žˆ์œผ๋ฉด gke-oidc-envoy ๋ฐฐํฌ๊ฐ€ gke-oidc-service ๋ฐฐํฌ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก TCP ํฌํŠธ 8443์— ๋Œ€ํ•ด ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

GKE์šฉ ID ์„œ๋น„์Šค ๊ตฌ์„ฑ์š”์†Œ ๋ฒ„์ „ 0.2.20 ์ด์ƒ์—์„œ๋Š” TCP ํฌํŠธ 15000์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์š”์†Œ ๋ฒ„์ „์ด 0.2.20 ์ด์ƒ์ธ ๊ฒฝ์šฐ ํฌํŠธ 15000์— ๋Œ€ํ•œ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์š”์†Œ ๋ฒ„์ „์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl describe deployment gke-oidc-envoy -n anthos-identity-service \
    | grep "components.gke.io/component-name: gke-oidc" -A1

๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์— ์ปค์Šคํ…€ ์†์„ฑ ์ถ”๊ฐ€

GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„ ๊ณ ์ • IP ์ฃผ์†Œ์™€ ๊ฐ™์€ ์ปค์Šคํ…€ ์ฃผ์„ ๋ฐ ์†์„ฑ์„ gke-oidc-envoy ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gke-oidc-envoy ์„œ๋น„์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl edit service gke-oidc-envoy -n anthos-identity-service

GKE์— TCP/UDP ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ LoadBalancer ์„œ๋น„์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํด๋Ÿฌ์Šคํ„ฐ์˜ RBAC ์ •์ฑ… ๋งŒ๋“ค๊ธฐ

๊ด€๋ฆฌ์ž๊ฐ€ Kubernetes ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด RBAC๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ๊ฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ RBAC ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด Role๊ณผ RoleBinding์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ClusterRole๊ณผ ClusterRoleBinding์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€ ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ RBAC ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ClusterRole ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ secret-viewer-cluster-role.yaml๋กœ ์ €์žฅํ•˜์„ธ์š”. ์ด ์—ญํ• ์ด ๋ถ€์—ฌ๋œ ์‚ฌ๋žŒ์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋ณด๊ณ , ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-viewer
    rules:
    - apiGroups: [""]
      # The resource type for which access is granted
      resources: ["secrets"]
      # The permissions granted by the ClusterRole
      verbs: ["get", "watch", "list"]
    
  2. ClusterRole ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f secret-viewer-cluster-role.yaml
    
  3. ๋‹ค์Œ ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ secret-viewer-cluster-role-binding.yaml๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ์€ ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์— secret-viewer ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name:  people-who-view-secrets
    subjects:
    - kind: User
      name: ISSUER_URI#USER
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-viewer
      apiGroup: rbac.authorization.k8s.io
    

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

    • ISSUER_URI: ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ spec.authentication.oidc.issuerURI์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URI์ž…๋‹ˆ๋‹ค.
    • USER: ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ spec.authentication.oidc.userClaim์— ๊ตฌ์„ฑ๋œ ํด๋ ˆ์ž„ ์ด๋ฆ„ ์•„๋ž˜์— ์žˆ๋Š” ํ† ํฐ์˜ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž
  4. ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f secret-viewer-cluster-role-binding.yaml
    

ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๊ทธ์ธ ๋ฐ ์ธ์ฆ

๊ด€๋ฆฌ์ž๋กœ๋ถ€ํ„ฐ OIDC ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ฐ›์€ ๊ฐœ๋ฐœ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณตํ•œ login-config.yaml ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  2. ๋ณ„๋„์˜ OIDC ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” Google Cloud CLI SDK๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud components install kubectl-oidc
    
  3. ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml
    

    ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„๋ฃŒํ•˜๋„๋ก ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

  4. ์ธ์ฆ๋œ ํ›„์—๋Š” kubectl ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    kubectl get pods
    

GKE์šฉ ID ์„œ๋น„์Šค ์‚ฌ์šฉ ์ค‘์ง€

gcloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GKE์šฉ ID ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

gcloud container clusters update CLUSTER_NAME \
    --no-enable-identity-service

๋‹ค์Œ ๋‹จ๊ณ„