RDS를 프라이빗 서브넷에서만 두었더니 외부에서 액세스하기 어려운 문제가 발생하였다. 원래는 배스천 호스트를 사용해서 접속하게 하려고 하였지만, 개발하시는 분들이 EC2 이용해서 RDS를 한번 더 접속하기 귀찮으실까봐... 그냥 프라이빗 서브넷 중 하나를 퍼블릭 서브넷으로 바꾸는 것으로 해결하였다.
그리고 EFS 를 설정하였다. EFS가 Multi AZ를 지원하기 때문이다. 처음에 EBS로 하지 말고 클러스터를 만들 때 부터 EFS로 하는게 맞았겠지만, 그 때는 이 차이점을 몰랐어서.. 따로 세팅해 주었다.
공식 문서 를 참고해서 진행하였다.
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
aws iam create-policy \
--policy-name AmazonEKS_EFS_CSI_Driver_Policy \
--policy-document file://iam-policy-example.json
eksctl create iamserviceaccount \
--cluster my-cluster \
--namespace kube-system \
--name efs-csi-controller-sa \
--attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EFS_CSI_Driver_Policy \
--approve \
--region region-code
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
--namespace kube-system \
--set image.repository=602401143452.dkr.ecr.region-code.amazonaws.com/eks/aws-efs-csi-driver \
--set controller.serviceAccount.create=false \
--set controller.serviceAccount.name=efs-csi-controller-sa
image.repository의 컨테이너 주소는 링크되어있는 문서를 통해 바꿨다. 나는 ap-northeast-2를 사용하고 있으니 602401143452.dkr.ecr.ap-northeast-2.amazonaws.com 로 사용하면 된다.
vpc_id=$(aws eks describe-cluster \
--name my-cluster \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text)
cidr_range=$(aws ec2 describe-vpcs \
--vpc-ids $vpc_id \
--query "Vpcs[].CidrBlock" \
--output text \
--region region-code)
security_group_id=$(aws ec2 create-security-group \
--group-name MyEfsSecurityGroup \
--description "My EFS security group" \
--vpc-id $vpc_id \
--output text)
aws ec2 authorize-security-group-ingress \
--group-id $security_group_id \
--protocol tcp \
--port 2049 \
--cidr $cidr_range
file_system_id=$(aws efs create-file-system \
--region region-code \
--performance-mode generalPurpose \
--query 'FileSystemId' \
--output text)
kubectl get nodes
k get nodes를 통해 노드의 주소를 얻었다면,
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=$vpc_id" \
--query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
--output table
해당 명령어를 사용하여 노드의 IP주소가 속해 있는 서브넷 아이디를
aws efs create-mount-target \
--file-system-id $file_system_id \
--subnet-id subnet-EXAMPLEe2ba886490 \
--security-groups $security_group_id
의 subnet-id 부분에 넣으면 된다. 나는 노드가 두 개이므로 두 번 진행하였다.
그리고 스토리지클래스와 PVC도 작성을 완료하였다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: efs-pvc
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: efs-sc
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
parameters:
provisioningMode: efs-ap
fileSystemId: fs-046fc26e91f93b2c1
directoryPerms: "700"
내일은 오전에 테스트 웹 코드 작성을 완료하고, github actions를 이용한 CI까지 해볼 예정이다. 물론 웹과 RDS의 연동이 잘.. 된다면의 말이지만...