Skip to content

Instantly share code, notes, and snippets.

@ianychoi
Last active September 12, 2021 17:25
Show Gist options
  • Save ianychoi/7d80ab950d8e384e486dde6869c16662 to your computer and use it in GitHub Desktop.
Save ianychoi/7d80ab950d8e384e486dde6869c16662 to your computer and use it in GitHub Desktop.
쿠버네티스 - Wordpress와 MySQL을 퍼시스턴트 볼륨에 배포하기

쿠버네티스 - Wordpress와 MySQL을 퍼시스턴트 볼륨에 배포하기

안내

  • 쿠버네티스 튜토리얼 홈페이지에 있는 내용을 실습합니다.
  • 실습 환경은 오픈 소스 쿠버네티스를 직접 설치하셔도 되며, 여기에서는 퍼블릭 클라우드에서 제공하는 관리형 클라우드인 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를 통해 퍼시스턴트볼륨 사용이 가능하도록 진행하였습니다. 이를 위해서는 쿠버네티스 환경에서 CSI 지원을 가능하도록 설정해야 합니다.

AKS

# 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

  • 링크를 참고하여 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

퍼시스턴트볼륨클레임(PVC)과 퍼시스턴트볼륨(PV) 생성

튜토리얼 관련, CSI 인터페이스를 사용하는 스토리지클래스에 따라 스토리지 사용에 문제가 없는지 확인을 하면 좋습니다. 이후 실습을 위해서는 CSI 인터페이스를 사용하는 스토리지클래스가 있어야 합니다.

AKS

  • AKS의 경우 위와 같이 설치를 하면 managed-csi 라는 스토리지 클래스가 자동으로 생성됩니다. PVC와 PV에 대한 자세한 예제는 PVC 예제 yaml, PV 예제 yaml를 참고합니다.

EKS

  • CSI를 지원하는 스토리지 클래스를 추가합니다. PVC에 대한 자세한 예제는 링크를 참고합니다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/dynamic-provisioning/specs/storageclass.yaml

kustomization.yaml 생성하기

YOUR_PASSWORD 부분을 적절한 값으로 변경합니다.

cat <<EOF >./kustomization.yaml
> secretGenerator:
> - name: mysql-pass
>   literals:
>   - password=YOUR_PASSWORD
> EOF

MySQL과 WordPress에 필요한 리소스 구성 추가하기

  1. 먼저 튜토리얼에 나온 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
  1. 이후 스토리지 클래스를 지정해줍니다. sed 명령어를 이용해 스토리지 클래스를 추가해보았습니다.

AKS

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

EKS

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
  1. 이후 kustomization.yaml 파일을 생성합니다.
cat <<EOF >>./kustomization.yaml
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
EOF

적용하고 확인하기

튜토리얼에 나온 명령어를 그대로 입력합니다.

kubectl apply -k ./

잠시 후 결과를 확인할 수 있습니다 (단, EKS의 경우 로드밸런서와 연동되어 결과가 나오는데 조금 더 시간이 소요되므로 기다린 후 확인하도록 합니다).

AKS

drawing

EKS

drawing

리소스 삭제

테스트 후 더 이상 사용하지 않는 리소스를 꼭 제거하도록 합시다!

AKS

kubectl delete -k ./

# Azure에서는 리소스 그룹을 삭제하면 모든 비용 청구되는 관련 리소스를 제거할 수 있습니다.
az group delete --resource-group k8s

EKS

kubectl delete -k ./

# $CLUSTER_NAME은 앞에서 설명하였듯이, 배포한 EKS 클러스터의 이름입니다.
eksctl delete iamserviceaccount --cluster $CLUSTER_NAME --namespace kube-system --name ebs-csi-controller-irsa --wait

# 콘솔 또는 CloudFormation을 이용해 관련 자원을 모두 삭제합니다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment