๋จ์ผ ์ธ์คํด์ค ์คํ ์ดํธํ ์ ํ๋ฆฌ์ผ์ด์ ์คํํ๊ธฐ
์ด ํ์ด์ง์์๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ํผ์์คํดํธ๋ณผ๋ฅจ(PersistentVolume)๊ณผ ๋ํ๋ก์ด๋จผํธ(Deployment)๋ฅผ ์ฌ์ฉํ์ฌ, ๋จ์ผ ์ธ์คํด์ค ์คํ ์ดํธํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ธ๋ค. ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ MySQL์ด๋ค.
๋ชฉ์
- ์ฌ์ฉ์ ํ๊ฒฝ์ ๋์คํฌ๋ฅผ ์ฐธ์กฐํ๋ ํผ์์คํดํธ๋ณผ๋ฅจ ์์ฑํ๊ธฐ
- MySQL ๋ํ๋ก์ด๋จผํธ ์์ฑํ๊ธฐ
- ์๋ ค์ง DNS ์ด๋ฆ์ผ๋ก ํด๋ฌ์คํฐ์ ๋ค๋ฅธ ํ๋์ MySQL ์๋น์ค ๋ ธ์ถํ๊ธฐ
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํ
kubectl version
.์ฌ๊ธฐ์์ ์ฌ์ฉ๋ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ๋ง์กฑํ๊ธฐ ์ํ์ฌ, ๊ธฐ๋ณธ ์คํ ๋ฆฌ์งํด๋์ค๊ฐ ์ค์ ๋์ด ์๋ ์ํ์ ๋์ ํผ์์คํดํธ๋ณผ๋ฅจ ํ๋ก๋น์ ๋, ๋๋ ์ ์ ์ผ๋ก(statically) ํ๋ก๋น์ ๋๋ ํผ์์คํดํธ๋ณผ๋ฅจ์ด ํ์ํ๋ค.
MySQL ๋ฐฐํฌํ๊ธฐ
์ฟ ๋ฒ๋คํฐ์ค ๋ํ๋ก์ด๋จผํธ๋ฅผ ์์ฑํ๊ณ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์(PersistentVolumeClaim)์ ์ฌ์ฉํ๋ ๊ธฐ์กด ํผ์์คํดํธ๋ณผ๋ฅจ์ ์ฐ๊ฒฐํ์ฌ ์คํ ์ดํธํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ YAML ํ์ผ์ MySQL์ ์คํํ๊ณ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ์ฐธ์กฐํ๋ ๋ํ๋ก์ด๋จผํธ๋ฅผ ๊ธฐ์ ํ๋ค. ์ด ํ์ผ์ /var/lib/mysql์ ๋ํ ๋ณผ๋ฅจ ๋ง์ดํธ๋ฅผ ์ ์ํ ํ์, 20G์ ๋ณผ๋ฅจ์ ์์ฒญํ๋ ํผ์ํธํดํธ๋ณผ๋ฅจํด๋ ์์ ์์ฑํ๋ค. ์ด ํด๋ ์์ ์๊ตฌ ์ฌํญ์ ์ ํฉํ ๊ธฐ์กด ๋ณผ๋ฅจ์ด๋ ๋์ ํ๋ก๋น์ ๋์ ์ํด์ ์ถฉ์กฑ๋๋ค.
์ฐธ๊ณ : config yaml ํ์ผ์ ์ ์๋ ๋น๋ฐ๋ฒํธ๋ ์์ ํ์ง ์๋ค. ๋ ์์ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ํด ์ฟ ๋ฒ๋คํฐ์ค ์ํฌ๋ฆฟ ์ ๋ณด์
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:9
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: 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
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
YAML ํ์ผ์ PV์ PVC๋ฅผ ๋ฐฐํฌํ๋ค.
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
YAML ํ์ผ์ ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ค์ ๋ฐฐํฌํ๋ค.
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
๋ํ๋ก์ด๋จผํธ์ ๊ดํ ์ ๋ณด๋ฅผ ํ์ธํ๋ค.
kubectl describe deployment mysql
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
Name: mysql Namespace: default CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700 Labels: app=mysql Annotations: deployment.kubernetes.io/revision=1 Selector: app=mysql Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable StrategyType: Recreate MinReadySeconds: 0 Pod Template: Labels: app=mysql Containers: mysql: Image: mysql:9 Port: 3306/TCP Environment: MYSQL_ROOT_PASSWORD: password Mounts: /var/lib/mysql from mysql-persistent-storage (rw) Volumes: mysql-persistent-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: mysql-pv-claim ReadOnly: false Conditions: Type Status Reason ---- ------ ------ Available False MinimumReplicasUnavailable Progressing True ReplicaSetUpdated OldReplicaSets: <none> NewReplicaSet: mysql-63082529 (1/1 replicas created) Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
๋ํ๋ก์ด๋จผํธ๋ก ์์ฑ๋ ํ๋๋ฅผ ๋์ดํ๋ค.
kubectl get pods -l app=mysql
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
NAME READY STATUS RESTARTS AGE mysql-63082529-2z3ki 1/1 Running 0 3m
ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ์ดํด๋ณธ๋ค.
kubectl describe pvc mysql-pv-claim
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
Name: mysql-pv-claim Namespace: default StorageClass: Status: Bound Volume: mysql-pv-volume Labels: <none> Annotations: pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes Capacity: 20Gi Access Modes: RWO Events: <none>
MySQL ์ธ์คํด์ค ์ ๊ทผํ๊ธฐ
์ด์ ์ YAML ํ์ผ์ ํด๋ฌ์คํฐ์ ๋ค๋ฅธ ํ๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
์ ๊ทผํ ์ ์๋ ์๋น์ค๋ฅผ ์์ฑํ๋ค. clusterIP: None
์๋น์ค ์ต์
์ ์ฌ์ฉํ๋ฉด ์๋น์ค์ DNS ์ด๋ฆ์ ์ง์ ํ๋์ IP ์ฃผ์๋ก
ํด์ํ๋๋ก ์ฒ๋ฆฌํ๋ค. ์ด ๋ฐฉ๋ฒ์ ์๋น์ค์์ ์ฐ๊ฒฐ๋๋ ํ๋๊ฐ ์ค์ง ํ๋ ๋ฟ์ด๊ณ ,
ํ๋์ ์๋ฅผ ๋ ๋๋ฆด ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ์ ํฉํ๋ค.
์๋ฒ์ ์ ์ํ๊ธฐ ์ํ์ฌ MySQL ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ๋ค.
kubectl run -it --rm --image=mysql:9 --restart=Never mysql-client -- mysql -h mysql -ppassword
์ด ๋ช ๋ น์ด๋ MySQL ํด๋ผ์ด์ธํธ๋ฅผ ์คํํ๋ ํ๋๋ฅผ ํด๋ฌ์คํฐ์ ์์ฑํ๊ณ , ์๋น์ค๋ฅผ ํตํ์ฌ ์๋ฒ์ ์ฐ๊ฒฐํ๋ค. ์ฐ๊ฒฐ๋๋ค๋ฉด, ์คํ ์ดํธํ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์คํ ์ค์์ ์ ์ ์๋ค.
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
mysql>
์ ๋ฐ์ดํธํ๊ธฐ
kubectl apply
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ํ๋ก์ด๋จผํธ์
์ด๋ฏธ์ง๋ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ณ๊ฒฝํ ์ ์๋ค. ์คํ
์ดํธํ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ด๋ จํ์ฌ ๋ช ๊ฐ์ง
์ฃผ์ ์ฌํญ์ด ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ผ์ผ๋งํ์ง ์๋๋ค. ์ด ์ค์ ์ ๋จ์ผ ์ธ์คํด์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฉ์ด๋ค. ๊ธฐ๋ณธ์ ์ธ ํผ์์คํดํธ๋ณผ๋ฅจ์ ํ๋์ ํ๋์์๋ง ๋ง์ดํธํ ์ ์๋ค. ํด๋ฌ์คํฐ ํํ์ ์คํ ์ดํธํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด์๋ ์คํ ์ดํธํ์ ์ ๋ณด์.
- ๋ํ๋ก์ด๋จผํธ ๊ตฌ์ฑ YAML ํ์ผ์์
strategy:
type: Recreate
๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ์ง์ํ๋ค. ๋์์ ๋ ๊ฐ ์ด์์ ํ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก, ๋กค๋ง ์ ๋ฐ์ดํธ๋ ์ผ์ด๋์ง ์๊ฒ ๋๋ค.Recreate
์ ๋ต์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ๋ ๊ตฌ์ฑ์ผ๋ก ์๋ก์ด ํ๋๋ฅผ ์์ฑํ๊ธฐ์ ์์ ๊ธฐ์กด์ ํ๋๋ฅผ ์ค๋จํ๋ค.
๋ํ๋ก์ด๋จผํธ ์ญ์ ํ๊ธฐ
์ด๋ฆ์ผ๋ก ๋ฐฐํฌ๋ ์ค๋ธ์ ํธ๋ฅผ ์ญ์ ํ๋ค.
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
ํผ์์คํดํธ๋ณผ๋ฅจ์ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ ๊ฒฝ์ฐ๋ผ๋ฉด, ๋์ผํ๊ฒ ์๋์ผ๋ก ์ญ์ ํ๊ณ ๊ธฐ๋ณธ ๋ฆฌ์์ค๋ ํด์ ํด์ผ ํ๋ค. ๋์ ํ๋ก๋น์ ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ด ์ญ์ ๋์์ ๋์ ํผ์์คํดํธ๋ณผ๋ฅจ ๋ํ ์๋์ผ๋ก ์ญ์ ๋๋ค. ์ผ๋ถ ๋์ ํ๋ก๋น์ ๋(EBS ์ PD์ ๊ฐ์)๋ ํผ์์คํดํธ๋ณผ๋ฅจ์ ์ญ์ ํ ๋์ ๊ธฐ๋ณธ ๋ฆฌ์์ค๋ ํด์ ํ๋ค.
๋ค์ ๋ด์ฉ
๋ํ๋ก์ด๋จผํธ ์ค๋ธ์ ํธ์ ๋ํด ๋ ๋ฐฐ์ ๋ณด๊ธฐ
์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌํ๊ธฐ์ ๋ํด ๋ ๋ฐฐ์๋ณด๊ธฐ