ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : v1.31
Kubernetes v1.31 ๋ฌธ์๋ ๋ ์ด์ ์ ๊ทน์ ์ผ๋ก ๊ด๋ฆฌ๋์ง ์์. ํ์ฌ ๋ณด๊ณ ์๋ ๋ฌธ์๋ ์ ์ ์ค๋ ์ท์. ์ต์ ๋ฌธ์๋ฅผ ์ํด์๋, ๋ค์์ ์ฐธ๊ณ . ์ต์ ๋ฒ์ .
์์: WordPress์ MySQL์ ํผ์์คํดํธ ๋ณผ๋ฅจ์ ๋ฐฐํฌํ๊ธฐ
์ด ํํ ๋ฆฌ์ผ์ WordPress ์ฌ์ดํธ์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ Minikube๋ฅผ ์ด์ฉํ์ฌ ์ด๋ป๊ฒ ๋ฐฐํฌํ๋์ง ๋ณด์ฌ์ค๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ค ํผ์์คํดํธ ๋ณผ๋ฅจ๊ณผ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
ํผ์์คํดํธ๋ณผ๋ฅจ(PV)๋ ๊ด๋ฆฌ์๊ฐ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ ํด๋ฌ์คํฐ๋ ์ฟ ๋ฒ๋คํฐ์ค ์คํ ๋ฆฌ์งํด๋์ค๋ฅผ ์ด์ฉํด ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋ ์ ์ฅ์์ ์ผ๋ถ์ด๋ค. ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์(PVC)์ PV๋ก ์ถฉ์กฑํ ์ ์๋ ์ฌ์ฉ์์ ์ํ ์คํ ๋ฆฌ์ง ์์ฒญ์ด๋ค. ํผ์์คํดํธ๋ณผ๋ฅจ์ ํ๋ ๋ผ์ดํ์ฌ์ดํด๊ณผ ๋ ๋ฆฝ์ ์ด๋ฉฐ ์ฌ์์, ์ฌ์ค์ผ์ค๋ง์ด๋ ํ๋๋ฅผ ์ญ์ ํ ๋์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๋ค.
๊ฒฝ๊ณ :
์ด ๋ฐฐํฌ๋ ํ๋ก๋์ ์ฌ์ฉ ์๋ก๋ ์ ์ ํ์ง ์์๋ฐ ์ด๋ ๋จ์ผ ์ธ์คํด์ค์ WordPress์ MySQL์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋ก๋์ ์ด๋ผ๋ฉด WordPress Helm Chart๋ก ๋ฐฐํฌํ๊ธฐ๋ฅผ ๊ณ ๋ คํด๋ณด์.์ฐธ๊ณ :
์ด ํํ ๋ฆฌ์ผ์ ์ ๊ณต๋ ํ์ผ๋ค์ GA ๋ํ๋ก์ด๋จผํธ API๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ 1.9 ์ด์์ ์ด์ฉํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ฟ ๋ฒ๋คํฐ์ค ํ์ ๋ฒ์ ์์ ์ ์ฉํ๋ค๋ฉด API ๋ฒ์ ์ ์ ์ ํ ๊ฐฑ์ ํ๊ฑฐ๋ ์ด ํํ ๋ฆฌ์ผ์ ์ด์ ๋ฒ์ ์ ์ฐธ๊ณ ํ์.๋ชฉ์
- ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์๊ณผ ํผ์์คํดํธ๋ณผ๋ฅจ ์์ฑ
- ๋ค์์ ํฌํจํ๋
kustomization.yaml
์์ฑ- ์ํฌ๋ฆฟ ์์ฑ์
- MySQL ๋ฆฌ์์ค ๊ตฌ์ฑ
- WordPress ๋ฆฌ์์ค ๊ตฌ์ฑ
kubectl apply -k ./
๋ก ์์ฑํ kustomization ์ ์ ์ฉ- ์ ๋ฆฌ
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํkubectl version
.
์ด ์์๋ kubectl
1.14 ์ด์ ๋ฒ์ ์์ ๋์ํ๋ค.
๋ค์ ์ค์ ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.
ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์๊ณผ ํผ์์คํดํธ๋ณผ๋ฅจ ์์ฑ
MySQL๊ณผ Wordpress๋ ๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํผ์์คํดํธ๋ณผ๋ฅจ์ด ํ์ํ๋ค. ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ๋ฐฐํฌ ๋จ๊ณ์ ์์ฑ๋๋ค.
๋ง์ ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ์ค์น๋ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์งํด๋์ค(StorageClass)๊ฐ ์๋ค. ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ์คํ ๋ฆฌ์งํด๋์ค๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ํด๋ฌ์คํฐ์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์งํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ด ์์ฑ๋๋ฉด ํผ์์คํดํธ๋ณผ๋ฅจ์ด ์คํ ๋ฆฌ์งํด๋์ค ์ค์ ์ ๊ธฐ์ด๋ก ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋๋ค.
๊ฒฝ๊ณ :
๋ก์ปฌ ํด๋ฌ์คํฐ์์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์งํด๋์ค๋hostPath
ํ๋ก๋น์ ๋๋ฅผ ์ฌ์ฉํ๋ค. hostPath
๋ ๊ฐ๋ฐ๊ณผ ํ
์คํธ ๋ชฉ์ ์๋ง ์ ํฉํ๋ค. hostPath
๋ณผ๋ฅจ์ธ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ ์ค์ผ์ฅด๋ง๋ ํ๋์ ๋
ธ๋์ /tmp
์ด์์๊ณ ๋
ธ๋ ๊ฐ์ ์ด๋ํ์ง ์๋๋ค. ํ๋๊ฐ ์ฃฝ์ด์ ํด๋ฌ์คํฐ ๋ด์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ค์ผ์ค๋ง๋๊ฑฐ๋ ํด๋น ๋
ธ๋๊ฐ ์ฌ๋ถํ
๋๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ ์์ด๋ฒ๋ฆฐ๋ค.์ฐธ๊ณ :
hostPath
ํ๋ก๋น์ ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ํด๋ฌ์คํฐ๋ฅผ ๊ธฐ๋ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด --enable-hostpath-provisioner
ํ๋๊ทธ๋ฅผ controller-manager
์ปดํฌ๋ํธ์ ๊ผญ ์ค์ ํด์ผ ํ๋ค.์ฐธ๊ณ :
๋ง์ฝ ๊ตฌ๊ธ ์ฟ ๋ฒ๋คํฐ์ค ์์ง์ผ๋ก ์ด์ํ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด๋๋ก ํ๋ค.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
-
MySQL ๋ํ๋ก์ด๋จผํธ ๊ตฌ์ฑ ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
-
WordPress ๊ตฌ์ฑ ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
-
๋ ํ์ผ์
kustomization.yaml
์ ์ถ๊ฐํ์.
cat <<EOF >>./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
์ ์ฉํ๊ณ ํ์ธํ๊ธฐ
kustomization.yaml
์ WordPress ์ฌ์ดํธ์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ์ฉํ ์ ์๋ค.
kubectl apply -k ./
์ด์ ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ ์ ์๋ค.
-
์ํฌ๋ฆฟ์ด ์กด์ฌํ๋์ง ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํ์ธํ๋ค.
kubectl get secrets
์๋ต์ ์๋์ ๋น์ทํด์ผ ํ๋ค.
NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s
-
ํผ์์คํดํธ๋ณผ๋ฅจ์ด ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋์๋์ง ํ์ธํ๋ค.
kubectl get pvc
์ฐธ๊ณ :
PV๋ฅผ ํ๋ก๋น์ ๋ํ๊ณ ์ ์ฐฉ(bound)์ํค๋๋ฐ ์ ๋ถ์ด ๊ฑธ๋ฆด ์ ์๋ค.
์๋ต์ ์๋์ ๋น์ทํด์ผ ํ๋ค.
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
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํ๋๊ฐ ์คํ ์ค์ธ์ง ํ์ธํ๋ค.
kubectl get pods
์ฐธ๊ณ :
ํ๋์ ์ํ๊ฐ `RUNNING`๊ฐ ๋๊ธฐ๊น์ง ์ ๋ถ์ด ๊ฑธ๋ฆด ์ ์๋ค.
์๋ต์ ์๋์ ๋น์ทํด์ผ ํ๋ค.
NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์๋น์ค๊ฐ ์คํ ์ค์ธ์ง ํ์ธํด๋ณด์.
kubectl get services wordpress
์๋ต์ ์๋์ ๋น์ทํด์ผ ํ๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m
์ฐธ๊ณ :
Minikube์์๋ ์๋น์ค๋ฅผ `NodePort`์ผ๋ก๋ง ๋ ธ์ถํ ์ ์๋ค. EXTERNAL-IP๋ ํญ์ Pending ์ํ์ด๋ค.
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ WordPress ์๋น์ค์ IP ์ฃผ์๋ฅผ ์ป์ด์จ๋ค.
minikube service wordpress --url
์๋ต์ ์๋์ ๋น์ทํด์ผ ํ๋ค.
http://1.2.3.4:32406
-
IP ์ฃผ์๋ฅผ ๋ณต์ฌํด์ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ดํธ๋ฅผ ์ด์ด ๋ณด์.
์๋ ์คํฌ๋ฆฐ์ท๊ณผ ์ ์ฌํ WordPress ์ค์ ํ์ด์ง๋ฅผ ๋ณผ ์ ์์ด์ผ ํ๋ค.
๊ฒฝ๊ณ :
์ด ํ์ด์ง์ WordPress ์ค์น๋ฅผ ๋ด๋ฒ๋ ค ๋์ง ๋ง์. ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ด ํ์ด์ง๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๊ทํ์ ์ธ์คํด์ค์ ์น ์ฌ์ดํธ๋ฅผ ์ค์ ํ๊ณ ์ ์์ ์ธ ์ปจํ ์ธ ๋ฅผ ๊ฒ์ํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค.WordPress๋ฅผ ์ฌ์ฉ์๋ช ๊ณผ ์ํธ๋ฅผ ๋ฃ์ด ์์ฑํ๊ฑฐ๋ ์ธ์คํด์ค๋ฅผ ์ญ์ ํ์.
์ ๋ฆฌํ๊ธฐ
-
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ์ํฌ๋ฆฟ, ๋ํ๋ก์ด๋จผํธ, ์๋น์ค์ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ์ญ์ ํ์.
kubectl delete -k ./
๋ค์ ๋ด์ฉ
- ์ธํธ๋ก์คํ์ ๊ณผ ๋๋ฒ๊น ์ ์์๋ณด์.
- ์ก๋ฅผ ์์๋ณด์.
- ํฌํธ ํฌ์๋ฉ๋ฅผ ์์๋ณด์.
- ์ด๋ป๊ฒ ์ปจํ ์ด๋์์ ์ ธ์ ์ฌ์ฉํ๋์ง๋ฅผ ์์๋ณด์.