Deployment

이 페이지에서는 Kubernetes 배포 객체에 대해 설명하고 Google Kubernetes Engine에서 이를 사용하는 방법을 설명합니다.

배포란 무엇인가요?

Deployment는 고유한 ID가 없는 여러 개의 동일한 포드 집합을 나타냅니다. 배포는 애플리케이션의 여러 복제본을 실행하고 실패하거나 응답하지 않는 모든 인스턴스를 자동으로 교체합니다. 배포는 이러한 방식으로 애플리케이션의 하나 이상의 인스턴스를 사용해서 사용자 요청을 지원할 수 있도록 보장합니다. 배포는 Kubernetes 배포 컨트롤러에서 관리됩니다.

Deployment는 해당 포드에 대한 사양이 포함된 포드 템플릿을 사용합니다. 포드 사양은 각 포드의 모양을 결정합니다. 즉, 컨테이너 내에서 실행할 애플리케이션, 포드가 마운트할 볼륨, 라벨 등을 결정합니다.

배포의 포드 템플릿이 변경되면 한 번에 하나씩 새 포드가 자동으로 생성됩니다.

사용 패턴

배포는 여러 복제본에 마운트된 ReadOnlyMany 또는 ReadWriteMany 볼륨을 사용하는 상태 비추적 애플리케이션에 적합하지만, ReadWriteOnce 볼륨을 사용하는 작업 부하에는 적합하지 않습니다. ReadWriteOnce 볼륨을 사용하는 상태 저장 작업의 경우에는 StatefulSets를 사용하세요. StatefulSets는 Google Compute Engine Persistent Disk와 같은 영구 저장소에 데이터를 저장하는 상태 저장 애플리케이션 및 클러스터형 애플리케이션을 배포하도록 디자인되었습니다. StatefulSets는 고유하고 영구적인 ID 및 안정적인 호스트 이름이 필요한 Kafka, MySQL, Redis, ZooKeeper, 기타 애플리케이션을 배포하는 데 적합합니다.

Deployment 만들기

kubectl run, kubectl apply, kubectl create 명령어를 사용하여 Deployment를 생성할 수 있습니다.

Deployment를 만든 후에는 원하는 개수의 포드가 항상 실행되고 사용 가능한 상태로 유지됩니다. 배포는 실패하거나 해당 노드에서 축출된 포드를 자동으로 교체합니다.

다음은 YAML 형식의 배포 매니페스트 파일 예입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

이 예에서는 다음과 같은 조건을 가정하고 있습니다.

  • metadata: name 필드로 표시된 nginx라는 Deployment가 생성됩니다.
  • Deployment는 replicas 필드로 표시된 3개의 복제된 포드를 만듭니다.
  • 포드 템플릿 또는 spec: template 필드는 해당 포드가 app: nginx 라벨로 지정된 것을 나타냅니다.
  • 포드 템플릿의 사양 또는 template: spec 필드는 버전 1.7.9에서 nginx Docker 허브 이미지를 실행하는 하나의 nginx 컨테이너가 포드에서 실행됨을 나타냅니다.
  • Deployment는 포드에서 사용할 수 있도록 포트 80을 엽니다.

요약하자면, 포드 템플릿에는 이 배포로 생성된 포드에 대한 다음 지침이 포함됩니다.

  • 각 포드에 app: nginx 라벨이 지정됩니다.
  • 컨테이너를 하나 만들고 이름을 nginx로 지정합니다.
  • 버전 1.7.9에서 nginx 이미지를 실행합니다.
  • 트래픽 전송 및 수신을 위해 포트 80을 엽니다.

배포 만들기에 대한 자세한 내용은 배포 만들기를 참조하세요.

배포 업데이트

배포의 포드 템플릿 사양을 변경하여 배포 업데이트를 수행할 수 있습니다. 사양 필드를 변경하면 업데이트 롤아웃이 자동으로 트리거됩니다. kubectl, Kubernetes API 또는 Google Cloud Platform 콘솔의 GKE 작업 부하 메뉴를 사용할 수 있습니다.

기본적으로 배포가 업데이트를 트리거할 때는 배포가 포드를 중지하고, 포드 수를 점진적으로 0으로 줄인 후 포드를 비우고 종료합니다. 그런 후 배포가 업데이트된 포드 템플릿을 사용해서 새 포드를 생성합니다.

이전 포드는 충분한 개수의 새 포드가 실행될 때까지 삭제되지 않으며, 새 포드는 충분한 개수의 이전 포드가 삭제될 때까지 생성되지 않습니다. 포드가 생성되고 삭제되는 순서를 보려면 kubectl describe deployments를 실행하세요.

배포는 원하는 복제본 수보다 최소한 1개 이상 부족한 개수가 실행되고, 사용할 수 없는 상태의 포드 수가 최대 1개를 넘지 않도록 보장할 수 있습니다. 마찬가지로, 배포는 원하는 복제본 수보다 최소 1개 더 많이 준비되고, 원하는 개수보다 최대 1개 더 많은 포드가 실행되도록 보장할 수 있습니다.

kubectl rollout undo 명령어를 사용하여 업데이트를 롤백할 수 있습니다. 또한 kubectl rollout pause를 사용하여 배포를 일시적으로 중지할 수 있습니다.

배포 관리

다음은 배포에 대한 일반적인 관리 작업 목록입니다.

상태 및 수명 주기

배포는 수명 주기 동안 처리 중, 완료됨 또는 실패함의 세 가지 상태 중 하나일 수 있습니다.

처리 중 상태는 배포가 포드 생성 또는 확장과 같은 작업을 수행하는 중임을 나타냅니다.

완료됨 상태는 배포가 해당 작업을 성공적으로 완료했고, 모든 포드가 최신 사양에 따라 실행되고 있으며, 사용 가능한 상태이고, 아직 실행 중인 이전 포드가 없음을 나타냅니다.

실패함 상태는 배포가 작업을 완료하지 못하게 만드는 하나 이상의 문제가 발생했음을 나타냅니다. 일부 원인으로는 부족한 할당량 또는 권한, 이미지 가져오기 오류, 제한 범위 또는 런타임 오류가 포함됩니다. Deployment에 오류가 발생한 원인을 조사하기 위해서는 kubectl get deployment [DEPLOYMENT+NAME] -o yaml을 실행하고 status: conditions 필드에서 메시지를 조사할 수 있습니다.

kubectl rollout status 명령어를 사용하여 Deployment 진행 상태를 모니터링하거나 해당 상태를 확인할 수 있습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine