์ฟ ๋ฒ๋คํฐ์ค API ์์ฒญ ๊ณผ์
๊ฐ๋จํ๊ฒ API Server์ ์ ๊ทผํ๊ธฐ ๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋ณด๋ฉด,
์ฒซ๋ฒ์งธ, ์์ฒญ์ ๋ณด๋์ ๋ ์ธ์ฆ(Authentication) ๊ณผ์ ์ ๊ฑฐ์น๋ค.
"๋๋ k8s cluster์ ๋ฑ๋ก๋ ์ฌ์ฉ์๊ฐ ๋ง๋๊ฑฐ์ง?"
๋๋ฒ์งธ, ์ธ์ฆ ๊ณผ์ ์ ํต๊ณผํ ํ ์ธ๊ฐ(Authorization) ๊ณผ์ ์ ๊ฑฐ์น๋ค.
"๋ฑ๋ก๋ ์ฌ์ฉ์๋ ๋ง๊ณ ์ด ์ก์ ์ ํ ์ ์๋ ๊ถํ์ ์๋?"
์ธ๋ฒ์งธ, ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ํต๊ณผํ๊ฒ ๋๋ฉด Admission Control์ ๊ฑฐ์น๋ค.
"๋๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ ์ ํ์ง ํ์ธํด๋ณผ๊น?"
์ด ๊ณผ์ ์ ๋ฌด์ฌํ ๋ง์น๋ฉด "์์ฒญ ์น์ธ"์ด ๋๋ค. ํ์ง๋ง ๋ง์ฝ ํ ๊ณผ์ ์ด๋ผ๋ ์ ์ ์น ์๋ค๋ฉด "์์ฒญ ๋ฐ๋ ค"๊ฐ ๋๋ค.
๊ทธ๋ผ ๋ณธ๊ฒฉ์ ์ผ๋ก AWS EKS๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ํด๋ฌ์คํฐ์ ์ต์ด ์์ฑํ IAM ์ฌ์ฉ์๊ฐ ์๋ ์๋กญ๊ฒ ๋ง๋ IAM ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํด๋ณด๊ฒ ๋ค. ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด AWS ๊ณต์๋ฌธ์๋ก ์ด๋ํ ์ ์๋ค.
๋ง์ฝ EKS๊ฐ ์๋ ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์ด๋ ์ปค์คํ ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ์ ๊ฒฝ์ฐ ์๋ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ด ๋ถ๋ถ์ ๋ํด์ ์ถํ ์ถ๊ฐํ๊ฒ ๋ค.
๋ค์ด๊ฐ๊ธฐ ์์, ์ต์ด ํด๋ฌ์คํฐ ์์ฑ์๊ฐ ์๋ ๋ค๋ฅธ ์์ฑ์๊ฐ ์ ๊ทผ ํ์ ์ ์ง์ง ํด๋ฌ์คํฐ์ ์ ๊ทผ์ด ์๋๋์ง ํ์ธํด๋ณด์
$ aws configure
์์ ์ access-key๋ฅผ ๋ฃ์ด aws ์ ์ ํ ํ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด,
$ kubectl get configmaps
์ด๋ฐ ๋ฉ์์ง๊ฐ ๋์จ๋ค. ์ธ์ฆ์ด ๋์ง ์์ IAM ์ฌ์ฉ์์ฌ์ ์ด๋ฐ ๋ฉ์์ง๊ฐ ๋์ค๋ ๊ฒ์ด๋ค. ์ง์ง๋ก ์ ๊ทผ์ด ์๋๋ค.
๊ทธ๋ผ ์ด IAM ์ฌ์ฉ์๊ฐ kubectl๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๊ฒ ๋ค.
$ kubectl edit configmap -n kube-system aws-auth
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: <ARN of instance role (not instance profile)>
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
๊ทธ๋ผ ์์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค. ์ดํ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค. ๊ธฐ์กด์ ์๋๊ฑด ์ ๋ ์์ ํ์๋ฉด ์๋๋ค.
data:
mapRoles: |
- rolearn: <arn:aws:iam::111122223333:role/eksctl-my-cluster-nodegroup-standard-wo-NodeInstanceRole-1WP3NUE3O6UCF>
username: <system:node:{{EC2PrivateDNSName}}>
groups:
- <system:bootstrappers>
- <system:nodes>
mapUsers: |
- userarn: <arn:aws:iam::111122223333:user/admin>
username: <admin>
groups:
- <system:masters>
- userarn: <arn:aws:iam::111122223333:user/ops-user>
username: <ops-user>
groups:
- <system:masters>
groups์๋ clusterbinding ๋๋ rolebinding์ ๋ฃ์ด์ค๋ค. ์ ๊ฐ์ ๊ฒฝ์ฐ role๊ณผ rolebinding์ ๋ง๋ค์ด์ฃผ์ด ์๋์ ๊ฐ์ด ํด์ฃผ์๋ค.
์์ ํ ๋ถ๋ถ์ ์ ์ฅํ๋ค. EKS ํด๋ฌ์คํฐ๊ฐ ์๋ ๊ฒฝ์ฐ crs, private.key, crt ๋ง๋ค์ด์ user๋ฅผ ์ถ๊ฐํด์ฃผ์ง๋ง EKS๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ด๋ฌํ ๋ถ๋ถ์ ํด์ฃผ์ง ์์๋ ๋๋ค.
AWS ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ช ์๋์ด์๋ค.
"Amazon EKS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ, ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๋ IAM ์ํฐํฐ ์ฌ์ฉ์ ๋๋ ์ญํ (์: ํ๋๋ ์ด์ ์ฌ์ฉ์)์๋ ์ ์ด ์์ญ์ ํด๋ฌ์คํฐ RBAC ๊ตฌ์ฑ์ system:masters ๊ถํ์ด ์๋์ผ๋ก ๋ถ์ฌ๋ฉ๋๋ค. ์ด IAM ์ํฐํฐ๋ ConfigMap ๋๋ ๊ธฐํ ํ์๋๋ ๊ตฌ์ฑ์ ๋ํ๋์ง ์์ผ๋ฏ๋ก ํด๋ฌ์คํฐ๋ฅผ ์๋ ์์ฑํ IAM ์ํฐํฐ๋ฅผ ์ถ์ ํด์ผ ํฉ๋๋ค. AWS ์ฌ์ฉ์๋ ์ญํ ์ ํด๋ฌ์คํฐ์ ์ํธ ์์ฉํ ์ถ๊ฐ ๊ถํ์ ๋ถ์ฌํ๋ ค๋ฉด Kubernetes ๋ด์์ aws-auth ConfigMap์ ํธ์งํด์ผ ํฉ๋๋ค."
๋ฐ๋ผ์ $ kubectl get configMap --all-namespaces ๋ช ๋ น์ด๋ฅผ ํด๋ ์ต์ด ํด๋ฌ์คํฐ ์์ฑ IAM ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๋ค.
์ดํ ์๋ ๋ช ๋ น์ด๋ฅผ ํ๊ฒ ๋๋ฉด,
$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: ~~
๋ผ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋์จ๋ค. ๋ฐฉ๊ธ ์ ์ด๋์ ๋ค๋ฅธ ๋ฉ์์ง๋ค. IAM ์ฌ์ฉ์๋ฅผ aws-auth์ ๋ฑ๋กํด์ค์ผ๋ก์จ ์ด์ ์ธ์ฆ์ ๋์๊ณ , ์ธ๊ฐ๊ฐ ์๋์ ๋์ค๋ ๋ฉ์์ง์ด๋ค.
๊ทธ๋ผ ์ด์ ์ธ๊ฐ๋ฅผ ํด๋ณด์.
์ธ๊ฐ ๋ถ๋ถ์ role๊ณผ rolebinding์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค. ๋ฐฉ๊ธ aws-auth ๋ถ๋ถ์ groups๋ฅผ ์ถ๊ฐํ์๋๋ฐ ์ด ๋ถ๋ถ์ ์ง๊ธ๋ถํฐ ๋ง๋๋ rolebinding ์ด๋ฆ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: guest:pods-get-list-role
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: guest:pods-get-list-role-binding
namespace: default
subjects:
- kind: User
name: <username>
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: guest:pods-get-list-role
apiGroup: rbac.authorization.k8s.io
์์ ๊ฐ์ yaml ํ์ผ์ ๋ง๋ ํ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด role๊ณผ rolebinding์ ๋ง๋ค์ด์ค๋ค.
$ kubectl apply -f role.yaml # yaml ํ์ผ์ด๋ฆ์ ๋ง๋ค์ด์ค ์ด๋ฆ์ผ๋ก ์ง์ ํด์ค์ผํ๋ค.
์ด์ ๋ค์ ํฐ๋ฏธ๋๋ก ๊ฐ์ ์๋ ๋ช ๋ น์ ์คํํด๋ณด์
$ kubectl get pods
role์์ ๋ฆฌ์์ค๋ฅผ pods ๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ pods์ ๋ํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ ๊ทผ์ด ์์ฃผ ์๋๋ ๊ฑธ ํ์ธ ํ ์ ์๋ค. ๋ง์ฝ service์ ์ ๊ทผํ๊ฒ ๋๋ค๋ฉด ์๋์ ๊ฐ์ ์๋ฌ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
์ด๋ ๊ฒ ํด์ EKS๋ก ๋ง๋ ํด๋ฌ์คํฐ์ IAM ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
๋ง์ฝ default namespace๊ฐ ์๋ ์ฌ์ฉ์ namespace์๋ ์ด ์ธ์ฆ์ธ๊ฐ๋ฅผ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ฌ์ฉ์ namespace๋ก ์ด๋ ํ role๊ณผ rolebinding์ ๋ง๋ค์ด ์คํ aws-auth groups์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] ์ปจํ ์ด๋ ์๊ฐ ๋ณ๊ฒฝ ๋ฐฉ๋ฒ (0) | 2021.11.01 |
---|---|
[Linux] dig ๋ช ๋ น์ด์ ์ฌ์ฉ๋ฒ (0) | 2021.10.28 |
[Kubernetes] ์ฟ ๋ฒ๋คํฐ์ค Docker Hub-Private Image ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ (0) | 2021.10.25 |
[Kubernetes] Cert manager Kubernetes ํต์ ์ํธํ ๋ฐ ์๋ํ (0) | 2021.10.25 |
[MySQL] ๋คํ / ์ํฌํธ ํ๊ธฐ Dump / Import (0) | 2021.10.22 |