ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Controller - StatefulSet
    kubernetes 2024. 12. 5. 16:25

    StatefulSet

    • Pod의 상태를 유지해주는 Controller
      • Pod 이름
      • Pod의 볼륨 (스토리지)
    • StatefulSet으로 Pod 생성 시, 0번부터 생성된다. ex) ns-nginx-0, ns-nginx-1, ns-nginx-2

     

    StatefulSet Definition

     

    StatefulSet은 serviceName이라는 Field를 가지고 있다.

     

    예시

     

    # statefulset-exam.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/6# cat statefulset-exam.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: sf-nginx
    spec:
      replicas: 3
      serviceName: sf-service
    #  podManagementPolicy: OrderedReady
      podManagementPolicy: Parallel
      selector:
        matchLabels:
          app: webui
      template:
        metadata:
          name: nginx-pod
          labels:
            app: webui
        spec:
          containers:
          - name: nginx-container

     

    *podManagedPolicy : OrderedReady (Default 값)

    pod 생성 시, 순차적으로 0번 만드는게 성공하면 1번 생성, 1번 만드는게 성공하면 2번 생성 …

    *podManagedPolicy : Parallel

     

    pod 생성 시, 0번 1번 2번을 동시에 생성

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f statefulset-exam.yaml
    statefulset.apps/sf-nginx created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    sf-nginx-0   1/1     Running   0          3s    192.168.104.8     node2   <none>           <none>
    sf-nginx-1   1/1     Running   0          3s    192.168.104.7     node2   <none>           <none>
    sf-nginx-2   1/1     Running   0          3s    192.168.166.144   node1   <none>           <none>

     

    # 삭제 후 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl delete pod sf-nginx-0
    pod "sf-nginx-0" deleted
    root@master:~/Getting-Start-Kubernetes/6# ^C
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
    sf-nginx-0   1/1     Running   0          1s    192.168.104.9     node2   <none>           <none>
    sf-nginx-1   1/1     Running   0          85s   192.168.104.7     node2   <none>           <none>
    sf-nginx-2   1/1     Running   0          85s   192.168.166.144   node1   <none>           <none>

     

    sf-nginx-0 pod를 삭제해도, 똑같은 이름으로 다시 생성된다.

    왜냐면 StatefulSet의 속성으로 pod의 이름을 보장해주기 때문이다. ex) sf-nginx-XX

    즉 0번이 지워지면 0번이 다시 생성된다.

     

    DaemonSet과 다른 점은, StatefulSet은 node당 한 개의 pod만 보장하지 않는다는 점이다.

    위의 예시와 같이 한 node에 두 개의 pod가 생성될 수 있다.

     

    다른 Controller와 다른 점은, pod name을 지정할 수 있다는 점이다.

    예를 들면 ReplicationController로 생성시 pod name이 random hash 값으로 붙는다.  ex) sf-nginx-skdjfd 

     

    예시2 (daemonSet scaling)

     

    # DaemonSet scale in

    root@master:~/Getting-Start-Kubernetes/6# kubectl scale statefulset sf-nginx --replicas=4
    statefulset.apps/sf-nginx scaled

     

    replicas 수를 3에서 4로 바꿔보자

     

    # 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES
    sf-nginx-0   1/1     Running   0          7m2s    192.168.104.9     node2   <none>           <none>
    sf-nginx-1   1/1     Running   0          8m26s   192.168.104.7     node2   <none>           <none>
    sf-nginx-2   1/1     Running   0          8m26s   192.168.166.144   node1   <none>           <none>
    sf-nginx-3   1/1     Running   0          98s     192.168.166.147   node1   <none>           <none>

     

    # DaemonSet scale out

    root@master:~/Getting-Start-Kubernetes/6# kubectl scale statefulset sf-nginx --replicas=2
    statefulset.apps/sf-nginx scaled

     

    # 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE     IP              NODE    NOMINATED NODE   READINESS GATES
    sf-nginx-0   1/1     Running   0          8m5s    192.168.104.9   node2   <none>           <none>
    sf-nginx-1   1/1     Running   0          9m29s   192.168.104.7   node2   <none>           <none>

     

    pod 2, 3번이 삭제되었다.

     

    예시2 (daemonSet Rolling update)

     

    # kubectl edit 으로 이미지 버전 수정

    root@master:~/Getting-Start-Kubernetes/6# kubectl edit statefulset.apps sf-nginx
    
    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      creationTimestamp: "2024-12-05T07:53:49Z"
      generation: 4
      name: sf-nginx
      namespace: default
      resourceVersion: "245455"
      uid: ef624b46-e2dc-402f-b614-c742c1667d3a
    spec:
      persistentVolumeClaimRetentionPolicy:
        whenDeleted: Retain
        whenScaled: Retain
      podManagementPolicy: Parallel
      replicas: 2
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: webui
      serviceName: sf-service
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: webui
          name: nginx-pod
        spec:
          containers:
          - image: nginx:1.15
            imagePullPolicy: IfNotPresent
            name: nginx-container
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
      updateStrategy:
        rollingUpdate:
          partition: 0
        type: RollingUpdate
    status:
      availableReplicas: 2
      collisionCount: 0
      currentReplicas: 2
      currentRevision: sf-nginx-7c9755b47
      observedGeneration: 4
      readyReplicas: 2
      replicas: 2
      updateRevision: sf-nginx-7c9755b47
      updatedReplicas: 2

     

    # 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME         READY   STATUS    RESTARTS   AGE
    sf-nginx-0   1/1     Running   0          7s
    sf-nginx-1   1/1     Running   0          10s
    root@master:~/Getting-Start-Kubernetes/6# kubectl describe pod sf-nginx-0
    Name:             sf-nginx-0
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             node2/10.100.0.102
    Start Time:       Thu, 05 Dec 2024 08:07:13 +0000
    Labels:           app=webui
                      apps.kubernetes.io/pod-index=0
                      controller-revision-hash=sf-nginx-7c9755b47
                      statefulset.kubernetes.io/pod-name=sf-nginx-0
    Annotations:      cni.projectcalico.org/containerID: 7eedc38f202d27206458bf789687d1346cbb9b617247a95f24c30f4cb1c3f171
                      cni.projectcalico.org/podIP: 192.168.104.10/32
                      cni.projectcalico.org/podIPs: 192.168.104.10/32
    Status:           Running
    IP:               192.168.104.10
    IPs:
      IP:           192.168.104.10
    Controlled By:  StatefulSet/sf-nginx
    Containers:
      nginx-container:
        Container ID:   containerd://d00eb9a5f3515070ee685172a052b02529c9b52814365b98e674ead1d9846e2a
        Image:          nginx:1.15
        Image ID:       docker.io/library/nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Thu, 05 Dec 2024 08:07:13 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mbjzp (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True
      Initialized                 True
      Ready                       True
      ContainersReady             True
      PodScheduled                True
    Volumes:
      kube-api-access-mbjzp:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  26s   default-scheduler  Successfully assigned default/sf-nginx-0 to node2
      Normal  Pulled     26s   kubelet            Container image "nginx:1.15" already present on machine
      Normal  Created    26s   kubelet            Created container nginx-container
      Normal  Started    26s   kubelet            Started container nginx-container

     

    daemonSet도 Rolling update가 가능하다.

     

    # rollback

     

    root@master:~/Getting-Start-Kubernetes/6# kubectl rollout undo statefulset sf-nginx
    statefulset.apps/sf-nginx rolled back
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME         READY   STATUS    RESTARTS   AGE
    sf-nginx-0   1/1     Running   0          40s
    sf-nginx-1   1/1     Running   0          42s
    root@master:~/Getting-Start-Kubernetes/6# kubectl describe pod sf-nginx-0
    Name:             sf-nginx-0
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             node2/10.100.0.102
    Start Time:       Thu, 05 Dec 2024 08:10:07 +0000
    Labels:           app=webui
                      apps.kubernetes.io/pod-index=0
                      controller-revision-hash=sf-nginx-66f56bb7cb
                      statefulset.kubernetes.io/pod-name=sf-nginx-0
    Annotations:      cni.projectcalico.org/containerID: 73b20e501a203566ff88ebe715b5f4a26c3949fa97aca2e87f4b044e4b86074e
                      cni.projectcalico.org/podIP: 192.168.104.11/32
                      cni.projectcalico.org/podIPs: 192.168.104.11/32
    Status:           Running
    IP:               192.168.104.11
    IPs:
      IP:           192.168.104.11
    Controlled By:  StatefulSet/sf-nginx
    Containers:
      nginx-container:
        Container ID:   containerd://7f4f2d1055da19e23fff29bea7cc41032a25823fb676aa073d683757cecb12dc
        Image:          nginx:1.14
        Image ID:       docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Thu, 05 Dec 2024 08:10:08 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-p7h99 (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True
      Initialized                 True
      Ready                       True
      ContainersReady             True
      PodScheduled                True
    Volumes:
      kube-api-access-p7h99:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  44s   default-scheduler  Successfully assigned default/sf-nginx-0 to node2
      Normal  Pulled     43s   kubelet            Container image "nginx:1.14" already present on machine
      Normal  Created    43s   kubelet            Created container nginx-container
      Normal  Started    43s   kubelet            Started container nginx-container

     

    nginx:1.14로 rollback이 된 것을 확인 가능하다.


    참고 영상

    https://www.youtube.com/watch?v=Mx3y9un1KeI

     

    'kubernetes' 카테고리의 다른 글

    [따배쿠] Controller - Cronjob  (0) 2024.12.07
    [따배쿠] Controller - Job  (0) 2024.12.06
    [따배쿠] Controller - DaemonSet  (0) 2024.12.05
    [따배쿠] Controller - Deployment  (0) 2024.12.05
    [따배쿠] Controller - Replicaset  (0) 2024.12.04
Designed by Tistory.