[K8S] local PV, PVC 를 활용한 StatefulSet 생성하기

sang yun Lee·2024년 2월 25일
0

k8s

목록 보기
15/18
post-thumbnail

🧸 개요


나는 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

🔹 기초 컴포넌트 생성

🔸 STEP 1 : 각 노드에 폴더 생성

# 각 노드에 접속한다.
ssh <hostname>@<username>
# 각 노드에 pv 의 경로가 될 폴더 생성
sudo mkdir -p /mnt/common
/mnt/common

🔸 STEP 2 : StorageClass 생성

StorageClass 파일 생성

# 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 객체 생성

# storageClass 생성
$ kubectl -f storageclass.yaml

🔸 STEP 3 : 네임스페이스 생성

# storageClass 생성
$ kubectl create ns devops-tools

🔹 PV 생성

🔸 STEP 1 : PV 파일 생성

아래에서 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

🔸 STEP 2 : PV 객체 생성

kubectl apply -f pv.yaml

🔹 PVC 생성

🔸 STEP 1 : PVC 파일 생성

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

🔸 STEP 2 : PVC 객체 생성

kubectl apply -f pvc.yaml

🔹 StatefulSet 생성

🔸 STEP 1 : StatefulSet 파일 생성

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

🔸 STEP 2 : StatefulSet 객체 생성

kubectl apply -f statefulset.yaml

관련 내용을 정리한 실습용 깃허브 링크입니다.
https://github.com/SangYunLeee/kubernetics-example/tree/main/statefulset-example

참고문헌

0개의 댓글