-
github actions, kustomize와 argocd를 EKS에서 kafka랑 사용하기 3부AWS 2023. 4. 3. 09:48
2부 링크
깃허브 링크
https://github.com/TaeWoonJeong/spring-feign-kafka-multimodule
https://repost.aws/ko/knowledge-center/eks-persistent-storage
위의 가이드를 참고해서 eks 에서 mysql을 ebs를 볼륨으로 사용해서 만들어 보겠다.
curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.9.0/docs/example-iam-policy.json
를 하면 아래의 정책이 나오는데, 잘 보면, ec2에서 ebs볼륨을 생성할 수 있게하는 정책임을 알 수 있다.
/ 20230403090013 // https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.9.0/docs/example-iam-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AttachVolume", "ec2:CreateSnapshot", "ec2:CreateTags", "ec2:CreateVolume", "ec2:DeleteSnapshot", "ec2:DeleteTags", "ec2:DeleteVolume", "ec2:DescribeAvailabilityZones", "ec2:DescribeInstances", "ec2:DescribeSnapshots", "ec2:DescribeTags", "ec2:DescribeVolumes", "ec2:DescribeVolumesModifications", "ec2:DetachVolume", "ec2:ModifyVolume" ], "Resource": "*" } ] }
정책을 example-iam-policy.json 이란 이름으로 다운받았으니, 이를 통해 정책을 iam 에서 생성해보자.
aws iam create-policy --policy-name AmazonEKS_EBS_CSI_Driver_Policy --policy-document file://example-iam-policy.json
이렇게 하면 iam에 가면 AmazonEKS_EBS_CSI_Driver_Policy 라는 정책이 만들어진다.
정책이 만들어졌으니 iam에서 해당 정책을 사용하는 역할을 만들어야한다.
역할을 만드는데, 아무곳에서 사용하면 안되므로 eks를 만들때 with-oidc 명령어도 있어서 자동으로 eks와 관련된 oidc가 만들어지는데, 이걸 사용해서 해당 eks에서만 iam 역할이 작동해야하고, iam 역할로 바로 접근은 못해서 eks 내부에 ebs-csi-controller-sa 라는 서비스 어카운트를 kube-system 네임스페이스에서 만들어준다.
cat <<EOF > trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] } EOF
이런식으로 만들어 준다.
그리고 iam 역할을 만들어준다.
aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
일단은 iam 역할 이름은 AmazonEKS_EBS_CSI_DriverRole 라는 이름이고, 신뢰정책을 추가하는 명령어다.
iam 역할에서 이제 ebs 볼륨에 관한 정책을 추가하기 위해 아래의 명령어를 쓴다.
aws iam attach-role-policy \ --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
이러면 아래처럼 잘 만들어진다.
신뢰관계도 잘 만들어진것을 볼 수 있다.
다음으로 ebs csi 드라이버를 배포한다면서 아래 명령어를 입력하라고 한다.
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
일단 해당 깃허브에 가보자. kubectl apply -k 는 kustomization 을 적용하라는 명령어다.
https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/deploy/kubernetes/overlays/stable
여기에 가서 확인해보자.
kustomization 파일에는 아래와 같이 별거 없다.
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ./ecr-public
ecr-public 폴더를 가져오라는 소린데, ecr-public 폴더에 가면 또 kustomization.yaml 이 있다.
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../../base
이렇게 있어서 상위에 있는 base폴더에 가보자.
base 폴더에 가면 역시 kustomization.yaml이 있다.
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: kube-system resources: - clusterrole-attacher.yaml - clusterrole-csi-node.yaml - clusterrole-provisioner.yaml - clusterrole-resizer.yaml - clusterrole-snapshotter.yaml - clusterrolebinding-attacher.yaml - clusterrolebinding-csi-node.yaml - clusterrolebinding-provisioner.yaml - clusterrolebinding-resizer.yaml - clusterrolebinding-snapshotter.yaml - controller.yaml - csidriver.yaml - node.yaml - poddisruptionbudget-controller.yaml - serviceaccount-csi-controller.yaml - serviceaccount-csi-node.yaml
모두 해당 yaml 파일들을 읽어서 실행해준다.
해당 yaml 파일들을 전부 이해는 못해서 패스한다..
다음으로 아까 iam 만들면서 생성한 서비스 어카운트에 어노테이션을 달아준다. 왜 다는지는 좀더 연구가 필요하다.
어노테이션이 없다면 어떻게 되는지 확인해볼것이다.
kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole
이렇게 하고 마지막으로 배포한 ebs-csi-controller 를 삭제한다.
kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller
추측하자면, 어노테이션이 없을 때 만들어진 ebs-csi-controller 라벨을 가진 파드를 서비스 어카운트에 해당 어노테이션을 붙인 다음 삭제하면 다시 재생성되므로 이때는 어노테이션이 붙여진 서비스 어카운트가 파드를 만들게 되어서 파드 최신화를 시켜준거 같다.
이제 eks에서 ebs와 관련된 설정을 모두 마쳤으므로 ebs 동적 프로비저닝을 해보자.
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/ kubectl apply -f manifests/
이렇게 해준다.
일단 manifest 에 무엇이 있는지 확인해보자.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer
일단 ebs-sc라는 이름의 StorageClass를 만들어준다. 첫번째 사용자가 들어올 때 까지 기다린다.
StorageClass를 잘 모르겠다면 해당 명령어를 입력해보자.
kubectl get storageclass
이런식으로 나오는데, 이는 eks가 있는 ec2의 볼륨을 보여준다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ebs-claim spec: accessModes: - ReadWriteOnce storageClassName: ebs-sc resources: requests: storage: 4Gi
pvc 가 위에서 만든 ebs-sc를 사용해서 4기가 용량을 request한다.
apiVersion: v1 kind: Pod metadata: name: app spec: containers: - name: app image: centos command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: ebs-claim
마지막으로 파드가 pvc 를 사용하면서 볼륨을 부착하게 된다.
https://jenakim47.tistory.com/70
이 블로그를 보면 동적 프로비저닝이란
"동적 프로비저닝을 사용하면 관리자가 사전에 물리 디스크와 PV를 수동으로 생성할 필요가 없이 PVC만 정의하면 이에 맞는 물리 디스트 생성 및 PV 생성을 자동화합니다. PVC는 StorageClass를 요청해야 하며 관리자는 동적 프로비저닝이 발생하도록 해당 클래스를 생성하고 구성해야 합니다."
이렇다고 한다. 읽어보니 이해된다.
kubectl apply -f manifests/
그렇게 해서 위의 명령어를 실행하고, ec2에서 elastic block store 에 가면 4기가 볼륨이 자동으로 만들어짐을 확인 할 수 있다.
storageclass의 reclaimpolicy 가 delete 이므로 나중에 pvc 를삭제한다면, EBS도 같이 삭제된다.
어찌됬던 해당 예제를 실행해보면 아래처럼 볼륨이 생성된다.
pod를 삭제하고 pvc를 삭제하면 EBS가 삭제됨을 확인할 수 있다.
물론 kubectl get storageclass 를 하면 ebs-sc 이름의 storageclass는 그대로 있다. 다만 ebs가 삭제되었으니 이전 기록은 볼 수 없다.
pvc 를 삭제하지 않는다면, 나중에 해당 pod를 다시 올려도 데이터가 그대로 유지된다.
이제 mysql에 해당 볼륨을 사용해보자.
'AWS' 카테고리의 다른 글
github actions, kustomize와 argocd를 EKS에서 kafka랑 사용하기 5부 (0) 2023.04.03 github actions, kustomize와 argocd를 EKS에서 kafka랑 사용하기 4부 (0) 2023.04.03 ec2에서 jenkins 빌드서버 만들어보기 2편 (0) 2023.03.31 ec2에서 jenkins 빌드서버 만들어보기 1편 (0) 2023.03.31 github actions, kustomize와 argocd를 EKS에서 kafka랑 사용하기 2부 (0) 2023.03.30