본문 바로가기
네트워크/k8s

[k8s] 36. StatefulSet - 실습

by Lauren X Ming 2021. 2. 25.

업그레이드된 대시보드

토큰

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oaGdsZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU5Mjg5M2UzLWQzMzgtNDk4My1hNzJmLWFhZTMxZjc1ZTM3MyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.zslE1__FJVOyg4k4du9zL_g92p28U9y9X7-gRqX5c6-f5LtS7dufrgjv3U714QQYpLEasDAHLBmFfwLgaiJiYd3iMYJItCTRyq5fz2J-ysvbu5KC4ty60gMWXFmHTT6kvqC3wY4kfyPKihjj3PGnwEIvKMwslFD6yv2fkJy2wz9qsDpH6fxZGlMA9c9rU5a-OlT-_K3raoEUvT2Y3c-MG1IMHemwy3-qrI6yjTuflkvH2UovtOUcSF3OGKDX12vE2My-gVLEo2DghvJWn4Jc84Yl2-ii1T2neEPP5yuIsQx3uCGxJ7ZILPQHqxrP4W1gfnqkme4-yyOrkiRXJdrtZQ

StatefulSet - 실습

image

1. StatefulSet Controller

image

  • ReplicaSet과 StatefulSet을 만들어서 이론에 설명한 내용이 잘 작동하는지 확인할 예정

ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica-web
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web
  template:
    metadata:
      labels:
        type: web
    spec:
      containers:
      - name: container
        image: kubetm/app
      terminationGracePeriodSeconds: 10
  • terminationGracePeriodSeconds: 10: 삭제될 때 10초 후에 삭제

StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: stateful-db
spec:
  replicas: 1
  selector:
    matchLabels:
      type: db
  template:
    metadata:
      labels:
        type: db
    spec:
      containers:
      - name: container
        image: kubetm/app
      terminationGracePeriodSeconds: 10

실습 과정

  1. ReplicaSet 생성
  2. StatefulSet 생성
  3. ReplicaSet과 StatefulSet이 생성한 파드 이름 비교
    image
  4. 각각 replicas를 3으로 올리기
  5. 다시 두 컨트롤러의 파드 이름 비교
    image
    ReplicaSet은 한 번에 만들고, StatefulSet은 하나하나씩 만듦
  6. ReplicaSet의 파드 삭제 --> 삭제와 동시에 새로운 파드를 만듦
  7. StatefulSet의 파드 삭제 --> 삭제를 하고, 삭제가 다 되면 똑같은 이름의 파드 생성
  8. ReplicaSet의 replicas를 0으로 줄이기 --> 10초 후 전부 다 삭제
  9. StatefulSet의 replicas를 0으로 줄이기 --> 10초마다 인덱스가 높은 순으로 삭제

2. PersistentVolumeClaim

image

  • PVC와 PV를 만들고 ReplicaSet으로 만든 파드와 연결하고 replicas를 늘릴 예정

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: replica-pvc1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: "fast"
  • storageClassName을 사용해서 동적으로 PV를 만듦

ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica-pvc
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web2
  template:
    metadata:
      labels:
        type: web2
    spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node1
      containers:
      - name: container
        image: kubetm/init
        volumeMounts:
        - name: storageos
          mountPath: /applog
      volumes:
      - name: storageos
        persistentVolumeClaim:
          claimName: replica-pvc1
      terminationGracePeriodSeconds: 10
  • 컨테이너에 volume mount를 함
  • /applog에 서비스 로그파일을 생성
  • persistentVolumeClaimclaimName에 PVC replica-pvc1가 지정되어 있음
  • nodeSelector로 PV나 파드가 node1에 생김
  • replicas를 5로 하고, nodeSelector를 빼고 만들면 파드가 서로 다른 노드에 지정되어 오류 발생

StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: stateful-pvc
spec:
  replicas: 1
  selector:
    matchLabels:
      type: db2
  serviceName: "stateful-headless"
  template: 
    metadata:
      labels:
        type: db2
    spec:
      containers:
      - name: container
        image: kubetm/app
        volumeMounts:
        - name: volume
          mountPath: /applog
      terminationGracePeriodSeconds: 10
  volumeClaimTemplates:
  - metadata:
      name: volume
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1G
      storageClassName: "fast"
  • volumeClaimTemplates: PersistentVolumeClaim 생성 시 이대로 만들어짐
    • metadata의 name은 template의 volumeMounts의 name과 같아야함
  • serviceName이 stateful-headless임 --> 이따가 headless 서비스 만들 때 이 이름과 맞춰야 함
  • 라벨이 type: db2

실습 과정

  1. PersistentVolumeClaim 생성
  2. ReplicaSet 생성
  3. ReplicaSet으로 만든 파드의 쉘에 들어가서 다음 명령어로 파일 생성
    touch /applog/server.log
  4. ReplicaSet의 replicas를 3으로 늘리기 --> 파드들이 한 PVC에 연결됨
  5. 4에서 생성한 파드 하나의 쉘에 들어가서 다음 명령어 실행
    cd /applog/
    ls
    image
    server.log가 조회됨
  6. StatefulSet 생성
  7. StatefulSet이 생성한 파드의 쉘로 들어가 다음 명령어 실행
    cd /applog
    touch server.log
  8. StatefulSet이 생성한 Persistent Volume Claim 이름 살펴보기
    image
    volume-stateful-pvc-0: volume 이름 + - + pod 이름
  9. StatefulSet의 replicas 3으로 늘리기
    image
    image
    노드가 자원 상황에 맞춰서 할당됨
  10. StatefulSet으로 만든 volume-stateful-pvc-1의 쉘에 들어가서 파일 확인
    cd /applog
    ls
    없음
    각각의 App에 맞는 PVC가 연결됨
  11. volume-stateful-pvc-1의 쉘에서 다음 명령어로 파일 만들기
    cd /applog
    touch db1.txt
  12. volume-stateful-pvc-1 삭제 후 재생성된 파드에서 db1.txt 존재하는지 확인 --> 존재함
  13. StatefulSet의 replicas를 0으로 줄이기 --> 순차적으로 하나씩 삭제됨
    PVC는 삭제되지 않음

3. Headless Service

image

Service (Headless)

  • Headless 서비스를 만들고 파드와 연결하고
  • 새로운 파드 request-pod에서 원하는 파드로 도메인 이름을 사용하여 연결할 예정
apiVersion: v1
kind: Service
metadata:
  name: stateful-headless
spec:
  selector:
    type: db2
  ports:
    - port: 80
      targetPort: 8080    
  clusterIP: None
  • StatefulSet의 정의에 맞춰 name, selector 설정
  • clusterIP: None으로 해서 headless 서비스 만들기

Pod

apiVersion: v1
kind: Pod
metadata:
  name: request-pod
spec:
  containers:
  - name: container
    image: kubetm/init

실습 과정

  1. 이전에 만든 StatefulSet의 replicas를 3으로 바꿔놓기
  2. headless Service 생성
    image
  3. request-pod 생성
  4. request-pod의 쉘에 들어가서 다음 명령어 입력
    nslookup stateful-headless
    image
    쿠버네티스 내부 DNS를 통해서 headless에 연결된 pod의 아이피 주소를 알 수 있음
  5. request-pod의 쉘에 들어가서 다음 명령어 입력하여 파드와 직접 연결
    curl stateful-pvc-0.stateful-headless:8080/hostname
    image
    도메인 이름으로 원하는 파드에 연결할 수 있음

출처

인프런 - 대세는 쿠버네티스

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 38. Ingress - 실습  (0) 2021.02.25
[k8s] 37. Ingress - Nginx  (0) 2021.02.25
[k8s] 35. StatefulSet  (0) 2021.02.25
[k8s] 34. Kubernetes Dashboard - 실습  (0) 2021.02.24
[k8s] 33. Kubernetes Dashboard  (0) 2021.02.24