Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
iconfalse
title목차

Table of Contents

StatefulSet개요

Info
iconfalse
  • 애플리케이션의 상태를 저장하고 관리하는 데 사용되는 쿠버네티스 객체
  • 기존의 포드를 삭제하고 생성할 때 상태를 유지해 줍니다.


Info
  • 안정된, 고유한 네트워크 식별자
  • 안정된, 지속성을 갖는 스토리지
  • 순차적인, 정상배포와 스케일링
  • 순차적인, 자동 롤링 업데이트


Info
  • Statefulset 관련 Volume이 삭제되지 않으므로 관리가 필요
  • Pod의 Storage는 PV나 StorageClass로 Provisioning이 필요
  • RollingUpdate를 수행하는 경우 수동으로 복구해야 할 수 있음 (기존의 스토리지와 충돌)
  • Pod 네트워크ID를 유지하기 위해 Headless서비스 필요


StatefulSet Manifest

Info
iconfalse

https://dev-k8sref-io.web.app/docs/workloads/statefulset-v1/

Info
iconfalse


Info

Headless 서비스 작성 방법 (ClusterIP가 없는 서비스)

Code Block
linenumberstrue
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: ngin

StorageClass확인

Code Block
titleStorageClass
linenumberstrue
collapsetrue
sansae@sansaeAir15m2 k8s-lab-workspace % k get storageclass
NAME                    PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
azurefile               file.csi.azure.com   Delete          Immediate              true                   34h
azurefile-csi           file.csi.azure.com   Delete          Immediate              true                   34h
azurefile-csi-premium   file.csi.azure.com   Delete          Immediate              true                   34h
azurefile-premium       file.csi.azure.com   Delete          Immediate              true                   34h
default (default)       disk.csi.azure.com   Delete          WaitForFirstConsumer   true                   34h
managed                 disk.csi.azure.com   Delete          WaitForFirstConsumer   true                   34h
managed-csi             disk.csi.azure.com   Delete          WaitForFirstConsumer   true                   34h
managed-csi-premium     disk.csi.azure.com   Delete          WaitForFirstConsumer   true                   34h
managed-premium         disk.csi.azure.com   Delete          WaitForFirstConsumer   true                   34h
sansae@sansaeAir15m2 k8s-lab-workspace % 

Statefulset Manifest

Code Block
titlestatefulset.yaml
linenumberstrue
StatefulSet Manifest
apiVersion: v1
kind: Service
metadata:
  name: nginx-stps
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3 # 기본값은 1
  minReadySeconds: 10 # 기본값은 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: azurefile
      resources:
        requests:
          storage: 1Gi


Statefulset 실습

Info
iconfalse
Code Block
linenumberstrue
sansae@sansaeAir15m2 k8s-lab-workspace % k apply -f statefulset.yaml 
service/nginx-stps created
statefulset.apps/web created
sansae@sansaeAir15m2 k8s-lab-workspace % k get all
NAME        READY   STATUS    RESTARTS   AGE
pod/web-0   0/1     Pending   0          3s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   29s
service/nginx-stps        ClusterIP   None         <none>        80/TCP    3s

NAME                   READY   AGE
statefulset.apps/web   0/3     3s

sansae@sansaeAir15m2 k8s-lab-workspace % k get all         
NAME        READY   STATUS    RESTARTS   AGE
pod/web-0   1/1     Running   0          2m47s
pod/web-1   1/1     Running   0          117s
pod/web-2   1/1     Running   0          97s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3m13s
service/nginx-stps        ClusterIP   None         <none>        80/TCP    2m47s

NAME                   READY   AGE
statefulset.apps/web   3/3     2m47s

sansae@sansaeAir15m2 k8s-lab-workspace % k get statefulset
NAME   READY   AGE
web    3/3     48m

sansae@sansaeAir15m2 k8s-lab-workspace % k describe statefulset web 
Name:               web
Namespace:          default
CreationTimestamp:  Sat, 09 Mar 2024 21:52:14 +0900
Selector:           app=nginx
Labels:             <none>
Annotations:        <none>
Replicas:           3 desired | 3 total
Update Strategy:    RollingUpdate
  Partition:        0
Pods Status:        3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        registry.k8s.io/nginx-slim:0.8
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /usr/share/nginx/html from www (rw)
  Volumes:  <none>
Volume Claims:
  Name:          www
  StorageClass:  azurefile
  Labels:        <none>
  Annotations:   <none>
  Capacity:      1Gi
  Access Modes:  [ReadWriteOnce]
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  48m   statefulset-controller  create Claim www-web-0 Pod web-0 in StatefulSet web success
  Normal  SuccessfulCreate  48m   statefulset-controller  create Pod web-0 in StatefulSet web successful
  Normal  SuccessfulCreate  47m   statefulset-controller  create Claim www-web-1 Pod web-1 in StatefulSet web success
  Normal  SuccessfulCreate  47m   statefulset-controller  create Pod web-1 in StatefulSet web successful
  Normal  SuccessfulCreate  47m   statefulset-controller  create Claim www-web-2 Pod web-2 in StatefulSet web success
  Normal  SuccessfulCreate  47m   statefulset-controller  create Pod web-2 in StatefulSet web successful

# Headless Service확인
sansae@sansaeAir15m2 k8s-lab-workspace % k exec -it util -- bash
root@util:/# curl nginx-stps
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.11.1</center>
</body>
</html>

root@util:/# nslookup nginx-stps
Server:		10.0.0.10
Address:	10.0.0.10#53

Name:	nginx-stps.default.svc.cluster.local
Address: 10.244.0.106
Name:	nginx-stps.default.svc.cluster.local
Address: 10.244.0.107
Name:	nginx-stps.default.svc.cluster.local
Address: 10.244.0.108

root@util:/# exit

sansae@sansaeAir15m2 k8s-lab-workspace % k get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP             NODE                                NOMINATED NODE   READINESS GATES
util    1/1     Running   0          14m     10.244.0.105   aks-agentpool-33019784-vmss000000   <none>           <none>
web-0   1/1     Running   0          8m4s    10.244.0.106   aks-agentpool-33019784-vmss000000   <none>           <none>
web-1   1/1     Running   0          7m44s   10.244.0.107   aks-agentpool-33019784-vmss000000   <none>           <none>
web-2   1/1     Running   0          7m24s   10.244.0.108   aks-agentpool-33019784-vmss000000   <none>           <none>


...