본문 바로가기

Container/Kubernetes

[K8S] Statefulset

Statefulset 
Pod의 상태를 유지해주는 컨트롤러
- Pod 이름
- Pod 의 볼륨(스토리지)


 

Pod이름 : Hash값으로 Random으로 만들어진다.

serviceName이라는 Field를 가지고 동작한다.

[따배쿠] 6-5. 쿠버네티스 StatefulSet (youtube.com)

# DaemonSet처럼 노드당 하나씩 보장해주는 것은 아님.
# 파드의 이름을 보장해줄 뿐이다.

[master ~]$ cat > rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        
        
[master ~]$ cat > statefulset-exam.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sf-nginx # 여기에 순차적으로 번호가 붙을 것
spec:
  replicas: 3
  serviceName: sf-service
#  podManagementPolicy: OrderedReady # Default 값 (순차적으로 만들어진다.)
  podManagementPolicy: Parallel # 이걸로 선택하면 동시에 만들어진다.
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
        
        
[master ~]$ kubectl create -f statefulset-exam.yaml 
statefulset.apps/sf-nginx created

[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running   0          12s   10.5.1.2   node2   <none>           <none>
sf-nginx-1   1/1     Running   0          12s   10.5.3.2   node4   <none>           <none>
sf-nginx-2   1/1     Running   0          12s   10.5.2.2   node3   <none>           <none>

# 이름을 보장해주기 때문에 1번을 삭제해도 1번이 다시 생성된다.
[master ~]$ kubectl delete pod sf-nginx-1
pod "sf-nginx-1" deleted
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running   0          41s   10.5.1.2   node2   <none>           <none>
sf-nginx-1   1/1     Running   0          3s    10.5.3.3   node4   <none>           <none>
sf-nginx-2   1/1     Running   0          41s   10.5.2.2   node3   <none>           <none>

# Scale out / down

# kubectl scale [object] [pod] --replicas
# object의 replicas 수를 scale하는 명령어

[master ~]$ kubectl scale statefulset sf-nginx --replicas=4
statefulset.apps/sf-nginx scaled
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running   0          2m26s   10.5.1.2   node2   <none>           <none>
sf-nginx-1   1/1     Running   0          108s    10.5.3.3   node4   <none>           <none>
sf-nginx-2   1/1     Running   0          2m26s   10.5.2.2   node3   <none>           <none>
sf-nginx-3   1/1     Running   0          2s      10.5.1.3   node2   <none>           <none>
[master ~]$ kubectl scale statefulset sf-nginx --replicas=2
statefulset.apps/sf-nginx scaled
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running   0          2m49s   10.5.1.2   node2   <none>           <none>
sf-nginx-1   1/1     Running   0          2m11s   10.5.3.3   node4   <none>           <none>

 

# Rolling-update

[master ~]$ kubectl edit statefulsets.apps sf-nginx 
..
 spec:
      containers:
      - image: nginx:1.15
        imagePullPolicy: IfNotPresent
        name: nginx-container
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
...

statefulset.apps/sf-nginx edited

# 순차적으로 바뀌는 것 확인
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS              RESTARTS   AGE     IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running             0          4m44s   10.5.1.2   node2   <none>           <none>
sf-nginx-1   0/1     ContainerCreating   0          1s      <none>     node3   <none>           <none>
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS              RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   0/1     ContainerCreating   0          4s    <none>     node4   <none>           <none>
sf-nginx-1   1/1     Running             0          12s   10.5.2.3   node3   <none>           <none>
[master ~]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
sf-nginx-0   1/1     Running   0          9s    10.5.3.4   node4   <none>           <none>
sf-nginx-1   1/1     Running   0          17s   10.5.2.3   node3   <none>           <none>

[master ~]$ kubectl describe pod sf-nginx-1
Name:             sf-nginx-1
Namespace:        default
Priority:         0
Service Account:  default
...
Containers:
  nginx-container:
    Container ID:   containerd://f865a487a19b101b91f1a9fa6e26ab92139cc8f36ec5802748af3dd3b38b53f7
    Image:          nginx:1.15
    Image ID:       docker.io/library/nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
    Port:           <none>
    Host Port:      <none>
    ...
    
    
# Roll back
[master ~]$ kubectl rollout undo statefulset sf-nginx 
statefulset.apps/sf-nginx rolled back

[master ~]$ kubectl delete statefulsets.apps sf-nginx 
statefulset.apps "sf-nginx" deleted
반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Cronjob Controller  (0) 2024.02.28
[K8S] Job Controller  (0) 2024.02.27
[K8S] DaemonSet  (0) 2024.02.26
[K8S] Deployment - RollingUpdate  (0) 2024.02.21
[K8S] ReplicaSet  (0) 2024.02.21