ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : v1.31
Kubernetes v1.31 ๋ฌธ์๋ ๋ ์ด์ ์ ๊ทน์ ์ผ๋ก ๊ด๋ฆฌ๋์ง ์์. ํ์ฌ ๋ณด๊ณ ์๋ ๋ฌธ์๋ ์ ์ ์ค๋ ์ท์. ์ต์ ๋ฌธ์๋ฅผ ์ํด์๋, ๋ค์์ ์ฐธ๊ณ . ์ต์ ๋ฒ์ .
์์: ์นด์ฐ๋๋ผ๋ฅผ ์คํ ์ดํธํ์ ์ผ๋ก ๋ฐฐํฌํ๊ธฐ
์ด ํํ ๋ฆฌ์ผ์ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ํ์น ์นด์ฐ๋๋ผ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ ์นด์ฐ๋๋ผ๋ ๋ฐ์ดํฐ ๋ด๊ตฌ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ํผ์์คํดํธ ์คํ ๋ฆฌ์ง๊ฐ ํ์ํ๋ค(์ ํ๋ฆฌ์ผ์ด์ ์ํ). ์ด ์์ ์์ ์ฌ์ฉ์ ์ง์ ์นด์ฐ๋๋ผ ์๋ ๊ณต๊ธ์๋ ์นด์ฐ๋๋ผ๊ฐ ํด๋ฌ์คํฐ์ ๊ฐ์ ํ ๋ ์นด์ฐ๋๋ผ๊ฐ ์ธ์คํด์ค๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํ๋ค.
์คํ ์ดํธํ์ ์ ์ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๊ฒ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์์ ์ด์ฉํ ๊ธฐ๋ฅ์ ์์ธํ ์ ๋ณด๋ ์คํ ์ดํธํ์ ์ ์ฐธ์กฐํ๋ค.
์ฐธ๊ณ :
์นด์ฐ๋๋ผ์ ์ฟ ๋ฒ๋คํฐ์ค๋ ํด๋ฌ์คํฐ ๋งด๋ฒ๋ผ๋ ์๋ฏธ๋ก ๋ ธ๋ ๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํํ ๋ฆฌ์ผ์์ ์คํ ์ดํธํ์ ์ ์ํ๋ ํ๋๋ ์นด์ฐ๋๋ผ ๋ ธ๋์ด๋ฉฐ ์นด์ฐ๋๋ผ ํด๋ก์คํฐ์ ๋งด๋ฒ(๋ง ์ด๋ผ ํจ)์ด๋ค. ํด๋น ํ๋๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์คํ๋ ๋, ์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค ํ๋ ์ธ์ ํด๋น ํ๋๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค ๋ ธ๋์ ์ค์ผ์ค ํ๋ค.
์นด์ฐ๋๋ผ ๋ ธ๋๊ฐ ์์๋๋ฉด ์๋ ๋ชฉ๋ก ์ ์ฌ์ฉํด์ ๋ง์ ์๋ ๋ค๋ฅธ ๋ ธ๋ ๊ฒ์์ ์ํ ์ํ ๋ถํธ์คํธ๋ฉ์ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด๋ถ์ ๋ํ๋ ๋ ์๋ก์ด ์นด์ฐ๋๋ผ ํ๋๋ฅผ ๊ฒ์ํ ์ ์๋ ์ฌ์ฉ์ ์ง์ ์นด์ฐ๋๋ผ ์๋ ๊ณต๊ธ์๋ฅผ ๋ฐฐํฌํ๋ค.
๋ชฉ์
- ์นด์ฐ๋๋ผ ํค๋๋ฆฌ์ค Service๋ฅผ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ค.
- ์คํ ์ดํธํ์ (StatefulSet)์ ์ด์ฉํ์ฌ ์นด์ฐ๋๋ผ ๋ง์ ์์ฑํ๋ค.
- ์คํ ์ดํธํ์ ์ ๊ฒ์ฆํ๋ค.
- ์คํ ์ดํธํ์ ์ ์์ ํ๋ค.
- ์คํ ์ดํธํ์ ๊ณผ ํฌํจ๋ ํ๋๋ฅผ ์ญ์ ํ๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ํํ ๋ฆฌ์ผ์ ์๋ฃํ๋ ค๋ฉด, ํ๋, ์๋น์ค, ์คํ ์ดํธํ์ ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์์ด์ผ ํ๋ค.
์ถ๊ฐ์ ์ธ Minikube ์ค์ ์๋ น
์ฃผ์:
Minikube๋ 2048MB ๋ฉ๋ชจ๋ฆฌ์ 2๊ฐ CPU๊ฐ ๊ธฐ๋ณธ ์ค์ ์ด๋ค. ์ด ํํ ๋ฆฌ์ผ์์ Minikube๋ฅผ ๊ธฐ๋ณธ ๋ฆฌ์์ค ์ค์ ์ผ๋ก ์คํํ๋ฉด ๋ฆฌ์์ค ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฐ ์ค๋ฅ๋ฅผ ํผํ๋ ค๋ฉด Minikube๋ฅผ ๋ค์ ์ค์ ์ผ๋ก ์คํํ์.
minikube start --memory 5120 --cpus=4
์นด์ฐ๋๋ผ๋ฅผ ์ํ ํค๋๋ฆฌ์ค ์๋น์ค ์์ฑํ๊ธฐ
์ฟ ๋ฒ๋คํฐ์ค ์์ ์๋น์ค๋ ๋์ผ ์์ ์ ์ํํ๋ ํ๋์ ์งํฉ์ ๊ธฐ์ ํ๋ค.
๋ค์์ ์๋น์ค๋ ํด๋ฌ์คํฐ์์ ์นด์ฐ๋๋ผ ํ๋์ ํด๋ผ์ด์ธํธ ๊ฐ์ DNS ์ฐพ์๋ณด๊ธฐ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
cassandra-service.yaml
ํ์ผ์์ ์นด์ฐ๋๋ผ ์คํ
์ดํธํ์
๋
ธ๋๋ฅผ ๋ชจ๋ ์ถ์ ํ๋ ์๋น์ค๋ฅผ ์์ฑํ๋ค.
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-service.yaml
๊ฒ์ฆํ๊ธฐ(์ ํ)
์นด์ฐ๋๋ผ ์๋น์ค ์ดํด๋ณด๊ธฐ
kubectl get svc cassandra
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra ClusterIP None <none> 9042/TCP 45s
cassandra
์๋น์ค๊ฐ ๋ณด์ด์ง ์๋๋ค๋ฉด, ์ด์ ๋ค๋ฅธ ์๋ต์ด๋ผ๋ฉด ์๋น์ค ์์ฑ์ ์คํจํ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ
์๋น์ค ๋๋ฒ๊น
ํ๊ธฐ๋ฅผ
์ฝ์ด๋ณด์.
์นด์ฐ๋๋ผ ๋ง์ ์์ฑํ๋ ์คํ ์ดํธํ์ ์ด์ฉํ๊ธฐ
์คํ ์ดํธํ์ ๋งค๋ํ์คํธ์๋ ๋ค์์ ํฌํจํ๋๋ฐ 3๊ฐ ํ๋๋ก ๊ตฌ์ฑ๋ ์นด์ฐ๋๋ผ ๋ง์ ์์ฑํ๋ค.
์ฐธ๊ณ :
์ด ์๋ Minikube๋ฅผ ์ํ ๊ธฐ๋ณธ ํ๋ก๋น์ ๋์ด๋ค. ๋ค์ ์คํ ์ดํธํ์ ์ ์์ ํ๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๊ฐฑ์ ํ๋ค.apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cassandra
labels:
app: cassandra
spec:
serviceName: cassandra
replicas: 3
selector:
matchLabels:
app: cassandra
template:
metadata:
labels:
app: cassandra
spec:
terminationGracePeriodSeconds: 500
containers:
- name: cassandra
image: gcr.io/google-samples/cassandra:v13
imagePullPolicy: Always
ports:
- containerPort: 7000
name: intra-node
- containerPort: 7001
name: tls-intra-node
- containerPort: 7199
name: jmx
- containerPort: 9042
name: cql
resources:
limits:
cpu: "500m"
memory: 1Gi
requests:
cpu: "500m"
memory: 1Gi
securityContext:
capabilities:
add:
- IPC_LOCK
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- nodetool drain
env:
- name: MAX_HEAP_SIZE
value: 512M
- name: HEAP_NEWSIZE
value: 100M
- name: CASSANDRA_SEEDS
value: "cassandra-0.cassandra.default.svc.cluster.local"
- name: CASSANDRA_CLUSTER_NAME
value: "K8Demo"
- name: CASSANDRA_DC
value: "DC1-K8Demo"
- name: CASSANDRA_RACK
value: "Rack1-K8Demo"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /ready-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
# These volume mounts are persistent. They are like inline claims,
# but not exactly because the names need to match exactly one of
# the stateful pod volumes.
volumeMounts:
- name: cassandra-data
mountPath: /cassandra_data
# These are converted to volume claims by the controller
# and mounted at the paths mentioned above.
# do not use these in production until ssd GCEPersistentDisk or other ssd pd
volumeClaimTemplates:
- metadata:
name: cassandra-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast
resources:
requests:
storage: 1Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast
provisioner: k8s.io/minikube-hostpath
parameters:
type: pd-ssd
cassandra-statefulset.yaml
ํ์ผ๋ก ์นด์ฐ๋๋ผ ์คํ
์ดํธํ์
์์ฑ
# cassandra-statefulset.yaml์ ์์ ํ์ง ์์ ๊ฒฝ์ฐ์ ์ด๊ฒ์ ์ฌ์ฉํ๋ค.
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml
ํด๋ฌ์คํฐ์ ๋ง๊ฒ cassandra-statefulset.yaml
๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์์ ๋ค์ด๋ก๋ํ ๋ค์
์์ ๋ ๋ฒ์ ์ ์ ์ฅํ ํด๋์์ ํด๋น ๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํ๋ค.
https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml
# cassandra-statefulset.yaml์ ๋ก์ปฌ์์ ์์ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
kubectl apply -f cassandra-statefulset.yaml
์นด์ฐ๋๋ผ ์คํ ์ดํธํ์ ๊ฒ์ฆํ๊ธฐ
-
์นด์ฐ๋๋ผ ์คํ ์ดํธํ์ ์ป๊ธฐ
kubectl get statefulset cassandra
์๋ต์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
NAME DESIRED CURRENT AGE cassandra 3 0 13s
StatefulSet
๋ฆฌ์์ค๋ ์์ฐจ์ ์ผ๋ก ํ๋๋ฅผ ๋ฐฐํฌํ๋ค. -
์์ฐจ์ ์ผ๋ก ์์ฑ๋ ํํฉ์ ๋ณด๊ธฐ ์ํด ํ๋๋ฅผ ์ดํด๋ณด์.
kubectl get pods -l="app=cassandra"
์๋ต์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
NAME READY STATUS RESTARTS AGE cassandra-0 1/1 Running 0 1m cassandra-1 0/1 ContainerCreating 0 8s
๋ชจ๋ 3๊ฐ ํ๋๊ฐ ๋ฐฐํฌ๋๊ธฐ๊น์ง ๋ช ๋ถ์ด ์์๋ ์ ์๋ค. ๋ฐฐํฌ ํ, ๋์ผ ๋ช ๋ น์ ๋ค์๊ณผ ์ ์ฌํ๊ฒ ์๋ตํ๋ค.
NAME READY STATUS RESTARTS AGE cassandra-0 1/1 Running 0 10m cassandra-1 1/1 Running 0 9m cassandra-2 1/1 Running 0 8m
-
์ฒซ ๋ฒ์งธ ํ๋ ๋ด๋ถ์ ๋ง์ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์นด์ฐ๋๋ผ nodetool์ ์คํํ์.
kubectl exec -it cassandra-0 -- nodetool status
์ด ์๋ต์ ๋ค์๊ณผ ๋น์ทํ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค.
Datacenter: DC1-K8Demo ====================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.17.0.5 83.57 KiB 32 74.0% e2dd09e6-d9d3-477e-96c5-45094c08db0f Rack1-K8Demo UN 172.17.0.4 101.04 KiB 32 58.8% f89d6835-3a42-4419-92b3-0e62cae1479c Rack1-K8Demo UN 172.17.0.6 84.74 KiB 32 67.1% a6a1e8c2-3dc5-4417-b1a0-26507af2aaad Rack1-K8Demo
์นด์ฐ๋๋ผ ์คํ ์ดํธํ์ ์์ ํ๊ธฐ
kubectl edit
๋ฅผ ์ฌ์ฉํ์ฌ ์นด์ฐ๋๋ผ ์คํ
์ดํธํ์
์ ํฌ๊ธฐ๋ฅผ ์์ ํ๋ค.
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
kubectl edit statefulset cassandra
์ด ๋ช ๋ น์ ํฐ๋ฏธ๋์์ ํธ์ง๊ธฐ๋ฅผ ์ฐ๋ค. ๋ณ๊ฒฝํด์ผํ ํ์
replicas
ํ๋์ด๋ค. ๋ค์ ์์ ๋ ์คํ ์ดํธํ์ ํ์ผ์์ ๋ฐ์ทํ๋ค.# ๋ค์์ ์ค๋ธ์ ํธ๋ฅผ ์์ ํ๋ค. '#'๋ก ์์ํ๋ ํ์ ๋ฌด์๋๊ณ , # ๋น ํ์ผ์ ํธ์ง์ ์ค๋จํ๋ค. ์ ์ฅํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด ํ์ผ์ด # ๊ด๋ จ ์คํจ์ ํจ๊ป ๋ค์ ์ด๋ฆฐ๋ค. # apiVersion: apps/v1 kind: StatefulSet metadata: creationTimestamp: 2016-08-13T18:40:58Z generation: 1 labels: app: cassandra name: cassandra namespace: default resourceVersion: "323" uid: 7a219483-6185-11e6-a910-42010a8a0fc0 spec: replicas: 3
-
๋ ํ๋ฆฌ์นด ๊ฐ์๋ฅผ 4๋ก ๋ฐ๊พธ๊ณ , ๋งค๋ํ์คํธ๋ฅผ ์ ์ฅํ๋ค.
์คํ ์ดํธํ์ ์ 4๊ฐ์ ํ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ค์ผ์ผ ํ๋ค.
-
๊ฒ์ฆํ๊ธฐ ์ํด ์นด์ฐ๋๋ผ ์คํ ์ดํธํ์ ์ ์ดํด๋ณด์
kubectl get statefulset cassandra
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ์ ์ฌํ๋ค.
NAME DESIRED CURRENT AGE cassandra 4 4 36m
์ ๋ฆฌํ๊ธฐ
์คํ ์ดํธํ์ ์ ์ญ์ ํ๊ฑฐ๋ ์ค์ผ์ผ๋งํ๋ ๊ฒ์ ์คํ ์ดํธํ์ ์ ์ฐ๊ด๋ ๋ณผ๋ฅจ์ ์ญ์ ํ์ง ์๋๋ค. ๋น์ ์ ๋ฐ์ดํฐ๊ฐ ์คํ ์ดํธํ์ ์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ์น์๊ธฐ์ ์ด ์ค์ ์ ๋น์ ์ ์์ ์ ์ํ ๊ฒ์ด๋ค.
๊ฒฝ๊ณ :
์คํ ๋ฆฌ์ง ํด๋์ค์ ๋ฆฌํด๋ ์ ์ ์ฑ ์ ๋ฐ๋ผ ํผ์์คํด์ค๋ณผ๋ฅจํด๋ ์ ์ ์ญ์ ํ๋ฉด ๊ทธ์ ์ฐ๊ด๋ ๋ณผ๋ฅจ๋ ์ญ์ ๋ ์ ์๋ค. ๋ณผ๋ฅจ ์์ฒญ์ด ์ญ์ ๋์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์๋ค๊ณ ์ ๋๋ก ๊ฐ์ ํ์ง ๋ง์.-
๋ค์ ๋ช ๋ น์ด(ํ ์ค๋ก ์ฐ๊ฒฐ๋)๋ฅผ ์คํํ์ฌ ์นด์ฐ๋๋ผ ์คํ ์ดํธํ์ ์ ๋ชจ๋ ์ ๊ฑฐํ์.
grace=$(kubectl get pod cassandra-0 -o=jsonpath='{.spec.terminationGracePeriodSeconds}') \ && kubectl delete statefulset -l app=cassandra \ && echo "Sleeping ${grace} seconds" 1>&2 \ && sleep $grace \ && kubectl delete persistentvolumeclaim -l app=cassandra
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์นด์ฐ๋๋ผ์ ๋ํด ์ค์ ํ ์๋น์ค๋ฅผ ์ ๊ฑฐํ์.
kubectl delete service -l app=cassandra
์นด์ฐ๋๋ผ ์ปจํ ์ด๋ ํ๊ฒฝ ๋ณ์
์ด ํํ ๋ฆฌ์ผ์ ํ๋ ๋ ๊ตฌ๊ธ์ ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์
gcr.io/google-samples/cassandra:v13
์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ๋ค.
์ด ๋์ปค ์ด๋ฏธ์ง๋ debian-base์
๊ธฐ๋ฐํ์๊ณ OpenJDK 8์ ํฌํจํ๋ค.
์ด ์ด๋ฏธ์ง๋ ์ํ์น ๋ฐ๋น์ ๋ฆฌํฌ์ ํ์ค ์นด์ฐ๋๋ผ ์ค์น๋ณธ์ ํฌํจํ๋ค.
ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ cassandra.yaml
์ ์ฝ์
๋ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
ํ๊ฒฝ ๋ณ์ | ๊ธฐ๋ณธ๊ฐ |
---|---|
CASSANDRA_CLUSTER_NAME |
'Test Cluster' |
CASSANDRA_NUM_TOKENS |
32 |
CASSANDRA_RPC_ADDRESS |
0.0.0.0 |
๋ค์ ๋ด์ฉ
- ์ด๋ป๊ฒ ์คํ ์ดํธํ์ ์ค์ผ์ผํ๋์ง ์ดํด๋ณธ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์๋์ ๊ณต์์ ๋ํด ๋ ์ดํด๋ณธ๋ค.
- ์ปค์คํ ์๋ ์ ๊ณต์ ์ค์ ๋ฅผ ์ดํด๋ณธ๋ค.