sungsu9022 / study-kubernetes-in-action

study-kubernetes
12 stars 8 forks source link

10. 스테이트풀셋: 복제된 스테이트풀 애플리케이션 배포하기 #10

Open sungsu9022 opened 4 years ago

sungsu9022 commented 4 years ago

10. 스테이트풀셋: 복제된 스테이트풀 애플리케이션 배포하기

볼륨이나 퍼시스턴트볼륨클레임에 바인딩된 퍼시스턴트볼륨을 통해서 데이터베이스를 일반 파드에 실행했었는데, 이 파드들을 스케일아웃하려면 어떻게 할수 있을지 살펴본다.

10.1 스테이트풀 파드 복제하기

스크린샷 2020-09-01 오후 10 56 49

10.1.1 개별 스토리지를 갖는 레플리카 여러 개 실행하기

수동으로 파드 생성하기

파드 인스턴스별로 하나의 레플리카셋 사용하기

스크린샷 2020-09-01 오후 10 59 00

동일 볼륨을 여러 개 디렉터리로 사용하기

스크린샷 2020-09-01 오후 11 00 04

10.1.2 각 파드에 안정적인 아이덴티티 제공하기

각 파드 인스턴스별 전용 서비스 사용하기

스크린샷 2020-09-01 오후 11 02 13

10.2 스테이트풀셋

10.2.1 스테이트풀셋과 레플리카셋 비교

애완동물 vs 가축

스테이트풀셋 - 애완동물
레플리카셋 - 가축

10.2.2 안정적인 네트워크 아이덴티티 제공하기

스크린샷 2020-09-01 오후 11 07 09

거버닝 서비스

스테이트풀셋 교체하기

스크린샷 2020-09-01 오후 11 13 48

스테이트풀셋 스케일링

스크린샷 2020-09-01 오후 11 15 05

10.2.3 각 스테이트풀 인스턴스에 안정적인 전용 스토리지 제공하기

볼륨 클레임 템플릿과 파드 템플릿을 같이 구성

스크린샷 2020-09-01 오후 11 23 14

퍼시스턴트볼륨클레임의 생성과 삭제의 이해

동일 파드의 새 인스턴스에 퍼시스턴트볼륨클레임 다시 붙이기

스크린샷 2020-09-01 오후 11 26 04

10.2.4 스테이트풀셋 보장(guarantee)

안정된 아이덴티티와 스토리지의 의미

스테이트풀셋 최대 하나의 의미

10.3 스테이트풀셋 사용하기

10.3.1 스테이트풀셋을 위해 준비사항

10.3.2 스테이트풀셋 배포

퍼시스턴트볼륨 생성

kind: List                        # 여러개의 리소스를 정의할때 List를  사용할 수 있다.
apiVersion: v1
items:
- apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv-a
  spec:
    capacity:
      storage: 1Mi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    hostPath:
      path: /tmp/pv-a
- apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv-b
  spec:
    capacity:
      storage: 1Mi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    hostPath:
      path: /tmp/pv-b
- apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: pv-c
  spec:
    capacity:
      storage: 1Mi
    accessModes:
      - ReadWriteOnce
    persistentVolumeReclaimPolicy: Recycle
    hostPath:
      path: /tmp/pv-c
# 볼륨 생성
kubectl create -f persistent-volumes-hostpath.yaml

거버닝 서비스 생성하기

 apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  clusterIP: None          # 헤드리스 서비스를 위함
  selector:
    app: kubia
  ports:
  - name: http
    port: 80
#  거버닝 헤드리스 서비스 생성
kubectl create -f kubia-service-headless.yaml

스테이트풀셋 생성하기

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kubia
spec:
  serviceName: kubia
  replicas: 2
  selector:
    matchLabels:
      app: kubia # has to match .spec.template.metadata.labels
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia-pet
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:                 # 볼륨 마운트
        - name: data
          mountPath: /var/data
  volumeClaimTemplates:          # 볼륨클레임 템플릿
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 1Mi
      accessModes:
      - ReadWriteOnce
