05B. MySQL ์คํ ์ดํธํ์ ๊ณผ ์๋น์ค์ ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ
05B. MySQL ์คํ ์ดํธํ์ ๊ณผ ์๋น์ค์ ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ ๊ด๋ จ
์ด์ YAML ํ์ผ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์คํ ์ดํธํ์
mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
.apiVersion
: ํ์ฌ ์คํ ์ดํธํ์ ์ ๋ฒ์ ์apps/v1
์ ๋๋ค..kind
: ์คํ ์ดํธํ์ ์ ์์ฑํ๋ฏ๋กStatefulSet
์ ์ง์ ํฉ๋๋ค..metadata.name
: ํ์ฌ ์คํ ์ดํธํ์ ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋mysql
์ ์ค์ ํฉ๋๋ค..spec.serviceName
: ์ฐ๊ฒฐํ๊ณ ์ํ๋ ํค๋๋ฆฌ์ค ์๋น์ค์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋mysql
์ ์ค์ ํฉ๋๋ค. ํค๋๋ฆฌ์ค ์๋น์ค๋ ๋ค์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค..spec.replicas
: ์คํ ์ดํธํ์ ์ ํ๋ ๊ฐ์์ ๋๋ค. 1๋ก ์ค์ ํ์ฌ ํ๋๋ฅผ 1๊ฐ๋ง ์์ฑํฉ๋๋ค..spec.selector
: ์คํ ์ดํธํ์ ์ผ๋ก ๊ด๋ฆฌํ ํ๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋matchLabels
์app: mysql
๋ก ์ค์ ํ์ผ๋ฏ๋ก ํค๊ฐapp
, ๊ฐ์ดmysql
๋ก ์ ํํ ์ผ์นํ๋ ํ๋๋ฅผ ์ฐพ์ต๋๋ค.
์ฌ๊ธฐ์๋ถํฐ๋ ํ๋ ์ค์ ์ ๋๋ค.
template:
metadata:
labels:
app: mysql
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: mysql:5.7
ports:
- protocol: TCP
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: examplepassword
- name: MYSQL_DATABASE
value: example
volumeMounts:
- name: data
mountPath: /var/lib/mysql
.spec.template.metadata
:labels
์ ํค-๊ฐ์ ์ค์ ํ์ฌ ์คํ ์ดํธํ์ ์ด ์ฐพ์ ์ ์๋๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์๋app: mysql
๋ฅผ ์ค์ ํ์ต๋๋ค..spec.template.spec
: ํ๋์spec
์ ๋๋ค. ํ๋์๋ ์ปจํ ์ด๋๊ฐ ์ฌ๋ฌ ๊ฐ ๋ค์ด๊ฐ ์ ์์ด์containers
๋ก ๋์ด์๊ณ , ๊ทธ ์๋์๋-
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด(Array)๋ก ๊ฐ์ ์คterminationGracePeriodSeconds
: 10์ ์ค์ ํ๋๋ฐ, ์ข ๋ฃ ์์ฒญ ํ 10์ด๊ฐ ๊ธฐ๋ค๋ฆฌ๋๋ก ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์๋์ง ์๊ฒ ํ๊ธฐ ์ํจ์ ๋๋ค.containers
:name
์๋ ์ปจํ ์ด๋์ ์ด๋ฆ์ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋mysql
๋ก ์ค์ ํ์ง๋ง ์ ๋ ํฐ์๋ ์๊ด์ด ์์ต๋๋ค.image
์๋ ์ปจํ ์ด๋๋ฅผ ์คํํ Docker ์ด๋ฏธ์ง๋ฅผ ์ค์ ํฉ๋๋ค.<์ด๋ฏธ์ง>:<ํ๊ทธ>
ํ์์ด๋ฉฐ ์ฌ๊ธฐ์๋mysql:5.7
์ ์ค์ ํ์ต๋๋ค.ports
: ๋ฐฐ์ด ํํ๋กcontainerPort
๋ฅผ ์ค์ ํฉ๋๋ค.containerPort
๋ ์ปจํ ์ด๋์์ ๊ฐ๋ฐฉํ ํฌํธ ๋ฒํธ๋ฅผ ๋ปํฉ๋๋ค. ์ฌ๊ธฐ์๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฌํธ์ธ 3306์ ์ค์ ํ์ต๋๋ค.env
: ํ๊ฒฝ ๋ณ์์ ๋๋ค. ๋ฐฐ์ด ํํ๋ก ์ค์ ํ๋ฉฐname
,value
ํ์์ ๋๋ค. ์ฌ๊ธฐ์๋MYSQL_ROOT_PASSWORD
์examplepassword
๋ฅผ ์ค์ ํ๊ณ ,MYSQL_DATABASE
์example
์ ์ค์ ํ์ฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฒ์ ์คํ๋ ๋example
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋๋ก ํฉ๋๋ค.volumeMounts
: ๋ณผ๋ฅจ ์ค์ ์ ๋๋ค. ์คํ ์ดํธํ์ ์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ด ์ค์ํฉ๋๋ค. ๋ฐฐ์ด ํํ๋ก ์ค์ ํ๋ฉฐname
์๋ ๋ณผ๋ฅจ์ ์ด๋ฆ์ธdata
๋ฅผ ์ค์ ํ๊ณ ,mountPath
์๋/var/lib/mysql
๋ฅผ ์ค์ ํ์ฌ ์ปจํ ์ด๋์/var/lib/mysql
๊ฒฝ๋ก์data
๋ณผ๋ฅจ์ด ์ฐ๊ฒฐ๋๋๋ก ํฉ๋๋ค.data
๋ณผ๋ฅจ์ ๋ค์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ด์ ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์(Persistent Volume Claim, ์๊ตฌ ๋ณผ๋ฅจ ์์ฒญ) ๋ถ๋ถ์ ๋๋ค. ์ฆ, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์๊ตฌ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ณผ๋ฅจ์ ์์ฒญํ์ฌ ์คํ ๋ฆฌ์ง(์ ์ฅ์)๋ฅผ ๋ฐ๊ฒ ๋ค๋ ๋ป์ ๋๋ค.
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
.spec.volumeClaimTemplates
: ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์ ์คmetadata
: ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋data
๋ฅผ ์ค์ ํ์ต๋๋ค.spec
: ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์์spec
storageClassName
: ์คํ ๋ฆฌ์ง ํด๋์ค(sc) ์ค์ ์ ๋๋ค. ์ฌ๊ธฐ์๋standard
๋ก ์ค์ ํ์ต๋๋ค. ์คํ ๋ฆฌ์ง ํด๋์ค๋ ๋์ค์ ๋ค๋ฅธ ๊ฒ์ ์ถ๊ฐํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.accessModes
: ์ ๊ทผ ๋ชจ๋์ ๋๋ค. ์ฌ๊ธฐ์๋ReadWriteOnce
๋ก ์ค์ ํ์ผ๋ฉฐReadWriteOnce
๋ ํ๋์ ๋ ธ๋์์๋ง ํ์ฌ ๋ณผ๋ฅจ์ด ์ฝ๊ธฐ/์ฐ๊ธฐ๋ก ๋ง์ดํธ๋ ์ ์์ต๋๋ค.resources
: ์์ฒญํ ๋ฆฌ์์ค ์ค์ ์ ๋๋ค.requests
์storage: 1Gi
๋ฅผ ์ค์ ํ์ฌ ์คํ ๋ฆฌ์ง(์ ์ฅ์) 1Gi ์ฉ๋์ ๋ฐ๊ฒ ๋ค๋ ๋ป์ ๋๋ค.
.kubectl get pvc
๋ช
๋ น์ ์
๋ ฅํ๋ฉด ํ์ฌ ์์ฑ๋ ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์(pvc)์ ํ์ธํ ์ ์์ต๋๋ค.
kubectl get pvc
#
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# data-mysql-0 Bound pvc-34538161-d92c-48de-83cc-594107fe0868 1Gi RWO standard 10s
.kubectl get pv
๋ช
๋ น์ ์
๋ ฅํ๋ฉด ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์(pvc)์ ํตํด ์์ฑ๋ ํผ์์คํดํธ ๋ณผ๋ฅจ(pv)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ๊ฐ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์คํ ๋ฆฌ์ง์
๋๋ค.
kubectl get pv
#
# NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
# pvc-34538161-d92c-48de-83cc-594107fe0868 1Gi RWO Delete Bound default/data-mysql-0 standard 110s
์๋น์ค
๋ค์์ ์๋น์ค์ ๋๋ค. ์คํ ์ดํธํ์ ์๋น์ค์ ํน์ง์ ์ธ ์ ์ ํค๋๋ฆฌ์ค ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ๋๋ค. ํค๋๋ฆฌ์ค๋ ๋ง๊ทธ๋๋ก ๋จธ๋ฆฌ๊ฐ ์๋ค๋ ๋ป์ธ๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค์์๋ IP ์ฃผ์๊ฐ ํ ๋น๋์ง ์์ ์๋น์ค๋ฅผ ๋ปํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํค ์๋น์ค๋ ํ๋์ ํธ๋ํฝ์ ๋๋ค(๋๋ ๋ผ์ด๋๋ก๋น ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ)์ผ๋ก ๊ท ๋ฑํ๊ฒ ์ ๋ฌํ์ง ์๊ณ , ํ๋์ ์ด๋ฆ์ ์ง์ ์ง์ ํด์ ์ ๋ฌํฉ๋๋ค.
mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
.apiVersion
: ํ์ฌ ์๋น์ค์ ๋ฒ์ ์v1
์ ๋๋ค..kind
: ์ฌ๊ธฐ์๋ ์๋น์ค๋ฅผ ์์ฑํ๋ฏ๋กService
๋ฅผ ์ง์ ํฉ๋๋ค..metadata.name
: ํ์ฌ ์๋น์ค์ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์๋mysql
์ ์ค์ ํฉ๋๋ค..spec.clusterIP
:ClusterIP
๋ฅผNone
์ผ๋ก ์ค์ ํ์ฌ ํค๋๋ฆฌ์ค ์๋น์ค๋ก ๋ง๋ญ๋๋ค..spec.selector
: ์๋น์ค๊ฐ ํธ๋ํฝ์ ์ ๋ฌํ ํ๋๋ฅผ ์ ํํฉ๋๋ค. ์ฌ๊ธฐ์๋app: mysql
์ ์ค์ ํ์ผ๋ฏ๋ก ํค๊ฐapp
, ๊ฐ์ดmysql
์ธ ํ๋๋ฅผ ์ฐพ์ต๋๋ค..spec.ports
:protocol
์ TCP,port
๋ 3306์ผ๋ก ์ค์ ํฉ๋๋ค.
์์์ mysql:5.7
์ปจํ
์ด๋๋ก MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ๋ -h
์ต์
์ ํธ์คํธ๋ฅผ mysql
๋ก ์ง์ ํ๋๋ฐ, ์ด๋ ๊ฒ ํ๋ฉด ์คํ
์ดํธํ์
์ ์ฒซ ๋ฒ์งธ ํ๋์ธ pod/mysql
์ผ๋ก ํธ๋ํฝ์ ์ ๋ฌํฉ๋๋ค.
kubectl run -it --rm mysql-client --image=mysql:5.7 --restart=Never -- sh
#
# If you don't see a command prompt, try pressing enter.
# sh-4.2#
mysql -h mysql -u root -p