Home
home

2장 실습 - Mountpoint for Amazon S3 CSI Driver 구성하기

1. 기본 환경 배포

이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.
IAM 사용자 생성 및 액세스 키 생성

1.1. Terraform을 통한 기본 인프라 배포

Terraform을 통한 기본 인프라 배포에 앞서 SSH 키 페어, IAM User Access Key ID, IAM User Secret Access Key를 미리 확인하고 메모해 둡니다.
Terraform으로 기본 인프라 배포
cd cnaee_class_tf/ch2
Bash
복사
# 실습 디렉터리 경로 진입
export TF_VAR_KeyName=[각자 ssh keypair] export TF_VAR_MyIamUserAccessKeyID=[각자 iam 사용자의 access key id] export TF_VAR_MyIamUserSecretAccessKey=[각자 iam 사용자의 secret access key] export TF_VAR_SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32
Bash
복사
# Terraform 환경 변수 저장
terraform init terraform plan
Bash
복사
# Terraform 배포
nohup sh -c "terraform apply -auto-approve" > create.log 2>&1 &
Bash
복사
Note:  nohup으로 백그라운드로 실행하도록 변경했습니다. Terraform 배포가 완료되면 정상적으로 자원 생성이 되었는지 확인을 합니다.(cat create.log)
Terraform을 통한 기본 인프라 배포가 완료되면 관리 콘솔에서 생성된 인프라들을 확인합니다.
Note: 
AWS 관리 콘솔에 로그인 할 땐 IAM 사용자 계정으로 진행합니다.

1.2. 기본 정보 확인 및 설정

Terraform 배포가 완료 후 출력되는 Output 정보에서 bastion_host_ip의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-bastion-EC2)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.
Note:
myeks-bastion-EC2의 OS 변경으로 SSH 접근에 대한 계정을 ubuntu로 지정합니다.
(ssh -i ~/.ssh/XXXX.pem ubuntu@X.X.X.X)
기본 설정 및 확인
aws eks update-kubeconfig \ --region $AWS_DEFAULT_REGION \ --name $CLUSTER_NAME
Shell
복사
# EKS 클러스터 인증 정보 업데이트
kubens default
Bash
복사
# kubens default 설정
echo $AWS_DEFAULT_REGION echo $CLUSTER_NAME echo $VPCID echo $PublicSubnet1,$PublicSubnet2,$PublicSubnet3 echo $PrivateSubnet1,$PrivateSubnet2,$PrivateSubnet3
Bash
복사
# 변수 호출 종합
eksctl get cluster
Bash
복사
# eksctl을 통한 eks cluster 정보 확인
eksctl get nodegroup \ --cluster $CLUSTER_NAME \ --name ${CLUSTER_NAME}-node-group
Bash
복사
# eksctl을 통한 노드 그룹 정보 확인
kubectl get node -owide
Bash
복사
# kubectl을 통한 노드 정보 확인
PublicN1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address}) PublicN2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address}) PublicN3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address}) echo "export PublicN1=$PublicN1" >> /etc/profile echo "export PublicN2=$PublicN2" >> /etc/profile echo "export PublicN3=$PublicN3" >> /etc/profile echo $PublicN1, $PublicN2, $PublicN3
Bash
복사
# 노드 IP 변수 선언
for node in $PublicN1 $PublicN2 $PublicN3; \ do \ ssh -i ~/.ssh/kp_node.pem -o StrictHostKeyChecking=no ec2-user@$node hostname; \ done
Bash
복사
# 노드에 ssh 접근 확인

2. Amazon S3 CSI Driver 설치 및 확인

Amazon EBS CSI Driver 확인
eksctl get addon --cluster ${CLUSTER_NAME}
Bash
복사
# Amazon EKS 클러스터 Add-On 확인
kubectl get deploy,ds -l=app.kubernetes.io/name=aws-ebs-csi-driver -n kube-system
Bash
복사
# aws-ebs-csi-driver 디플로이먼트와 데몬셋 확인
kubectl get pod -n kube-system -l app.kubernetes.io/component=csi-driver
Bash
복사
# aws-ebs-csi-driver 파드 확인
kubectl get pod -n kube-system -l app=ebs-csi-controller \ -o jsonpath='{.items[0].spec.containers[*].name}' ; echo
Bash
복사
# ebs-csi-controller의 컨테이너 정보 확인
kubectl get daemonset -n kube-system -l app.kubernetes.io/name=aws-ebs-csi-driver \ -o jsonpath='{.items[0].spec.template.spec.containers[*].name}' ; echo
Bash
복사
# ebs-csi-node의 컨테이너 정보 확인

