Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Example: Deploying WordPress and MySQL with Persistent Volumes

์˜ˆ์‹œ: WordPress์™€ MySQL์„ ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ์— ๋ฐฐํฌํ•˜๊ธฐ

์ด ํŠœํ† ๋ฆฌ์–ผ์€ WordPress ์‚ฌ์ดํŠธ์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ Minikube๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋ฐฐํฌํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‘˜ ๋‹ค ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ๊ณผ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ(PV)๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋‚˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ ์ €์žฅ์†Œ์˜ ์ผ๋ถ€์ด๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„(PVC)์€ PV๋กœ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž์— ์˜ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์š”์ฒญ์ด๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์€ ํŒŒ๋“œ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ๋…๋ฆฝ์ ์ด๋ฉฐ ์žฌ์‹œ์ž‘, ์žฌ์Šค์ผ€์ค„๋ง์ด๋‚˜ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•œ๋‹ค.

๋ชฉ์ 

  • ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„๊ณผ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ ์ƒ์„ฑ
  • ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” kustomization.yaml ์ƒ์„ฑ
    • ์‹œํฌ๋ฆฟ ์ƒ์„ฑ์ž
    • MySQL ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ
    • WordPress ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ
  • kubectl apply -k ./๋กœ ์ƒ์„ฑํ•œ kustomization ์„ ์ ์šฉ
  • ์ •๋ฆฌ

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

์ด ์˜ˆ์‹œ๋Š” kubectl 1.14 ์ด์ƒ ๋ฒ„์ „์—์„œ ๋™์ž‘ํ•œ๋‹ค.

๋‹ค์Œ ์„ค์ • ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

  1. mysql-deployment.yaml

  2. wordpress-deployment.yaml

ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„๊ณผ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ ์ƒ์„ฑ

MySQL๊ณผ Wordpress๋Š” ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์ด ํ•„์š”ํ•˜๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์€ ๋ฐฐํฌ ๋‹จ๊ณ„์— ์ƒ์„ฑ๋œ๋‹ค.

๋งŽ์€ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ์„ค์น˜๋œ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค(StorageClass)๊ฐ€ ์žˆ๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์— ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์ด ์ƒ์„ฑ๋˜๋ฉด ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์ด ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค ์„ค์ •์„ ๊ธฐ์ดˆ๋กœ ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ๋‹ค.

kustomization.yaml ์ƒ์„ฑํ•˜๊ธฐ

์‹œํฌ๋ฆฟ ์ƒ์„ฑ์ž ์ถ”๊ฐ€

์‹œํฌ๋ฆฟ์€ ์•”ํ˜ธ๋‚˜ ํ‚ค ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. 1.14 ๋ฒ„์ „๋ถ€ํ„ฐ kubectl์€ kustomization ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. kustomization.yaml์˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋กœ kustomization.yaml ๋‚ด์— ์‹œํฌ๋ฆฟ ์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. YOUR_PASSWORD๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์›ํ•˜๋Š” ์•”ํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

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

MySQL๊ณผ WordPress์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” MySQL ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค. MySQL ์ปจ์ผ€์ด๋„ˆ๋Š” ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์„ /var/lib/mysql์— ๋งˆ์šดํŠธํ•œ๋‹ค. MYSQL_ROOT_PASSWORD ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์‹œํฌ๋ฆฟ์—์„œ ๊ฐ€์ ธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•”ํ˜ธ๋กœ ์„ค์ •ํ•œ๋‹ค.

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 ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค. WordPress ์ปจํ…Œ์ด๋„ˆ๋Š” ์›น์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์œ„ํ•ด /var/www/html์— ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•œ๋‹ค. WORDPRESS_DB_HOST ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—๋Š” ์œ„์—์„œ ์ •์˜ํ•œ MySQL ์„œ๋น„์Šค์˜ ์ด๋ฆ„์ด ์„ค์ •๋˜๋ฉฐ, WordPress๋Š” ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•œ๋‹ค. WORDPRESS_DB_PASSWORD ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—๋Š” kustomize๊ฐ€ ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์„ค์ •๋œ๋‹ค.

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: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
  1. MySQL ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

    curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
    
  2. WordPress ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

    curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
    
  3. ๋‘ ํŒŒ์ผ์„ kustomization.yaml์— ์ถ”๊ฐ€ํ•˜์ž.

cat <<EOF >>./kustomization.yaml
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml
EOF

์ ์šฉํ•˜๊ณ  ํ™•์ธํ•˜๊ธฐ

kustomization.yaml์€ WordPress ์‚ฌ์ดํŠธ์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl apply -k ./

์ด์ œ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์‹œํฌ๋ฆฟ์ด ์กด์žฌํ•˜๋Š”์ง€ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™•์ธํ•œ๋‹ค.

    kubectl get secrets
    

    ์‘๋‹ต์€ ์•„๋ž˜์™€ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.

    NAME                    TYPE                                  DATA   AGE
    mysql-pass-c57bb4t7mf   Opaque                                1      9s
    
  2. ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ์ด ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get pvc
    

    ์‘๋‹ต์€ ์•„๋ž˜์™€ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    mysql-pv-claim   Bound     pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
    wp-pv-claim      Bound     pvc-8cd0df54-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
    
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get pods
    

    ์‘๋‹ต์€ ์•„๋ž˜์™€ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.

    NAME                               READY     STATUS    RESTARTS   AGE
    wordpress-mysql-1894417608-x5dzt   1/1       Running   0          40s
    
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ด๋ณด์ž.

    kubectl get services wordpress
    

    ์‘๋‹ต์€ ์•„๋ž˜์™€ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.

    NAME        TYPE            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    wordpress   LoadBalancer    10.0.0.89    <pending>     80:32406/TCP   4m
    
  5. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ WordPress ์„œ๋น„์Šค์˜ IP ์ฃผ์†Œ๋ฅผ ์–ป์–ด์˜จ๋‹ค.

    minikube service wordpress --url
    

    ์‘๋‹ต์€ ์•„๋ž˜์™€ ๋น„์Šทํ•ด์•ผ ํ•œ๋‹ค.

    http://1.2.3.4:32406
    
  6. IP ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์ดํŠธ๋ฅผ ์—ด์–ด ๋ณด์ž.

    ์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์œ ์‚ฌํ•œ WordPress ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    wordpress-init

์ •๋ฆฌํ•˜๊ธฐ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์‹œํฌ๋ฆฟ, ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์„œ๋น„์Šค์™€ ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„์„ ์‚ญ์ œํ•˜์ž.

    kubectl delete -k ./
    

๋‹ค์Œ ๋‚ด์šฉ

์ตœ์ข… ์ˆ˜์ • August 12, 2022 at 1:44 PM PST: [ko] sync the documents using comment (40bc0a1513)