갬미의 성장일기

Day 56 - 3tier 구성하기, StatefulSet 본문

Cloud/Cloud 공부일기

Day 56 - 3tier 구성하기, StatefulSet

갬미 2022. 3. 30. 23:18

오늘 배운 내용

- StatefulSet

- 지금까지 배운 내용 + StatefulSet 을 사용해서 3tier 구성하기

 


StatefulSet

pod는 두가지 종류가 있다

1. stateless - session 정보가 없는 pod

2. stateful - session 정보를 가진 pod 

 

pod를 생성하는 방법중 statefulset이 있다

statefulset으로 만들어진 pod는 stateful 상태가 된다

1. RS -> stateless

2. Deployset -> stateless

3. DaemonSet -> stateless

4. StatefulSet -> stateful

 

파드의 이름이 고정되어 순서대로 생성되고 삭제 되기때문에 주로 파드가 만들어지는 순서나 이름을 예측할 필요가 있는 시스템에서 많이 사용한다 

     nginx-1 / nginx-2 / nginx-3 ....

    - pod를 삭제하면 똑같은 이름을 가진 pod가 생기고 같은 역할을 함

 

statefulset은 volumeClaimTemplates 기능을 사용해 pvc를 자동으로 생성할수있고, 이때 생성된 pvc가 사라지지 않는 한 같은 이름을 가진 pod는 pvc를 공유한다

pod이름이 web-0, web-1 로 생성되었다

저절로 pvc disk가 생김

 

pvc가 사라지기 전까지 같은 이름의 pod는 같은 pvc를 공유하므로, pod가 죽었다가 같은 이름을 가진 새로운 pod가 생겼다고 하더라도 pvc에 저장된 data는 계속해서 남아있다

 

DB 시스템은 거의 대부분 statefulset을 이용하며 was SessionAffinity에도 사용할 수 있다

was의 session은 어디에 있을까?

- was의 메모리에 있음 login session 정보는 was가 가지고 있다

- 메모리에 가지고 있다 = 메모리 DB에 가지고 있다 --> 이걸 빼서 완벽한 sesssion 보존을 함

메모리에 가지고있는 경우 was pod가 꺼지면 모두 사라짐

--> 세션처리용 DB를 따로 저장한다

모든 세션은 pod가 아닌 memory DB가 가지고 있다

특히 Auto Scale을 사용하는 경우 was pod 가 생겼다가 줄었다가 하기 때문에 이 방법이 필수로 사용된다

 

정리하자면

pod가 session을 가지고있으면 stateful -> pod가 죽으면 세션이 모두 사라진다

따라서 pod에 session을 없애고 (stateless로 만들고) 세션이 저장되는 메모리는 따로 session용 DB에 따로 저장하여 세션 정보는 따로 저장하도록 한다

 

+ headless

statefulset는 pod를 clusterIP: None으로 생성한다

이는 외부에 statefulset을 노출하지 않겠다는 말인데 ip를 가지지 않기 때문에 클러스터 내부적에서 도메인 이름으로 통신할 수 있다

CoreDNS에서 클러스터 내에서 도메인이름으로 pod와 통신 가능하게하며, pod는 podname.svcname으로 도메인 통신 가능하다

 

StatefulSet 실습

https://cloud.google.com/kubernetes-engine/docs/concepts/statefulset?hl=ko 

 

StatefulSet  |  Kubernetes Engine 문서  |  Google Cloud

의견 보내기 StatefulSet 이 페이지에서는 Kubernetes의 StatefulSet 객체와 Google Kubernetes Engine(GKE)에서 이를 사용하는 방법을 설명합니다. 또한 스테이트풀(Stateful) 애플리케이션 배포도 설명합니다. 개요

cloud.google.com

stateful smaple.yml

 

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None # headless
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

replicas를 줄이면 2->1->0 지워진다

다시 개수를 늘리면 0>1>2>... 순으로 만들어짐

 

pod-name.svc-name 으로 원하는 pod에 접근가능 (같은 cluster 안에서)

ex. ping mysql-0.mysql-svc

 

미니과제

StatefulSet으로 DB 파드를 만들고 3tier 구성하기

- ingress 사용 X

 

Initializing mysql directory error 발생시 다음 참고

 

Initializing mysql directory error

I checked this page: http://dev.mysql.com/doc/refman/5.7/en/mysql-install-db.html mysql_install_db is removed, however, when I use mysqld --initialize. It promotes these errors and warning. [Warn...

stackoverflow.com

다음 추가

image: mysql:5.7
args:
  - "--ignore-db-dir=lost+found"

오늘의 회고

  • 스테이트풀셋 ,, 머리가 터져버리는줄 알았다 지금 다시 정리해보니까 나름 괜찮아보이기도 하고,,, 내일 또 다시 실습해보기로 했다!
  • 야물파일은 git에 올린다 .. 
Comments