2.1. Amazon S3 CSI Driver 설치 및 확인

S3 버킷 생성 및 확인
NICKNAME=[각자의 닉네임] export NICKNAME=$NICKNAME; echo $NICKNAME
Bash
복사
# 각자의 NICKNAME 지정
aws s3api create-bucket \ --bucket cnaee-${NICKNAME} \ --region $AWS_DEFAULT_REGION \ --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION
Bash
복사
# S3 버킷 생성
aws s3 ls
Bash
복사
# S3 버킷 확인
IAM 정책 생성
BUCKET_NAME="cnaee-${NICKNAME}" echo "export BUCKET_NAME=$BUCKET_NAME" >> /etc/profile; echo $BUCKET_NAME
Bash
복사
# 버킷 이름 - 환경 변수 선언
cat > iam-policy-temp.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "MountpointFullBucketAccess", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${BUCKET_NAME}" ] }, { "Sid": "MountpointFullObjectAccess", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::${BUCKET_NAME}/*" ] } ] } EOF
Bash
복사
# iam-policy-temp.json 생성
envsubst < iam-policy-temp.json > iam-policy.json cat iam-policy.json
Bash
복사
# 환경 변수를 적용한 iam-policy.json 생성
aws iam create-policy \ --policy-name MountpointFullBucketAccessPolicy \ --policy-document file://iam-policy.json
Bash
복사
# IAM 정책 생성
IRSA 생성
ROLE_NAME=AmazonEKS_S3_CSI_DriverRole; echo $ROLE_NAME POLICY_ARN=arn:aws:iam::${ACCOUNT_ID}:policy/MountpointFullBucketAccessPolicy; echo $POLICY_ARN
Bash
복사
# IAM Role 이름과 IAM Policy ARN - 환경 변수 선언
while true; do date aws cloudformation list-stacks \ --stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \ --query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \ --output table sleep 1 done
Bash
복사
# [신규 터미널] CloudFormation Stack 정보 모니터링
eksctl create iamserviceaccount \ --name s3-csi-driver-sa \ --namespace kube-system \ --cluster $CLUSTER_NAME \ --attach-policy-arn $POLICY_ARN \ --approve \ --role-name $ROLE_NAME \ --region $AWS_DEFAULT_REGION \ --role-only
Bash
복사
# eksctl로 S3 CSI DRIVER IRSA 생성
Amazon S3 CSI Driver 설치
eksctl create addon \ --name aws-mountpoint-s3-csi-driver \ --cluster $CLUSTER_NAME \ --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_S3_CSI_DriverRole \ --force
Bash
복사
# eksctl로 s3-csi-driver 설치
Amazon S3 CSI Driver 설치 확인
eksctl get addon --cluster ${CLUSTER_NAME}
Bash
복사
# Add-On 확인
kubectl get deploy,ds -n kube-system kubectl get deploy,ds -l=app.kubernetes.io/name=aws-mountpoint-s3-csi-driver -n kube-system kubectl get pod -n kube-system -l app.kubernetes.io/component=csi-driver
Bash
복사
# aws-mountpoint-s3-csi-driver 구성 요소 확인
kubectl get daemonset -n kube-system -l app.kubernetes.io/name=aws-mountpoint-s3-csi-driver \ -o jsonpath='{.items[0].spec.template.spec.containers[*].name}' ; echo
Bash
복사
# s3-csi-node 컨테이너 정보 확인

2.2. Amazon S3 CSI Driver - 정적 프로비저닝 구성

