์ด ํ์ด์ง์์๋ ์ธ๋ถ 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 ์ ํด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
- ์กฐ์ง ๋ฐ ์ธ๋ถ IdP์ ์ง์ ID ์ ํด๋ฅผ ์ค์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ง์ ID ์ ํด ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
- ์ธ๋ถ IdP์์ Google Cloud ์ง์ ID ์ ํด ์ฝ์์ ๋ํ ์ก์ธ์ค๋ฅผ ์ค์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฝ์์ ๋ํ ์ฌ์ฉ์ ์ก์ธ์ค ์ค์ (์ ํด)์ ์ฐธ์กฐํ์ธ์.
๋ค์ ์น์ธ ๋ฉ์ปค๋์ฆ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ก์ธ์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ํด๋ฌ์คํฐ์ ์ก์ธ์คํ๋๋ก ์๋ดํฉ๋๋ค.
- ์ ํด ID๋ก gcloud CLI์ ๋ก๊ทธ์ธํฉ๋๋ค.
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 ๋ค์์ ๋ฐ๊ฟ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 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 ๋ค์์ ๋ฐ๊ฟ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. principalSet://iam.googleapis.com/locations/global/workforcePools/full-time-employees/group/sre |
์ง์ ID ์ ํด์์ ์ง์ํ๋ ๋ชจ๋ ์ฃผ ๊ตฌ์ฑ์ ์๋ณ์๋ IAM ์ ์ฑ ์์ ์ง์ ํ ์ฌ์ฉ์ ํํ์ ์ฐธ์กฐํ์ธ์.
๋ค์ ์์์๋ IdP ํ ํฐ์ access_level="sensitive"
์์ฑ์ด ์๋ full-time-employees
์ง์ ํ์ ๋ชจ๋ ํญ๋ชฉ์ ๋ณด์ ๋น๋ฐ์ ๋ํ ํด๋ฌ์คํฐ ์ ์ฒด ์ฝ๊ธฐ ์ ์ฉ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ค์ 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์ ๋ฐ์ธ๋ฉํ๋ ๋ชจ๋ ์ฃผ ๊ตฌ์ฑ์์ ๋ณด์ ๋น๋ฐ์ ๋ณผ ์ ์์ต๋๋ค.
๋ค์ 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์ ๋ถ์ฌํฉ๋๋ค.ClusterRole ๋ฐ ClusterRoleBinding์ ๋ฐฐํฌํฉ๋๋ค.
kubectl apply -f secret-viewer-cluster-role.yaml kubectl apply -f secret-viewer-cluster-role-binding.yaml
ํด๋ฌ์คํฐ์ ๋ก๊ทธ์ธ ๋ฐ ์ธ์ฆ
- ์ฌ์ฉ์๊ฐ Google Cloud์ ๋ํด Google Cloud CLI๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ๋๋ก ํฉ๋๋ค.
์ฌ์ฉ์๋ ๋ค์์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ์ธ์ฆํ๋๋ก 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 ์ ํด๋ฅผ ์ฌ์ฉํ๋๋ก ํด๋ฌ์คํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
์กฐ์ง ๋ฐ ์ธ๋ถ IdP์ ์ง์ ID ์ ํด๋ฅผ ์ค์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ง์ ID ์ ํด ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
์ง์ ID ์ ํด ์๋ณ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋๋ก ํด๋ฌ์คํฐ์ RoleBinding ๋ฐ ClusterRoleBinding ๋งค๋ํ์คํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ค์ ์ต์ ์ค ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ๋ก๊ทธ๋๋งคํฑ ์ ๋ฐ์ดํธ:
gke-identity-service-migrator
์ ํธ๋ฆฌํฐ๋ฅผ ์ค์นํ๊ณ ์คํํฉ๋๋ค. ์์ธํ ๋ด์ฉ์GoogleCloudPlatform/gke-utilities
์ ์ฅ์ ๋ฆฌ๋๋ฏธ๋ฅผ ์ฐธ์กฐํ์ธ์.์ด ์ ํธ๋ฆฌํฐ๋ GKE์ฉ ID ์๋น์ค ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ธฐ์กด RBAC ๋ฐ์ธ๋ฉ์ ์ฐพ์ ํด๋น ์ง์ ID ์ ํด ์ฃผ ๊ตฌ์ฑ์ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ ๋งค๋ํ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
์๋ ์ ๋ฐ์ดํธ: ์ธ์ฆ๋ ์ฌ์ฉ์ ๋๋ ๊ทธ๋ฃน์ ์ฐธ์กฐํ๋ ๋ชจ๋ ๋ฐ์ธ๋ฉ์ ๋ํด ์ง์ ID ์ ํด ์๋ณ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๋งค๋ํ์คํธ ํ์ผ ์ฌ๋ณธ์ ๋ณ๋๋ก ๋ง๋ญ๋๋ค.
RoleBinding ๋ฐ ClusterRoleBinding์ ์ ๋ฐ์ดํธ๋ ๋งค๋ํ์คํธ๋ฅผ ํด๋ฌ์คํฐ์ ์ ์ฉํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ง์ ID ์ ํด๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆํ ๋ ๋์ผํ ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์๋์ง ํ ์คํธํฉ๋๋ค.
ํด๋ฌ์คํฐ์์ ์ค๋๋ RBAC ๋ฐ์ธ๋ฉ์ ์ญ์ ํฉ๋๋ค.
GKE์ฉ ID ์๋น์ค๋ฅผ ์ค์งํฉ๋๋ค.
GKE์ฉ ID ์๋น์ค ์ฌ์ฉ
ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ GKE Standard ๋ชจ๋ ํด๋ฌ์คํฐ์์ GKE์ฉ ID ์๋น์ค๋ฅผ ์ค์ ํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์์ ์ํํฉ๋๋ค.
- ํด๋ฌ์คํฐ์์ GKE์ฉ ID ์๋น์ค๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
- GKE์ฉ ID ์๋น์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ํด๋ฌ์คํฐ์ 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 ์๋น์ค ๋งค๊ฐ๋ณ์๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
default
ClientConfig๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.kubectl get clientconfig default -n kube-public -o yaml > client-config.yaml
์ํ๋ ์ค์ ์ผ๋ก
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 ํ ํฐ์ ๊ฐ์ ธ์ต๋๋ค.
- Microsoft Azure ๋ฐ Okta์๋
USER
: ID ํ ํฐ์ ์ฌ์ฉ์ ํด๋ ์์ ๋๋ค.GROUPS
: ID ํ ํฐ์ ๊ทธ๋ฃน ํด๋ ์์ ๋๋ค.USER_PREFIX
: ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ์ ํด๋ ์์ ์ถ๊ฐ๋ ํ๋ฆฌํฝ์ค์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๊ธ์ ํ๋ฆฌํฝ์ค๊ฐ Kubernetes API server์ ์ ๊ณต๋userID
์์ ๋ถ์ต๋๋ค(์ฌ์ฉ์ ํด๋ ์์ดemail
์ด ์๋ ๊ฒฝ์ฐ). ๊ทธ ๊ฒฐ๊ณผ ์ฌ์ฉ์ ์๋ณ์๋ISSUER_URI#USER
๊ฐ ๋ฉ๋๋ค. ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง๋ง, ์ฌ์ฉ์๋USER_PREFIX
๋ฅผ-
๋ก ์ค์ ํ์ฌ ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉ ์ค์งํ ์ ์์ต๋๋ค.GROUP_PREFIX
: ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ทธ๋ฃน ํด๋ ์์ ์ถ๊ฐ๋๋ ํ๋ฆฌํฝ์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฆ์ดfoobar
์ธ ๊ทธ๋ฃน์ด 2๊ฐ ์๋ ๊ฒฝ์ฐgid-
ํ๋ฆฌํฝ์ค๋ฅผ ์ถ๊ฐํ์ธ์. ๊ฒฐ๊ณผ ๊ทธ๋ฃน์gid-foobar
์ ๋๋ค.
์ ๋ฐ์ดํธ๋ ๊ตฌ์ฑ์ ์ ์ฉํฉ๋๋ค.
kubectl apply -f client-config.yaml
์ด ๊ตฌ์ฑ์ ์ ์ฉํ๋ฉด GKE์ฉ ID ์๋น์ค๊ฐ ํด๋ฌ์คํฐ ๋ด์์ ์คํ๋๊ณ
gke-oidc-envoy
๋ถํ ๋ถ์ฐ๊ธฐ ๋ค์์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.spec.server
ํ๋์ IP ์ฃผ์๋ ๋ถํ ๋ถ์ฐ๊ธฐ์ IP ์ฃผ์์ฌ์ผ ํฉ๋๋ค.spec.server
ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉดkubectl
๋ช ๋ น์ด๊ฐ ์คํจํ ์ ์์ต๋๋ค.client-config.yaml
๊ตฌ์ฑ ํ์ผ์ ์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.cp client-config.yaml login-config.yaml
spec.authentication.oidc
์น์ ์clientSecret
์ค์ ์ ์ฌ์ฉํ์ฌlogin-config.yaml
๊ตฌ์ฑ ํ์ผ์ ์ ๋ฐ์ดํธํฉ๋๋ค.clientSecret: CLIENT_SECRET
CLIENT_SECRET
๋ฅผ OIDC ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ OIDC ์ ๊ณต์ ์ฒด ์ฌ์ด์ ๊ณต์ ๋ณด์ ๋น๋ฐ๋ก ๋ฐ๊ฟ๋๋ค.์ ๋ฐ์ดํธ๋
login-config.yaml
ํ์ผ์ ๊ฐ๋ฐ์์๊ฒ ๋ฐฐํฌํฉ๋๋ค.
์๊ฒฉํ ์ ์ฑ ์ผ๋ก ํด๋ฌ์คํฐ์์ GKE์ฉ ID ์๋น์ค ๊ตฌ์ฑ
๋คํธ์ํฌ ์ ์ฑ ์ด ์๊ฒฉํ ํด๋ฌ์คํฐ์์ ์์๋๋ก ์๋ํ๋๋ก GKE์ฉ ID ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
- ์ปจํธ๋กค ํ๋ ์ธ์ด
ClientConfig
๊ฒ์ฆ ์นํ ๊ณผ ํต์ ํ ์ ์๋๋ก TCP ํฌํธ15000
์ ๋ํด ๋ฐฉํ๋ฒฝ ๊ท์น์ ์ถ๊ฐํฉ๋๋ค. gke-oidc-envoy
๊ฐ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ก ์์ฑ๋์์ผ๋ฉด ์ด๋ฅผ VPC์ ๋ ธ์ถํฉ๋๋ค.- ํด๋ฌ์คํฐ ๋ด์์ ํธ๋ํฝ์ ๊ฑฐ๋ถํ๋ ์ ์ฑ
์ด ์์ผ๋ฉด
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 ์ญํ ์ ๋ถ์ฌํฉ๋๋ค.
๋ค์ 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"]
ClusterRole ๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f secret-viewer-cluster-role.yaml
๋ค์ 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
์ ๊ตฌ์ฑ๋ ํด๋ ์ ์ด๋ฆ ์๋์ ์๋ ํ ํฐ์ ์ฌ์ฉ์ ์๋ณ์
ClusterRoleBinding ๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f secret-viewer-cluster-role-binding.yaml
ํด๋ฌ์คํฐ์ ๋ก๊ทธ์ธ ๋ฐ ์ธ์ฆ
๊ด๋ฆฌ์๋ก๋ถํฐ OIDC ๊ตฌ์ฑ ํ์ผ์ ๋ฐ์ ๊ฐ๋ฐ์๋ ํด๋ฌ์คํฐ์ ์ธ์ฆํ ์ ์์ต๋๋ค.
๊ด๋ฆฌ์๊ฐ ์ ๊ณตํ
login-config.yaml
ํ์ผ์ ๋ค์ด๋ก๋ํฉ๋๋ค.๋ณ๋์ OIDC ๊ตฌ์ฑ์์๋ฅผ ์ ๊ณตํ๋ Google Cloud CLI SDK๋ฅผ ์ค์นํ์ธ์. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ด๋ฅผ ์ค์นํ ์ ์์ต๋๋ค.
gcloud components install kubectl-oidc
ํด๋ฌ์คํฐ์ ์ธ์ฆ์ ์ํํฉ๋๋ค.
kubectl oidc login --cluster=CLUSTER_NAME --login-config=login-config.yaml
์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ๋๋ก ์น๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฆฝ๋๋ค.
์ธ์ฆ๋ ํ์๋
kubectl
๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.kubectl get pods
GKE์ฉ ID ์๋น์ค ์ฌ์ฉ ์ค์ง
gcloud CLI๋ฅผ ์ฌ์ฉํ์ฌ GKE์ฉ ID ์๋น์ค๋ฅผ ์ฌ์ฉ ์ค์งํ ์ ์์ต๋๋ค. GKE์ฉ ID ์๋น์ค๋ฅผ ์ฌ์ฉ ์ค์งํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
gcloud container clusters update CLUSTER_NAME \
--no-enable-identity-service
๋ค์ ๋จ๊ณ
- ์ง์ ID ์ ํด ์์ธํ ์์๋ณด๊ธฐ
- ์ํฌ๋ก๋ ๋ฐฐํฌ ์์ธํ ์์๋ณด๊ธฐ