티스토리 뷰

<출처> 

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"을 입력한다.

다음의 구성파일들을 다운로드 한다.

  1. mysql-deployment.yaml

  2. wordpress-deployment.yaml




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으로부터 데이터베이스 패스워드를 설정한다.


application/wordpress/mysql-deployment.yam
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


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함