engal1991 / Docker-Kubernetes

0 stars 0 forks source link

[13장: 포드를 사용하는 다른 오브젝트들] 13.3 스테이트풀셋(StatefulSets) #51

Open engal1991 opened 2 years ago

yuodsa1 commented 2 years ago

쿠버네티스 > 애플리케이션에서는 상태를 가지지 않는 경우가 많은데, Mysql Redis 같이 데이터를 가지고 있어야하는 친구들을 쿠버네티스에서 사용할 떄는 데이터를 영속성을 가지고 있어야하기 때문에 이를 스테이트풀셋을 사용하여 활용할 수 있다.

스테이트풀셋은 고유한 이름을 지정함으로서 다른 포드들과 고유함을 가집니다. 스테이트풀셋은 고유한 이라는 점을 포커스되어있는 오브젝트이기에 일반적인 서비스로 묶여져 있다면, 지정되서 트래픽을 받는게 아닌 서비스에서 로드밸런싱이 되서 랜덤으로 트래픽을 받습니다. 이건 고유한 이라는 부분에서 옳지않아서 스테이트풀셋은 다른 서비스 타입을 사용합니다.

[2]과 같이 타입이 None으로 이를 헤드리스 서비스라고 하며, 서비스의 이름으로 포드의 접근 위치를 알아내기 위해 사용됩니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-example
spec:
  serviceName: statefulset-service # 고유한 이름 설정..!!
  selector:
    matchLabels:
      name: statefulset-example
  replicas: 3
  template:
    metadata:
      labels:
        name: statefulset-example
    spec:
      containers:
      - name: statefulset-example
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80
          name: web
---
apiVersion: v1
kind: Service
metadata:
  name: statefulset-service
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None  -- [ 2 ]
  selector:
    name: statefulset-example

이 포드들이 여러개 생성된다면 0,1,2,3 이렇게 뒤에 붙는다. ( jenkins 이름 확인해보면 0,1,2,3이 붙는다 )

스테이트풀셋과 퍼시스턴트 볼륨

파드안에 데이터는 휘발성이기때문에 스테이트풀셋은 퍼시스턴트 볼륨과 한쌍이라고 할 수 있는데, 스테이풀셋이 여러가지고, 이를 배포할 떄? pv를 사용하기 위해 pvc(pc 클레임) 을 파드마다 생성해야하는데, 스테이트풀셋에서는 pvc를 다이나믹 프로비저닝 하게끔 항목을 제공합니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-volume
spec:
  serviceName: statefulset-volume-service
  selector:
    matchLabels:
      name: statefulset-volume-example
  replicas: 3
  template:
    metadata:
      labels:
        name: statefulset-volume-example
    spec:
      containers:
      - name: statefulset-volume-example
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: webserver-files                 <--- 요기랑
          mountPath: /var/www/html/
  volumeClaimTemplates:                       <--- 요기가
  - metadata:
      name: webserver-files
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: generic
      resources:
        requests:
          storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: statefulset-volume-service
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None
  selector:
    name: statefulset-volume-example