3. EKS로 Wordpress 띄우기(1/n) - EFS 설정

유유·2021년 7월 6일
1

EKS

목록 보기
3/4
post-thumbnail

EKS 환경에서 Wordrpess를 배포합니다.

이때, Wordpress 구성요소는 Public 하게 관리 할 것이며, MySQL 구성요소는 Private 하게 관리 할 것입니다.

Wordpress는 서비스를 외부로 노출하기 위해 Service의 Type: LoadBalancer 또는 Ingress 를 활용할 수 있습니다.
우선적으로 1번 방안으로 진행하고 다음 포스팅에서 2번 방법도 사용해 보겠습니다.(참고)

1.1 설치 요구사항

설치 요구사항

  • 설치도구 : eksctl
  • 노드 수 : 3개
  • 버전 :

Wordpress 상세

  • Deployment : 2개
  • Secret활용
  • SVC : LoadBalancer 타입으로 생성
  • Ingress(선택) : Route53으로 도메인 생성 후 할당
  • PVC : EFS

1.2 EFS 구성

Amazon EKS 클러스터에 대한 Amazon EFS 파일 시스템을 생성합니다.

1.2.1 Amazon EKS 클러스터에 Amazon EFS CSI 드라이버를 배포 ( IAM 정책 및 역할 생성)

  • CSI 드라이버의 서비스 계정에서AWSAPI는 사용자를 대신하여 사용합니다.

GitHub 에서 IAM 정책 문서를 다운로드합니다.

curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v1.2.0/docs/iam-policy-example.json

정책을 만듭니다. 아래 AmazonEKS_EFS_CSI_Driver_Policy을 다른 이름으로 변경할 수 있지만, 그렇게 할 경우 이후 단계에서도 변경해야 합니다.

aws iam create-policy \
    --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
    --policy-document file://iam-policy-example.json
  • IAM 역할을 생성하여 여기에 IAM 정책을 연결합니다. Kubernetes 서비스 계정에 IAM 역할 ARN 에 주석을 추가하고 Kubernetes 서비스 계정 이름으로 추가합니다. 역할을 만들 수 있습니다.

다음 명령은 IAM 역할 및 Kubernetes 서비스 계정을 만듭니다. 또한 정책을 역할에 연결하고 Kubernetes 서비스 계정에 IAM 역할 ARN 주석으로 추가하고 Kubernetes 서비스 계정 이름을 IAM 역할에 대한 신뢰 정책에 추가합니다. 클러스터에 IAM OIDC 공급자가 없는 경우 명령은 IAM OIDC 공급자도 생성합니다.

eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster <cluster-name> \
    --attach-policy-arn arn:aws:iam::<Account ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
    --approve \
    --override-existing-serviceaccounts \
    --region ap-northeast-2

1.2.2 Amazon 아마존 EFS 드라이버 설치

이 절차에는 Helm V3 이상이 필요합니다.
Helm을 설치
->

  • helm repository를 추가합니다.
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
  • 저장소를 업데이트하십시오.
helm repo update
  • 차트를 설치합니다. 클러스터가 ap-northeast-2지역에 있지 않다면, 리전에 맞게 주소를 바꿔 주세요
helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
    --namespace kube-system \
    --set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/eks/aws-efs-csi-driver \
    --set serviceAccount.controller.create=false \
    --set serviceAccount.controller.name=efs-csi-controller-sa

1.2.3 Amazon EKS 클러스터에 대한 Amazon EFS 파일 시스템을 생성하려면

  • 클러스터가 있는 VPC ID를 검색하여 이후 단계에서 사용할 수 있도록 변수에 저장합니다. Replace(<>) 을 클러스터 사용자 이름으로 바꿉니다.
vpc_id=$(aws eks describe-cluster \
    --name <cluster-name> \
    --query "cluster.resourcesVpcConfig.vpcId" \
    --output text)
  • 클러스터의 VPC 대한 CIDR 범위를 검색하여 이후 단계에서 사용할 수 있도록 변수에 저장합니다.
cidr_range=$(aws ec2 describe-vpcs \
    --vpc-ids $vpc_id \
    --query "Vpcs[].CidrBlock" \
    --output text)
  • Amazon EFS 마운트 지점에 대해 인바운드 NFS 트래픽을 허용하는 인바운드 규칙을 사용하여 보안 그룹을 생성합니다.

1. 보안 그룹 생성. 을 바꿉니다.example values는 사용자의 값으로 바꾸십시오.

security_group_id=$(aws ec2 create-security-group \
    --group-name MyEfsSecurityGroup \
    --description "My EFS security group" \
    --vpc-id $vpc_id \
    --output text)

