์ด๋ฒ ๊ธ์ ์ฃผ์ ์ธ "IRSA" ๋ ์ดํดํ๊ธฐ๋ ํ๋ค์์ง๋ง, ์ด๊ฑธ ๊ธ๋ก ์์ฑํ๋ ๊ฑด ๋ ์ด๋ ค์์ ๋ง์ ๋ธ๋ก๊ทธ ๊ธ๋ค๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ผ๋ฉฐ, ์๋์ ๋ช ์ํ ์ฐธ๊ณ ๋ธ๋ก๊ทธ๋ค๋ ์ฝ์ด์ฃผ์ธ์!
IRSA ๋ IAM Roles for Service Account ์ ์ฝ์๋ก, Kubernetes ์์ AWS ๋ฆฌ์์ค์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
IRSA ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์ ํน์ Service Account ์ AWS IAM Role ์ ๋งคํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํด๋น Service Account ์ด AWS ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ป์ต๋๋ค.
IRSA ๋ AWS ์์ ์ ๊ณตํ๋ OIDC ์ IAM Role ์ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ํ๋๊ฐ AWS ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ๊ด๋ฆฌํ ํ์ ์์ด AWS ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ํด์ค๋๋ค.
๊ทธ๋ผ ๊ฐ๋จํ IRSA ์ ๋ํด ์์๋ดค์ผ๋, ์ค์ ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
To the Code~!
Shallow Dive
์ฐ์ IRSA ์ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง๋ถํฐ ์ดํด๋ณด์ฃ !
serviceaccount ์ pod ๋ฅผ ์๋์ ๊ฐ์ด ๋ฐฐํฌํด์ค์ผ ํ๋๋ฐ,
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: true
metadata:
name: irsa-exam
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::xxxx:role/IRSA_Exam"
---
kind: Pod
apiVersion: v1
metadata:
name: irsa-exam
spec:
serviceAccountName: irsa-exam
containers:
- name: aws
image: amazon/aws-cli
command: [ "/bin/sh" ]
args: [ "-c", "while true; do echo hello; sleep 1d;done" ]
serviceaccount ์ ๋ช ์ํ IAM Role ์ ARN ์ด ํ์ฌ ์์ผ๋ ๋ง๋ค์ด ์ค์๋ค.
IRSA ์ฉ IAM Role ์ ์ง์ ๋ง๋ค ์๋ ์์ง๋ง, Terraform IAM Module ์ ์ด์ฉํ๋ฉด ํธํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๊ธฐ๋ณธ IRSA ๋ง๊ณ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ค์ดํฐ๋ธ ์ฑ๋ค์ ๋ํ IRSA ๋ ์ ๊ณตํด์ฃผ๋ ์ด์ฉํ๋ฉด ๊ต์ฅํ ํธํฉ๋๋ค.
cert_manager_irsa_role, karpenter_controller_irsa_role ๋ฑ
Terraform IAM Module ๋ฅผ ํตํด Role ์ ์์ฑํ๋ค๋ฉด, ์ ๋ขฐ ๊ด๊ณ(Trust Relationships) ๋ฅผ ํ๋ฒ ํ์ธํด๋ด ๋๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExplicitSelfRoleAssumption",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole",
"Condition": {
"ArnLike": {
"aws:PrincipalArn": "arn:aws:iam::xxxx:role/IRSA_Exam"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::xxxx:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx:sub": "system:serviceaccount:default:irsa-exam",
"oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx:aud": "sts.amazonaws.com"
}
}
}
]
}
ํต์ฌ๋ง ์ดํด๋ณด๋ฉด ํด๋น ARN ์ ๊ฐ์ง OIDC Provider ๋ sts:AssumeRoleWithWebIdentity ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ค๋ง subject ๊ฐ system:serviceaccount:default:irsa-exam ๊ฐ ์ด์ฌ์ผ ํ๊ณ , audience ๊ฐ sts.amazonaws.com ์ด์ฌ์ผ ํฉ๋๋ค.
์ถ๊ฐ๋ก "oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx:sub" ๋ถ๋ถ์ "system:serviceaccount:default:irsa-exam" ์ ๋ฐ๋์ Service Account ์ ๋ค์์คํ์ด์ค์ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
StringEquals ๋ง๊ณ StringLike ๋ฅผ ํตํด * ์ฌ์ฉ ๋ํ ๊ฐ๋ฅํ์ง๋ง, ์ถ์ฒ๋๋ฆฌ์ง๋ ์์ต๋๋ค.
์ดํ ํ๋์ ์ ๊ทผํ์ฌ aws s3 ls ์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด AWS ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ํ๋ ๋ด์์ WebIdentityToken ์ ์ง์ํด์ฃผ์ด์ผ ๊ฐ๋ฅํฉ๋๋ค.
IRSA ๊ฐ ๋์ํ๋์ง๋ง ํ์ธํ๋ ค๋ฉด ์ฌ๊ธฐ๊น์ง ์งํํด๋ ์ ํ ๋ฌธ์ ์์ง๋ง, ์ ๋ ์ด ๋์ ์์์ ๊ถ๊ธํ ์ ์ด 2๊ฐ์ง ์กด์ฌํ์ต๋๋ค.
- ServiceAccount ์ Annotation ๋ง ๋ฌ์๋๋ฐ ์ด๋ป๊ฒ ํด๋น ServiceAccount ๋ฅผ ๋ง์ดํธํ ํ๋์์ AWS ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง?
- ServiceAccount ๋ JWT ํํ๋ก ํ ํฐ์ ๊ฐ์ง๊ณ ์๋๋ฐ ๋ง๋ฃ๊ฐ ๋์์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๊ฐฑ์ ํ์ง?
IRSA ์ ๋ํด ์กฐ๊ธ ๋ ๊น์ด์๊ฒ ๋ค์ด๊ฐ๋ณด๋ฉด์ ํด๋น ๊ถ๊ธ์ ์ ๋ฐ๋ก ํด์ํด๋ณด์ฃ !
Deep Dive
ServiceAccount ์ ๋จ์ํ Annotation ์ ์์ฑํ๋ ๊ฒ๋ง์ผ๋ก๋ AWS ์ ์ ๊ทผ์ ๊ฐ๋ฅ์ผ ํด์ฃผ๋(Assume Role ์ ํ์ํ) JWT ๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด JWT ๋ ๊ฐ์๊ธฐ ์ด๋์ ํ์ด ๋์์๊น์?
์ฌ๊ธฐ์ ๋งํ๋ JWT ๋ K8S SA Token ์ ์๋ฏธํ๋ฉฐ, ์ค์ง์ ์ผ๋ก Assume Role ์ ํ์ํ Token ์ ๋งํฉ๋๋ค.
AWS ๋ฆฌ์์ค์ ์ ๊ทผํ๋ AWS Session Token ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ์ง๊ธ์ ์ดํด๊ฐ ์๊ฐ์๋๋ผ๋ ๊ธ์ ๋ค ์ฝ์ ํ์๋ ์ดํด๊ฐ ๋์ค๊ฒ๋๋ค!
์ฟ ๋ฒ๋คํฐ์คํํ ๋ช ๋ น์ ํ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก API Server ์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค. ์์ฒญ์ ๋ฐ์ API Server ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ Mutating Admission ๊ณผ Validating Admission ์ ํฉ์ณ Admission Controller ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Mutating Admission ์์ ์์ฒญํ ๋งค๋ํ์คํธ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๊ณ , Validating Admission ์ ์ต์ข ๋งค๋ํ์คํธ๊ฐ ์ ํจํ ๋งค๋ํ์คํธ์ธ์ง ํ๋จ์ ํด์ฃผ์ฃ .
๋ ์์ธํ๊ฒ ์๊ณ ์ถ๋ค๋ฉด ์ธ์ฆ/์ธ๊ฐ์ ECTD ์ฌ์ด ๊ทธ ๋ ์ - Admission Controller ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
์ฐ๋ฆฌ๋ ์ด Mutating Admission ๊ณผ์ ์ ํตํด์ Assume Role ์ ํ์ํ JWT ์ ์ป์ ์ ์๋ ๊ฒ์ด์ง์!
Mutating Admission ์ ์ฟ ๋ฒ๋คํฐ์ค ๋ด์์ mutatingwebhookconfigurations.admissionregistration.k8s.io ๋ก ์ ์๋ฉ๋๋ค.
๊ทธ๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด, ๊ด๋ จํ ๋ฆฌ์์ค๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
$ kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io
๋งค๋ํ์คํธ๋ฅผ ์ดํด๋ณด๋ฉด,
pods ๋ผ๋ ๋ฆฌ์์ค๊ฐ CREATE ๋ ๋ ํด๋น Admission ์ด ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ดํ https://127.0.0.1:23443/mutate ์๋ํฌ์ธํธ๋ก ํด๋น ํ๋์ ์ ๋ณด๋ฅผ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ https://127.0.0.1:23443/mutate ์ amazon-eks-pod-identity-webhook ์ ์๋ํฌ์ธํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ ๊ฐ์๋ฐ, kubectl get ์ผ๋ก ๋ณด์ด์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ์ฟ ๋ฒ๋คํฐ์ค ์์ ์๋๊ฑฐ ๊ฐ์ง ์์ต๋๋ค.
์ด๊ฑฐ๋ ๋ํผ์ ์ธ๋ฐ, Control Plane ์ amazon-eks-pod-identity-webhook ๋ผ๋ ๋จ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ผ๋ก ์ถ์ธก๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ API Server ์์ ๋ก์ปฌ ์ฃผ์์ธ 127.0.0.1:23443 ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฑด๋๋ฆฐ๋ค๋ฉด ํด๋ฌ์คํฐ์ ํฐ ์ฅ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ Control Plane ์ฒ๋ผ AWS ๊ฐ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํน์ ๊ด๋ จ๋์ ์๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์! ๊ด๋ จ๋ ์คํผ์ ํ ์ ๋ณด๋ฅผ ์ฐพ์ ์๊ฐ ์๋ค์ ใ ใ
์๋ฌดํผ https://127.0.0.1:23443/mutate ์ ๊ฑฐ์ณ ๋ณํ๋ ํ๋ ๋งค๋ํ์คํธ๊ฐ ์ค์ง์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌ๋ฉ๋๋ค.
๋ณํ๋์๋ค๊ณ ํด์ ๊ฒฉ๋ณํ ๋ถ๋ถ์ ์์ต๋๋ค. ๊ทธ์ ENV ์ ๋ง์ดํธ๋ณผ๋ฅจ๋ง ์ถ๊ฐ๋์์ต๋๋ค.
์๋ ๋งค๋ํ์คํธ๋ Webhook ์ผ๋ก ์ธํด ๋ณํ๋ ๋ถ๋ถ๋ง ์์ฑํ์์ต๋๋ค.
...
env:
- name: AWS_STS_REGIONAL_ENDPOINTS
value: regional
- name: AWS_DEFAULT_REGION
value: ap-northeast-2
- name: AWS_REGION
value: ap-northeast-2
- name: AWS_ROLE_ARN
value: arn:aws:iam::xxxx:role/IRSA_Exam
- name: AWS_WEB_IDENTITY_TOKEN_FILE
value: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
...
volumeMounts:
- mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount
name: aws-iam-token
readOnly: true
...
volumes:
- name: aws-iam-token
projected:
defaultMode: 420
sources:
- serviceAccountToken:
audience: sts.amazonaws.com
expirationSeconds: 86400
path: token
volumes ๋ฅผ ๋ณด๋ฉด projected ๋ผ๊ณ ๋์ด์๋๋ฐ, ์ด ๊ธฐ๋ฅ์ ์ฟ ๋ฒ๋คํฐ์ค 1.12 ์์ ์ถ๊ฐ๋ projectedServiceAccountToken ์ด๋ผ๋ ๊ธฐ๋ฅ์ผ๋ก ํ ํฐ์ exp, aud ๋ฑ์ ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ง์๋๊ธฐ ์ด์ ์๋ ์ง์ ๋ฃ์ด์คฌ์ด์ผ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ /var/run/secrets/eks.amazonaws.com/serviceaccount/token ๊ฒฝ๋ก์ Assume Role ์ ์ฌ์ฉํ JWT ๊ฐ ์กด์ฌํฉ๋๋ค.
๊ทธ๋ผ /var/run/secrets/eks.amazonaws.com/serviceaccount/token ์ ์๋ k8s sa token ์ผ๋ก ๋ญ ํ ์ ์์๊น์?
๋ฐ๋ก AWS ๋ฆฌ์์ค์ ์ ๊ทผ์ด ๊ฐ๋ฅํ AWS Session Token ๋ฅผ ์ป์ ์ ์์ต๋๋ค. (Assume Role ์ ๋ฆฌ์์ค ์ ๊ทผ ๊ถํ์ด ์์ด์ผํจ)
#-- /run/secrets/eks.amazonaws.com/serviceaccount ์ ์๋ token ๊ฐ
$ IRSA_TOKEN="<JWT>"
$ aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::xxxx:role/IRSA_Exam \
--role-session-name test \
--web-identity-token $IRSA_TOKEN
์ ๋ช ๋ น์ด๋ฅผ ๋ณด๋ฉด $IRSA_TOKEN ์ k8s sa token ์ ๋ฃ์ด์ฃผ์ด AWS Session Token ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
๋์น๋ฅผ ์ฑ์ จ์ ๋ถ๋ ์์ ์ ์๊ฒ ์ง๋ง, k8s sa token ์ ์ป์ด๋ด๊ธฐ๋ง ํ๋ค๋ฉด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง ์ด๋์๋ ํด๋น k8s sa token ์ ํตํด AWS Session Token ์ ์ป์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ k8s sa token ์ด ๋ ธ์ถ๋๋ค๋ฉด, ํด๋น ํ ํฐ์ ํตํด IRSA_Exam Role ์ธ๊ฒ์ฒ๋ผ ์์ฅํ ์ ์๋ค๋ ์ํ์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ์ ๋ k8s sa token ์ ๋ณด์์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค!
๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด AWS SDK ๋ฅผ ์ด์ฉํ์๋ฉด ๋ฉ๋๋ค. ์๋ฐ๋ก ์๋ฅผ ๋ค๋ฉด WebIdentityTokenCredentialsProvider ํด๋์ค๋ฅผ ์ด์ฉํด์ ์์ ๊ฐ์ ๊ณผ์ ์ ์งํํ ์ ์์ต๋๋ค.
์ด์ ๋ ๋ ๋์๊ฐ k8s sa token ์ด ์ ํจํ ํ ํฐ์ธ์ง ์ด๋ป๊ฒ ํ๋จ ํ ์ ์์๊น์? ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด IAM OIDC Provider ๋ฅผ ํตํด ์ ํจํ JWT ์ธ์ง ํ๋จํ ์ ์์ต๋๋ค.
EKS ์์ ์์ฑ๋ OIDC Provider URL ์ ํผ๋ธ๋ฆญ์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ฃผ๋ฉด,
$ curl https://oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx/.well-known/openid-configuration
json ํ์์ ์๋ต์ ์ป์ ์ ์์ต๋๋ค.
{
"issuer": "https://oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx",
"jwks_uri": "https://oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx/keys",
"authorization_endpoint": "urn:kubernetes:programmatic_authorization",
"response_types_supported": [
"id_token"
],
"subject_types_supported": [
"public"
],
"claims_supported": [
"sub",
"iss"
],
"id_token_signing_alg_values_supported": [
"RS256"
]
}
์๋ต ๋ฐ์ jwks_uri ๋ก ํ๋ฒ ๋ ์์ฒญ์ ๋ณด๋ ๋๋ค.
$ curl https://oidc.eks.ap-northeast-2.amazonaws.com/id/xxxx/keys
๊ทธ๋ผ JWK ์ ์ป์ ์ ์์ฃ . ์๋ง์ key ์ค ํ๋๋ฅผ ์ ํํ ํ PEM ์ผ๋ก ๋ณํํด์ค๋๋ค!
์ด๋ key ๊ฐ ์ฌ๋ฌ ๊ฐ ๋์ฌํ ๋ฐ ์๋ฌด key ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ ์๋๋ผ JWT Header ์ ์๋ kid(key id) ์ ์ผ์นํ๋ key ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ฐ์ Public Key ๋ฅผ Verify Signature ๋ถ๋ถ์ ๋ฃ์ผ๋ฉด ์ ํจํ JWT ์ธ์ง๋ฅผ ์ ์ ์์ต๋๋ค.
ํ๋ ๋ด ์ ํ๋ฆฌ์ผ์ด์ AWS SDK ๋ฅผ ์ด์ฉํ ๋๋ ๊ฒฐ๊ตญ ์ด๋ฐ ๊ฒ์ฆ ๊ณผ์ ๊ณผ ๋ฐ๊ธ ๊ณผ์ ์ ๊ฑธ์ณ Session Token ์ ๋ฐ์ ์ ์๊ณ , ๋์ํ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ "ServiceAccount ์ Annotation ๋ง ๋ฌ์๋๋ฐ ์ด๋ป๊ฒ ํด๋น ServiceAccount ๋ฅผ ๋ง์ดํธํ ํ๋์์ AWS ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง?" ๋ผ๋ ๊ถ๊ธ์ ์ ํด๊ฒฐํ์ต๋๋ค.
๋ ๋์๊ฐ ์ด๋ป๊ฒ ์ ํจํ ํ ํฐ์ธ์ง ๊ฒ์ฆํ๋์ง๋ ์์๋ณด์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ํ ํฐ์ด ๋ง๋ฃ๋์์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์? ๋ง๋ฃ๋ ํ ํฐ์ ๊ฐฑ์ ํด์ฃผ์ด์ผ ํ๋๋ฐ ์ด๊ฑธ ๋๊ฐ ํด์ค๊น์?
์ฐ์ ์ง๊ธ๊น์ง ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋ ํ ํฐ์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค. K8S SA Token ๊ณผ AWS Session Token ์ ๋๋ค.
K8S SA Token ๊ฐ์ ๊ฒฝ์ฐ๋ kubelet ์ด ์งํํด์ค๋๋ค. ๊ณต์ ๋ฌธ์์ ๋์์์ฃ .
๊ทธ๋ผ AWS Session Token ์ ๋๊ฐ ๊ฐฑ์ ํด ์ค๊น์? ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ฝ๋๋ก ๊ตฌํ์ ํด์ผํฉ๋๋ค.
AWS SDK for JAVA ๊ฐ์ ๊ฒฝ์ฐ ๋คํํ ๋ง๋ฃ๋๊ธฐ ์ง์ ์ ์์์ ์๋์ผ๋ก ๊ฐฑ์ ํด์ค๋ค๊ณ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ทธ์ Web Identity Token(K8S SA Token) ๋ง ์ ์์น์ํค๋ฉด ๋ฉ๋๋ค!
์ถ๊ฐ๋ก ๊ด๋ จ ์ฝ๋์ ๋๋ค.
์ด๋ ๊ฒ "ServiceAccount ๋ JWT ํํ๋ก ํ ํฐ์ ๊ฐ์ง๊ณ ์๋๋ฐ ๋ง๋ฃ๊ฐ ๋์์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๊ฐฑ์ ํ์ง?" ๋ผ๋ ๊ถ๊ธ์ ๋ ํด๊ฒฐํ์ต๋๋ค.
ํ์์์ ์ฝ๊ฒ ์ฝ๊ฒ ์ฌ์ฉํ๋ IRSA ์์ง๋ง, ์๊ณ ๋ณด๋ ๊ฝค๋ ๋ณต์กํ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๊ณ ์์๋ค์!
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง~!
References
- [2024] ์ค๋ฌด์์ ์ฌ์ฉ์ค์ธ AWS ํด๋ผ์ฐ๋ IAM ์ดํด์ ๋ณด์
- EKS์์ ์ฟ ๋ฒ๋คํฐ์ค ํฌ๋์ IAM ๊ถํ ์ ์ดํ๊ธฐ: Pod Identity Webhook
- Diving into IAM Roles for Service Accounts
- Introducing fine-grained IAM roles for service accounts
- IRSA ์ ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ์ด๋ป๊ฒ ๋๋์?