EBS CSI드라이버에서는 Amazon EKS 클러스터가 영구 볼륨을 위해 Amazon EBS 볼륨의 수명 주기를 관리할 수 있게 해주는 CSI 인터페이스를 제공한다.
⇒ EBS CSI 드라이버를 EKS 클러스터에 배포하고 제대로 동작하는지 확인
순서
1. IRSA를 위한 IAM Policy 생성 (EBS CLI Controller 파드를 위한 정책 생성)
2. 기 생성한 IAM 정책을 IAM Role에 연결
a. IAM Role의 신뢰 관계는 EKS의 OIDC
b. Condition에는 ebs-csi-controller-sa 서비스어카운트만 허용한다.
3. EBS CSI Driver 설치
4. 동작 테스트 및 Log 확인
IAM Policy (JSON) to Terraform data block
=> IAM Policy를 Terraform data block에서 사용할 수 있도록 도와주는 웹 사이트이다. (아주 편함)
URL : https://flosell.github.io/iam-policy-json-to-terraform/
// CSI Driver
data "aws_iam_policy_document" "csi_driver" {
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = [
"ec2:CreateSnapshot",
"ec2:AttachVolume",
"ec2:DetachVolume",
"ec2:ModifyVolume",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeInstances",
"ec2:DescribeSnapshots",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:DescribeVolumesModifications",
]
}
statement {
sid = ""
effect = "Allow"
resources = [
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:snapshot/*",
]
actions = ["ec2:CreateTags"]
condition {
test = "StringEquals"
variable = "ec2:CreateAction"
values = [
"CreateVolume",
"CreateSnapshot",
]
}
}
statement {
sid = ""
effect = "Allow"
resources = [
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:snapshot/*",
]
actions = ["ec2:DeleteTags"]
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:CreateVolume"]
condition {
test = "StringLike"
variable = "aws:RequestTag/ebs.csi.aws.com/cluster"
values = ["true"]
}
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:CreateVolume"]
condition {
test = "StringLike"
variable = "aws:RequestTag/CSIVolumeName"
values = ["*"]
}
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:DeleteVolume"]
condition {
test = "StringLike"
variable = "ec2:ResourceTag/CSIVolumeName"
values = ["*"]
}
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:DeleteVolume"]
condition {
test = "StringLike"
variable = "ec2:ResourceTag/ebs.csi.aws.com/cluster"
values = ["true"]
}
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:DeleteSnapshot"]
condition {
test = "StringLike"
variable = "ec2:ResourceTag/CSIVolumeSnapshotName"
values = ["*"]
}
}
statement {
sid = ""
effect = "Allow"
resources = ["*"]
actions = ["ec2:DeleteSnapshot"]
condition {
test = "StringLike"
variable = "ec2:ResourceTag/ebs.csi.aws.com/cluster"
values = ["true"]
}
}
}
IAM Role이 생성되었으므로 이 Role을 통해 CSI-Driver Controller 파드에 부착 (IRSA)
Manifest를 이용한 CSI Driver Controller 배포
GitHub 리포지토리를 로컬 시스템에 복제
git clone <https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git>
디렉터리 이동
cd aws-ebs-csi-driver/deploy/kubernetes/base/
(Option) EBS Volume이 생성될 때 Tag를 자동으로 생성되게 하고 싶은 경우
아래와 같이 extra-tags를 지정해주면 된다. 이는 물론 CSI Driver Docs를 보면 자세히 나온다.
...
containers:
- name: ebs-plugin
image: amazon/aws-ebs-csi-driver:latest
imagePullPolicy: IfNotPresent
args:
# - {all,controller,node} # specify the driver mode
- --endpoint=$(CSI_ENDPOINT)
- --logtostderr
- --v=5
- --extra-tags=department=accounting,environment=dev
...
kustomization.yaml 파일에서 Region에 맞게 Image 변경 (ap-northeast-2)
cd ../overlays/stable/ecr
➜ ecr git:(master) ✗ pwd
/home/user/git/kubernetes/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr
➜ ecr git:(master) ✗ ls
kustomization.yaml
➜ ecr git:(master) ✗ vim kustomization.yaml
kubectl apply -k ../ecr
7번째 줄 => 이미지의 리전 변경
- ebs-csi-controller-sa Kubernetes 서비스 어카운트에 주석을 지정
kubectl annotate serviceaccount ebs-csi-controller-sa \\
-n kube-system \\
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
- 드라이버 포드를 삭제합니다.
역할에 할당된 IAM 정책의 IAM 권한을 사용하여 자동으로 재배포
kubectl delete pods \\
-n kube-system \\
-l=app=ebs-csi-controller
Pod 제한수가 있으므로 혹시 모르니 Node Group의 수를 1개 → 2개로 증가
(이 부분은 진행하지 않으셔도 됨)
➜ EKS-2 git:(dev) ✗ kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.labels['beta\\.kubernetes\\.io\\/instance-type']}{'\\t'}{.status.capacity.pods}{'\\n'}{end}"
t3.medium 17
➜ EKS-2 git:(dev) ✗ kubectl get pods -A | wc -l
11
증가한 이후
➜ EKS-2 git:(dev) ✗ kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.labels['beta\\.kubernetes\\.io\\/instance-type']}{'\\t'}{.status.capacity.pods}{'\\n'}{end}"
t3.medium 17
t3.medium 17
➜ EKS-2 git:(dev) ✗
➜ EKS-2 git:(dev) ✗
➜ EKS-2 git:(dev) ✗ kubectl get pods -A | wc -l
13
다시 Controller 재생성한 뒤 확인
➜ kubernetes kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-ebs-csi-driver,app.kubernetes.io/instance=aws-ebs-csi-driver"
NAME READY STATUS RESTARTS AGE
ebs-csi-controller-79c664c46f-kqxwv 5/5 Running 0 88s
ebs-csi-controller-79c664c46f-zqz7v 5/5 Running 0 88s
ebs-csi-node-2dlf9 3/3 Running 0 88s
ebs-csi-node-vlnmx 3/3 Running 0 88s
샘플 애플리케이션을 통해 CSI 드라이버가 작동 중인지 확인하기
아래의 App 테스트 코드를 그대로 따라하기
: 링크 접속한 뒤 따라하면 됨
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/ebs-csi.html
Helm으로 설치된 Controller 패키지 삭제
혹시 Helm3로 설치하였고 실습을 마무리하였다면 패키지를 삭제해준다.
➜ dynamic-provisioning git:(master) helm -n kube-system uninstall aws-ebs-csi-driver
W1116 17:36:06.061538 7786 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
release "aws-ebs-csi-driver" uninstalled
문제 해결
CSI Driver가 권한 문제로 Volume을 생성하지 못하여 PVC가 Pending 상태였음
caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
기 생성된 서비스 어카운트의 이름은 아래와 같지만
Terraform을 통해 생성된 Principle은 아래와 같이 다르다. 즉, Principle에서 Allow가 되지 않음
ebs-csi-controller-sa <-> csi_driver
ServiceAccount Principle를 변경
PV 잘 부착된 모습
다른 Zone의 Pod와 Volume을 공유하고 싶다면 AWS에서 제공하는 NFS 서비스인 EFS 사용을 고려할 수 있으며, 이 때 EKS 환경이라면 EFS CSI Driver를 사용할 수 있다.
EBS CSI Driver와 같이 따라오는 친구가 EFS CSI Driver이다.
전체적인 과정은 EBS CSI Driver와 유사하며, 다른 글에서 정리해보겠음
'AWS' 카테고리의 다른 글
[EKS] EKS 환경에서 ArgoCD 설치, 배포, 롤백 (0) | 2021.11.27 |
---|---|
[EKS] Jenkins로 CI 수행하기 - Maven Build 및 Image ECR Push (0) | 2021.11.26 |
[EKS] External DNS 설치 및 사용하기 (0) | 2021.11.24 |
[EKS] Terraform으로 EKS Cluster 생성 (2) | 2021.11.20 |
[Shell Script] CLB 인스턴스 상태 및 등록, 해제하는 쉘 스크립트 (0) | 2021.11.17 |