ํคํด๋ฝ์ ํ์ฉํ ํตํฉ ์ธ์ฆ ์ค์ตํ๊ธฐ
ํคํด๋ฝ์ ํ์ฉํ ํตํฉ ์ธ์ฆ ์ค์ตํ๊ธฐ ๊ด๋ จ
KubeCon + Cloud Native North America 2023์์ ๋ฐํํ <Beyond Passwords: Keycloak's Contributions to IAM(Identity and Access Management) + Security>๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋ฐํ ๋ด์ฉ์ 3ํ๋ก ๋๋์ด ๋ฐํํฉ๋๋ค. 1๋ถ์์๋ ํคํด๋ฝ์ ๋ํ ๊ธฐ๋ฅ ์๊ฐ์ ์ด์ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. 2๋ถ์์๋ ํคํด๋ฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์คํํด์ผ ํ ์ฌ์ ์์ ์ ์์๋ณด๊ณ , ์ด๋ฒ 3๋ถ์์๋ ํคํด๋ฝ์ ์ฌ์ฉํ์ฌ EKS, GKE์ ๊ฐ์ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ํตํฉ์ธ์ฆ ํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ด ๋๋ค. ๋ฐํ ์๋ฃ๋ KubeCon NA 2023 ํํ์ด์ง์์ ๋ค์ด๋ฐ์ผ์ค ์ ์์ต๋๋ค.
- 1๋ถ: ์ ์ํ์ธ, ํตํฉ์ธ์ฆ๊ด๋ฆฌ ์คํ์์ค โํคํด๋ฝโ์ ์์๋ณด์
- 2๋ถ: ํคํด๋ฝ ๊ตฌ์ฑ์ ์ํ ๊ธฐ๋๊ธด ์ฌ์ ์์ ํ๋ฒ์ ๋ณด๊ธฐ
- 3๋ถ: ํคํด๋ฝ์ ํ์ฉํ ํตํฉ ์ธ์ฆ ์ค์ตํ๊ธฐ
์ด๋ฒ 3๋ถ์์ ์ดํด๋ณผ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- GKE์ EKS์ OIDC ๊ธฐ๋ฅ ๊ตฌ์ฑํ๊ธฐ
- kubelogin์ด ๊ฐ์ง๋ ์๋ฏธ์ ๊ตฌ์กฐ ์ค๋ช
- EKS์ GKE์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
- ํคํด๋ฝ์ ์ด์ฉํ ํตํฉ ์ธ์ฆ์ผ๋ก ์ป์ ์ ์๋์ด์ ๋ค ์ ๋ฆฌ
GKE์ EKS์ OIDC ๊ธฐ๋ฅ ๊ตฌ์ฑํ๊ธฐ
์ฐ๋ฆฌ๋ ์ฌ์ ์ค๋น ์์ ์ ํตํด์ GKE ํด๋ฌ์คํฐ๋ฅผ ๋น๋กฏํด ํคํด๋ฝ์ ๋ฐฐํฌํ๊ณ ํคํด๋ฝ์์ ์ธ์ฆ์ ์งํํ๊ธฐ ์ํ ์ค์ ์ ๋ชจ๋ ์๋ฃํ์์ต๋๋ค. ๋ค์์ผ๋ก, GKE ํด๋ฌ์คํฐ์ ์ ๊ทผ ์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
1. GKE์ OIDC ๊ธฐ๋ฅ ๊ตฌ์ฑํ๊ธฐ
๋จผ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์์นํ 1-3.clientconfig-gke-keycloak-w-oidc.yaml
์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
.1-3.clientconfig-gke-keycloak-w-oidc.yaml
์ ์ฌ์ ์ค๋น ์์
์์ GKE ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ ๋ ์ถ๊ฐ๋ก ์
๋ ฅํ --enable-identity-service
์ผ๋ก ๋ง๋ค์ด์ง ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ ์ปค์คํ
์ค๋ธ์ ํธ์
๋๋ค. ์ด ํ์ผ ๋ด๋ถ์๋ OIDC ์ธ์ฆ์ ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
oidc:
clientSecret: ...
clientID: k8s-auth
cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
extraParams: resource=token-groups-claim
groupPrefix: '-'
groupsClaim: groups
issuerURI: https://oncloud-1.site/realms/kubernetes
kubectlRedirectURI: http://localhost:8000
scopes: openid
userClaim: preferred_username
userPrefix: '-'
internalServer: ""
name: hj-keycloak-oncloud-1-gke
์ด์ ๊ฐ์ ํ๋ผ๋ฏธํฐ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
clientSecret
: [์ํฌ๋ฆฟ]- OIDC ๊ณต๊ธ์ ์ฒด๊ฐ OIDC ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณต์ ํ๋ ClientSecret์ ๋๋ค.
- Google์ด 'k8s-auth'ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋๋ก 'k8s-auth'ํด๋ผ์ด์ธํธ์ Client Secret์ ์ ๋ ฅํฉ๋๋ค.
clientID
: k8s-auth- OIDC ๊ณต๊ธ์ ์ฒด์๊ฒ ์ธ์ฆ์ ์์ฒญํ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ID์ ๋๋ค.
- 'k8s-auth'ํด๋ผ์ด์ธํธ์ Client ID๋ฅผ ์ ๋ ฅํฉ๋๋ค.
cloudConsoleRedirectURI
: https://console.cloud.google.com/kubernetes/oidcextraParams
:resource=token-groups-claim
- OIDC ๊ณต๊ธ์ ์ฒด์ ์ ์กํ ์ถ๊ฐ์ ์ธ ํค-๊ฐ ๋งค๊ฐ๋ณ์์ ๋๋ค.
- Google์๊ฒ ๊ทธ๋ฃน ํด๋ ์์ ํ๊ธฐ ์ํด
resource=token-groups-claim
๋ฅผ ์ ๋ ฅํฉ๋๋ค.
groupPrefix
: '-'- ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ถ๊ฐํ๋ ๊ทธ๋ฃน ํด๋ ์์ ์ถ๊ฐ๋๋ ํ๋ฆฌํฝ์ค์ ๋๋ค.
groupsClaim
: groups- JWT ํ๋์์ ์ฌ์ฉ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ํ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ด ์ค์ต์์๋ ํคํด๋ฝ์์ ์ถ๊ฐ๋ก ์ค์ ํ groups๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ groups๋ก ์ค์ ํฉ๋๋ค.
- ํคํด๋ฝ์ Realm Roles์ ํด๋นํฉ๋๋ค.
issuerURI
: https://oncloud-1.site/realms/kubernetes- OIDC ์น์ธ์ ์์ฒญํ๋ URL์
๋๋ค. URI๋ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ,
https://example.com/adfs
๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ก์ต๋๋ค. - 'k8s-auth'ํด๋ผ์ด์ธํธ๊ฐ ์ํ 'kubernetes' Realm ์ฃผ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
- OIDC ์น์ธ์ ์์ฒญํ๋ URL์
๋๋ค. URI๋ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ,
kubectlRedirectURI
: http://localhost:8000- ์ธ๊ฐ๋ฅผ ์ํด
kubectl oidc login
์ ์ฌ์ฉ๋๋ ๋ฆฌ๋๋ ์ URL์ ๋๋ค. - 'k8s-auth'ํด๋ผ์ด์ธํธ์ 'Valid redirect URIs'๋ฅผ ์ ๋ ฅํฉ๋๋ค.
- ์ธ๊ฐ๋ฅผ ์ํด
scopes
:- OIDC ์ ๊ณต์ ์ฒด์ ์ ์กํ ์ถ๊ฐ์ ์ธ ๋ฒ์์ ๋๋ค
- Google์๊ฒ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด openid๋ฅผ ์ ๋ ฅํฉ๋๋ค.
userClaim
:preferred_username
- JWT ํ๋์์ ์ฌ์ฉ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ํ๋๋ฅผ ์
๋ ฅํฉ๋๋ค. ์ด ์ค์ต์์๋ ์ด๋ฉ์ผ์ ๋ฐ๋ก ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์
preferred_username
์ ์ฌ์ฉํฉ๋๋ค.
- JWT ํ๋์์ ์ฌ์ฉ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ํ๋๋ฅผ ์
๋ ฅํฉ๋๋ค. ์ด ์ค์ต์์๋ ์ด๋ฉ์ผ์ ๋ฐ๋ก ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์
userPrefix
: '-'- ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํด๋ ์์ ์ถ๊ฐ๋ ํ๋ฆฌํฝ์ค์ ๋๋ค. ์ ์ ํด๋ ์์ด email์ด ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๊ธ์ ํ๋ฆฌํฝ์ค๊ฐ Kubernetes API server์ ์ ๊ณต๋ userID ์์ ๋ถ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฌ์ฉ์ ์๋ณ์๋ 'ISSUER_URI#USER'๊ฐ ๋ฉ๋๋ค.
- ๋ณธ ์ค์ต์์๋ ์ ์ ํด๋ ์์ email๋ก ์งํํ๋ฏ๋ก ํ๋ฆฌํฝ์ค๋ฅผ '-'๋ก ์ค์ ํ์ฌ ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉ ์ค์งํฉ๋๋ค.
์์ ์ค์ ์ ํ์ํ client secret์ [kubernetes Realm]
- [Client]
- [k8s-auth]
- [credentials]
ํญ์ ์๋ Client secret์ ๋ณต์ฌํ๋ฉด ๋ฉ๋๋ค.
๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฑ์๋ฃ์๋ค๋ฉด kubectl replace -f 1-3.clientconfig-gke-keycloak-w-oidc.yaml
๋ก ๋ณ๊ฒฝํฉ๋๋ค.
kubectl replace -f 1-3.clientconfig-gke-keycloak-w-oidc.yaml
#
# clientconfig.authentication.gke.io/default replaced
2. EKS๋ฅผ OIDC ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ํํ๋ก ๋ฐฐํฌํ๊ธฐ
GKE ์ด์ธ์ AWS, Azure, Alibaba ๋ฑ ๋ค์ํ ํด๋ผ์ฐ๋ ๊ณต๊ธ์๋ค์ด ์ ๊ณตํ๋ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์ง๋ง, ๊ตญ๋ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ AWS์ EKS ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐ ๋ฐฐํฌํ๊ณ ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ฒ ์ต๋๋ค.
OIDC ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ EKS๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ 2-1.deploy-eks-env-only.sh
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ EKS๋ฅผ ๊ด๋ฆฌํ๋ eksctl
๋ก EKS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ํ์ํ EKS ํด๋ฌ์คํฐ์ ์ค์ ์ ๊ฐ์ ์์น์ ์๋ eksctl-config
๋๋ ํฐ๋ฆฌ ์๋์ keycloak-w-oidc.yaml
์ ์ ์๋์ด ์์ต๋๋ค. EKS ํด๋ฌ์คํฐ์ ์ ์ฉ๋ ํคํด๋ฝ ํตํฉ ์ธ์ฆ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
identityProviders:
- name: keycloak
type: oidc
issuerUrl: https://oncloud-1.site/realms/kubernetes
clientId: k8s-auth
usernameClaim: preferred_username
usernamePrefix:
groupsClaim: groups
์ฝ๋๋ฅผ ๋ณด์์ ๋ usernameClaim
์ผ๋ก ์ฌ์ฉ์ ์ด๋ฆ์ ์๋ณํ๊ณ groupsClaim
์ ํตํด์ group ์ ๋ณด๋ฅผ ์๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ ํคํด๋ฝ์ ๋ํ ์ธ์ฆ ํ์
์ oidc์ด๋ฉฐ issuerUrl
์๋ GKE ๊ตฌ์ฑ๊ณผ ๋์ผํ๊ฒ ํคํด๋ฝ์ ์ ์ URL์ ๊ธฐ์
ํ๊ณ ์์ต๋๋ค.
๋ค์์ผ๋ก๋ OIDC ํตํฉ ์ธ์ฆ์ ์ํํ ๋ ๋ง์ฃผํ ์ ์๋ ๋ถํธํจ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์๋ก์ด ๋ช
๋ น์ด์ธ kubelogin
์๋ง๋ค๊ฒ ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
kubelogin์ด ๊ฐ์ง๋ ์๋ฏธ์ ๊ตฌ์กฐ ์ค๋ช
ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์์ ๊ณผ OIDC ๊ธฐ๋ฅ์ ํฌํจํ๋ EKS์ GKE๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค. ์ด์ ๋จ์ ๊ฒ์ โํตํฉ ์ธ์ฆ์ ํตํด์ ๋ก๊ทธ์ธ์ ์งํํ๋ฉด๋๋?โ ๋ผ๋ ์๊ฐ์ด ๋์ค ์ ์๊ฒ ์ง๋ง, ์์ง์ ํตํฉ ์ธ์ฆ์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ ์ด์ ๋ EKS์ GKE์ ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ฆ ๋ฐฉ์์ OIDC๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๊ฐ์ง๋ง, ์ด๋ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด์ ๋ช ๋ น์ด ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
EKS๋ kubectl๊ณผ ๊ฐ์ ๋ช
๋ น์ด ์คํ๋ ๋ kubectl oidc-login get-token
๋ช
๋ น์ด๋ก JWT๋ฅผ ํคํด๋ฝ์ผ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์์ ์ธ์ฆํ๋ ๋ฐฉ์์ด๊ณ , GKE๋ kubectl oidc login
๋ช
๋ น์ผ๋ก ์ธ์ฆ์ด ๋ ๋ณ๋์ ์ปจํ
์คํธ(context)๋ฅผ ์์ฑํด์ ์ฟ ๋ฒ๋คํฐ์ค ํตํฉ ์ธ์ฆ์ ์งํํ๋ ๋ฐฉ์์
๋๋ค.ํด๋ฌ์คํฐ ์ธ์ฆ ๋ช
๋ น์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ช
๋ น์ด๋ฅผ ๋ ๊ฐ ์จ์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด์ ํ์ฌ ์ค์ ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ ์๋ก์ด ๋ช
๋ น์ด๋ฅผ ๋ง๋ค๊ฒ ๋์์ต๋๋ค. ์ด ๋ช
๋ น์ด๊ฐ kubelogin ์
๋๋ค.
์์ด๋์ด๋ ์ด๋ ์ต๋๋ค. ํ์ฌ ์ปจํ
์คํธ ์ด๋ฆ ์์ gke๋ผ๋ ๊ฐ์ด ์๋ค๋ฉด ํด๋น ํด๋ฌ์คํฐ๋ฅผ gke๋ก ํ๋ณํ์ฌ์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋๋ก ์กฐ์นํ๊ณ , ๊ทธ ์ด์ธ์๋ kubectl oidc-login get-token
๋ช
๋ น์ ํตํด JWT๋ฅผ ๋ฐ๊ธ๋ฐ์์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ฒ ํ๋ ๋ฐฉ์์
๋๋ค. ๊ทธ๋ ๊ฒ ์์ฑ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#!/usr/bin/env bash
function kubelogin() {
local vendor="$(cat ~/.kube/config | grep current-context | cut -d ':' -f2 | grep gke)"
if [ "$vendor" != "" ]; then
kubectl oidc login --cluster="hj-keycloak-oncloud-1-gke" --login-config="/Users/mz01-hj/.keycloak/config"
else
kubectl oidc-login get-token \
--oidc-issuer-url=https://oncloud-1.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=6qfWVLJ91PrGABqqXD613ScVk6j2Qw1d
fi
}
kubelogin
์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด์ ๊ฐ๋ตํ๊ฒ ์์ฑํ๋ค ๋ณด๋ ํ๋์ฝ๋ฉ๋์ด ์๋ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ๋ค๋ฅธ GKE ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ ๋ ๋ฐ์ํ๋ ์์ธ ์ํฉ์๋ ๋์์ด ์ ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํคํด๋ฝ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ฐ์ ๋งค๋ฒ ์ ๋ฐ์ดํธ ํด์ผํ๋ ๋ถํธํจ์ด ์์ต๋๋ค.
๋งค๋ฒ ์
๋ฐ์ดํธํด์ผ ํ๋ ๋ถํธํจ์ ํด๊ฒฐํ๊ธฐ ์ํด์ kubelogin
์ ์์ฑํ๋ kubelogin-installer.sh
์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
# declare variable.
DOMAIN_NAME=oncloud-1
CLIENT_SECRET=6qfWVLJ91PrGABqqXD613ScVk6j2Qw1d
# keycloak-login-config
rm -rf ~/.keycloak ; mkdir ~/.keycloak
kubectl get clientconfig --context=hj-keycloak-${DOMAIN_NAME}-gke -n kube-public default -o yaml > ~/.keycloak/config
rm -rf /usr/local/bin/kubelogin
cat > "/usr/local/bin/kubelogin.tmp" <<'EOF'
#!/usr/bin/env bash
function kubelogin() {
local vendor="$(cat ~/.kube/config | grep current-context | cut -d ':' -f2 | grep gke)"
if [ "$vendor" != "" ]; then
kubectl oidc login --cluster="hj-keycloak-${DOMAIN_NAME}-gke" --login-config="/Users/mz01-hj/.keycloak/config"
else
kubectl oidc-login get-token \
--oidc-issuer-url=https://${DOMAIN_NAME}.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=${CLIENT_SECRET}
fi
}
kubelogin
EOF
vendor='$vendor' DOMAIN_NAME=$DOMAIN_NAME CLIENT_SECRET=$CLIENT_SECRET envsubst < /usr/local/bin/kubelogin.tmp >> /usr/local/bin/kubelogin
rm /usr/local/bin/kubelogin.tmp
sudo chmod 755 "/usr/local/bin/kubelogin"
echo "kubelogin installed successfully"
.kubelogin-installer.sh
๋ DOMAIN_NAME
์ด๋ CLIENT_SECRET
๊ณผ ๊ฐ์ ๊ฐ์ ํ๊ฒฝ๋ณ์๋ก load ์์ผ์ kubelogin
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์์ฑํ๋ ๋ฐฉ์์
๋๋ค.
์ด์ ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋ ์ค์ ์ ๋ง์ณค์ผ๋ EKS์ GKE์ ๋ํด์ ์ธ์ฆ/์ธ๊ฐ ์ค์ต์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
EKS์ GKE์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
์ด๋ ๊ฒ์ ๋จผ์ ํด๋ ์๊ด์ ์์ง๋ง, GKE๋ ์๋ก ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ EKS๋ฅผ ๋จผ์ ํ๋ ๊ฒ์ด ์ข ๋ ๋ฌด๋ํ๊ฒ ์ค์ตํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ EKS์ ๋ํ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ฐ์ ์ค์ตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
1. EKS์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
EKS ํด๋ฌ์คํฐ์ ์ธ์ฆ/์ธ๊ฐ ์ค์ต์ ์ํด์EKS ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
tree EKS
#
# EKS
# โโโ 1.clusterrolebinding-4-devops-group-as-admin.yaml
# โโโ 2-oncloud-1.swtich-ctx-hoon-to-soojin.sh
# โโโ 3.set-cred-4-oidc-user.sh
#
# 0 directories, 3 files
์ฒซ ๋ฒ์งธ๋ก ๋จผ์ kubectl get pods
๋ก ์ฟ ๋ฒ๋คํฐ์ค ํ๋๊ฐ ์กฐํ๋๋์ง ํ์ธํฉ๋๋ค.
eksctl
๋ก EKS๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์ต์ด์๋ ๊ด๋ฆฌ์ ๊ถํ์ด ๋ด๊ธด ์ฌ์ฉ์์ด๊ธฐ ๋๋ฌธ์ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. EKS ํตํฉ ์ธ์ฆ์ ๊ฒฝ์ฐ ํ์ฌ ์ํ์์ ์ธ๊ฐ๋ ํคํด๋ฝ์ ํตํด์ ์งํ๋๊ณ ๊ทธ๋ค์ ์ฌ์ฉ์๋ก๋ถํฐ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ํ ์ธ๊ฐ๋ RBAC์ ํตํด์ ์ด๋ค์ง๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ 1.clusterrolebinding-4-devops-group-as-admin.yaml
์ ์ ์ฉํด์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ ํตํด ์ ์ํ ์ฌ์ฉ์๋ค์ด kubectl
์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. 1.clusterrolebinding-4-devops-group-as-admin.yaml
์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๊ด๋ฆฌ์ ๊ถํ์ group์ด devops ์ธ ์ฌ๋์๊ฒ ๋ถ์ฌํ๊ฒ ๋ค๋ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: oidc-group-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: devops
์ด๋ ๊ฒ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ผ๋ก ์ธ๊ฐ์ ๋ํ ๋ถ๋ถ์ ์ค์ ํ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก ์๋ก์ด ์ฌ์ฉ์๋ก EKS์ kubectl
์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ํ์ธํ๊ธฐ ์ํด์ ์๋ก์ด ์ฌ์ฉ์๋ก ์ ํํด์ผํฉ๋๋ค. ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์์นํ 2-oncloud-1.swtich-ctx-hoon-to-soojin.sh
์ผ๋ก ์๋ก์ด ์ปจํ
์คํธ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉ์๋ฅผ ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
์ด ์
ธ ์คํฌ๋ฆฝํธ๋ aws ๋ช
๋ น์ ํตํด์ EKS์ ์๋ก์ด ์ฌ์ฉ์๋ก ์ ์ํ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ช
๋ น์
๋๋ค. ์ปจํ
์คํธ๊ฐ ์์ฑ๋๊ณ ์๋ก์ด ์ปจํ
์คํธ๋ก ๋ณ๊ฒฝ๋ ํ์ ๋ค์ kubectl get pods
๋ช
๋ น์ ์
๋ ฅํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ์ปจํ
์คํธ์ ๋ํด์ ์ธ์ฆํ์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
kubectl get pod
#
error: You must be logged in to the server (Unauthorized)
์ธ ๋ฒ์งธ๋ก, ํคํด๋ฝ์ ์ด์ฉํ ํตํฉ์ธ์ฆ ์งํ์ ์ํด์ 3.set-cred-4-oidc-user.sh
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. 3.set-cred-4-oidc-user.sh
๋ oidc-user
๋ผ๋ ์๋ก์ด kubectl
์ ์ฌ์ฉ์๋ฅผ ๋ง๋ค๊ณ kubelogin
์ kubectl
์ ์ฌ์ฉํ ๋๋ง๋ค ํธ์ถํ๋๋ก ์ค์ ํ๋ ๋ด์ฉ์ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ด๋ฅผ ํตํด์ ํคํด๋ฝ์ ํตํ JWT๋ฅผ ๋ช
๋ น ์คํ ๋ง๋ค ๋ฐ์ ์ ์๊ณ ์ธ์ฆ์ด ๊ฐ๋ฅํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
#!/usr/bin/env bash
kubectl config set-credentials oidc-user \
--exec-api-version=client.authentication.k8s.io/v1beta1 \
--exec-command=kubelogin
์ ๋ด์ฉ์ด ์ค์ ๋ก๋ ์๋์ ๊ฐ์ด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋์ ๊ฐ์ ํ์ฌ EKS๋ฅผ ํฌํจํ ์จํ๋ ๋ฏธ์ค์ ์์นํ ๋๋ถ๋ถ์ ์ฟ ๋ฒ๋คํฐ์ค์ ์ ์ฉํ ์ ์๋ ํตํฉ ์ธ์ฆ ์ค์ ์ ๋๋ค.
kubectl oidc-login get-token \
--oidc-issuer-url=https://oncloud-1.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=[์ํฌ๋ฆฟ]
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ oidc-user
๋ผ๋ ์ฌ์ฉ์๋ฅผ ๋ง๋ค์๋ค๋ฉด, kubectl get pods -A --user=oidc-user
๋ช
๋ น์ ํตํด์ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋๋ฅผ ์กฐํํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์์ ๋ ํฐ๋ฏธ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋์ง ์๊ณ ๋ค์๊ณผ ๊ฐ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ํ๋ฉ๋๋ค. ์ด๋ ํคํด๋ฝ์ ๋ํ ๋ก๊ทธ์ธ ํ๋ฉด์ด ๋ํ๋๋๋ฐ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ <FontIcon icon="iconfont icon-select"/>[Google ๋ฒํผ]
์ ๋๋ฌ์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ผ๋ก ์ธ์ฆ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
Google ๋ฒํผ์ ์ ํํ์ ๋ ์ด๋ฏธ ๋ธ๋ผ์ฐ์ ์์ ์ฐ๊ฒฐ๋ ์ด๋ฉ์ผ ๊ณ์ ์ด ์๋ค๋ฉด, ํด๋น ์ด๋ฉ์ผ๋ก ์ธ์ฆ ๋ฉ์ผ์ด ๋ฐ์ก๋์์ผ๋ ์ด๋ฉ์ผ์ ํ์ธํด๋ฌ๋ผ๋ ์๋ด ๋ฌธ๊ตฌ๊ฐ ๋ํ๋ฉ๋๋ค. (๋ง์ฝ ์๋ค๋ฉด ์ด๋ฉ์ผ์ ์ ํํ๋ ๋ฉ์์ง๊ฐ ๋์ต๋๋ค.)
์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฉ์ผ ์๋น์ค์ ๋ฉ์ผํจ์ ํ์ธํ์์ ๋ ์๋์ ๊ฐ์ ์ธ์ฆ ๋ฉ์ผ์ด ์จ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ [Link to e-mail address verification]
์ ๋๋ฅด๋ฉด ํฐ๋ฏธ๋์์ ์คํํ๋ ๋ช
๋ น ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค. ์ฆ ์ด ๊ณผ์ ์ ํตํด์ EKS์์์ ํคํด๋ฝ ์ธ์ฆ์ด ์๋ฃ๋๊ณ , ์ธ์ฆ ์๋ฃ๋ ๊ทธ๋ฃน devops์ ๊ถํ์ผ๋ก ํ๋ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
์์ ๊ฐ์ ํ๋ฆ์ ์๋๊ฐ ์๊ฒ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
2. GKE์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
GKE ํ๊ฒฝ์์์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ํ
์คํธํ๊ธฐ ์ํด์ ์์ ๋๋ ํฐ๋ฆฌ์ ์์นํ GKE
๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค.
tree GKE
#
# GKE
# โโโ 1.clusterrolebinding-4-devops-group-as-admin-NOTWORK.yaml
# โโโ 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
# โโโ 2-soojin.clusterrolebinding-4-devops-user-as-admin.yaml
์์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ GKE์ ๊ฒฝ์ฐ EKS์ ๋ค๋ฅธ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ค๋ฅด๊ฒํตํฉ ์ธ์ฆ์ ์ํ ์ปจํ
์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋จผ์ ์ง๊ธ์ EKS ์ปจํ
์คํธ์์ GKE ์ปจํ
์คํธ๋ก ์ด๋์ด ํ์ํฉ๋๋ค. ์ด๋ kubectx
๋ช
๋ น ๋๋ kubectl config use-context
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ง๊ธ ์ปจํ
์คํธ๊ฐ GKE๋ก ๋ณ๊ฒฝ๋์๋ค๋ฉด, ์ฌ๊ธฐ์ kubelogin
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์
๋ ฅํ๊ฒ ๋๋ฉด ๋ค์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ด ๋ํ๋๋ฉด์ ์ธ์ฆ๋์๋ค๊ณ ๋ํ๋ฉ๋๋ค.
ํฐ๋ฏธ๋์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
# 2023/10/30 19:11:46 Started webserver on localhost: 8000.
# 2023/10/30 19:11:46 Attempting to open http://127.0.0.1:8000/login in default browser.
# 2023/10/30 19:11:47 OIDC Authentication successful.
์ธ์ฆ์ด ์๋ฃ๋์๋ค๊ณ ๋ํ๋จ๊ณผ ๋์์ ์๋ก์ด ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ , ์ง๊ธ ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ ๊ณผ์ ์ ์๋๊ฐ ์๊ฒ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฌ ์ํ์์ GKE ํด๋ฌ์คํฐ์ kubectl get pods
๋ฅผ ์
๋ ฅํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ํ๋ฉ๋๋ค.
kubectl get pods
#
# Error from server (Forbidden): pods is forbidden: User "hj@mz.co.kr" cannot list resource "pods" in API group in the namespace "default"
์ด๋ ํคํด๋ฝ์ ํตํด์ ์ธ์ฆ์ ์๋ฃ๋์์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค RBAC์ ํตํด์๋ ์ธ๊ฐ๊ฐ ๋์ง ์์์ ๋ฐ์ํ๋ ์๋ฌ์
๋๋ค. ์ด ๋ฌธ์ ๋ GKE ํด๋ฌ์คํฐ์ ์ด๋๋ฏผ ์ปจํ
์คํธ๋ก ๋ค์ ๋์๊ฐ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ ์ ์ฉํด์ฃผ๋ฉด ํด๊ฒฐ ๋ฉ๋๋ค. ์ ์ฉํ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
์
๋๋ค.
kubectl apply -f
#
# 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
Info
EKS์ ๋์ผํ๊ฒ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์ด ๊ธ์ ์์ฑํ๋ ์์ ์์ ๊ตฌ๊ธ GKE์์ JWT๋ก๋ถํฐ ๊ทธ๋ฃน์ ๋ํ ํ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ด ์ ์๋์ํ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ต์์๋ ๋ถ๋์ดํ๊ฒ ๊ฐ์ธ์ RBAC ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ถ๋ถ์ ํฅํ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก kubectx
๋ก <ํด๋ฌ์คํฐ์ด๋ฆ>-<ํด๋ฌ์คํฐ์ด๋ฆ-anthos-default-user>
์ ๊ฐ์ ์ด๋ฆ ํ์์ ์ฌ์ฉํ๋ GKE ์ปจํ
์คํธ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ํ์๋ค๋ฉด ๋ค์ kubectl get pods
๋ฅผ ์
๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
kubectl get pods
#
# NAME READY STATUS RESTARTS AGE
# keycloak-0 1/1 Running 0 85m
# keycloak-postgresql-0 1/1 Running 0 85m
ํคํด๋ฝ์ ํตํ ์ธ์ฆ์ด ์๋ฃ๋ ์ฌ์ฉ์๊ฐ ์ด์ ๋ kubectl get pods
๋ฅผ ํตํด์ ํ๋๋ฅผ ํ์ธํ ์ ์๋ ๊ฒ์ ์์๋ดค์ต๋๋ค.
ํคํด๋ฝ์ ์ด์ฉํ ํตํฉ ์ธ์ฆ์ผ๋ก ์ป์ ์ ์๋ ์ด์ ๋ค ์ ๋ฆฌ
์ง๊ธ๊น์ง์ ์ค์ต์ ํตํด์ ํคํด๋ฝ์ ์ด์ฉํ ์ฟ ๋ฒ๋คํฐ์ค ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ณ ์๋ก ๋ค๋ฅธ ํด๋ผ์ฐ๋์ ๋ฐฐํฌ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์งํ ํ์ต๋๋ค. ์ ๋ฆฌ๋ฅผ ์ํด์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ผ๋ก ์ป์ ์ ์๋ ์ด์ ์ ์์ฝํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ๋จ์ํ๊ฒ EKS, GKE ๋ฟ๋ง ์๋๋ผ ์จํ๋ ๋ฏธ์ค ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๋น๋กฏํด SAML๊ณผ OIDC๋ฅผ ์ง์ํ๋ ๋ค๋ฅธ ์คํ์์ค ์ฑ๋ค์์๋ ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก๋ ๋๋ถ๋ถ Okta์ Onelogin๊ณผ ๊ฐ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ค ์ ์์ง๋ง ๋ฒ๋ น ์์ ๊ท์ ๋ก SaaS๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธ์ต๊ถ ๋ฐ ๊ณต๊ณต๊ธฐ๊ด์์ ์คํ์์ค๋ฅผ ํ์ฉํด ๋ด๋ถ ์กฐ์ง์ ์ธ์ฆ ์ฌ์ ์(IdP)๋ฅผ ๊ตฌ์ฑํ์ค ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ๋ก๋ ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ๋ํ ์ค์ ์ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์กฐ์ง์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ์ผ๋ค์ด ๊ต์ฅํ ํ๋ ์ผ์ด ๋ ์ ์๋๋ฐ, ํคํด๋ฝ์ Realm๊ณผ Role๋ก ์ฌ์ฉ์๋ค์ ๋ํ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
๊ธด ๊ธ์ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.