####2. 클러스터의 VPC 대한 CIDR에서 인바운드 NFS 트래픽을 허용하는 인바운드 규칙을 생성합니다.

aws ec2 authorize-security-group-ingress \
    --group-id $security_group_id \
    --protocol tcp \
    --port 2049 \
    --cidr $cidr_range

1.2.4 Amazon EKS 클러스터에 대한 Amazon EFS 파일 시스템을 생성합니다.

  • 파일 시스템을 생성합니다.
file_system_id=$(aws efs create-file-system \
    --region ap-northeast-2 \
    --performance-mode generalPurpose \
    --query 'FileSystemId' \
    --output text)
  • 탑재 대상을 만듭니다.

    1. 클러스터 노드의 IP 주소를 결정하십시오.
kubectl get nodes
2. VPC의 서브넷 ID와 서브넷이있는 가용 영역을 확인합니다.
aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=$vpc_id" \
    --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
    --output table

결과

|                           DescribeSubnets                          |
+------------------+--------------------+----------------------------+
| AvailabilityZone |     CidrBlock      |         SubnetId           |
+------------------+--------------------+----------------------------+
|  ap-northeast-2c      |  192.168.128.0/19  |  subnet-6e421a0e97  |
|  ap-northeast-2b      |  192.168.96.0/19   |  subnet-d0503db0ec  |
|  ap-northeast-2c      |  192.168.32.0/19   |  subnet-2ba886490  |
|  ap-northeast-2b      |  192.168.0.0/19    |  subnet-123c7c5182  |
|  ap-northeastt-2a      |  192.168.160.0/19  |  subnet-EXAMPLE0416ce588p  |
|  ap-northeast-2a      |  192.168.64.0/19   |  subnet-12c68ea7fb  |
+------------------+--------------------+----------------------------+
3. 노드가 있는 서브넷에 대한 마운트 대상을 추가합니다. 이전 두 단계의 출력에서 클러스터는 IP 주소가 `192.168.56.0. 해당 IP 주소는CidrBlock서브넷의 IDsubnet-EXAMPLEe2ba886490. 따라서 다음 명령은 노드가 있는 서브넷에 대한 마운트 대상을 만듭니다. 클러스터에 노드가 더 많은 경우 노드가 있는 각 AZ의 서브넷에 대해 명령을 한 번 실행하여subnet-EXAMPLEe2ba886490를 적절한 서브넷 ID로 바꿉니다.
aws efs create-mount-target \
    --file-system-id $file_system_id \
    --subnet-id subnet-034e836661d362946\
    --security-groups $security_group_id

mount target을 확인하기 위한 험난한 여정...


echo $file_system_id         
fs-4c6ad02c

 aws efs describe-mount-targets --file-system-id fs-4c6ad02c
{
    "MountTargets": [
        {
            "MountTargetId": "fsmt-cec8b5af", 
            "VpcId": "vpc-0dfde63787164eaed", 
            "AvailabilityZoneId": "apne2-az1", 
            "NetworkInterfaceId": "eni-0f71d47acb3de43d9", 
            "AvailabilityZoneName": "ap-northeast-2a", 
            "FileSystemId": "fs-4c6ad02c", 
            "LifeCycleState": "available", 
            "SubnetId": "subnet-01f6009c85f598ad6", 
            "OwnerId": "970698899539", 
            "IpAddress": "192.168.7.96"
        }, 
        {
            "MountTargetId": "fsmt-dcc8b5bd", 
            "VpcId": "vpc-0dfde63787164eaed", 
            "AvailabilityZoneId": "apne2-az4", 
            "NetworkInterfaceId": "eni-0113b2069eb397b75", 
            "AvailabilityZoneName": "ap-northeast-2d", 
            "FileSystemId": "fs-4c6ad02c", 
            "LifeCycleState": "available", 
            "SubnetId": "subnet-0a9a0be5aa87f011f", 
            "OwnerId": "970698899539", 
            "IpAddress": "192.168.54.215"
        }, 
        {
            "MountTargetId": "fsmt-a0c8b5c1", 
            "VpcId": "vpc-0dfde63787164eaed", 
            "AvailabilityZoneId": "apne2-az3", 
            "NetworkInterfaceId": "eni-0d1ac4740fd4c7546", 
            "AvailabilityZoneName": "ap-northeast-2c", 
            "FileSystemId": "fs-4c6ad02c", 
            "LifeCycleState": "available", 
            "SubnetId": "subnet-034e836661d362946", 
            "OwnerId": "970698899539", 
            "IpAddress": "192.168.84.177"
        }
    ]
}
profile
하이

0개의 댓글