05B. MySQL 스테이트풀셋과 서비스의 구조 살펴보기
About 2 min
05B. MySQL 스테이트풀셋과 서비스의 구조 살펴보기 관련
목차
언제나 최신 Kubernetes
Unit 5 - 5.2 MySQL 스테이트풀셋과 서비스의 구조 살펴보기
언제나 최신 Kubernetes
이제 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