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 구성 하기” 실습을 마칩니다.
수고하셨습니다 :)