예시: 영구 볼륨으로 WordPress와 MySQL 배포하기
예시: 영구 볼륨으로 WordPress와 MySQL 배포하기
이 튜토리얼은 Minikube로 WordPress 사이트와 MySQL 데이터베이스를 배포하는 방법을 보여줘요. 두 애플리케이션 모두 데이터를 저장하기 위해 PersistentVolume과 PersistentVolumeClaim을 사용해요.
PersistentVolume(PV)은 관리자가 수동으로 프로비저닝했거나, Kubernetes가 StorageClass를 사용해 동적으로 프로비저닝한 클러스터의 스토리지 조각이에요. PersistentVolumeClaim(PVC)은 PV가 충족할 수 있는 사용자의 스토리지 요청이에요. PersistentVolume과 PersistentVolumeClaim은 파드 수명주기와 독립적이며, 파드의 재시작·재스케줄링·삭제를 거쳐도 데이터를 보존해요.
출처: 문서
본문
목표 (Objectives)
- PersistentVolumeClaim과 PersistentVolume 만들기
- Secret 생성기·MySQL 리소스 구성·WordPress 리소스 구성이 있는 kustomization.yaml 만들기
kubectl apply -k ./로 kustomization 디렉터리 적용- 정리하기
시작하기 전에
Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.
버전을 확인하려면 kubectl version을 입력해요. 이 페이지에 표시된 예시는 kubectl 1.27 이상에서 동작해요. 다음 구성 파일을 다운로드해요.
PersistentVolumeClaim과 PersistentVolume 만들기
MySQL과 WordPress는 각각 데이터를 저장할 PersistentVolume이 필요해요. 그들의 PersistentVolumeClaim은 배포 단계에서 생성돼요.
많은 클러스터 환경에 기본 StorageClass가 설치되어 있어요. PersistentVolumeClaim에서 StorageClass를 지정하지 않으면 클러스터의 기본 StorageClass가 대신 사용돼요. PersistentVolumeClaim이 생성되면 StorageClass 구성에 따라 PersistentVolume이 동적으로 프로비저닝돼요.
kustomization.yaml 만들기
Secret 생성기 추가
Secret은 비밀번호나 키 같은 민감한 데이터 한 조각을 저장하는 객체예요. 1.14부터 kubectl은 kustomization 파일을 사용한 Kubernetes 객체 관리를 지원해요. kustomization.yaml의 생성기(generators)로 Secret을 만들 수 있어요.
다음 명령으로 kustomization.yaml에 Secret 생성기를 추가해요. YOUR_PASSWORD를 사용하려는 비밀번호로 바꿔야 해요.
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
EOF
MySQL과 WordPress용 리소스 구성 추가
다음 매니페스트는 단일 인스턴스 MySQL Deployment를 설명해요. MySQL 컨테이너는 /var/lib/mysql에 PersistentVolume을 마운트해요. MYSQL_ROOT_PASSWORD 환경 변수는 Secret에서 데이터베이스 비밀번호를 설정해요.
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:8.0
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
다음 매니페스트는 단일 인스턴스 WordPress Deployment를 설명해요. WordPress 컨테이너는 웹사이트 데이터 파일을 위해 /var/www/html에 PersistentVolume을 마운트해요. WORDPRESS_DB_HOST 환경 변수는 위에서 정의한 MySQL 서비스의 이름을 설정하고, WordPress는 Service를 통해 데이터베이스에 접근해요. WORDPRESS_DB_PASSWORD 환경 변수는 kustomize가 생성한 Secret에서 데이터베이스 비밀번호를 설정해요.
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:6.2.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
- MySQL 배포 구성 파일을 다운로드해요.
- WordPress 구성 파일을 다운로드해요.
- 그것들을 kustomization.yaml 파일에 추가해요.
적용 및 확인
kustomization.yaml은 WordPress 사이트와 MySQL 데이터베이스를 배포하기 위한 모든 리소스를 포함해요. 디렉터리를 적용할 수 있어요.
kubectl apply -k ./
이제 모든 객체가 존재하는지 확인할 수 있어요.
- 다음 명령으로 Secret이 존재하는지 확인해요.
- PersistentVolume이 동적으로 프로비저닝되었는지 확인해요. PV가 프로비저닝되고 바인딩되는 데 최대 몇 분이 걸릴 수 있어요.
- 다음 명령으로 파드가 실행 중인지 확인해요. 파드의 상태가
RUNNING이 되는 데 최대 몇 분이 걸릴 수 있어요. - 다음 명령으로 서비스가 실행 중인지 확인해요. 참고: Minikube는 NodePort를 통해서만 Services를 노출할 수 있어요. EXTERNAL-IP는 항상 pending이에요.
- 다음 명령으로 WordPress 서비스의 IP 주소를 얻어요.
- IP 주소를 복사하고 브라우저에서 페이지를 로드해 사이트를 봐요. WordPress 설정 페이지를 볼 수 있어야 해요. 경고: WordPress 설치를 이 페이지에 방치하지 마세요. 다른 사용자가 그것을 찾으면 여러분의 인스턴스에 웹사이트를 설정해 악성 콘텐츠를 제공하는 데 사용할 수 있어요. 사용자 이름과 비밀번호를 만들어 WordPress를 설치하거나 인스턴스를 삭제하세요.
정리하기
- 다음 명령으로 Secret, Deployments, Services, PersistentVolumeClaims를 삭제해요.
다음 단계
- 내부 검사와 디버깅 더 알아보기
- Jobs 더 알아보기
- 포트 포워딩 더 알아보기
- 컨테이너에 셸 얻기 배우기