티스토리 뷰
15 Stateful Applications - Example: WordPress and MySQL with Persistent Volumes
zerobig-k8s 2018. 9. 2. 16:43<출처>
https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
이번 튜토리얼은 Minikube를 이용하여 WordPress 사이트와 MySQL 데이터베이스를 배포하는 방법에 대해 소개한다. 두 애플리케이션 모두 데이터를 저장하기 위해 PersistentVolumes과 PersistentVolumeClaims을 사용한다.
PersistentVolume(PV)는 관리자에 의해 수동으로 프로비저닝 되어지거나, StorageClass를 이용하여 K8S에 의해 동적으로 프로비저닝 되어진, 클러스터 내 하나의 스토리지 세트를 말한다. PersistentVolumeClaim (PVC)은 사용자에 의한 스토리지 요청으로 PV에 의해 수행되어질 수 있다. PersistentVolumes와 PersistentVolumeClaims는 Pod의 생명주기로부터 영향받지 않으며 Pod가 재기동되고, 재 스케쥴링되고, 심지어 삭제가 된다 할지라도 데이터를 유지한다.
경고: 이 배포는 단일 인스턴스의 WordPress와 MySQL Pod를 이용하기 때문에, 상용환경에서의 유즈케이스로 적합하지 않다. 상용환경에서는 WordProcess를 배포하기 위해 WordPress Helm Chart 사용을 고려한다.
주의: 이번 강좌에서 제공되는 파일들은 GA Deployment API들을 이용하고 있고 K8S 버전 1.9 이상으로 한정한다. 이전 K8S 버전으로 강좌를 진행하려면, 적절한 API 버전으로 업데이트 하거나, 이 강좌의 이전 버전을 참조한다.
Objectives
- PersistentVolumeClaims와 PersistentVolumes를 생성한다.
- Secret을 생성한다.
- MySQL을 배포한다.
- WordPress를 배포한다.
- 정리한다.
Before you begin
K8S 클러스터를 갖추어야만 하고, kubectl 커맨드-라인 도구가 클러스터와 소통하도록 구성되어져야만 한다. 클러스터가 아직 준비되어 있지 않다면, Minikube를 이용하여, 생성할 수 있다. 또는 다음의 K8S 실습장(playground)들을 이용할 수 있다.
버전 확인을 위해, "kubectl version"을 입력한다.
다음의 구성파일들을 다운로드 한다.
Create PersistentVolumeClaims and PersistentVolumes
MySQL과 Wordpress 각각 데이터 저장을 위해 PersistentVolume이 필요하다. 그들의 PersistentVolumeClaims는 배포 단계에서 생성되어질 것이다.
많은 클러스터 환경들은 기본적으로 설치된 StorageClass를 갖는다. StorageClass이 PersistentVolumeClaim에 지정되지 않는다면, 클러스터의 기본 StorageClass가 대신 이용된다.
PersistentVolumeClaim이 생성될 때, StorageClass 구성을 근거로 PersistentVolume이 동적으로 프로비저닝 된다.
경고:
로컬 클러스터에서, 기본 StorageClass는 "hostPath" provisioner를 이용한다. "hostPath" 볼륨은 오직 개발과 테스트 용으로 적합하다. "hostPath" 볼륨의 경우, Pod가 스케쥴되어지는 노드들의 "/tmp" 영역에 존재하는 여러분의 데이터는 노드들간 이동하지 않는다. 하나의 Pod가 죽어 클러스터 내 다른 노드에 스케쥴되어지면, 또는 노드가 리부팅되어면, 데이터는 유실된다.
주의: "hostPath" provisioner 이용이 필요한 클러스터를 불러와야 하는 경우, "--enable-hostpath-provisioner" 플래그가 반드시 "controller-manager" 컴포넌트에 설정 되어져야만 한다.
주의: 구글 K8S 엔진에서 동작되는 K8S 클러스터를 이용하고 있다면, 다음 가이드를 참고한다.
Create a Secret for MySQL Password
Secret은 패스워드 또는 키와 같이 민감한 데이터 조각들을 저장하는 오브젝트다. manifest 파일들이 Secret을 이용하도록 이미 구성되어졌지만, 여러분들만의 Secret을 생성해야만 한다.
1. 다음 명령을 통해 Secret 객체를 생성한다. "YOUR_PASSWORD" 에 사용하기를 원하는 패스워드로 바꾸는것이 필요할 것이다.
1 2 | [root@zerobig-vm-c k8s]# kubectl create secret generic mysql-pass --from-literal=password=zerobig secret/mysql-pass created | cs |
2. 다음 명령을 수행하여 존재하는 Secret을 검증한다.
1 | [root@zerobig-vm-c k8s]# kubectl get secrets | cs |
그 결과는 다음과 같을 것이다. (필자의 경우 여러 개의 secret들이 존해하여 mysql-pass 에 대해서만 get 을 한 것이니, 여러분들은 굳이 이렇게 할 필요는 없다.)
1 2 3 | [root@zerobig-vm-c k8s]# kubectl get secrets mysql-pass NAME TYPE DATA AGE mysql-pass Opaque 1 6m | cs |
주의: Secret 의 노출을 방지하기 위해, "get" 이나 "describe"는 그 내용들을 보이지 않는다.
Deploy MySQL
다음 manifest는 단일 MySQL 인스터스 배포를 기술하고 있다. MySQL 컨테이너는 /var/lib/mysql에 PersistentVolume을 마운트한다. "MYSQL_ROOT_PASSWORD" 환경변수는 Secret으로부터 데이터베이스 패스워드를 설정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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 # for versions before 1.9.0 use apps/v1beta2 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:5.6 name: mysql env: - name: MYSQL_ROOT_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 | cs |
1. "mysql-deployment.yaml" 파일로 MySQL을 배포한다.
1 2 3 4 | [root@zerobig-vm-c k8s]# kubectl create -f https://k8s.io/examples/application/wordpress/mysql-deployment.yaml service/wordpress-mysql created persistentvolumeclaim/mysql-pv-claim created deployment.apps/wordpress-mysql created | cs |
2. PersistentVolume이 동적으로 프로비저닝 됨을 검증한다. PVs에 대해 프로비전되어 묶여지는데 수분이 소요될 수 있음에 주의하자.
1 | [root@zerobig-vm-c k8s]# kubectl get pvc | cs |
그 응답은 다음과 같을 것이다. (필자는 여러 개의 pvc 정보가 있어 다음과 같은 조건을 붙였지만, 여러분들은 기본 명령을 수행한다. 이후 동일 상황이 반복되면 추가 커맨트는 생략한다.)
1 2 3 | [root@zerobig-vm-c k8s]# kubectl get pvc mysql-pv-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-165ef9e3-acb8-11e8-af17-0800272d8893 20Gi RWO standard 1m | cs |
3. 다음 명령을 수행하여 Pod가 동작됨을 검증한다.
1 | [root@zerobig-vm-c k8s]# kubectl get pods | cs |
주의: Pod의 상태가 "RUNNIG" 가 되기끼지 수분이 소요될 수 있다.
1 2 | [root@zerobig-vm-c k8s]# kubectl get pods | grep word wordpress-mysql-bcc89f687-66pkd 1/1 Running 0 3m | cs |
Deploy WordPress
다음 manifest는 단일 WordPress 인스턴스의 배포와 서비스에 대해 기술한다. 지속성있는 스토리지를 위한 PVC, 그리고 패스워드를 위한 Secre 등과 같이 많은 동일 특성을 이용한다. 그러나 다른 설정 또한 사용하는데 "type: LoadBalancer" 이 그것이다. 이 설정은 WordPress를 클러스터 외부로부터의 트래픽에 노출 시켜준다.
application/wordpress/wordpress-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 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 # for versions before 1.9.0 use apps/v1beta2 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:4.8-apache name: wordpress env: - name: WORDPRESS_DB_HOST value: wordpress-mysql - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 80 name: wordpress volumeMounts: - name: wordpress-persistent-storage mountPath: /var/www/html volumes: - name: wordpress-persistent-storage persistentVolumeClaim: claimName: wp-pv-claim | cs |
1. "wordpress-deployment.yaml" 파일로 WordPress 서비스와 배포를 생성한다.
1 2 3 4 | [root@zerobig-vm-c k8s]# kubectl create -f https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml service/wordpress created persistentvolumeclaim/wp-pv-claim created deployment.apps/wordpress created | cs |
2. PersistentVolume이 동적으로 프로비저닝 됨을 검증한다.
1 | [root@zerobig-vm-c k8s]# kubectl get pvc | cs |
주의: PVs에 대해 프로비전 되어 묶여지는데 수분이 소요될 수 있다.
그 응답은 다음과 같을 것이다.
1 2 | [root@zerobig-vm-c k8s]# kubectl get pvc | grep wp wp-pv-claim Bound pvc-a8bbf6ed-acba-11e8-af17-0800272d8893 20Gi RWO standard 2m | cs |
3. 다음 명령을 수행하여 서비스가 동작됨을 검증한다.
1 | [root@zerobig-vm-c k8s]# kubectl get services wordpress | cs |
그 응답은 다음과 같을 것이다.
1 2 3 | [root@zerobig-vm-c k8s]# kubectl get services wordpress NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.98.190.69 <pending> 80:32710/TCP 3m | cs |
주의: Pod의 상태가 "RUNNIG" 가 되기끼지 수분이 소요될 수 있다.
4. WordPress 서비스에 대한 IP 주소를 얻기 위해 다음 명령을 수행한다:
1 | [root@zerobig-vm-c k8s]# minikube service wordpress --url | cs |
그 응답은 다음과 같을 것이다.
1 2 | [root@zerobig-vm-c k8s]# minikube service wordpress --url http://192.168.99.100:32710 | cs |
5. IP 주소를 복사하여, 여러분의 사이트를 보기 위해 브러우져에서 페이지를 불러온다. (필자의 경우, VMware 상의 CentOS로 이동 후 설치된 크롬 브라우져 상에서 아래 페이지를 띄웠다.)
여러분은 다음 스크린 샷과 유사하게 WordPress 설정 페이지를 볼 수 있어야 한다.
경고: 이 페이지를 WordPress 설치 상태로 남겨두지 말자. 다른 사용자가 이를 발견한다면, 여러분의 인스턴스에 웹사이트를 설치하여 악의적인 컨텐츠를 제공하기위해 악용할 수도 있다.
사용자이름과 패스워드를 생성하여 WordPress를 설치하거나 인스턴스를 삭제한다.
(참고로, WordPress 설정을 마무리하면 다음과 같은 근사한 자신만의 웹 페이지를 만날 수 있다.)
Cleaning Up
1. 여러분의 Secret 을 삭제하기 위해 다음 명령을 수행한다:
1 2 | [root@zerobig-vm-c k8s]# kubectl delete secret mysql-pass secret "mysql-pass" deleted | cs |
2. 배포와 서비스를 삭제하기 위해 다음 명령을 수행한다:
1 2 3 4 5 6 | [root@zerobig-vm-c k8s]# kubectl delete deployment -l app=wordpress deployment.extensions "wordpress" deleted deployment.extensions "wordpress-mysql" deleted [root@zerobig-vm-c k8s]# kubectl delete service -l app=wordpress service "wordpress" deleted service "wordpress-mysql" deleted | cs |
3. PersistentVolumeClaims를 삭제하기 위해 다음 명령을 수행한다. 동적으로 프로비저닝된 PersistentVolumes는 자동으로 삭제되어 질 것이다.
1 2 3 | [root@zerobig-vm-c k8s]# kubectl delete pvc -l app=wordpress persistentvolumeclaim "mysql-pv-claim" deleted persistentvolumeclaim "wp-pv-claim" deleted | cs |
What's next
- Learn more about Introspection and Debugging
- Learn more about Jobs
- Learn more about Port Forwarding
- Learn how to Get a Shell to a Container