- 쿠버네티스 튜토리얼 홈페이지에 있는 내용을 실습합니다.
- 실습 환경은 오픈 소스 쿠버네티스를 직접 설치하셔도 되며, 여기에서는 퍼블릭 클라우드에서 제공하는 관리형 클라우드인 AKS (Azure Kubernetes Service)와 EKS (Elastic Kubernetes Service) 2가지에 대한 실습 내용을 작성해 보았습니다.
# mysql-deployment.yaml 다운로드
curl -O https://kubernetes.io/examples/application/wordpress/mysql-deployment.yaml
# wordpress-deployment.yaml 다운로드
curl -O https://kubernetes.io/examples/application/wordpress/wordpress-deployment.yaml
퍼블릭 클라우드에서 CSI를 통해 퍼시스턴트볼륨 사용이 가능하도록 진행하였습니다. 이를 위해서는 쿠버네티스 환경에서 CSI 지원을 가능하도록 설정해야 합니다.
- AKS에서 CSI를 사용하기 위한 자세한 내용은 azuredisk-csi-driver: AKS에 설치, 관련 Docs 문서 (한글 번역), 해외 블로그를 통해 자세히 살펴볼 수 있습니다.
- 한국 중부 (koreacentral) 데이터센터를 사용하여 실행하였습니다.
# Azure CLI에서 CSI 드라이버를 위한 AKS 생성을 위한 명령어
az feature register --namespace "Microsoft.ContainerService" --name "EnableAzureDiskFileCSIDriver"
az extension add --name aks-preview
# CSI를 지원하는 AKS 환경을 생성합니다.
az group create --location koreacentral --resource-group k8s
az aks create -g k8s -n akseverywhere --network-plugin azure --aks-custom-headers EnableAzureDiskFileCSIDriver=true --generate-ssh-keys
# AKS 로그인 권한을 가져옵니다.
az aks get-credentials --resource-group k8s --name akseverywhere
# CSI를 지원하는 노드 목록 확인
kubectl get csinodes
- 링크를 참고하여 EKS에서 CSI를 사용하기 위한 사전 권한 등 설정을 먼저 진행해야 합니다.
- 아래 실행 전, $AWS_DEFAULT_REGION 환경 변수에 데이터센터에 따른 적절한 값 (예: ap-northeast-2)을 넣어야 합니다. 또한 $CLUSTER_NAME은 배포한 EKS, $ACCOUNT_ID는 IAM에서 사용하는 계정 ID입니다.
# 정책 파일 다운로드
curl -sSL -o ebs-csi-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/docs/example-iam-policy.json
# IAM 정책 생성
aws iam create-policy --policy-name AmazonEKS_EBS_CSI_Driver_Policy --policy-document file://ebs-csi-policy.json
# IRSA
eksctl create iamserviceaccount \
--name ebs-csi-controller-irsa \
--namespace kube-system \
--cluster $CLUSTER_NAME \
--attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AmazonEKS_EBS_CSI_Driver_Policy \
--approve
# Helm 리포에 추가
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
## 리포 업뎃, 드라이버 검색
helm repo update
helm search repo aws-ebs-csi-driver
# 차트 배포
helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \
--namespace kube-system \
--set image.repository=602401143452.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/eks/aws-ebs-csi-driver \
--set enableVolumeResizing=true \
--set enableVolumeSnapshot=true \
--set controller.serviceAccount.create=false \
--set controller.serviceAccount.name=ebs-csi-controller-irsa
# 배포 확인
kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-ebs-csi-driver,app.kubernetes.io/instance=aws-ebs-csi-driver" -w
튜토리얼 관련, CSI 인터페이스를 사용하는 스토리지클래스에 따라 스토리지 사용에 문제가 없는지 확인을 하면 좋습니다. 이후 실습을 위해서는 CSI 인터페이스를 사용하는 스토리지클래스가 있어야 합니다.
- AKS의 경우 위와 같이 설치를 하면
managed-csi
라는 스토리지 클래스가 자동으로 생성됩니다. PVC와 PV에 대한 자세한 예제는 PVC 예제 yaml, PV 예제 yaml를 참고합니다.
- CSI를 지원하는 스토리지 클래스를 추가합니다. PVC에 대한 자세한 예제는 링크를 참고합니다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/dynamic-provisioning/specs/storageclass.yaml
YOUR_PASSWORD
부분을 적절한 값으로 변경합니다.
cat <<EOF >./kustomization.yaml
> secretGenerator:
> - name: mysql-pass
> literals:
> - password=YOUR_PASSWORD
> EOF
- 먼저 튜토리얼에 나온 yaml 파일을 다운로드합니다.
# MySQL 배포 yaml
curl -O https://raw.githubusercontent.com/kubernetes/website/main/content/ko/examples/application/wordpress/mysql-deployment.yaml
# Wordpress 배포 yaml
curl -O https://raw.githubusercontent.com/kubernetes/website/main/content/ko/examples/application/wordpress/wordpress-deployment.yaml
- 이후 스토리지 클래스를 지정해줍니다. sed 명령어를 이용해 스토리지 클래스를 추가해보았습니다.
sed -i 's/storage: 20Gi/storage: 20Gi\n storageClassName: managed-csi/g' mysql-deployment.yaml
sed -i 's/storage: 20Gi/storage: 20Gi\n storageClassName: managed-csi/g' wordpress-deployment.yaml
sed -i 's/storage: 20Gi/storage: 20Gi\n storageClassName: ebs-sc/g' mysql-deployment.yaml
sed -i 's/storage: 20Gi/storage: 20Gi\n storageClassName: ebs-sc/g' wordpress-deployment.yaml
- 이후 kustomization.yaml 파일을 생성합니다.
cat <<EOF >>./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
튜토리얼에 나온 명령어를 그대로 입력합니다.
kubectl apply -k ./
잠시 후 결과를 확인할 수 있습니다 (단, EKS의 경우 로드밸런서와 연동되어 결과가 나오는데 조금 더 시간이 소요되므로 기다린 후 확인하도록 합니다).
테스트 후 더 이상 사용하지 않는 리소스를 꼭 제거하도록 합시다!
kubectl delete -k ./
# Azure에서는 리소스 그룹을 삭제하면 모든 비용 청구되는 관련 리소스를 제거할 수 있습니다.
az group delete --resource-group k8s
kubectl delete -k ./
# $CLUSTER_NAME은 앞에서 설명하였듯이, 배포한 EKS 클러스터의 이름입니다.
eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --namespace kube-system --name ebs-csi-controller-irsa --wait
# 콘솔 또는 CloudFormation을 이용해 관련 자원을 모두 삭제합니다.