나는 StatefulSet 을 필요로 할 일이 생겼다. 두개의 노드에 각각 하나의 파드가 생성되어야 하고 각각의 파드는 현재 실행되고 있는 파드의 노드의 볼륨을 사용하도록 해야되었다. 그래서 결국 테스트를 완료하였고 이를 실습 위주로 공유하려 한다.
( 개념에 대해서도 공유하면 좋겠지만 개념은 많은 곳에서 검색해서 찾아볼 수 있으니까 ... ! 그래도 궁금한 점이 있으면 sororiri@gmail.com 으로 메일을 남겨주세요 )
실습을 따라하면 아래와 같이 pod 가 2개인 statefulset 을 생성할 수 있다.
현재 실습은 아래의 sub
노드와 sub2
노드를 대상으로 컴포넌트들을 생성할 예정입니다.
$ kubectl get node
NAME STATUS ROLES AGE VERSION
com Ready control-plane 156d v1.28.2
sub Ready <none> 124d v1.27.6
sub2 Ready <none> 153d v1.27.6
# 각 노드에 접속한다.
ssh <hostname>@<username>
# 각 노드에 pv 의 경로가 될 폴더 생성
sudo mkdir -p /mnt/common
/mnt/common
# StorageClass 파일 생성
$ cat << EOF > storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
# storageClass 생성
$ kubectl -f storageclass.yaml
# storageClass 생성
$ kubectl create ns devops-tools
아래에서 sub
, sub2
를 자신의 노드 1, 노드 2의 name 으로 정정한다.
# PV 파일 생성
$ cat << EOF > pv.yaml
# 첫번째 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv-volume-0
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: myclaim-mysts-0
namespace: devops-tools
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/common
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- sub # <자신의 노드 1의 name 으로 변경>
---
# 두번째 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv-volume-1
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: myclaim-mysts-1
namespace: devops-tools
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/common
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- sub2 # <노드 2의 name 으로 변경>
EOF
kubectl apply -f pv.yaml
cat << EOF > pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jmyclaim-mysts-0
namespace: devops-tools
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim-mysts-1
namespace: devops-tools
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
EOF
kubectl apply -f pvc.yaml
cat << EOF > statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: devops-tools
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysts
namespace: devops-tools
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myclaim
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myclaim
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "local-storage"
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f statefulset.yaml
관련 내용을 정리한 실습용 깃허브 링크입니다.
https://github.com/SangYunLeee/kubernetics-example/tree/main/statefulset-example