- Created by Sansae, last modified on Mar 06, 2024
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 23 Next »
목차
StatefulSet개요
- 애플리케이션의 상태를 저장하고 관리하는 데 사용되는 쿠버네티스 객체
- 기존의 포드를 삭제하고 생성할 때 상태를 유지해 줍니다.
- 안정된, 고유한 네트워크 식별자
- 안정된, 지속성을 갖는 스토리지
- 순차적인, 정상배포와 스케일링
- 순차적인, 자동 롤링 업데이트
- Statefulset 관련 Volume이 삭제되지 않으므로 관리가 필요
- Pod의 Storage는 PV나 StorageClass로 Provisioning이 필요
- RollingUpdate를 수행하는 경우 수동으로 복구해야 할 수 있음 (기존의 스토리지와 충돌)
- Pod 네트워크ID를 유지하기 위해 Headless서비스 필요
StatefulSet Manifest
https://dev-k8sref-io.web.app/docs/workloads/statefulset-v1/
apiVersion: apps/v1
kind: StatefulSet
metadata (ObjectMeta)
- spec (StatefulSetSpec)
- serviceName
- selector
- template
- replicas
- status (StatefulSetStatus)
Headless 서비스 작성 방법 (ClusterIP가 없는 서비스)
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: ngin
StorageClass확인
StorageClass Expand source
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
statefulset.yaml
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 실습
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>
- No labels