9. [중급편] Controller

데일리·2024년 1월 4일
0

1. Replicaset vs StatefulSet


Stateless Application(Web Server)

  • App이 여러개 배포되어도 모두 서비스 역할을 할 수 있다.
  • 하나의 App에 트래픽이 집중되면 문제가 발생할 수 있기 때문에 여러 App에 트래픽을 나눠서 요청한다.
  • 각 App마다 Volumn이 필수는 아니고 여러 App들이 Volumn을 공유할 수 있다.

Stateful Application(Database)

  • App이 여러개 생성되면 각각의 App마다 역할이 주어진다.
  • 각각의 앱마다 역할이 있기 때문에 특정 앱이 죽은 앱과 같은 역할을 하는 앱이 생성되어야한다. 따라서 앱의 이름이 중요하다.
  • 각 App마다 역할이 있기 때문에 볼륨이 각각 필요하다.

Pod 관리

ReplicatSetStatefulSet
생성Radom으로 이름 생성Index로 이름이 생성
여러개 생성 시동시 생성순차 생성
삭제 시새 이름으로 생성기존 이름으로 생성
replicas 0 설정 시동시 삭제index가 높은 순으로 순차적 삭제

PV 및 PVC 관리

ReplicatSetStatefulSet
생성PV와 연결하려면 PVC를 직접 생성volumnClaimTemplete를 통해 pvc 동적 생성
Pod가 여러개 일 경우모두 하나의 PVC를 바라본다각각의 Pod마다 PVC와 PV를 가지고 있다
삭제 시새 이름으로 생성되고 기존 PVC 연결기존 이름으로 생성되고 기존 PVC 연결
replicas 0 설정 시모두 삭제Pod은 삭제가 되지만 PVC, PV는 유지 된다.

**주의 할점**

  • replicaset에서는 PVC가 들어있는 노드에 해당 pod들도 들어있어야한다.(nodeSelector 사용)
  • StatefulSet은 각각의 PVC가 존재하기 때문에 노드의 위치는 상관이 없다.

2. 실습

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"

metadata의 name과 volumnMount의 name은 같아야한다, 또한 위와 같이 volumnClaimTemplete을 지정해 놓으면 PVC이름은 metatdata의 이름(volumn)이 앞에 붙는다.

apiVersion: v1
kind: Service
metadata:
  name: stateful-headless
spec:
  selector:
    type: db2
  ports:
    - port: 80
      targetPort: 8080    
  clusterIP: None

metadata의 name은 statefulSet의 serviceName과 같아야 한다.

3. Ingress


각각의 Pod마다 기능별로 배포가 되어있었을 때에 기존에는 Path에 따라 서비스로 연결을 해줘야 했다, 하지만 Ingress를 통해 domain에 따라 각각의 서비스에 연결이 가능하게 되었다.

목적

  • Service LoadBalancing
  • Canary Ugrade
  • https

ServiceLoadBalancing


위의 그림처럼 도메인의 path를 통해 ingress 컨트롤러가 rule에 지정된 서비스로 연결을 시켜준다.

Canary Upgrade


새로운 버전을 테스트 및 배포할 때 사용된다.

  • @weight 설정을 통해 해당 비율만큼만 설정된 서비스로 연결을 할 수 있다.
  • @header 설정을 통해 지저된 헤더값을 가지고 서비스 연결을 특정할 수 있다.

https

  • pod 자체에서 인증서 구현이 어려울 경우 사용
  • Ingress에서 Secret 인증서 지정 후 해당 DNS로 연결이 들어오면 인증을 해준다.

4. Autoscaler

파드와 CPU와 메모리 자원 할당을 조절하는 서비스

HPA

부하가 생기면 Pod의 개수를 확장(Scale-Out/Scale-In)

  • 장애가 날 수 있는 상황으로 고려하여 구현하기 때문에 기동이 빠르게 되는 App에 사용된다.
  • Stateless App에 사용(StatefulSet은 각 pod마다 역할이 있는데 이를 HPA가 구분하지 못하기 때문)

VPA

부하가 생기면 Pod의 리소스를 확장(Scale-Up/Scale-Down)

  • Stateful App에서 사용
  • 한 컨트롤러에서 HPA와 동시에 사용불가

CA

클러스터 노드에 자원이 없을 경우 노드를 동적으로 추가 및 삭제 해준다.

  • 부하가 생기면 스케줄러가 등록된 Cloud Provider에 노드를 추가 및 삭제한다.

5. HPA

업로드중..

  • HPA에 해당 deployment 지정 후 max/min replicas 설정
  • Target type에 따라 value가 달라진다
    • Utilization: 리소스의 %
    • AverageValue: 리소스의 평균값 지정
    • Value: 실제 값을 지정
  • 지정된 value로 공식을 통해 replicas 값을 설정한다.
  • 그 밖에 metric type을 설정할 수 있는데 pod을 설정해 pod의 들어오는 패킷 수 및 정보를 확인 할 수 있고 다른 objects를 설정하여 그 밖에 컴포넌트에 접근할 수 있다.
profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글