DevOps/Kubernetes

[Kubernates] 쿠버네티스 워크로드

ki1111m2 2023. 10. 13. 17:20

워크로드

 

쿠버네티스 상에서 작동되는 애플리케이션

+) 클라우드 분야에서는 애플리케이션을 실행할 때 필요한 IT 리소스의 집합이라는 의미로 통용됨


파드(Pods)

 

쿠버네티스의 배포 가능한 가장 작은 컴퓨팅 유닛

그 자체로 하나의 논리적인 호스트

 

파드에 포함된 항목(도커 컨테이너처럼 파드 내에서 다음 요소들은 격리됨)

  • 하나 이상의 애플리케이션 컨테이너
  • IP 주소
  • 볼륨과 같은 공유 스토리지

출처: 코드스테이츠

 

파드를 생성하기 위해 파드를 정의할 때, YAML 파일을 사용할 수 있음

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

 

YAML 파일로 정의된 파드를 실제로 만들기 위해서는 다음 명령을 사용함

kubectl apply -f simple-pod.yaml

디플로이먼트(Deployment)

 

쿠버네티스에서 디플로이먼트는 한글로 번역하지 않음

보통 배포라고 하면 서비스의 노출을 떠올리지만, 쿠버네티스에서 디플로이먼트는 서비스 노출의 의미가 아님

디플로이먼트는 파드의 교체, 배치와 관련된 명세임

 

쿠버네티스에서 사용자가 직접 개별 파드를 만들 일은 많지 않음

파드는 일시적이고, 언제나 삭제될 수 있음을 감안하고 만들기 때문

파드가 실행되는 공간인 노드가 실패하는 경우, 그 안에서 실행되는 파드 역시 사용할 수 없게 됨

 

쿠버네티스의 핵심은 컨테이너를 오케스트레이션하는 것으로, 파드 장애시 자동 복구, 복제 등을 자동으로 처리하는 데에 있음

결론적으로 파드는 디플로이먼트, 스테이트풀셋, 데몬셋을 이용해 관리하는 것이 바람직함

 

디플로이먼트는 파드를 업데이트하기 위한 선언적 명세

  • (레플리카셋, 즉 복제본 구성을 이용하여) 파드를 원하는 개수만큼 실행시킬 수 있음
  • (제어판을 이용하여) 파드를 업데이트할 수 있음
  • 파드를 롤백할 수 있음

쿠버네티스가 지원하는 배포 전략으로는 재생성과 롤링 배포 방식이 있음

 

디플로이먼트 예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    # 여기서부터 파드 템플릿이다
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
    # 여기까지 파드 템플릿이다

 

YAML 파일로 정의된 디플로이먼트를 적용하기 위해서는 다음 명령을 사용함

kubectl apply -f <디플로이먼트_파일>

서비스

 

클러스터 안 파드는 각각 고유 IP를 가지고 있지만, 우리가 직접 내부망에 접속할 수 있는 것은 아님

파드 안에 서비스를 외부로 노출시키기 위해서는 서비스 리소스를 사용해야 함

 

쿠버네티스에서 서비스는 파드의 집합에 접근할 수 있는 정책을 정의하는 추상적 개념임

서비스 리소스가 정의된 YAML 파일에 selector라는 것을 이용해 서비스할 대상 타깃을 설정할 수 있음

 

디플로이먼트를 통해 파드의 복제본을 여러 개 만들었을때, 서비스 리소스는 이러한 파드 집합에 접근할 수 있게 함

파드가 교체되거나 특정 파드에 문제가 생긴 경우에도 사용 가능한 파드를 찾아 알아서 접속할 수 있게 만듦

 

서비스 리소스 예시

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: nginx # 배포하려는 파드를 지정합니다. 당연히 파드가 이미 실행중이어야 합니다.
  type: LoadBalancer
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80

 

서비스에 접속하기 위해선 minikube tunnel 명령어를 이용