# 스테이트풀셋 생성
kubectl create -f kubia-statefulset.yaml

# statefulset 조회
kubectl get statefulset

# pod 조회
kubectl get po | grep kubia-

# 생성된 statefulset pod 조회
kubectl get po kubia-0 -o yaml

10.3.3 생성된 파드 확인

# api server local 프록시
kubectl proxy

# 파드 엔드포인트 조회
curl localhost:8001/api/v1/namespaces/default/pods/kubia-0/proxy/
curl localhost:8001/api/v1/namespaces/default/pods/kubia-1/proxy/
스크린샷 2020-09-01 오후 11 45 43

스테이트풀셋 파드를 삭제해 재스케줄링된 파드가 동일한 스토리지에 연결되는지 확인

# 스테이트풀셋 파드 데이터 수정
curl -X POST -d "Hey three! This greeting was submitted to kubia-0." localhost:8001/api/v1/namespaces/default/pods/kubia-0/proxy/

# 변경한 파드 삭제(삭제하면 직후 스테이트풀셋이 새로운 파드를 생성한다.)
kubectl delete po kubia-0

# 재확인(수정한 데이터가 그대로 남아있음.)
curl localhost:8001/api/v1/namespaces/default/pods/kubia-0/proxy/

스테이트풀셋 스케일링

스테이트풀 파드를 헤드리스가 아닌 일반적인 서비스로 노출하기

apiVersion: v1
kind: Service
metadata:
  name: kubia-public
spec:
  selector:
    app: kubia
  ports:
  - port: 80
    targetPort: 8080

API 서버를 통해 클러스터 내부 서비스에 연결

# cluster ip service 호출
curl localhost:8001/api/v1/namespaces/default/services/kubia-public/proxy/
``

## 10.4 스테이트풀셋의 피어 디스커버리
 - 클러스터된 애플리케이션의 중요한 요구사항은 피어 디스커버리(클러스터의 다른 멤버를 찾는 기능)이다.
 - API서버와 통신해서 찾을수 있지만, 쿠버네티스의 목표 중 하나는 애플리케이션을 완전히 쿠버네티스에 독립적으로 유지하며 기능을 노출하는 것이다.

### SRV 레코드
 - srvlookup이라 부르는 일회용 파드(--restart=Never)를 실행하고 콘솔에 연결하며(-it) 명령어를 수행하고 종료되며, 바로 삭제된다.(--rm)
 - ANSWER SECTION에는 헤드리스 서비스를 뒷받침하는 두 개의 파드를 가리키는 두 개의 SRV 레코드를 확인할 수 있다.
 - 파드가 스테이트풀셋의 다른 모든 파드의 목록을 가져오려면 SRC DNS 룩업을 수행해서 얻을수 있다는 것이다.

``` sh
# srvlookup을 할수 있는 dnsutils pod을 하나 수행시켜서 명령어를 수행하고 파드 종료
kubectl run -it srvlookup --image=tutum/dnsutils --rm --restart=Never -- dig SRV kubia.default.svc.cluster.local

;; ANSWER SECTION:
kubia.default.svc.cluster.local. 30 IN  SRV 0 50 80 kubia-0.kubia.default.svc.cluster.local.
kubia.default.svc.cluster.local. 30 IN  SRV 0 50 80 kubia-1.kubia.default.svc.cluster.local.

;; ADDITIONAL SECTION:
kubia-1.kubia.default.svc.cluster.local. 30 IN A 172.17.0.8
kubia-0.kubia.default.svc.cluster.local. 30 IN A 172.17.0.3

10.4.1 DNS를 통한 피어 디스커버리

import dns from 'dns'

dns.resolveSrv(serviceName, (err, addresses) {
    // TODO 무언가 처리
})
스크린샷 2020-09-02 오후 10 05 36

10.4.2 스테이트풀셋 업데이트

# 편집기로 statefulset 정의 열어서 수정
kubectl edit statefulset kubia

# pod 확인
kubectl get po

10.4.3 클러스터된 데이터 저장소 사용하기

10.5 스테이트풀셋이 노드 실패를 처리하는 과정