ํ•ด๋‹น ๋ฌธ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „: v1.31

Kubernetes v1.31 ๋ฌธ์„œ๋Š” ๋” ์ด์ƒ ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์„œ๋Š” ์ •์  ์Šค๋ƒ…์ƒท์ž„. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋‹ค์Œ์„ ์ฐธ๊ณ . ์ตœ์‹  ๋ฒ„์ „.

์˜ˆ์‹œ: 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: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

๋‹ค์Œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋‹จ์ผ-์ธ์Šคํ„ด์Šค 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)