Cloud/MSA

[WordPress] Kubernetes Deployment 배포

Piracoon 2021. 4. 22. 10:03

kubernetes doc에서 WordPress와 MySQL을 PV에 배포하는 것을 예제로 보여준다.
참고 : kubernetes.io/ko/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

 

예시: WordPress와 MySQL을 퍼시스턴트 볼륨에 배포하기

이 튜토리얼은 WordPress 사이트와 MySQL 데이터베이스를 Minikube를 이용하여 어떻게 배포하는지 보여준다. 애플리케이션 둘 다 퍼시스턴트 볼륨과 퍼시스턴트볼륨클레임을 데이터를 저장하기 위해

kubernetes.io

해당 예제를 통해 PVC, PV 생성하는 방법을 알고, MySQL, WordPress 리소스를 생성하기 위해 사용하는 Secret을 사용하는 방법에 실습을 해 볼 수 있다.

이번 배포에 앞서 WordPress를 알아보면, 간단하게 말하면 PHP로 개발된 웹 페이지를 띄울 수 있게 해주는 오픈소스이다. 템플릿을 제공해 줌으로써 간편하게 웹 페이지를 구동할 수 있는 것을 장점으로 보면 될 것 같다. 버전에 대한 backup import, export를 해줌으로써 좀 더 편한 관리를 할 수 있는 것으로 보인다.

 


Kubernetes에서는 minukube를 통해 배포한다. 이 포스팅에서는 kubernetes v1.17.8에서 진행하며, crio는 v1.17.5를 사용한다.

또한 PV, PVC를 생성할 때, Rook-Ceph를 통해 구성이 되어 있으므로 각자의 환경에 맞게 수정이 필요하다.

 

1. 작업 공간 생성 (namespace 생성 - 본 예에서는 wordpress 사용)
# kubectl create ns wordpress

2. mysql, wordpress에서 password로 사용할 secret 생성 (본 예에서는 mysql이 password)
# kubectl create secret generic mysql-secrets --from-literal=password=mysql -n wordpress

3. mysql 생성 
# kubectl apply -f mysql.yaml

4. wordpress 생성
# kubectl apply -f wordpress.yaml

5. 서비스 접근 (LoadBalancer 혹은 NodePort 확인)
# kubectl get svc -n wordpress wordpress

6. 크롬 혹은 IE 접근
http://{IP}:80

 

mysql.yaml

---

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  namespace: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  namespace: wordpress
  labels:
    app: wordpress
spec:
  storageClassName: csi-cephfs-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  namespace: wordpress
  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
worpress.yaml

---

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  namespace: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  namespace: wordpress
  labels:
    app: wordpress
spec:
  storageClassName: csi-cephfs-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: 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

해당 포스팅에서 배포한 wordpress는 PHP 버전 5.6.32를 사용한다.