본문 바로가기

웹 프로그래밍/스프링

쿠버네티스(k8s) 기본 원리

Load Balancing, Service Discovery

웹 서비스는 얼마만큼의 컴퓨터 자원이 필요한지 사전에 알기 어렵다

  • Scale Up을 진행하기 어렵다
  • Load Balancing과 Service Discovery가 중요한 이유

 

무중단 배포

웹 서비스는 사용자가 언제든지 접속하고 있을수 있다

  • 접속 중에 업데이트를 진행하면 서비스가 중단될수도 있다. 
  • 어떻게 하면 사용자의 서비스 중단 없이 업데이트를 진행할 것인가?

 

쿠버네티스의 등장

Container Orchestration

도커의 컨테이너는 애플리케이션 배포에 인프라에 대한 고민을 많이 줄여주었다

  • 다양한 서버에 배포하면서 환경을 일정하게 유지할수 있으며
  • 상대적으로 가볍기 때문에 빠르게 전달하고 실행할수 있다

이 컨테이너의 배포, 확장, 관리를 자동화 하는 것을 Container Orchestration이라고 부른다

-> 쿠버네티스(Kubernetes)는 서버 자원을 묶어서 관리하고 컨테이너의 관리를 자동화하는 시스템이다

 

 

쿠버네티스(Kubernetes)

대표적인 Container Orchestration System (배포의 모든 어려움을 커버함)

  • 컨테이너를 수평적으로 늘리며(Horizontal Pod Autoscaler), Load Balancing(부하를 나눠줌)를 관리
  • 컨테이너 모음의 순차적 업데이트를 통한 무중단 배포 가능(Rolling update)
  • 컨테이너 실행에 필요한 자원을 가진 컴퓨터를 자동 식별(Service Discovery)

 

Kubernetes Cluster

쿠버네티스가 컨테이너를 관리하기 위한 여러 머신(컴퓨터)의 묶음

  • Node: 개별 컴퓨터 자원
  • Pod: 각각 노드위에서 실행되는 컨테이너 또는 컨테이너 모음(여러 컨테이너가 한 애플리케이션일수 있음)
  • Control Plane: Cluster 전체를 관리하고 API를 외부에 노출하여 통신(kubectl 이라는 명령어로 컨트롤 가능)

 

 

대표적인 kubectl 명령어

먼저 클러스트의 설정파일(kubeconfig.yaml)을 받아야한다 -> 어떤 클러스트인지 정보가 담겨있음

 

kubectl get nodes (현재 클러스터의 노드들 정보보기)

 

kubectl get svc

 

nslookup

 

kubectl set image deployment/[DEPLOYMENT_NAME] [CONTAINER_NAME]=[NEW_IMAGE]:[TAG]

(명령어 하나만으로 자동으로 롤링 업데이트가 됨)

 

kubectl create secret docker-registry regcred --docekr-server <yours> --docker-name <yours> --dcoker-password <yours> --docker-email <yours> (해당 도커 레지스트리에 접근하기 위한 시크릿키 생성)

 

kubectl  logs -f <파드 이름> (해당 파드의 로그 실시간 출력)

 

kubectl apply -f my-hpa.yaml(오토스케일링을 위한 설정을 적용하라는 명령어)

kubectl apply -f deployment-file.yaml(배포 방법에 대한 설정을 적용하라는 명령어)

-> 이 두개의 yaml 파일을 적용해야 오토스케일링과 로드밸런싱 적용이 가능하다.

 

kubectl descibe hpa my-hpa -n default

(내 yaml 설정이 잘 적용이 되었는지 확인)

 

 

my-hpa.yaml 내용 (cpu 사용률이 50% 이상이면 AutoScaling을 진행하고 만약 10분이내에 cpu 사용률이 50% 이하라면

1분 간격으로 Scale down 하라)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment
  minReplicas: 1
  maxReplicas: 5
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 600  # 10분 동안 유지
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

 

deployment-file.yaml 내용(AutoScaling 할때 어떤 이미지를 사용할지와 cpu 사용량의 최소치와 최대치를 설정)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: my-deployment
  template:
    metadata:
      labels:
        k8s-app: my-deployment
    spec:
      containers:
      - name: my-deployment
        image: myreg.kr.ncr.ntruss.com/alarm-server:calc
        resources:
          requests:
            cpu: "250m"  # CPU 요청을 250 millicores로 설정
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"

 

롤링 업데이트시 설정 yaml 파일

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: example/image:v2

 

maxUnavailable을 0으로 설정한것은 무중단 배포를 위함