실습 코드 다운로드
wget https://github.com/cloudneta/cnaeelab/raw/master/_data/demo_ch2_3.zip unzip demo_ch2_3.zip
Bash
복사
# 실습 파일 다운로드 및 압축 해제
cd demo_ch2_3 tree
Bash
복사
# 대상 경로 진입 및 확인
모니터링
watch -d kubectl get pod,pv,pvc
Bash
복사
# [신규 터미널 1] 자원 생성 모니터링
watch -d aws s3 ls s3://$BUCKET_NAME/
Bash
복사
# [신규 터미널 2] S3 버킷 모니터링
정적 프로비저닝 - PV 생성
sed -i "s/your-bucket-name-here/$BUCKET_NAME/g" s3_sp_pv.yaml cat s3_sp_pv.yaml | yh
Bash
복사
# Bucket Name 치환
kubectl apply -f s3_sp_pv.yaml
Bash
복사
# PV 생성
kubectl describe pv | yh
Bash
복사
# PV 생성 확인
정적 프로비저닝 - PVC 생성
kubectl apply -f s3_sp_pvc.yaml
Bash
복사
# PVC 생성
kubectl describe pvc | yh
Bash
복사
# PVC 생성 확인
정적 프로비저닝 - Pod 생성 및 확인
kubectl apply -f s3_sp_pod.yaml
Bash
복사
# Pod 생성
kubectl exec -it s3-sp-app -- sh -c 'ls /data'
Bash
복사
# 생성된 파드의 /data 경로 확인
kubectl exec -it s3-sp-app -- sh -c 'cat /data/cnaee-01.txt'
Bash
복사
# 생성된 파드의 /data 경로의 파일 내용 확인
aws s3 ls s3://$BUCKET_NAME/
Bash
복사
# S3 버킷 내에 파일 확인
aws s3 cp s3://$BUCKET_NAME/cnaee-01.txt - | cat
Bash
복사
# S3 버킷 내에 파일 내용 확인
Pod 재생성 후 데이터 유지 확인
kubectl delete -f s3_sp_pod.yaml
Bash
복사
# Pod 삭제
kubectl apply -f s3_sp_pod.yaml
Bash
복사
# Pod 생성
kubectl exec -it s3-sp-app -- sh -c 'ls /data'
Bash
복사
# 생성된 파드의 /data 경로 확인

3. 실습 환경 삭제

실습 환경 삭제와 Terraform 삭제 작업을 진행합니다.

3.1. 실습 자원 삭제

정적 프로비저닝 실습 환경 삭제
kubectl delete -f /root/demo_ch2_3
Bash
복사
# 실습 자원 삭제
eksctl delete addon \ --cluster $CLUSTER_NAME \ --name aws-mountpoint-s3-csi-driver \ --preserve
Bash
복사
# eksctl로 S3 CSI DRIVER 삭제
while true; do date aws cloudformation list-stacks \ --stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \ --query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \ --output table sleep 1 done
Bash
복사
# [신규 터미널] 모니터링
eksctl delete iamserviceaccount \ --name s3-csi-driver-sa \ --namespace kube-system \ --cluster $CLUSTER_NAME \ --region $AWS_DEFAULT_REGION
Bash
복사
# eksctl로 S3 CSI DRIVER IRSA 삭제
aws iam delete-policy --policy-arn $POLICY_ARN
Bash
복사
# IAM 정책 삭제
aws s3 rm s3://$BUCKET_NAME --recursive aws s3 ls
Bash
복사
# S3 버킷의 모든 객체 삭제
aws s3api delete-bucket \ --bucket $BUCKET_NAME \ --region $AWS_DEFAULT_REGION aws s3 ls
Bash
복사
# S3 버킷 삭제

3.2. Terraform 삭제

Terraform 자원 삭제
nohup sh -c "terraform destroy -auto-approve" > delete.log 2>&1 &
Bash
복사
# terraform 자원 삭제
Warning:
nohup으로 백그라운드로 실행하도록 변경했습니다. Terraform 삭제가 완료되면 정상적으로 자원 삭제 되었는지 확인을 합니다.(cat delete.log)
여기까지 2장의 세 번째 실습인 “Mountpoint for Amazon S3 CSI Driver 구성 하기” 실습을 마칩니다.
수고하셨습니다 :)