검색

노드

download PDF
OpenShift Container Platform 4.10

OpenShift Container Platform에서 노드 구성 및 관리

Red Hat OpenShift Documentation Team

초록

이 문서에서는 클러스터의 노드, Pod, 컨테이너를 구성하고 관리하는 방법에 대한 지침을 제공합니다. 또한 Pod 예약 및 배치 구성, 작업 및 DaemonSet를 사용하여 작업 자동화, 클러스터를 효율적으로 유지하는 기타 작업에 대한 정보도 제공합니다.

1장. 노드 개요

1.1. 노드 정보

노드는 Kubernetes 클러스터의 가상 또는 베어 메탈 시스템입니다. 작업자 노드는 Pod로 그룹화된 애플리케이션 컨테이너를 호스팅합니다. 컨트롤 플레인 노드는 Kubernetes 클러스터를 제어하는 데 필요한 서비스를 실행합니다. OpenShift Container Platform에서 컨트롤 플레인 노드에는 OpenShift Container Platform 클러스터를 관리하기 위한 Kubernetes 서비스 이상의 서비스가 포함되어 있습니다.

클러스터에 안정적이고 정상적인 노드를 갖는 것은 호스팅된 애플리케이션의 원활한 기능에 우선합니다. OpenShift Container Platform에서는 노드를 나타내는 Node 오브젝트를 통해 노드에 액세스, 관리 및 모니터링할 수 있습니다. OpenShift CLI(oc) 또는 웹 콘솔을 사용하여 노드에서 다음 작업을 수행할 수 있습니다.

노드의 다음 구성 요소는 Pod 실행을 유지하고 Kubernetes 런타임 환경을 제공합니다.

  • 컨테이너 런타임:: 컨테이너 런타임은 컨테이너 실행을 담당합니다. Kubernetes는 containerd, cri-o, rktlet, Docker와 같은 여러 런타임을 제공합니다.
  • kubelet:: Kubelet은 노드에서 실행되며 컨테이너 매니페스트를 읽습니다. 정의된 컨테이너가 시작되고 실행 중인지 확인합니다. kubelet 프로세스는 작업 상태와 노드 서버 상태를 유지합니다. kubelet은 네트워크 규칙 및 포트 전달을 관리합니다. kubelet은 Kubernetes에서 생성한 컨테이너만 관리합니다.
  • kube-proxy:: Kube-proxy는 클러스터의 모든 노드에서 실행되며 Kubernetes 리소스 간 네트워크 트래픽을 유지합니다. Kube-proxy를 사용하면 네트워킹 환경을 분리하고 액세스할 수 있습니다.
  • DNS:: 클러스터 DNS는 Kubernetes 서비스에 대한 DNS 레코드를 제공하는 DNS 서버입니다. Kubernetes에서 시작하는 컨테이너는 DNS 검색에 이 DNS 서버를 자동으로 포함합니다.
컨트롤 플레인 및 작업자 노드 개요
읽기 작업

읽기 작업을 사용하면 관리자 또는 개발자가 OpenShift Container Platform 클러스터의 노드에 대한 정보를 가져올 수 있습니다.

관리 작업

관리자는 여러 작업을 통해 OpenShift Container Platform 클러스터에서 노드를 쉽게 관리할 수 있습니다.

기능 개선 작업

OpenShift Container Platform을 사용하면 단순히 노드에 액세스하고 관리하는 것 이상의 작업을 수행할 수 있습니다. 관리자는 노드에서 다음 작업을 수행하여 클러스터의 효율성, 애플리케이션 친화성을 만들고, 개발자에게 더 나은 환경을 제공할 수 있습니다.

1.2. Pod 정보

Pod는 노드에 함께 배포되는 하나 이상의 컨테이너입니다. 클러스터 관리자는 Pod를 정의하고 스케줄링할 준비가 된 정상 노드에서 실행되도록 할당할 수 있습니다. 컨테이너가 실행되는 동안 Pod가 실행됩니다. Pod가 정의되고 실행되면 변경할 수 없습니다. Pod를 사용할 때 수행할 수 있는 일부 작업은 다음과 같습니다.

읽기 작업

관리자는 다음 작업을 통해 프로젝트의 Pod에 대한 정보를 가져올 수 있습니다.

관리 작업

다음 작업 목록은 관리자가 OpenShift Container Platform 클러스터에서 Pod를 관리하는 방법에 대한 개요를 제공합니다.

기능 개선 작업

OpenShift Container Platform에서 사용할 수 있는 다양한 툴 및 기능을 사용하여 Pod를 보다 쉽고 효율적으로 사용할 수 있습니다. 다음 작업에는 Pod를 더 잘 관리하기 위해 이러한 툴과 기능을 사용하는 작업이 포함됩니다.

작업사용자더 많은 정보

수평 Pod 자동 스케일러를 생성하고 사용합니다.

개발자

수평 Pod 자동 스케일러를 사용하여 실행할 최소 및 최대 Pod 수와 Pod에서 목표로 하는 CPU 사용률 또는 메모리 사용률을 지정할 수 있습니다. 수평 Pod 자동 스케일러를 사용하면 Pod 를 자동으로 스케일링할 수 있습니다.

사용자 정의 메트릭 자동 스케일러:: 사용자 정의 메트릭 자동 스케일러는 CPU 또는 메모리를 기반으로 하지 않는 사용자 정의 메트릭을 기반으로 하는 배포, 상태 저장 세트, 사용자 정의 리소스 또는 작업의 Pod 수를 자동으로 늘리거나 줄일 수 있습니다. + 자세한 내용은 사용자 정의 지표 자동 스케일러 Operator 개요 를 참조하십시오.

수직 Pod 자동 스케일러를 설치하고 사용합니다.

관리자 및 개발자

관리자는 수직 Pod 자동 스케일러를 사용하여 리소스 및 워크로드의 리소스 요구 사항을 모니터링하여 클러스터 리소스를 더 효과적으로 사용합니다.

개발자는 수직 Pod 자동 스케일러를 사용하여 각 Pod에 충분한 리소스가 있는 노드에 Pod를 예약하여 수요가 많은 기간에 Pod를 유지할 수 있습니다.

장치 플러그인을 사용하여 외부 리소스에 대한 액세스 권한을 제공합니다.

관리자

장치 플러그인 은 특정 하드웨어 리소스를 관리하는 노드( kubelet 외부)에서 실행되는 gRPC 서비스입니다. 장치 플러그인을 배포하여 클러스터 전체에서 하드웨어 장치를 사용하도록 일관되고 이식 가능한 솔루션을 제공할 수 있습니다.

Secret 오브젝트를 사용하여 Pod에 민감한 데이터를 제공합니다.

관리자

일부 애플리케이션에는 암호 및 사용자 이름과 같은 민감한 정보가 필요합니다. Secret 오브젝트를 사용하여 애플리케이션 Pod에 이러한 정보를 제공할 수 있습니다.

1.3. 컨테이너 정보

컨테이너는 종속 항목, 라이브러리 및 바이너리와 함께 패키지된 애플리케이션 코드로 구성된 OpenShift Container Platform 애플리케이션의 기본 단위입니다. 컨테이너에서는 물리 서버, 가상 머신(VM) 및 프라이빗 또는 퍼블릭 클라우드와 같은 환경 및 여러 배치 대상 사이에 일관성을 제공합니다.

Linux 컨테이너 기술은 실행 중인 프로세스를 분리하고 지정된 리소스로만 액세스를 제한하는 간단한 메커니즘입니다. 관리자는 다음과 같은 Linux 컨테이너에서 다양한 작업을 수행할 수 있습니다.

OpenShift Container Platform은 Init 컨테이너라는 특수 컨테이너를 제공합니다. Init 컨테이너는 애플리케이션 컨테이너보다 먼저 실행되며 애플리케이션 이미지에 없는 유틸리티 또는 설정 스크립트를 포함할 수 있습니다. Init 컨테이너를 사용하여 나머지 Pod를 배포하기 전에 작업을 수행할 수 있습니다.

노드, Pod 및 컨테이너에서 특정 작업을 수행하는 것 외에도 전체 OpenShift Container Platform 클러스터와 함께 작업하여 클러스터의 효율성을 유지하고 애플리케이션 Pod를 고가용성으로 유지할 수 있습니다.

2장. 노드 작업

2.1. Pod 사용

Pod는 하나의 호스트에 함께 배포되는 하나 이상의 컨테이너이자 정의, 배포, 관리할 수 있는 최소 컴퓨팅 단위입니다.

2.1.1. Pod 이해

Pod는 컨테이너에 대한 머신 인스턴스(실제 또는 가상)와 대략적으로 동일합니다. 각 Pod에는 자체 내부 IP 주소가 할당되므로 해당 Pod가 전체 포트 공간을 소유하고 Pod 내의 컨테이너는 로컬 스토리지와 네트워킹을 공유할 수 있습니다.

Pod에는 라이프사이클이 정의되어 있으며 노드에서 실행되도록 할당된 다음 컨테이너가 종료되거나 기타 이유로 제거될 때까지 실행됩니다. Pod는 정책 및 종료 코드에 따라 종료 후 제거되거나 컨테이너 로그에 대한 액세스를 활성화하기 위해 유지될 수 있습니다.

OpenShift Container Platform에서는 대체로 Pod를 변경할 수 없는 것으로 취급합니다. 실행 중에는 Pod 정의를 변경할 수 없습니다. OpenShift Container Platform은 기존 Pod를 종료한 후 수정된 구성이나 기본 이미지 또는 둘 다 사용하여 Pod를 다시 생성하는 방식으로 변경 사항을 구현합니다. Pod를 다시 생성하면 확장 가능한 것으로 취급되고 상태가 유지되지 않습니다. 따라서 일반적으로 Pod는 사용자가 직접 관리하는 대신 상위 수준의 컨트롤러에서 관리해야 합니다.

참고

OpenShift Container Platform 노드 호스트당 최대 Pod 수는 클러스터 제한을 참조하십시오.

주의

복제 컨트롤러에서 관리하지 않는 베어 Pod는 노드 중단 시 다시 예약되지 않습니다.

2.1.2. Pod 구성의 예

OpenShift Container Platform에서는 하나의 호스트에 함께 배포되는 하나 이상의 컨테이너이자 정의, 배포, 관리할 수 있는 최소 컴퓨팅 단위인 Pod의 Kubernetes 개념을 활용합니다.

다음은 Rails 애플리케이션에서 포드 정의의 예입니다. 이 예제에서는 Pod의 다양한 기능을 보여줍니다. 대부분 다른 주제에서 설명하므로 여기에서는 간단히 언급합니다.

Pod 오브젝트 정의(YAML)

kind: Pod
apiVersion: v1
metadata:
  name: example
  namespace: default
  selfLink: /api/v1/namespaces/default/pods/example
  uid: 5cc30063-0265780783bc
  resourceVersion: '165032'
  creationTimestamp: '2019-02-13T20:31:37Z'
  labels:
    app: hello-openshift 1
  annotations:
    openshift.io/scc: anyuid
spec:
  restartPolicy: Always 2
  serviceAccountName: default
  imagePullSecrets:
    - name: default-dockercfg-5zrhb
  priority: 0
  schedulerName: default-scheduler
  terminationGracePeriodSeconds: 30
  nodeName: ip-10-0-140-16.us-east-2.compute.internal
  securityContext: 3
    seLinuxOptions:
      level: 's0:c11,c10'
  containers: 4
    - resources: {}
      terminationMessagePath: /dev/termination-log
      name: hello-openshift
      securityContext:
        capabilities:
          drop:
            - MKNOD
        procMount: Default
      ports:
        - containerPort: 8080
          protocol: TCP
      imagePullPolicy: Always
      volumeMounts: 5
        - name: default-token-wbqsl
          readOnly: true
          mountPath: /var/run/secrets/kubernetes.io/serviceaccount 6
      terminationMessagePolicy: File
      image: registry.redhat.io/openshift4/ose-ogging-eventrouter:v4.3 7
  serviceAccount: default 8
  volumes: 9
    - name: default-token-wbqsl
      secret:
        secretName: default-token-wbqsl
        defaultMode: 420
  dnsPolicy: ClusterFirst
status:
  phase: Pending
  conditions:
    - type: Initialized
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
    - type: Ready
      status: 'False'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
      reason: ContainersNotReady
      message: 'containers with unready status: [hello-openshift]'
    - type: ContainersReady
      status: 'False'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
      reason: ContainersNotReady
      message: 'containers with unready status: [hello-openshift]'
    - type: PodScheduled
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2019-02-13T20:31:37Z'
  hostIP: 10.0.140.16
  startTime: '2019-02-13T20:31:37Z'
  containerStatuses:
    - name: hello-openshift
      state:
        waiting:
          reason: ContainerCreating
      lastState: {}
      ready: false
      restartCount: 0
      image: openshift/hello-openshift
      imageID: ''
  qosClass: BestEffort

1
Pod는 단일 작업에서 Pod 그룹을 선택하고 관리하는 데 사용할 수 있는 라벨을 하나 이상 사용하여 "태그를 지정"할 수 있습니다. 라벨은 metadata 해시의 키/값 형식으로 저장됩니다.
2
Pod는 가능한 값 Always, OnFailure, Never를 사용하여 정책을 재시작합니다. 기본값은 Always입니다.
3
OpenShift Container Platform은 컨테이너에 대한 보안 컨텍스트를 정의합니다. 보안 컨텍스트는 권한 있는 컨테이너로 실행하거나 선택한 사용자로 실행할 수 있는지의 여부 등을 지정합니다. 기본 컨텍스트는 매우 제한적이지만 필요에 따라 관리자가 수정할 수 있습니다.
4
containers는 하나 이상의 컨테이너 정의로 이루어진 배열을 지정합니다.
5
이 컨테이너는 컨테이너 내에서 외부 스토리지 볼륨이 마운트되는 위치를 지정합니다. 이 경우 레지스트리에서 OpenShift Container Platform API에 대해 요청하는 데 필요한 자격 증명 액세스 권한을 저장하는 볼륨이 있습니다.
6
Pod에 제공할 볼륨을 지정합니다. 지정된 경로에서 볼륨을 마운트합니다. 컨테이너 루트, / 또는 호스트와 컨테이너에서 동일한 경로에 마운트하지 마십시오. 컨테이너가 호스트 /dev/pts 파일과 같이 충분한 권한이 있는 경우 호스트 시스템이 손상될 수 있습니다. /host를 사용하여 호스트를 마운트하는 것이 안전합니다.
7
Pod의 각 컨테이너는 자체 컨테이너 이미지에서 인스턴스화됩니다.
8
OpenShift Container Platform API에 대해 요청하는 Pod는 요청 시 Pod에서 인증해야 하는 서비스 계정 사용자를 지정하는 serviceAccount 필드가 있는 일반적인 패턴입니다. 따라서 사용자 정의 인프라 구성 요소에 대한 액세스 권한을 세부적으로 제어할 수 있습니다.
9
Pod는 사용할 컨테이너에서 사용할 수 있는 스토리지 볼륨을 정의합니다. 이 경우 기본 서비스 계정 토큰이 포함된 보안 볼륨에 대한 임시 볼륨을 제공합니다.

파일이 많은 영구 볼륨을 Pod에 연결하면 해당 Pod가 실패하거나 시작하는 데 시간이 오래 걸릴 수 있습니다. 자세한 내용은 OpenShift에서 파일 수가 많은 영구 볼륨을 사용하는 경우 Pod를 시작하지 못하거나 과도한 시간을 차지하여 "Ready" 상태를 얻을 수 없는 이유는 무엇입니까?

참고

이 Pod 정의에는 Pod가 생성되고 해당 라이프사이클이 시작된 후 OpenShift Container Platform에 의해 자동으로 채워지는 특성은 포함되지 않습니다. Kubernetes Pod 설명서에는 Pod의 기능 및 용도에 대한 세부 정보가 있습니다.

2.1.3. 추가 리소스

2.2. Pod 보기

관리자는 클러스터의 Pod를 보고 해당 Pod 및 클러스터의 상태를 전체적으로 확인할 수 있습니다.

2.2.1. Pod 정보

OpenShift Container Platform에서는 하나의 호스트에 함께 배포되는 하나 이상의 컨테이너이자 정의, 배포, 관리할 수 있는 최소 컴퓨팅 단위인 Pod의 Kubernetes 개념을 활용합니다. Pod는 컨테이너에 대한 머신 인스턴스(실제 또는 가상)와 대략적으로 동일합니다.

특정 프로젝트와 연결된 Pod 목록을 확인하거나 Pod 관련 사용량 통계를 볼 수 있습니다.

2.2.2. 프로젝트의 Pod 보기

Pod의 복제본 수, 현재 상태, 재시작 횟수, 수명 등을 포함하여 현재 프로젝트와 관련된 Pod 목록을 확인할 수 있습니다.

프로세스

프로젝트의 Pod를 보려면 다음을 수행합니다.

  1. 프로젝트로 변경합니다.

    $ oc project <project-name>
  2. 다음 명령을 실행합니다.

    $ oc get pods

    예를 들면 다음과 같습니다.

    $ oc get pods

    출력 예

    NAME                       READY   STATUS    RESTARTS   AGE
    console-698d866b78-bnshf   1/1     Running   2          165m
    console-698d866b78-m87pm   1/1     Running   2          165m

    Pod IP 주소와 Pod가 있는 노드를 보려면 -o wide 플래그를 추가합니다.

    $ oc get pods -o wide

    출력 예

    NAME                       READY   STATUS    RESTARTS   AGE    IP            NODE                           NOMINATED NODE
    console-698d866b78-bnshf   1/1     Running   2          166m   10.128.0.24   ip-10-0-152-71.ec2.internal    <none>
    console-698d866b78-m87pm   1/1     Running   2          166m   10.129.0.23   ip-10-0-173-237.ec2.internal   <none>

2.2.3. Pod 사용량 통계 보기

컨테이너의 런타임 환경을 제공하는 Pod에 대한 사용량 통계를 표시할 수 있습니다. 이러한 사용량 통계에는 CPU, 메모리, 스토리지 사용량이 포함됩니다.

사전 요구 사항

  • 사용량 통계를 보려면 cluster-reader 권한이 있어야 합니다.
  • 사용량 통계를 보려면 메트릭이 설치되어 있어야 합니다.

프로세스

사용량 통계를 보려면 다음을 수행합니다.

  1. 다음 명령을 실행합니다.

    $ oc adm top pods

    예를 들면 다음과 같습니다.

    $ oc adm top pods -n openshift-console

    출력 예

    NAME                         CPU(cores)   MEMORY(bytes)
    console-7f58c69899-q8c8k     0m           22Mi
    console-7f58c69899-xhbgg     0m           25Mi
    downloads-594fcccf94-bcxk8   3m           18Mi
    downloads-594fcccf94-kv4p6   2m           15Mi

  2. 다음 명령을 실행하여 라벨이 있는 Pod의 사용량 통계를 확인합니다.

    $ oc adm top pod --selector=''

    필터링할 선택기(라벨 쿼리)를 선택해야 합니다. =, ==, !=가 지원됩니다.

    예를 들면 다음과 같습니다.

    $ oc adm top pod --selector='name=my-pod'

2.2.4. 리소스 로그 보기

OpenShift CLI(oc) 및 웹 콘솔에서 다양한 리소스의 로그를 볼 수 있습니다. 로그는 로그의 말미 또는 끝에서 읽습니다.

사전 요구 사항

  • OpenShift CLI(oc)에 액세스합니다.

프로세스(UI)

  1. OpenShift Container Platform 콘솔에서 워크로드Pod로 이동하거나 조사하려는 리소스를 통해 Pod로 이동합니다.

    참고

    빌드와 같은 일부 리소스에는 직접 쿼리할 Pod가 없습니다. 이러한 인스턴스에서 리소스의 세부 정보 페이지에서 로그 링크를 찾을 수 있습니다.

  2. 드롭다운 메뉴에서 프로젝트를 선택합니다.
  3. 조사할 Pod 이름을 클릭합니다.
  4. 로그를 클릭합니다.

프로세스(CLI)

  • 특정 Pod의 로그를 확인합니다.

    $ oc logs -f <pod_name> -c <container_name>

    다음과 같습니다.

    -f
    선택 사항: 출력에서 로그에 기록되는 내용을 따르도록 지정합니다.
    <pod_name>
    pod 이름을 지정합니다.
    <container_name>
    선택 사항: 컨테이너의 이름을 지정합니다. Pod에 여러 컨테이너가 있는 경우 컨테이너 이름을 지정해야 합니다.

    예를 들면 다음과 같습니다.

    $ oc logs ruby-58cd97df55-mww7r
    $ oc logs -f ruby-57f7f4855b-znl92 -c ruby

    로그 파일의 내용이 출력됩니다.

  • 특정 리소스의 로그를 확인합니다.

    $ oc logs <object_type>/<resource_name> 1
    1
    리소스 유형 및 이름을 지정합니다.

    예를 들면 다음과 같습니다.

    $ oc logs deployment/ruby

    로그 파일의 내용이 출력됩니다.

2.3. Pod에 대한 OpenShift Container Platform 클러스터 구성

관리자는 Pod에 효율적인 클러스터를 생성하고 유지 관리할 수 있습니다.

클러스터를 효율적으로 유지하면 Pod가 종료될 때 수행하는 작업과 같은 툴을 사용하여 개발자에게 더 나은 환경을 제공할 수 있습니다. 즉 필요한 수의 Pod가 항상 실행되고 있는지 확인하여 한 번만 실행되도록 설계된 Pod를 재시작하는 경우 Pod에 사용할 수 있는 대역폭을 제한하고, 중단 중 Pod를 계속 실행하는 방법을 제공합니다.

2.3.1. 재시작 후 Pod 작동 방식 구성

Pod 재시작 정책에 따라 해당 Pod의 컨테이너가 종료될 때 OpenShift Container Platform에서 응답하는 방법이 결정됩니다. 정책은 해당 Pod의 모든 컨테이너에 적용됩니다.

가능한 값은 다음과 같습니다.

  • Always - 급격한 백오프 지연(10초, 20초, 40초)을 5분으로 제한하여 Pod에서 성공적으로 종료된 컨테이너를 지속적으로 재시작합니다. 기본값은 Always입니다.
  • OnFailure - 급격한 백오프 지연(10초, 20초, 40초)을 5분으로 제한하여 Pod에서 실패한 컨테이너를 재시작합니다.
  • Never - Pod에서 종료되거나 실패한 컨테이너를 재시작하지 않습니다. Pod가 즉시 실패하고 종료됩니다.

Pod가 특정 노드에 바인딩된 후에는 다른 노드에 바인딩되지 않습니다. 따라서 노드 장애 시 Pod가 작동하려면 컨트롤러가 필요합니다.

상태컨트롤러 유형재시작 정책

종료할 것으로 예상되는 Pod(예: 일괄 계산)

Job

OnFailure 또는 Never

종료되지 않을 것으로 예상되는 Pod(예: 웹 서버)

복제 컨트롤러

Always

머신당 하나씩 실행해야 하는 Pod

데몬 세트

Any

Pod의 컨테이너가 실패하고 재시작 정책이 OnFailure로 설정된 경우 Pod가 노드에 남아 있고 컨테이너가 재시작됩니다. 컨테이너를 재시작하지 않으려면 재시작 정책 Never를 사용하십시오.

전체 Pod가 실패하면 OpenShift Container Platform에서 새 Pod를 시작합니다. 개발자는 애플리케이션이 새 Pod에서 재시작될 수 있는 가능성을 고려해야 합니다. 특히 애플리케이션에서는 이전 실행으로 발생한 임시 파일, 잠금, 불완전한 출력 등을 처리해야 합니다.

참고

Kubernetes 아키텍처에서는 클라우드 공급자의 끝점이 안정적인 것으로 예상합니다. 클라우드 공급자가 중단되면 kubelet에서 OpenShift Container Platform이 재시작되지 않습니다.

기본 클라우드 공급자 끝점이 안정적이지 않은 경우 클라우드 공급자 통합을 사용하여 클러스터를 설치하지 마십시오. 클라우드가 아닌 환경에서처럼 클러스터를 설치합니다. 설치된 클러스터에서 클라우드 공급자 통합을 설정하거나 해제하는 것은 권장되지 않습니다.

OpenShift Container Platform에서 실패한 컨테이너에 재시작 정책을 사용하는 방법에 대한 자세한 내용은 Kubernetes 설명서의 예제 상태를 참조하십시오.

2.3.2. Pod에서 사용할 수 있는 대역폭 제한

Pod에 서비스 품질 트래픽 조절 기능을 적용하고 사용 가능한 대역폭을 효과적으로 제한할 수 있습니다. Pod에서 송신하는 트래픽은 구성된 속도를 초과하는 패킷을 간단히 삭제하는 정책에 따라 처리합니다. Pod에 수신되는 트래픽은 데이터를 효과적으로 처리하기 위해 대기 중인 패킷을 구성하여 처리합니다. 특정 Pod에 대한 제한 사항은 다른 Pod의 대역폭에 영향을 미치지 않습니다.

프로세스

Pod의 대역폭을 제한하려면 다음을 수행합니다.

  1. 오브젝트 정의 JSON 파일을 작성하고 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 주석을 사용하여 데이터 트래픽 속도를 지정합니다. 예를 들어 Pod 송신 및 수신 대역폭을 둘 다 10M/s로 제한하려면 다음을 수행합니다.

    제한된 Pod 오브젝트 정의

    {
        "kind": "Pod",
        "spec": {
            "containers": [
                {
                    "image": "openshift/hello-openshift",
                    "name": "hello-openshift"
                }
            ]
        },
        "apiVersion": "v1",
        "metadata": {
            "name": "iperf-slow",
            "annotations": {
                "kubernetes.io/ingress-bandwidth": "10M",
                "kubernetes.io/egress-bandwidth": "10M"
            }
        }
    }

  2. 오브젝트 정의를 사용하여 Pod를 생성합니다.

    $ oc create -f <file_or_dir_path>

2.3.3. Pod 중단 예산을 사용하여 실행 중인 pod 수를 지정하는 방법

Pod 중단 예산을 사용하면 유지보수를 위해 노드를 드레이닝하는 등 작업 중에 Pod에 대한 보안 제약 조건을 지정할 수 있습니다.

PodDisruptionBudget은 동시에 작동해야 하는 최소 복제본 수 또는 백분율을 지정하는 API 오브젝트입니다. 프로젝트에서 이러한 설정은 노드 유지 관리 (예: 클러스터 축소 또는 클러스터 업그레이드) 중에 유용할 수 있으며 (노드 장애 시가 아니라) 자발적으로 제거된 경우에만 적용됩니다.

PodDisruptionBudget 오브젝트의 구성은 다음과 같은 주요 부분으로 구성되어 있습니다.

  • 일련의 pod에 대한 라벨 쿼리 기능인 라벨 선택기입니다.
  • 동시에 사용할 수 있어야 하는 최소 pod 수를 지정하는 가용성 수준입니다.

    • minAvailable은 중단 중에도 항상 사용할 수 있어야하는 pod 수입니다.
    • maxUnavailable은 중단 중에 사용할 수없는 pod 수입니다.
참고

Available 은 condition Ready=True 가 있는 Pod 수를 나타냅니다. ready=True 는 요청을 처리할 수 있는 Pod를 참조하며 일치하는 모든 서비스의 부하 분산 풀에 추가해야 합니다.

maxUnavailable 0 % 또는 0이나 minAvailable100 % 혹은 복제본 수와 동일한 값은 허용되지만 이로 인해 노드가 드레인되지 않도록 차단할 수 있습니다.

다음을 사용하여 모든 프로젝트에서 pod 중단 예산을 확인할 수 있습니다.

$ oc get poddisruptionbudget --all-namespaces

출력 예

NAMESPACE                              NAME                                    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
openshift-apiserver                    openshift-apiserver-pdb                 N/A             1                 1                     121m
openshift-cloud-controller-manager     aws-cloud-controller-manager            1               N/A               1                     125m
openshift-cloud-credential-operator    pod-identity-webhook                    1               N/A               1                     117m
openshift-cluster-csi-drivers          aws-ebs-csi-driver-controller-pdb       N/A             1                 1                     121m
openshift-cluster-storage-operator     csi-snapshot-controller-pdb             N/A             1                 1                     122m
openshift-cluster-storage-operator     csi-snapshot-webhook-pdb                N/A             1                 1                     122m
openshift-console                      console                                 N/A             1                 1                     116m
#...

PodDisruptionBudget은 시스템에서 최소 minAvailable pod가 실행중인 경우 정상으로 간주됩니다. 이 제한을 초과하는 모든 pod는 제거할 수 있습니다.

참고

Pod 우선 순위 및 선점 설정에 따라 우선 순위가 낮은 pod는 pod 중단 예산 요구 사항을 무시하고 제거될 수 있습니다.

2.3.3.1. Pod 중단 예산을 사용하여 실행해야 할 pod 수 지정

PodDisruptionBudget 오브젝트를 사용하여 동시에 가동되어야 하는 최소 복제본 수 또는 백분율을 지정할 수 있습니다.

프로세스

pod 중단 예산을 구성하려면 다음을 수행합니다.

  1. 다음과 같은 오브젝트 정의를 사용하여 YAML 파일을 만듭니다.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      minAvailable: 2  2
      selector:  3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudgetpolicy/v1 API 그룹의 일부입니다.
    2
    동시에 사용할 수 필요가 있는 최소 pod 수 입니다. 정수 또는 백분율 (예: 20 %)을 지정하는 문자열을 사용할 수 있습니다.
    3
    리소스 집합에 대한 라벨 쿼리입니다. matchLabelsmatchExpressions의 결과는 논리적으로 결합됩니다. 이 매개 변수(예: selector {} )를 비워 두면 프로젝트의 모든 Pod를 선택합니다.

    또는 다음을 수행합니다.

    apiVersion: policy/v1 1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      maxUnavailable: 25% 2
      selector: 3
        matchLabels:
          name: my-pod
    1
    PodDisruptionBudgetpolicy/v1 API 그룹의 일부입니다.
    2
    동시에 사용할 수없는 최대 pod 수입니다. 정수 또는 백분율 (예: 20 %)을 지정하는 문자열을 사용할 수 있습니다.
    3
    리소스 집합에 대한 라벨 쿼리입니다. matchLabelsmatchExpressions의 결과는 논리적으로 결합됩니다. 이 매개 변수(예: selector {} )를 비워 두면 프로젝트의 모든 Pod를 선택합니다.
  2. 다음 명령을 실행하여 오브젝트를 프로젝트에 추가합니다.

    $ oc create -f </path/to/file> -n <project_name>

2.3.4. 중요 Pod를 사용하여 Pod 제거 방지

완전히 작동하는 클러스터에 중요하지만 마스터가 아닌 일반 클러스터 노드에서 실행되는 다양한 핵심 구성 요소가 있습니다. 중요한 추가 기능이 제거되면 클러스터가 제대로 작동하지 않을 수 있습니다.

중요로 표시된 Pod는 제거할 수 없습니다.

프로세스

Pod를 중요로 설정하려면 다음을 수행합니다.

  1. Pod 사양을 생성하거나 system-cluster-critical 우선순위 클래스를 포함하도록 기존 Pod를 편집합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pdb
    spec:
      template:
        metadata:
          name: critical-pod
        priorityClassName: system-cluster-critical 1
    1
    노드에서 제거해서는 안 되는 Pod의 기본 우선순위 클래스입니다.

    또는 클러스터에 중요한 Pod에 대해 system-node-critical을 지정할 수 있지만 필요한 경우 제거할 수도 있습니다.

  2. Pod를 생성합니다.

    $ oc create -f <file-name>.yaml

2.3.5. 파일 수가 많은 영구 볼륨을 사용할 때 Pod 타임아웃 감소

스토리지 볼륨에 많은 파일(~1,000,000개 이상)이 포함된 경우 Pod 시간 초과가 발생할 수 있습니다.

이는 볼륨이 마운트될 때 Pod의 securityContext 에 지정된 fsGroup 과 일치하도록 OpenShift Container Platform에서 각 볼륨의 컨텐츠의 소유권 및 권한을 재귀적으로 변경하기 때문에 발생할 수 있습니다. 대규모 볼륨의 경우 소유권 및 권한을 확인하고 변경하는 데 시간이 오래 걸리므로 Pod 시작 속도가 매우 느려질 수 있습니다.

다음 해결 방법 중 하나를 적용하여 이 지연을 줄일 수 있습니다.

  • SCC(보안 컨텍스트 제약 조건)를 사용하여 볼륨의 SELinux 재레이블을 건너뜁니다.
  • SCC 내에서 fsGroupChangePolicy 필드를 사용하여 OpenShift Container Platform에서 볼륨의 소유권 및 권한을 확인하고 관리하는 방법을 제어합니다.
  • 런타임 클래스를 사용하여 볼륨의 SELinux 재레이블을 건너뜁니다.

자세한 내용은 OpenShift에서 파일 수가 많은 영구 볼륨을 사용할 때 Pod가 시작되지 않거나 "Ready" 상태를 달성하는 데 과도한 시간이 걸리는 이유는 무엇입니까?

2.4. 수평 Pod 자동 스케일러를 사용하여 Pod 자동 스케일링

개발자는 HPA(수평 Pod 자동 스케일러)를 사용하여 해당 복제 컨트롤러 또는 배포 구성에 속하는 Pod에서 수집한 메트릭을 기반으로 OpenShift Container Platform에서 복제 컨트롤러 또는 배포 구성의 규모를 자동으로 늘리거나 줄이는 방법을 지정할 수 있습니다. 모든 배포, 배포 구성, 복제본 세트, 복제 컨트롤러 또는 상태 저장 세트에 대한 HPA를 생성할 수 있습니다.

사용자 정의 메트릭을 기반으로 Pod 스케일링에 대한 자세한 내용은 사용자 정의 메트릭을 기반으로 Pod 자동 스케일링을 참조하십시오.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다. 이러한 오브젝트에 대한 자세한 내용은 Deployment 및 DeploymentConfig 오브젝트 이해를 참조하십시오.

2.4.1. 수평 Pod 자동 스케일러 이해

수평 Pod 자동 스케일러를 생성하여 실행하려는 최소 및 최대 Pod 수와 Pod에서 목표로 하는 CPU 사용률 또는 메모리 사용률을 지정할 수 있습니다.

수평 Pod 자동 스케일러를 생성하면 OpenShift Container Platform에서 Pod의 CPU 및/또는 메모리 리소스 메트릭을 쿼리합니다. 이러한 메트릭을 사용할 수 있는 경우 수평 Pod 자동 스케일러에서 현재 메트릭 사용률과 원하는 메트릭 사용률의 비율을 계산하고 그에 따라 확장 또는 축소합니다. 쿼리 및 스케일링은 정기적으로 수행되지만 메트릭을 사용할 수 있을 때까지 1~2분이 걸릴 수 있습니다.

복제 컨트롤러의 경우 이러한 스케일링은 복제 컨트롤러의 복제본과 직접적으로 일치합니다. 배포 구성의 경우 스케일링은 배포 구성의 복제본 수와 직접적으로 일치합니다. 자동 스케일링은 Complete 단계에서 최신 배포에만 적용됩니다.

OpenShift Container Platform은 리소스를 자동으로 차지하여 시작하는 동안과 같이 리소스가 급증하는 동안 불필요한 자동 스케일링을 방지합니다. unready 상태의 Pod는 확장 시 CPU 사용량이 0이고, 축소 시에는 자동 스케일러에서 Pod를 무시합니다. 알려진 메트릭이 없는 Pod는 확장 시 CPU 사용량이 0%이고, 축소 시에는 100%입니다. 이를 통해 HPA를 결정하는 동안 안정성이 향상됩니다. 이 기능을 사용하려면 준비 상태 점검을 구성하여 새 Pod를 사용할 준비가 되었는지 확인해야 합니다.

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다.

2.4.1.1. 지원되는 메트릭

수평 Pod 자동 스케일러에서는 다음 메트릭을 지원합니다.

표 2.1. 메트릭
메트릭설명API 버전

CPU 사용

사용되는 CPU 코어의 수입니다. Pod에서 요청하는 CPU의 백분율을 계산하는 데 사용할 수 있습니다.

autoscaling/v1, autoscaling/v2

메모리 사용률

사용되는 메모리의 양입니다. Pod에서 요청하는 메모리의 백분율을 계산하는 데 사용할 수 있습니다.

autoscaling/v2

중요

메모리 기반 자동 스케일링의 경우 메모리 사용량이 복제본 수에 비례하여 증가 및 감소해야 합니다. 평균적으로 다음과 같습니다.

  • 복제본 수가 증가하면 Pod당 메모리(작업 집합) 사용량이 전반적으로 감소해야 합니다.
  • 복제본 수가 감소하면 Pod별 메모리 사용량이 전반적으로 증가해야 합니다.

메모리 기반 자동 스케일링을 사용하기 전에 OpenShift Container Platform 웹 콘솔을 사용하여 애플리케이션의 메모리 동작을 확인하고 애플리케이션이 해당 요구 사항을 충족하는지 확인하십시오.

다음 예제에서는 image-registry Deployment 오브젝트의 자동 스케일링을 보여줍니다. 초기 배포에는 Pod 3개가 필요합니다. HPA 오브젝트에서 최소 5개로 증가합니다. Pod의 CPU 사용량이 75%에 도달하면 Pod가 7로 증가합니다.

$ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75

출력 예

horizontalpodautoscaler.autoscaling/image-registry autoscaled

minReplicas 가 3으로 설정된 image-registry Deployment 오브젝트의 샘플 HPA

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: image-registry
  namespace: default
spec:
  maxReplicas: 7
  minReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: image-registry
  targetCPUUtilizationPercentage: 75
status:
  currentReplicas: 5
  desiredReplicas: 0

  1. 배포의 새 상태를 확인합니다.

    $ oc get deployment image-registry

    이제 배포에 Pod 5개가 있습니다.

    출력 예

    NAME             REVISION   DESIRED   CURRENT   TRIGGERED BY
    image-registry   1          5         5         config

2.4.2. HPA는 어떻게 작동합니까?

HPA(Horizontal Pod Autoscaler)는 Pod 자동 확장의 개념을 확장합니다. HPA를 사용하면 부하 분산 노드 그룹을 생성하고 관리할 수 있습니다. HPA는 지정된 CPU 또는 메모리 임계값을 초과하면 Pod 수를 자동으로 늘리거나 줄입니다.

그림 2.1. HPA의 상위 수준 워크플로

workflow

HPA는 Kubernetes 자동 스케일링 API 그룹의 API 리소스입니다. 자동 스케일러는 동기화 기간 동안 기본 15초를 사용하여 제어 루프로 작동합니다. 이 기간 동안 컨트롤러 관리자는 HPA의 YAML 파일에 정의된 내용에 대해 CPU, 메모리 사용률 또는 둘 다를 쿼리합니다. 컨트롤러 관리자는 HPA를 대상으로 하는 각 Pod에 대해 CPU 또는 메모리와 같은 Pod별 리소스 지표 API에서 사용률 지표를 가져옵니다.

utilization 값 target이 설정된 경우 컨트롤러는 각 Pod의 컨테이너에 해당하는 리소스 요청의 백분율로 utilization 값을 계산합니다. 그런 다음 컨트롤러는 모든 대상 Pod에서 평균 사용률을 사용하고 원하는 복제본 수를 조정하는 데 사용되는 비율을 생성합니다. HPA는 지표 서버에서 제공하는 metrics.k8s.io 에서 지표를 가져오도록 구성됩니다. 지표 평가의 동적 특성으로 인해 복제본 그룹을 확장하는 동안 복제본 수가 변동될 수 있습니다.

참고

HPA를 구현하려면 모든 대상 Pod에 해당 컨테이너에 리소스 요청이 설정되어 있어야 합니다.

2.4.3. 요청 및 제한 정보

스케줄러는 Pod의 컨테이너에 지정하는 리소스 요청을 사용하여 Pod를 배치할 노드를 결정합니다. kubelet은 컨테이너에 지정한 리소스 제한을 적용하여 컨테이너가 지정된 제한보다 더 많이 사용할 수 없도록 합니다. kubelet은 해당 컨테이너가 사용할 특히 해당 시스템 리소스의 요청 양을 예약합니다.

리소스 메트릭을 사용하는 방법은 무엇입니까?

Pod 사양에서는 CPU 및 메모리와 같은 리소스 요청을 지정해야 합니다. HPA는 이 사양을 사용하여 리소스 사용률을 확인한 다음 대상을 확장 또는 축소합니다.

예를 들어 HPA 오브젝트는 다음 지표 소스를 사용합니다.

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60

이 예에서 HPA는 스케일링 대상의 Pod의 평균 사용률을 60%로 유지합니다. utilization은 현재 리소스 사용량과 요청된 Pod 리소스 간 비율입니다.

2.4.4. 모범 사례

모든 Pod에 리소스 요청이 구성되어 있어야 합니다.

HPA는 OpenShift Container Platform 클러스터에서 관찰된 Pod CPU 또는 메모리 사용률 값을 기반으로 스케일링 결정을 내립니다. 사용률 값은 각 Pod의 리소스 요청의 백분율로 계산됩니다. 리소스 요청 값이 누락되면 HPA의 최적 성능에 영향을 줄 수 있습니다.

쿨한 다운 기간 구성

수평 Pod 자동 스케일링 중에 시간 간격 없이 이벤트를 빠르게 확장할 수 있습니다. 자주 복제 변동을 방지합니다. stabilizationWindowSeconds 필드를 구성하여 쿨 다운 기간을 지정할 수 있습니다. 스케일링에 사용된 지표가 계속 변동될 때 복제본 수의 변동을 제한하는 데 안정화 기간(stabilization) 창입니다. 자동 스케일링 알고리즘은 이 창을 사용하여 이전에 원하는 상태를 추측하고 워크로드 규모에 원하지 않는 변경을 방지합니다.

예를 들어, stabilization 창은 scaleDown 필드에 대해 지정됩니다.

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300

위의 예에서는 지난 5분 동안 원하는 모든 상태를 고려합니다. 이는 롤링 최대값과 동일하며 스케일링 알고리즘은 나중에 동등한 Pod를 다시 생성하는 경우에만 Pod를 제거하는 경우가 많습니다.

2.4.4.1. 스케일링 정책

autoscaling/v2 API를 사용하면 수평 Pod 자동 스케일러에 스케일링 정책을 추가할 수 있습니다. 스케일링 정책은 OpenShift Container Platform HPA(수평 Pod 자동 스케일러)에서 Pod를 스케일링하는 방법을 제어합니다. 스케일링 정책을 사용하면 지정된 기간에 스케일링할 특정 수 또는 특정 백분율을 설정하여 HPA에서 Pod를 확장 또는 축소하는 비율을 제한할 수 있습니다. 또한 메트릭이 계속 변동하는 경우 이전에 계산한 원하는 상태를 사용하여 스케일링을 제어하는 안정화 기간을 정의할 수 있습니다. 동일한 스케일링 방향(확장 또는 축소)에 대해 여러 정책을 생성하여 변경 정도에 따라 사용할 정책을 결정할 수 있습니다. 반복 시간을 지정하여 스케일링을 제한할 수도 있습니다. HPA는 반복 중 Pod를 스케일링한 다음 필요에 따라 추가 반복에서 스케일링을 수행합니다.

스케일링 정책이 포함된 HPA 오브젝트 샘플

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
  behavior:
    scaleDown: 1
      policies: 2
      - type: Pods 3
        value: 4 4
        periodSeconds: 60 5
      - type: Percent
        value: 10 6
        periodSeconds: 60
      selectPolicy: Min 7
      stabilizationWindowSeconds: 300 8
    scaleUp: 9
      policies:
      - type: Pods
        value: 5 10
        periodSeconds: 70
      - type: Percent
        value: 12 11
        periodSeconds: 80
      selectPolicy: Max
      stabilizationWindowSeconds: 0
...

1
스케일링 정책의 방향, 즉 scaleDown 또는 scaleUp을 지정합니다. 이 예제에서는 축소 정책을 생성합니다.
2
스케일링 정책을 정의합니다.
3
정책이 각 반복에서 특정 Pod 수 또는 Pod 백분율로 스케일링하는지의 여부를 결정합니다. 기본값은 pods입니다.
4
각 반복 중에 Pod 수 또는 Pod 백분율 중 하나의 스케일링 양을 제한합니다. Pod 수에 따라 축소할 기본값은 없습니다.
5
스케일링 반복의 길이를 결정합니다. 기본값은 15초입니다.
6
백분율로 된 축소 기본값은 100%입니다.
7
여러 정책이 정의된 경우 먼저 사용할 정책을 결정합니다. 가장 많은 변경을 허용하는 정책을 사용하려면 Max를 지정하고, 최소 변경을 허용하는 정책을 사용하려면 Min을 지정합니다. HPA에서 해당 정책 방향으로 스케일링하지 않도록 하려면 Disabled를 지정합니다. 기본값은 Max입니다.
8
HPA에서 원하는 상태를 검토해야 하는 기간을 결정합니다. 기본값은 0입니다.
9
이 예제에서는 확장 정책을 생성합니다.
10
Pod 수에 따라 확장되는 양을 제한합니다. Pod 수 확장 기본값은 4%입니다.
11
Pod 백분율에 따라 확장되는 양을 제한합니다. 백분율로 된 확장 기본값은 100%입니다.

축소 정책의 예

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
...
  minReplicas: 20
...
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 4
        periodSeconds: 30
      - type: Percent
        value: 10
        periodSeconds: 60
      selectPolicy: Max
    scaleUp:
      selectPolicy: Disabled

이 예제에서 Pod 수가 40개를 초과하면 selectPolicy에서 요구하는 대로 해당 정책으로 인해 상당한 변경이 발생하므로 축소에 백분율 기반 정책이 사용됩니다.

Pod 복제본이 80개 있는 경우 HPA는 첫 번째 반복에서 1분(periodSeconds: 60)에 걸쳐 (type: Percentvalue: 10 매개변수에 따라) Pod 80개 중 10%에 해당하는 8개의 Pod를 줄입니다. 다음 반복에서는 Pod가 72개입니다. HPA는 나머지 Pod의 10%를 계산한 7.2개를 8개로 올림하여 Pod 8개를 축소합니다. 이후 반복할 때마다 나머지 Pod 수에 따라 스케일링할 Pod 수가 다시 계산됩니다. Pod 수가 40개 미만으로 줄어들면 Pod 기반 숫자가 백분율 기반 숫자보다 크기 때문에 Pod 기반 정책이 적용됩니다. HPA는 20개의 복제본(minReplicas)이 남아 있을 때까지 30초(periodSeconds: 30)에 걸쳐 한 번에 Pod를 4개씩 줄입니다(type: Podsvalue: 4).

selectPolicy: Disabled 매개변수를 사용하면 HPA에서 Pod를 확장하지 못합니다. 필요한 경우 복제본 세트 또는 배포 세트의 복제본 수를 조정하여 수동으로 확장할 수 있습니다.

설정되어 있는 경우 oc edit 명령을 사용하여 스케일링 정책을 확인할 수 있습니다.

$ oc edit hpa hpa-resource-metrics-memory

출력 예

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/behavior:\
'{"ScaleUp":{"StabilizationWindowSeconds":0,"SelectPolicy":"Max","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":15},{"Type":"Percent","Value":100,"PeriodSeconds":15}]},\
"ScaleDown":{"StabilizationWindowSeconds":300,"SelectPolicy":"Min","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":60},{"Type":"Percent","Value":10,"PeriodSeconds":60}]}}'
...

2.4.5. 웹 콘솔을 사용하여 수평 Pod 자동 스케일러 생성

웹 콘솔에서 Deployment 또는 DeploymentConfig 오브젝트에서 실행할 최소 및 최대 Pod 수를 지정하는 HPA(수평 Pod 자동 스케일러)를 생성할 수 있습니다. Pod에서 대상으로 하는 CPU 또는 메모리 사용량을 정의할 수도 있습니다.

참고

HPA는 Operator 지원 서비스, Knative 서비스 또는 Helm 차트의 일부인 배포에 추가할 수 없습니다.

절차

웹 콘솔에서 HPA를 생성하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 추가 를 선택하여 HorizontalPodAutoscaler 추가 양식을 엽니다.

    그림 2.2. Add HorizontalPodAutoscaler

    HorizontalPodAutoscaler 추가 양식
  3. HorizontalPodAutoscaler 추가 양식에서 이름, 최소 및 최대 Pod 제한, CPU 및 메모리 사용량을 정의하고 저장을 클릭합니다.

    참고

    CPU 및 메모리 사용량에 대한 값이 없는 경우 경고가 표시됩니다.

웹 콘솔에서 HPA를 편집하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 편집을 선택하여 Horizontal Pod Autoscaler 편집 양식을 엽니다.
  3. Horizontal Pod Autoscaler 편집 양식에서 최소 및 최대 Pod 제한과 CPU 및 메모리 사용량을 편집한 다음 저장을 클릭합니다.
참고

웹 콘솔에서 수평 Pod 자동 스케일러를 생성하거나 편집하는 동안 양식 보기에서 YAML 보기로 전환할 수 있습니다.

웹 콘솔에서 HPA를 제거하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 제거를 선택합니다.
  3. 확인 팝업 창에서 제거를 클릭하여 HPA를 제거합니다.

2.4.6. CLI를 사용하여 CPU 사용률에 대한 수평 Pod 자동 스케일러 생성

OpenShift Container Platform CLI를 사용하면 HPA(수평 Pod 자동 스케일러)를 생성하여 기존 Deployment,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 오브젝트를 자동으로 확장할 수 있습니다. HPA는 지정한 CPU 사용량을 유지하도록 해당 오브젝트와 연결된 Pod를 스케일링합니다.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다.

HPA는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 전체 Pod에서 지정된 CPU 사용률을 유지합니다.

CPU 사용률을 자동 스케일링할 때는 oc autoscale 명령을 사용하여 언제든지 실행하려는 최소 및 최대 Pod 수와 Pod에서 목표로 하는 평균 CPU 사용률을 지정할 수 있습니다. 최솟값을 지정하지 않으면 Pod에 OpenShift Container Platform 서버의 기본값이 지정됩니다.

특정 CPU 값을 자동 스케일링하려면 대상 CPU 및 Pod 제한을 사용하여 HorizontalPodAutoscaler 오브젝트를 생성합니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

출력 예

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

프로세스

CPU 사용률에 대한 수평 Pod 자동 스케일러를 생성하려면 다음을 수행합니다.

  1. 다음 중 하나를 수행합니다.

    • CPU 사용률의 백분율에 따라 스케일링하려면 기존 오브젝트에 대한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      $ oc autoscale <object_type>/<name> \1
        --min <number> \2
        --max <number> \3
        --cpu-percent=<percent> 4
      1
      자동 스케일링할 오브젝트의 유형 및 이름을 지정합니다. 오브젝트가 존재하고 Deployment,DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc 또는 StatefulSet 여야 합니다.
      2
      필요한 경우 축소 시 최소 복제본 수를 지정합니다.
      3
      확장 시 최대 복제본 수를 지정합니다.
      4
      요청된 CPU의 백분율로 표시되는 모든 Pod의 목표 평균 CPU 사용량을 지정합니다. 지정하지 않거나 음수가 아닌 경우 기본 자동 스케일링 정책이 사용됩니다.

      예를 들어 다음 명령은 image-registry Deployment 오브젝트의 자동 스케일링을 보여줍니다. 초기 배포에는 Pod 3개가 필요합니다. HPA 오브젝트에서 최소 5개로 증가합니다. Pod의 CPU 사용량이 75%에 도달하면 Pod가 7로 증가합니다.

      $ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75
    • 특정 CPU 값을 스케일링하려면 기존 오브젝트에 대해 다음과 유사한 YAML 파일을 생성합니다.

      1. 다음과 유사한 YAML 파일을 생성합니다.

        apiVersion: autoscaling/v2 1
        kind: HorizontalPodAutoscaler
        metadata:
          name: cpu-autoscale 2
          namespace: default
        spec:
          scaleTargetRef:
            apiVersion: apps/v1 3
            kind: Deployment 4
            name: example 5
          minReplicas: 1 6
          maxReplicas: 10 7
          metrics: 8
          - type: Resource
            resource:
              name: cpu 9
              target:
                type: AverageValue 10
                averageValue: 500m 11
        1
        autoscaling/v2 API를 사용합니다.
        2
        이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
        3
        스케일링할 오브젝트의 API 버전을 지정합니다.
        • Deployment,ReplicaSet,Statefulset 오브젝트의 경우 apps/v1 을 사용합니다.
        • ReplicationController 의 경우 v1 을 사용합니다.
        • DeploymentConfig 의 경우 apps.openshift.io/v1 을 사용합니다.
        4
        오브젝트 유형을 지정합니다. 오브젝트는 Deployment,DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc 또는 StatefulSet 여야 합니다.
        5
        스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
        6
        축소 시 최소 복제본 수를 지정합니다.
        7
        확장 시 최대 복제본 수를 지정합니다.
        8
        메모리 사용률에 metrics 매개변수를 사용합니다.
        9
        CPU 사용률에 cpu를 지정합니다.
        10
        AverageValue로 설정합니다.
        11
        대상 CPU 값을 사용하여 averageValue로 설정합니다.
      2. 수평 Pod 자동 스케일러를 생성합니다.

        $ oc create -f <file-name>.yaml
  2. 수평 Pod 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get hpa cpu-autoscale

    출력 예

    NAME            REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    cpu-autoscale   Deployment/example   173m/500m       1         10        1          20m

2.4.7. CLI를 사용하여 메모리 사용률에 대한 수평 Pod 자동 스케일러 오브젝트 생성

OpenShift Container Platform CLI를 사용하면 HPA(수평 Pod 자동 스케일러)를 생성하여 기존 Deployment,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 오브젝트를 자동으로 확장할 수 있습니다. HPA는 지정한 평균 메모리 사용률(직접 값 또는 요청된 메모리의 백분율)을 유지하도록 해당 오브젝트와 연결된 Pod를 스케일링합니다.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다.

HPA는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 전체 Pod에서 지정된 메모리 사용률을 유지합니다.

메모리 사용률의 경우 최소 및 최대 Pod 수와 Pod에서 목표로 해야 하는 평균 메모리 사용률을 지정할 수 있습니다. 최솟값을 지정하지 않으면 Pod에 OpenShift Container Platform 서버의 기본값이 지정됩니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-129-223.compute.internal -n openshift-kube-scheduler

출력 예

Name:         openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Cpu:     0
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2020-02-14T22:21:14Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Timestamp:             2020-02-14T22:21:14Z
Window:                5m0s
Events:                <none>

프로세스

메모리 사용률에 대한 수평 Pod 자동 스케일러를 생성하려면 다음을 수행합니다.

  1. 다음 중 하나에 대한 YAML 파일을 생성합니다.

    • 특정 메모리 값을 스케일링하려면 기존 오브젝트에 대해 다음과 유사한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: hpa-resource-metrics-memory 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: AverageValue 10
              averageValue: 500Mi 11
        behavior: 12
          scaleDown:
            stabilizationWindowSeconds: 300
            policies:
            - type: Pods
              value: 4
              periodSeconds: 60
            - type: Percent
              value: 10
              periodSeconds: 60
            selectPolicy: Max
      1
      autoscaling/v2 API를 사용합니다.
      2
      이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
      3
      스케일링할 오브젝트의 API 버전을 지정합니다.
      • Deployment,ReplicaSet 또는 Statefulset 오브젝트의 경우 apps/v1 을 사용합니다.
      • ReplicationController 의 경우 v1 을 사용합니다.
      • DeploymentConfig 의 경우 apps.openshift.io/v1 을 사용합니다.
      4
      오브젝트 유형을 지정합니다. 오브젝트는 Deployment, DeploymentConfig, ReplicaSet,ReplicationController 또는 StatefulSet 여야 합니다.
      5
      스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
      6
      축소 시 최소 복제본 수를 지정합니다.
      7
      확장 시 최대 복제본 수를 지정합니다.
      8
      메모리 사용률에 metrics 매개변수를 사용합니다.
      9
      메모리 사용률에 대한 메모리를 지정합니다.
      10
      유형을 AverageValue로 설정합니다.
      11
      averageValue 및 특정 메모리 값을 지정합니다.
      12
      선택 사항: 스케일링 정책을 지정하여 확장 또는 축소비율을 제어합니다.
    • 백분율로 스케일링하려면 기존 오브젝트에 대해 다음과 유사한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: memory-autoscale 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: Utilization 10
              averageUtilization: 50 11
        behavior: 12
          scaleUp:
            stabilizationWindowSeconds: 180
            policies:
            - type: Pods
              value: 6
              periodSeconds: 120
            - type: Percent
              value: 10
              periodSeconds: 120
            selectPolicy: Max
      1
      autoscaling/v2 API를 사용합니다.
      2
      이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
      3
      스케일링할 오브젝트의 API 버전을 지정합니다.
      • ReplicationController의 경우 v1 을 사용합니다.
      • DeploymentConfig의 경우 apps.openshift.io/v1 을 사용합니다.
      • Deployment, ReplicaSet, Statefulset 오브젝트의 경우 apps/v1 을 사용합니다.
      4
      오브젝트 유형을 지정합니다. 오브젝트는 Deployment, DeploymentConfig, ReplicaSet,ReplicationController 또는 StatefulSet 여야 합니다.
      5
      스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
      6
      축소 시 최소 복제본 수를 지정합니다.
      7
      확장 시 최대 복제본 수를 지정합니다.
      8
      메모리 사용률에 metrics 매개변수를 사용합니다.
      9
      메모리 사용률에 대한 메모리를 지정합니다.
      10
      Utilization으로 설정합니다.
      11
      averageUtilization 및 전체 Pod에 대한 대상 평균 메모리 사용률(요청 메모리의 백분율로 표시)을 지정합니다. 대상 Pod에 메모리 요청이 구성되어 있어야 합니다.
      12
      선택 사항: 스케일링 정책을 지정하여 확장 또는 축소비율을 제어합니다.
  2. 수평 Pod 자동 스케일러를 생성합니다.

    $ oc create -f <file-name>.yaml

    예를 들면 다음과 같습니다.

    $ oc create -f hpa.yaml

    출력 예

    horizontalpodautoscaler.autoscaling/hpa-resource-metrics-memory created

  3. 수평 Pod 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get hpa hpa-resource-metrics-memory

    출력 예

    NAME                          REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    hpa-resource-metrics-memory   Deployment/example   2441216/500Mi   1         10        1          20m

    $ oc describe hpa hpa-resource-metrics-memory

    출력 예

    Name:                        hpa-resource-metrics-memory
    Namespace:                   default
    Labels:                      <none>
    Annotations:                 <none>
    CreationTimestamp:           Wed, 04 Mar 2020 16:31:37 +0530
    Reference:                   Deployment/example
    Metrics:                     ( current / target )
      resource memory on pods:   2441216 / 500Mi
    Min replicas:                1
    Max replicas:                10
    ReplicationController pods:  1 current / 1 desired
    Conditions:
      Type            Status  Reason              Message
      ----            ------  ------              -------
      AbleToScale     True    ReadyForNewScale    recommended size matches current size
      ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
    Events:
      Type     Reason                   Age                 From                       Message
      ----     ------                   ----                ----                       -------
      Normal   SuccessfulRescale        6m34s               horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

2.4.8. CLI를 사용하여 수평 Pod 자동 스케일러 상태 조건 이해

일련의 상태 조건을 사용하여 HPA(수평 Pod 자동 스케일러)에서 스케일링할 수 있는지 그리고 HPA가 현재 제한되어 있는지의 여부를 결정할 수 있습니다.

HPA 상태 조건은 Autoscaling API의 v2 버전에서 사용할 수 있습니다.

HPA는 다음과 같은 상태 조건을 통해 응답합니다.

  • AbleToScale 상태는 HPA에서 메트릭을 가져오고 업데이트할 수 있는지의 여부 및 백오프 관련 상태로 스케일링을 방지할 수 있는지의 여부를 나타냅니다.

    • True 조건은 스케일링이 허용되었음을 나타냅니다.
    • False 조건은 지정된 이유로 스케일링이 허용되지 않음을 나타냅니다.
  • ScalingActive 조건은 HPA가 활성화되어 있고(예: 대상의 복제본 수가 0이 아님) 원하는 메트릭을 계산할 수 있는지의 여부를 나타냅니다.

    • True 조건은 메트릭이 제대로 작동함을 나타냅니다.
    • False 조건은 일반적으로 메트릭을 가져오는 데 문제가 있음을 나타냅니다.
  • ScalingLimited 조건은 원하는 스케일링이 수평 Pod 자동 스케일러의 최댓값 또는 최솟값으로 제한되었음을 나타냅니다.

    • True 조건은 스케일링을 위해 최소 또는 최대 복제본 수를 늘리거나 줄여야 함을 나타냅니다.
    • False 조건은 요청된 스케일링이 허용됨을 나타냅니다.

      $ oc describe hpa cm-test

      출력 예

      Name:                           cm-test
      Namespace:                      prom
      Labels:                         <none>
      Annotations:                    <none>
      CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
      Reference:                      ReplicationController/cm-test
      Metrics:                        ( current / target )
        "http_requests" on pods:      66m / 500m
      Min replicas:                   1
      Max replicas:                   4
      ReplicationController pods:     1 current / 1 desired
      Conditions: 1
        Type              Status    Reason              Message
        ----              ------    ------              -------
        AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
        ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
        ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
      Events:

      1
      수평 Pod 자동 스케일러의 상태 메시지입니다.

다음은 스케일링할 수 없는 Pod의 예입니다.

출력 예

Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: no matches for kind "ReplicationController" in group "apps"
Events:
  Type     Reason          Age               From                       Message
  ----     ------          ----              ----                       -------
  Warning  FailedGetScale  6s (x3 over 36s)  horizontal-pod-autoscaler  no matches for kind "ReplicationController" in group "apps"

다음은 스케일링에 필요한 메트릭을 가져올 수 없는 Pod의 예입니다.

출력 예

Conditions:
  Type                  Status    Reason                    Message
  ----                  ------    ------                    -------
  AbleToScale           True     SucceededGetScale          the HPA controller was able to get the target's current scale
  ScalingActive         False    FailedGetResourceMetric    the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

다음은 요청된 자동 스케일링이 필요한 최솟값보다 적은 Pod의 예입니다.

출력 예

Conditions:
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.8.1. CLI를 사용하여 수평 Pod 자동 스케일러 상태 조건 보기

HPA(수평 Pod 자동 스케일러)를 통해 Pod에 설정된 상태 조건을 볼 수 있습니다.

참고

수평 Pod 자동 스케일러 상태 조건은 v2 버전의 autoscaling API에서 사용할 수 있습니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

출력 예

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

프로세스

Pod의 상태 조건을 보려면 Pod 이름과 함께 다음 명령을 사용합니다.

$ oc describe hpa <pod-name>

예를 들면 다음과 같습니다.

$ oc describe hpa cm-test

상태가 출력의 Conditions 필드에 나타납니다.

출력 예

Name:                           cm-test
Namespace:                      prom
Labels:                         <none>
Annotations:                    <none>
CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
Reference:                      ReplicationController/cm-test
Metrics:                        ( current / target )
  "http_requests" on pods:      66m / 500m
Min replicas:                   1
Max replicas:                   4
ReplicationController pods:     1 current / 1 desired
Conditions: 1
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.9. 추가 리소스

2.5. 수직 Pod 자동 스케일러를 사용하여 Pod 리소스 수준 자동 조정

OpenShift Container Platform VPA(Vertical Pod Autoscaler Operator)는 Pod의 컨테이너에 대한 과거 및 현재의 CPU 및 메모리 리소스를 자동으로 검토한 후 확인한 사용량 값에 따라 리소스 제한 및 요청을 업데이트할 수 있습니다. VPA는 개별 CR(사용자 정의 리소스)을 사용하여 Deployment, Deployment Config, StatefulSet, Job, DaemonSet, ReplicaSet 또는 ReplicationController와 같은 워크로드 오브젝트와 연결된 모든 Pod를 프로젝트에서 업데이트합니다.

VPA를 사용하면 Pod의 최적 CPU 및 메모리 사용량을 이해하고 Pod의 라이프사이클 내내 Pod 리소스를 자동으로 유지 관리할 수 있습니다.

2.5.1. Vertical Pod Autoscaler Operator 정보

VPA(Vertical Pod Autoscaler Operator)는 API 리소스 및 CR(사용자 정의 리소스)로 구현됩니다. CR에 따라 Vertical Pod Autoscaler Operator에서 데몬 세트, 복제 컨트롤러 등과 같은 특정 워크로드 오브젝트와 관련된 Pod에서 수행해야 하는 작업이 프로젝트에서 결정됩니다.

VPA는 해당 Pod의 컨테이너 및 현재 CPU 및 메모리 사용량을 자동으로 계산하고, 이 데이터를 사용하여 최적화된 리소스 제한 및 요청을 확인하여 이러한 Pod가 항상 효율적으로 작동하는지 확인할 수 있습니다. 예를 들어 VPA에서 사용 중인 리소스보다 더 많은 리소스를 요청하는 Pod의 리소스를 줄이고 리소스를 충분히 요청하지 않는 Pod의 리소스를 늘립니다.

VPA는 애플리케이션이 다운 타임 없이 요청을 계속 제공할 수 있도록 권장 사항과 일치하지 않는 모든 Pod를 한 번에 하나씩 자동으로 삭제합니다. 그런 다음 워크로드 오브젝트는 원래 리소스 제한 및 요청을 사용하여 Pod를 재배포합니다. VPA는 변경 승인 Webhook를 사용하여 Pod가 노드에 승인되기 전에 최적화된 리소스 제한 및 요청을 사용하여 Pod를 업데이트합니다. VPA에서 Pod를 삭제하지 않으려면 필요에 따라 VPA 리소스 제한 및 요청 및 수동으로 Pod를 업데이트할 수 있습니다.

참고

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하려면 최소 두 개의 복제본을 지정해야 합니다. 이 최소보다 적은 복제본을 지정하는 워크로드 오브젝트는 삭제되지 않습니다. 이러한 Pod를 수동으로 삭제하면 워크로드 오브젝트가 Pod를 재배포하면 VPA에서 새 Pod를 권장 사항으로 업데이트합니다. VPA 최소 값 변경에 표시된 대로 VerticalPodAutoscalerController 오브젝트를 수정하여 이 최소값을 변경할 수 있습니다.

예를 들어 CPU의 50%를 사용하면서 10%만 요청하는 Pod가 있는 경우, VPA는 요청하는 것보다 더 많은 CPU를 사용하고 있는 것으로 판단하고 Pod를 삭제합니다. 복제본 세트와 같은 워크로드 오브젝트는 Pod를 재시작하고 VPA는 권장 리소스로 새 Pod를 업데이트합니다.

개발자의 경우 VPA를 사용하면 각 Pod에 적절한 리소스를 제공하도록 노드에 Pod를 예약하여 수요가 많은 기간에도 Pod가 유지되도록 할 수 있습니다.

관리자는 VPA를 사용하여 Pod에서 필요 이상의 CPU 리소스를 예약하지 않도록 클러스터 리소스를 더 효율적으로 활용할 수 있습니다. VPA는 워크로드에서 실제로 사용 중인 리소스를 모니터링하고 다른 워크로드에서 용량을 사용할 수 있도록 리소스 요구 사항을 조정합니다. 또한 VPA는 초기 컨테이너 구성에 지정된 제한 및 요청 간 비율도 유지합니다.

참고

VPA 실행을 중지하거나 클러스터에서 특정 VPA CR을 삭제하는 경우 VPA에서 이미 수정한 Pod에 대한 리소스 요청은 변경되지 않습니다. 새 Pod에서는 모두 VPA에서 설정한 이전의 권장 사항 대신 워크로드 오브젝트에 정의된 리소스를 가져옵니다.

2.5.2. Vertical Pod Autoscaler Operator 설치

OpenShift Container Platform 웹 콘솔을 사용하여 VPA(Vertical Pod Autoscaler Operator)를 설치할 수 있습니다.

절차

  1. OpenShift Container Platform 웹 콘솔에서 OperatorOperatorHub를 클릭합니다.
  2. 사용 가능한 Operator 목록에서 VerticalPodAutoscaler를 선택한 다음 설치를 클릭합니다.
  3. Operator 설치 페이지에서 Operator 권장 네임스페이스 옵션이 선택되어 있는지 확인합니다. 그러면 필수 openshift-vertical-pod-autoscaler 네임스페이스에 Operator가 설치됩니다. 해당 네임스페이스가 존재하지 않는 경우 자동으로 생성됩니다.
  4. 설치를 클릭합니다.
  5. VPA Operator 구성 요소를 나열하여 설치를 확인합니다.

    1. 워크로드Pod로 이동합니다.
    2. 드롭다운 메뉴에서 openshift-vertical-pod-autoscaler 프로젝트를 선택하고 Pod 4개가 실행되고 있는지 확인합니다.
    3. 워크로드배포로 이동하여 배포 4개가 실행되고 있는지 확인합니다.
  6. 선택 사항입니다. 다음 명령을 사용하여 OpenShift Container Platform CLI에서 설치를 확인합니다.

    $ oc get all -n openshift-vertical-pod-autoscaler

    출력에는 Pod 4개와 및 배포 4개가 표시됩니다.

    출력 예

    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc   1/1     Running   0          3m13s
    pod/vpa-admission-plugin-default-67644fc87f-xq7k9       1/1     Running   0          2m56s
    pod/vpa-recommender-default-7c54764b59-8gckt            1/1     Running   0          2m56s
    pod/vpa-updater-default-7f6cc87858-47vw9                1/1     Running   0          2m56s
    
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    service/vpa-webhook   ClusterIP   172.30.53.206   <none>        443/TCP   2m56s
    
    NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/vertical-pod-autoscaler-operator   1/1     1            1           3m13s
    deployment.apps/vpa-admission-plugin-default       1/1     1            1           2m56s
    deployment.apps/vpa-recommender-default            1/1     1            1           2m56s
    deployment.apps/vpa-updater-default                1/1     1            1           2m56s
    
    NAME                                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47   1         1         1       3m13s
    replicaset.apps/vpa-admission-plugin-default-67644fc87f       1         1         1       2m56s
    replicaset.apps/vpa-recommender-default-7c54764b59            1         1         1       2m56s
    replicaset.apps/vpa-updater-default-7f6cc87858                1         1         1       2m56s

2.5.3. Vertical Pod Autoscaler Operator 사용 정보

VPA(Vertical Pod Autoscaler Operator)를 사용하려면 클러스터에서 워크로드 오브젝트에 대한 VPA CR(사용자 정의 리소스)을 생성합니다. VPA는 해당 워크로드 오브젝트와 연결된 Pod에 가장 적합한 CPU 및 메모리 리소스를 확인하고 적용합니다. 배포, 상태 저장 세트, 작업, 데몬 세트, 복제본 세트 또는 복제 컨트롤러 워크로드 오브젝트에 VPA를 사용할 수 있습니다. VPA CR은 모니터링할 Pod와 동일한 프로젝트에 있어야 합니다.

VPA CR을 사용하여 워크로드 오브젝트를 연결하고 VPA가 작동하는 모드를 지정합니다.

  • AutoRecreate 모드는 Pod 수명 동안 VPA CPU 및 메모리 권장 사항을 자동으로 적용합니다. VPA는 권장 사항과 일치하지 않는 프로젝트의 모든 Pod를 삭제합니다. 워크로드 오브젝트에서 재배포하면 VPA는 새 Pod를 권장 사항으로 업데이트합니다.
  • Initial 모드는 Pod 생성 시에만 VPA 권장 사항을 자동으로 적용합니다.
  • Off 모드는 권장되는 리소스 제한 및 요청만 제공하며 권장 사항을 수동으로 적용할 수 있습니다. off 모드에서는 Pod를 업데이트하지 않습니다.

CR을 사용하여 VPA 평가 및 업데이트에서 특정 컨테이너를 옵트아웃할 수도 있습니다.

예를 들어 Pod에 다음과 같은 제한 및 요청이 있습니다.

resources:
  limits:
    cpu: 1
    memory: 500Mi
  requests:
    cpu: 500m
    memory: 100Mi

auto로 설정된 VPA를 생성하면 VPA에서 리소스 사용량을 확인하고 Pod를 삭제합니다. 재배포되면 Pod는 새 리소스 제한 및 요청을 사용합니다.

resources:
  limits:
    cpu: 50m
    memory: 1250Mi
  requests:
    cpu: 25m
    memory: 262144k

다음 명령을 사용하여 VPA 권장 사항을 볼 수 있습니다.

$ oc get vpa <vpa-name> --output yaml

몇 분 후 출력에는 CPU 및 메모리 요청에 대한 권장 사항이 표시되며 다음과 유사합니다.

출력 예

...
status:
...
  recommendation:
    containerRecommendations:
    - containerName: frontend
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      uncappedTarget:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 262m
        memory: "274357142"
    - containerName: backend
      lowerBound:
        cpu: 12m
        memory: 131072k
      target:
        cpu: 12m
        memory: 131072k
      uncappedTarget:
        cpu: 12m
        memory: 131072k
      upperBound:
        cpu: 476m
        memory: "498558823"
...

출력에는 권장 리소스(target), 최소 권장 리소스(lowerBound), 최고 권장 리소스(upperBound), 최신 리소스 권장 사항(uncappedTarget)이 표시됩니다.

VPA는 lowerBoundupperBound 값을 사용하여 Pod를 업데이트해야 하는지 확인합니다. Pod에 lowerBound 값보다 작거나 upperBound 값을 초과하는 리소스 요청이 있는 경우 VPA는 Pod를 종료하고 target 값을 사용하여 Pod를 다시 생성합니다.

2.5.3.1. VPA 최소 값 변경

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하고 업데이트하려면 최소 두 개의 복제본을 지정해야 합니다. 결과적으로 두 개 미만의 복제본을 지정하는 워크로드 오브젝트는 VPA에서 자동으로 작동하지 않습니다. VPA는 VPA 외부의 일부 프로세스에서 Pod를 다시 시작하는 경우 이러한 워크로드 오브젝트에서 새 Pod를 업데이트합니다. VerticalPodAutoscalerController 사용자 정의 리소스(CR)에서 minReplicas 매개변수를 수정하여 클러스터 전체 최소 값을 변경할 수 있습니다.

예를 들어 minReplicas3 으로 설정하면 VPA는 세 개 미만의 복제본을 지정하는 워크로드 오브젝트의 Pod를 삭제하고 업데이트하지 않습니다.

참고

minReplicas1 로 설정하면 VPA는 하나의 복제본만 지정하는 워크로드 오브젝트에 대한 유일한 Pod를 삭제할 수 있습니다. 이 설정은 워크로드가 VPA에서 Pod를 삭제하여 리소스를 조정할 때마다 다운타임을 허용할 수 있는 경우에만 이 설정을 사용해야 합니다. 하나의 복제 오브젝트에서 원하지 않는 다운 타임을 방지하려면 podUpdatePolicyInitial 로 설정된 VPA CR을 구성하여 VPA 외부 프로세스에서 Pod를 재시작할 때만 Pod를 자동으로 업데이트합니다. 그러면 애플리케이션에 적절한 시간에 Pod를 수동으로 업데이트할 수 있습니다.

VerticalPodAutoscalerController 오브젝트의 예

apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  creationTimestamp: "2021-04-21T19:29:49Z"
  generation: 2
  name: default
  namespace: openshift-vertical-pod-autoscaler
  resourceVersion: "142172"
  uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
  minReplicas: 3 1
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15

1 1
VPA에서 작업할 최소 복제본 수를 지정합니다. 최소보다 적은 복제본이 있는 모든 오브젝트는 VPA에서 자동으로 삭제되지 않습니다.
2.5.3.2. VPA 권장 사항 자동 적용

VPA를 사용하여 Pod를 자동으로 업데이트하려면 updateModeAuto 또는 Recreate로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

워크로드 오브젝트에 대한 Pod가 생성되면 VPA에서 컨테이너를 지속적으로 모니터링하여 CPU 및 메모리 요구 사항을 분석합니다. VPA는 CPU 및 메모리에 대한 VPA 권장 사항을 충족하지 않는 모든 Pod를 삭제합니다. 재배포되면 Pod는 VPA 권장 사항에 따라 새 리소스 제한 및 요청을 사용하여 애플리케이션에 대해 설정된 모든 Pod 중단 예산을 준수합니다. 권장 사항은 참조를 위해 VPA CR의 status 필드에 추가되어 있습니다.

참고

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하려면 최소 두 개의 복제본을 지정해야 합니다. 이 최소보다 적은 복제본을 지정하는 워크로드 오브젝트는 삭제되지 않습니다. 이러한 Pod를 수동으로 삭제하면 워크로드 오브젝트가 Pod를 재배포하면 VPA에서 새 Pod를 권장 사항으로 업데이트합니다. VPA 최소 값 변경에 표시된 대로 VerticalPodAutoscalerController 오브젝트를 수정하여 이 최소값을 변경할 수 있습니다.

Auto 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Auto 또는 Recreate로 설정합니다.
  • Auto. VPA는 Pod 생성 시 리소스 요청을 할당하고 요청된 리소스가 새 권장 사항과 크게 다른 경우 기존 Pod를 종료하여 업데이트합니다.
  • Recreate. VPA는 Pod 생성 시 리소스 요청을 할당하고 요청된 리소스가 새 권장 사항과 크게 다른 경우 기존 Pod를 종료하여 업데이트합니다. 이 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
참고

VPA에서 권장 리소스를 결정하고 권장 사항을 새 Pod에 적용하려면 프로젝트에 작동 중인 Pod가 있어야 합니다.

2.5.3.3. Pod 생성에 VPA 권장 사항 자동 적용

VPA를 사용하여 Pod를 처음 배포할 때만 권장 리소스를 적용하려면 updateModeInitial로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

그런 다음 VPA 권장 사항을 사용하려는 워크로드 오브젝트와 연결된 모든 Pod를 수동으로 삭제합니다. Initial 모드에서 VPA는 새 리소스 권장 사항을 확인할 때 Pod를 삭제하지 않고 Pod을 업데이트하지도 않습니다.

Initial 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Initial" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Initial로 설정합니다. Pod가 생성되면 VPA에서 리소스를 할당하고 Pod 수명 동안 리소스를 변경하지 않습니다.
참고

VPA에서 권장 리소스를 결정하고 권장 사항을 새 Pod에 적용하려면 프로젝트에 작동 중인 Pod가 있어야 합니다.

2.5.3.4. VPA 권장 사항 수동 적용

VPA를 권장 CPU 및 메모리 값을 확인하는 데에만 사용하려면 updateModeoff로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

해당 워크로드 오브젝트에 대한 Pod가 생성되면 VPA는 컨테이너의 CPU 및 메모리 요구 사항을 분석하고 VPA CR의 status 필드에 해당 권장 사항을 기록합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않습니다.

Off 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Off" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Off로 설정합니다.

다음 명령을 사용하여 권장 사항을 볼 수 있습니다.

$ oc get vpa <vpa-name> --output yaml

권장 사항에 따라 워크로드 오브젝트를 편집하여 CPU 및 메모리 요청을 추가한 다음 권장 리소스를 사용하여 Pod를 삭제하고 재배포할 수 있습니다.

참고

VPA에서 권장 리소스를 결정하려면 프로젝트에 작동 중인 Pod가 있어야 합니다.

2.5.3.5. VPA 권장 사항 적용에서 컨테이너 제외

워크로드 오브젝트에 컨테이너가 여러 개 있고 VPA에서 모든 컨테이너를 평가하고 해당 컨테이너에 대해 작동하지 않도록 하려면 특정 워크로드 오브젝트에 대한 VPA CR을 생성하고 resourcePolicy를 추가하여 특정 컨테이너를 옵트아웃합니다.

VPA에서 권장 리소스를 사용하여 Pod를 업데이트하면 resourcePolicy가 포함된 모든 컨테이너가 업데이트되지 않으며 VPA는 Pod의 해당 컨테이너에 대한 권장 사항을 제공하지 않습니다.

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3
  resourcePolicy: 4
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"
1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Auto, Recreate 또는 Off로 설정합니다. Recreate 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
4
옵트아웃할 컨테이너를 지정하고 modeOff로 설정합니다.

예를 들면 Pod에 다음과 같이 리소스 요청 및 제한이 동일한 두 개의 컨테이너가 있습니다.

# ...
spec:
  containers:
  - name: frontend
    resources:
      limits:
        cpu: 1
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
  - name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
# ...

backend 컨테이너를 옵트아웃으로 설정하여 VPA CR을 시작하면 VPA에서 Pod를 종료한 후 frontend 컨테이너에만 적용되는 권장 리소스를 사용하여 Pod를 다시 생성합니다.

...
spec:
  containers:
    name: frontend
    resources:
      limits:
        cpu: 50m
        memory: 1250Mi
      requests:
        cpu: 25m
        memory: 262144k
...
    name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
...

2.5.4. Vertical Pod Autoscaler Operator 사용

VPA(Vertical Pod Autoscaler Operator) CR(사용자 정의 리소스)을 생성하여 VPA를 사용할 수 있습니다. CR은 VPA에서 해당 Pod에 수행할 작업을 분석하고 결정해야 하는 Pod를 나타냅니다.

프로세스

특정 워크로드 오브젝트에 대한 VPA CR을 생성하려면 다음을 수행합니다.

  1. 스케일링할 워크로드 오브젝트가 있는 프로젝트로 변경합니다.

    1. VPA CR YAML 파일을 생성합니다.

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: vpa-recommender
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind:       Deployment 1
          name:       frontend 2
        updatePolicy:
          updateMode: "Auto" 3
        resourcePolicy: 4
          containerPolicies:
          - containerName: my-opt-sidecar
            mode: "Off"
      1
      이 VPA에서 관리할 워크로드 오브젝트 유형(Deployment, StatefulSet, Job, DaemonSet, ReplicaSet 또는 ReplicationController)을 지정합니다.
      2
      이 VPA에서 관리할 기존 워크로드 오브젝트의 이름을 지정합니다.
      3
      다음과 같이 VPA 모드를 지정합니다.
      • auto: 컨트롤러와 연결된 Pod에 권장 리소스를 자동으로 적용합니다. VPA는 기존 Pod를 종료하고 권장 리소스 제한 및 요청을 사용하여 새 Pod를 생성합니다.
      • recreate: 워크로드 오브젝트와 연결된 Pod에 권장 리소스를 자동으로 적용합니다. VPA는 기존 Pod를 종료하고 권장 리소스 제한 및 요청을 사용하여 새 Pod를 생성합니다. recreate 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
      • initial: 워크로드 오브젝트와 연결된 Pod가 생성될 때 권장 리소스를 자동으로 적용합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않습니다.
      • off: 워크로드 오브젝트와 연결된 Pod의 리소스 권장 사항만 생성합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않고 해당 권장 사항을 새 Pod에 적용하지도 않습니다.
      4
      선택 사항입니다. 옵트아웃할 컨테이너를 지정하고 모드를 Off로 설정합니다.
    2. VPA CR을 생성합니다.

      $ oc create -f <file-name>.yaml

      잠시 후 VPA는 워크로드 오브젝트와 연결된 Pod에서 컨테이너의 리소스 사용량을 확인합니다.

      다음 명령을 사용하여 VPA 권장 사항을 볼 수 있습니다.

      $ oc get vpa <vpa-name> --output yaml

      출력에는 CPU 및 메모리 요청에 대한 권장 사항이 표시되며 다음과 유사합니다.

      출력 예

      ...
      status:
      
      ...
      
        recommendation:
          containerRecommendations:
          - containerName: frontend
            lowerBound: 1
              cpu: 25m
              memory: 262144k
            target: 2
              cpu: 25m
              memory: 262144k
            uncappedTarget: 3
              cpu: 25m
              memory: 262144k
            upperBound: 4
              cpu: 262m
              memory: "274357142"
          - containerName: backend
            lowerBound:
              cpu: 12m
              memory: 131072k
            target:
              cpu: 12m
              memory: 131072k
            uncappedTarget:
              cpu: 12m
              memory: 131072k
            upperBound:
              cpu: 476m
              memory: "498558823"
      
      ...

      1
      lowerBound는 최소 권장 리소스 수준은 입니다.
      2
      target은 권장 리소스 수준입니다.
      3
      upperBound는 권장되는 최고 리소스 수준입니다.
      4
      uncappedTarget은 최신 리소스 권장 사항입니다.

2.5.5. Vertical Pod Autoscaler Operator 설치 제거

OpenShift Container Platform 클러스터에서 VPA(Vertical Pod Autoscaler Operator)를 제거할 수 있습니다. 설치 제거해도 기존 VPA CR에 의해 이미 수정된 Pod의 리소스 요청은 변경되지 않습니다. 새 Pod에서는 모두 Vertical Pod Autoscaler Operator에서 설정한 권장 사항 대신 워크로드 오브젝트에 정의된 리소스를 가져옵니다.

참고

oc delete vpa <vpa-name > 명령을 사용하여 특정 VPA CR을 제거할 수 있습니다. 리소스 요청에는 수직 Pod 자동 스케일러를 설치 제거할 때와 동일한 작업이 적용됩니다.

VPA Operator를 제거한 후 잠재적인 문제를 방지하려면 Operator와 관련된 다른 구성 요소를 제거하는 것이 좋습니다.

사전 요구 사항

  • Vertical Pod Autoscaler Operator를 설치해야 합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 Operator설치된 Operator를 클릭합니다.
  2. openshift-vertical-pod-autoscaler 프로젝트로 전환합니다.
  3. VerticalPodAutoscaler Operator의 경우 옵션 메뉴 kebab 를 클릭하고 Operator 설치 제거를 선택합니다.
  4. 선택 사항: Operator와 연결된 모든 피연산자를 제거하려면 대화 상자에서 이 Operator의 모든 피연산자 인스턴스 삭제를 선택합니다.
  5. 제거를 클릭합니다.
  6. 선택 사항: OpenShift CLI를 사용하여 VPA 구성 요소를 제거합니다.

    1. VPA 네임스페이스를 삭제합니다.

      $ oc delete namespace openshift-vertical-pod-autoscaler
    2. VPA CRD(사용자 정의 리소스 정의) 오브젝트를 삭제합니다.

      $ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
      $ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
      $ oc delete crd verticalpodautoscalers.autoscaling.k8s.io

      CRD를 삭제하면 관련 역할, 클러스터 역할, 역할 바인딩이 제거됩니다.

      참고

      이 작업은 클러스터에서 모든 사용자가 생성한 VPA CR에서 제거됩니다. VPA를 다시 설치하는 경우 이러한 오브젝트를 다시 생성해야 합니다.

    3. VPA Operator를 삭제합니다.

      $ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler

2.6. Pod에 민감한 데이터 제공

일부 애플리케이션에는 개발자에게 제공하길 원하지 않는 민감한 정보(암호 및 사용자 이름 등)가 필요합니다.

관리자는 Secret 오브젝트를 사용하여 이러한 정보를 명확한 텍스트로 공개하지 않고도 제공할 수 있습니다.

2.6.1. 보안 이해

Secret 오브젝트 유형에서는 암호, OpenShift Container Platform 클라이언트 구성 파일, 개인 소스 리포지토리 자격 증명 등과 같은 중요한 정보를 보유하는 메커니즘을 제공합니다. 보안은 Pod에서 중요한 콘텐츠를 분리합니다. 볼륨 플러그인을 사용하여 컨테이너에 보안을 마운트하거나 시스템에서 시크릿을 사용하여 Pod 대신 작업을 수행할 수 있습니다.

주요 속성은 다음과 같습니다.

  • 보안 데이터는 정의와는 별도로 참조할 수 있습니다.
  • 보안 데이터 볼륨은 임시 파일 저장 기능(tmpfs)에 의해 지원되며 노드에 저장되지 않습니다.
  • 보안 데이터는 네임스페이스 내에서 공유할 수 있습니다.

YAML Secret 오브젝트 정의

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
  namespace: my-namespace
type: Opaque 1
data: 2
  username: <username> 3
  password: <password>
stringData: 4
  hostname: myapp.mydomain.com 5

1
보안의 키 이름과 값의 구조를 나타냅니다.
2
data 필드에서 허용되는 키 형식은 Kubernetes 구분자 용어집DNS_SUBDOMAIN 값에 있는 지침을 충족해야 합니다.
3
data 맵의 키와 관련된 값은 base64로 인코딩되어야 합니다.
4
stringData 맵의 항목이 base64로 변환된 후 해당 항목이 자동으로 data 맵으로 이동합니다. 이 필드는 쓰기 전용이며 값은 data 필드를 통해서만 반환됩니다.
5
stringData 맵의 키와 관련된 값은 일반 텍스트 문자열로 구성됩니다.

먼저 보안을 생성한 후 해당 보안을 사용하는 Pod를 생성해야 합니다.

보안 생성 시 다음을 수행합니다.

  • 보안 데이터를 사용하여 보안 오브젝트를 생성합니다.
  • Pod 서비스 계정을 업데이트하여 보안에 대한 참조를 허용합니다.
  • 보안을 환경 변수로 사용하거나 secret 볼륨을 사용하여 파일로 사용하는 Pod를 생성합니다.
2.6.1.1. 보안 유형

type 필드의 값은 보안의 키 이름과 값의 구조를 나타냅니다. 유형을 사용하면 보안 오브젝트에 사용자 이름과 키를 적용할 수 있습니다. 검증을 수행하지 않으려면 기본값인 opaque 유형을 사용합니다.

보안 데이터에 특정 키 이름이 있는지 확인하기 위해 서버 측 최소 검증을 트리거하려면 다음 유형 중 하나를 지정합니다.

  • kubernetes.io/service-account-token. 서비스 계정 토큰을 사용합니다.
  • kubernetes.io/basic-auth. 기본 인증에 사용합니다.
  • kubernetes.io/ssh-auth. SSH 키 인증에 사용합니다.
  • kubernetes.io/tls. TLS 인증 기관에 사용합니다.

검증을 수행하지 않으려면 typ: Opaque를 지정합니다. 즉 보안에서 키 이름 또는 값에 대한 규칙을 준수하도록 요청하지 않습니다. opaque 보안에는 임의의 값을 포함할 수 있는 비정형 key:value 쌍을 사용할 수 있습니다.

참고

example.com/my-secret-type과 같은 다른 임의의 유형을 지정할 수 있습니다. 이러한 유형은 서버 측에 적용되지 않지만 보안 생성자가 해당 유형의 키/값 요구 사항을 준수하도록 의도했음을 나타냅니다.

다양한 시크릿 유형의 예는 보안 사용의 코드 샘플을 참조하십시오.

2.6.1.2. 보안 데이터 키

보안키는 DNS 하위 도메인에 있어야 합니다.

2.6.2. 보안 생성 방법 이해

관리자는 개발자가 해당 보안을 사용하는 Pod를 생성하기 전에 보안을 생성해야 합니다.

보안 생성 시 다음을 수행합니다.

  1. 보안을 유지하려는 데이터가 포함된 보안 오브젝트를 생성합니다. 각 시크릿 유형에 필요한 특정 데이터는 다음 섹션에서 역직렬화됩니다.

    불투명 보안을 생성하는 YAML 오브젝트의 예

    apiVersion: v1
    kind: Secret
    metadata:
      name: test-secret
    type: Opaque 1
    data: 2
      username: <username>
      password: <password>
    stringData: 3
      hostname: myapp.mydomain.com
      secret.properties: |
        property1=valueA
        property2=valueB

    1
    보안 유형을 지정합니다.
    2
    인코딩된 문자열 및 데이터를 지정합니다.
    3
    디코딩된 문자열 및 데이터를 지정합니다.

    둘 다 아닌 data 또는 stringdata 필드를 사용합니다.

  2. 보안을 참조하도록 Pod 서비스 계정을 업데이트합니다.

    보안을 사용하는 서비스 계정의 YAML

    apiVersion: v1
    kind: ServiceAccount
     ...
    secrets:
    - name: test-secret

  3. 보안을 환경 변수로 사용하거나 secret 볼륨을 사용하여 파일로 사용하는 Pod를 생성합니다.

    보안 데이터로 볼륨의 파일을 채우는 Pod의 YAML

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-example-pod
    spec:
      containers:
        - name: secret-test-container
          image: busybox
          command: [ "/bin/sh", "-c", "cat /etc/secret-volume/*" ]
          volumeMounts: 1
              - name: secret-volume
                mountPath: /etc/secret-volume 2
                readOnly: true 3
      volumes:
        - name: secret-volume
          secret:
            secretName: test-secret 4
      restartPolicy: Never

    1
    보안이 필요한 각 컨테이너에 volumeMounts 필드를 추가합니다.
    2
    보안이 표시되기를 원하는 미사용 디렉터리 이름을 지정합니다. 보안 데이터 맵의 각 키는 mountPath 아래의 파일 이름이 됩니다.
    3
    true 로 설정합니다. true인 경우 드라이버에서 읽기 전용 볼륨을 제공하도록 지시합니다.
    4
    시크릿 이름을 지정합니다.

    보안 데이터로 환경 변수를 채우는 Pod의 YAML

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-example-pod
    spec:
      containers:
        - name: secret-test-container
          image: busybox
          command: [ "/bin/sh", "-c", "export" ]
          env:
            - name: TEST_SECRET_USERNAME_ENV_VAR
              valueFrom:
                secretKeyRef: 1
                  name: test-secret
                  key: username
      restartPolicy: Never

    1
    시크릿 키를 사용하는 환경 변수를 지정합니다.

    보안 데이터로 환경 변수를 채우는 빌드 구성의 YAML

    apiVersion: build.openshift.io/v1
    kind: BuildConfig
    metadata:
      name: secret-example-bc
    spec:
      strategy:
        sourceStrategy:
          env:
          - name: TEST_SECRET_USERNAME_ENV_VAR
            valueFrom:
              secretKeyRef: 1
                name: test-secret
                key: username
          from:
            kind: ImageStreamTag
            namespace: openshift
            name: 'cli:latest'

    1
    시크릿 키를 사용하는 환경 변수를 지정합니다.
2.6.2.1. 보안 생성 제한 사항

보안을 사용하려면 Pod에서 보안을 참조해야 합니다. 보안은 다음 세 가지 방법으로 Pod에서 사용할 수 있습니다.

  • 컨테이너에 환경 변수를 채우기 위해 사용.
  • 하나 이상의 컨테이너에 마운트된 볼륨에서 파일로 사용.
  • Pod에 대한 이미지를 가져올 때 kubelet으로 사용.

볼륨 유형 보안은 볼륨 메커니즘을 사용하여 데이터를 컨테이너에 파일로 작성합니다. 이미지 가져오기 보안은 서비스 계정을 사용하여 네임스페이스의 모든 Pod에 보안을 자동으로 삽입합니다.

템플릿에 보안 정의가 포함된 경우 템플릿에 제공된 보안을 사용할 수 있는 유일한 방법은 보안 볼륨 소스를 검증하고 지정된 오브젝트 참조가 Secret 오브젝트를 실제로 가리키는 것입니다. 따라서 보안을 생성한 후 해당 보안을 사용하는 Pod를 생성해야 합니다. 가장 효과적인 방법은 서비스 계정을 사용하여 자동으로 삽입되도록 하는 것입니다.

Secret API 오브젝트는 네임스페이스에 있습니다. 동일한 네임스페이스에 있는 Pod만 참조할 수 있습니다.

개별 보안은 1MB로 제한됩니다. 이는 대규모 보안이 생성되어 apiserver 및 kubelet 메모리가 소모되는 것을 막기 위한 것입니다. 그러나 작은 보안을 많이 생성해도 메모리가 소모될 수 있습니다.

2.6.2.2. 불투명 보안 생성

관리자는 임의의 값을 포함할 수 있는 비정형 key:value 쌍을 저장할 수 있는 불투명 보안을 생성할 수 있습니다.

절차

  1. 컨트롤 플레인 노드의 YAML 파일에 Secret 오브젝트를 생성합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque 1
    data:
      username: <username>
      password: <password>
    1
    불투명 보안을 지정합니다.
  2. 다음 명령을 사용하여 Secret 오브젝트를 생성합니다.

    $ oc create -f <filename>.yaml
  3. Pod에서 보안을 사용하려면 다음을 수행합니다.

    1. "보안 생성 방법" 섹션에 표시된 대로 Pod 서비스 계정을 업데이트하여 보안을 참조합니다.
    2. "보안 생성 방법" 섹션에 표시된 대로 보안을 환경 변수로 사용하거나( 보안 볼륨 사용) 파일로 사용하는 Pod를 생성합니다.

추가 리소스

2.6.2.3. 서비스 계정 토큰 시크릿 생성

관리자는 서비스 계정 토큰 시크릿을 생성하여 API에 인증해야 하는 애플리케이션에 서비스 계정 토큰을 배포할 수 있습니다.

참고

서비스 계정 토큰 시크릿을 사용하는 대신 TokenRequest API를 사용하여 바인딩된 서비스 계정 토큰을 얻는 것이 좋습니다. TokenRequest API에서 얻은 토큰은 바인딩된 수명이 있고 다른 API 클라이언트에서 읽을 수 없기 때문에 보안에 저장된 토큰보다 더 안전합니다.

TokenRequest API를 사용할 수 없고 읽기 쉬운 API 오브젝트에서 만료되지 않은 토큰의 보안 노출이 허용되는 경우에만 서비스 계정 토큰 시크릿을 생성해야 합니다.

바인딩된 서비스 계정 토큰을 생성하는 방법에 대한 자세한 내용은 다음 추가 리소스 섹션을 참조하십시오.

절차

  1. 컨트롤 플레인 노드의 YAML 파일에 Secret 오브젝트를 생성합니다.

    보안 오브젝트의 예:

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-sa-sample
      annotations:
        kubernetes.io/service-account.name: "sa-name" 1
    type: kubernetes.io/service-account-token 2

    1
    기존 서비스 계정 이름을 지정합니다. ServiceAccountSecret 오브젝트를 모두 생성하는 경우 ServiceAccount 오브젝트를 먼저 생성합니다.
    2
    서비스 계정 토큰 시크릿을 지정합니다.
  2. 다음 명령을 사용하여 Secret 오브젝트를 생성합니다.

    $ oc create -f <filename>.yaml
  3. Pod에서 보안을 사용하려면 다음을 수행합니다.

    1. "보안 생성 방법" 섹션에 표시된 대로 Pod 서비스 계정을 업데이트하여 보안을 참조합니다.
    2. "보안 생성 방법" 섹션에 표시된 대로 보안을 환경 변수로 사용하거나( 보안 볼륨 사용) 파일로 사용하는 Pod를 생성합니다.

추가 리소스

  • Pod에서 보안 사용에 대한 자세한 내용은 보안 생성 방법 이해를 참조하십시오.
  • 바인딩된 서비스 계정 토큰 요청에 대한 자세한 내용은 서비스 계정 토큰 바인딩 사용을참조하십시오.
  • 서비스 계정 생성에 대한 자세한 내용은 서비스 계정 이해 및 생성을 참조하십시오.
2.6.2.4. 기본 인증 보안 생성

관리자는 기본 인증 보안에 필요한 자격 증명을 저장할 수 있는 기본 인증 보안을 생성할 수 있습니다. 이 보안 유형을 사용하는 경우 Secret 오브젝트의 data 매개변수에 base64 형식으로 인코딩된 다음 키가 포함되어야 합니다.

  • 사용자 이름: 인증을 위한 사용자 이름
  • password: 인증에 대한 암호 또는 토큰
참고

stringData 매개변수를 사용하여 일반 텍스트 콘텐츠를 사용할 수 있습니다.

절차

  1. 컨트롤 플레인 노드의 YAML 파일에 Secret 오브젝트를 생성합니다.

    secret 오브젝트의 예

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-basic-auth
    type: kubernetes.io/basic-auth 1
    data:
    stringData: 2
      username: admin
      password: <password>

    1
    기본 인증 보안을 지정합니다.
    2
    사용할 기본 인증 값을 지정합니다.
  2. 다음 명령을 사용하여 Secret 오브젝트를 생성합니다.

    $ oc create -f <filename>.yaml
  3. Pod에서 보안을 사용하려면 다음을 수행합니다.

    1. "보안 생성 방법" 섹션에 표시된 대로 Pod 서비스 계정을 업데이트하여 보안을 참조합니다.
    2. "보안 생성 방법" 섹션에 표시된 대로 보안을 환경 변수로 사용하거나( 보안 볼륨 사용) 파일로 사용하는 Pod를 생성합니다.

추가 리소스

2.6.2.5. SSH 인증 보안 생성

관리자는 SSH 인증에 사용되는 데이터를 저장할 수 있는 SSH 인증 보안을 생성할 수 있습니다. 이 보안 유형을 사용하는 경우 Secret 오브젝트의 data 매개변수에 사용할 SSH 인증 정보가 포함되어야 합니다.

절차

  1. 컨트롤 플레인 노드의 YAML 파일에 Secret 오브젝트를 생성합니다.

    보안 오브젝트의 예:

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-ssh-auth
    type: kubernetes.io/ssh-auth 1
    data:
      ssh-privatekey: | 2
              MIIEpQIBAAKCAQEAulqb/Y ...

    1
    SSH 인증 보안을 지정합니다.
    2
    사용할 SSH 키/값 쌍을 SSH 자격 증명으로 지정합니다.
  2. 다음 명령을 사용하여 Secret 오브젝트를 생성합니다.

    $ oc create -f <filename>.yaml
  3. Pod에서 보안을 사용하려면 다음을 수행합니다.

    1. "보안 생성 방법" 섹션에 표시된 대로 Pod 서비스 계정을 업데이트하여 보안을 참조합니다.
    2. "보안 생성 방법" 섹션에 표시된 대로 보안을 환경 변수로 사용하거나( 보안 볼륨 사용) 파일로 사용하는 Pod를 생성합니다.

추가 리소스

2.6.2.6. Docker 구성 보안 생성

관리자는 컨테이너 이미지 레지스트리에 액세스하기 위한 자격 증명을 저장할 수 있는 Docker 구성 보안을 생성할 수 있습니다.

  • kubernetes.io/dockercfg. 이 시크릿 유형을 사용하여 로컬 Docker 구성 파일을 저장합니다. secret 오브젝트의 data 매개변수에는 base64 형식으로 인코딩된 .dockercfg 파일의 내용이 포함되어야 합니다.
  • kubernetes.io/dockerconfigjson. 이 시크릿 유형을 사용하여 로컬 Docker 구성 JSON 파일을 저장합니다. secret 오브젝트의 data 매개변수에는 base64 형식으로 인코딩된 .docker/config.json 파일의 내용이 포함되어야 합니다.

프로세스

  1. 컨트롤 플레인 노드의 YAML 파일에 Secret 오브젝트를 생성합니다.

    Docker 구성 보안 오브젝트의

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-docker-cfg
      namespace: my-project
    type: kubernetes.io/dockerconfig 1
    data:
      .dockerconfig:bm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== 2

    1
    보안이 Docker 구성 파일을 사용하도록 지정합니다.
    2
    base64로 인코딩된 Docker 구성 파일의 출력

    Docker 구성 JSON 시크릿 오브젝트의

    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-docker-json
      namespace: my-project
    type: kubernetes.io/dockerconfig 1
    data:
      .dockerconfigjson:bm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== 2

    1
    보안이 Docker 구성 JSON 파일을 사용하도록 지정합니다.
    2
    base64로 인코딩된 Docker 구성 JSON 파일의 출력
  2. 다음 명령을 사용하여 Secret 오브젝트를 생성합니다.

    $ oc create -f <filename>.yaml
  3. Pod에서 보안을 사용하려면 다음을 수행합니다.

    1. "보안 생성 방법" 섹션에 표시된 대로 Pod 서비스 계정을 업데이트하여 보안을 참조합니다.
    2. "보안 생성 방법" 섹션에 표시된 대로 보안을 환경 변수로 사용하거나( 보안 볼륨 사용) 파일로 사용하는 Pod를 생성합니다.

추가 리소스

2.6.3. 보안 업데이트 방법 이해

보안 값을 수정해도 이미 실행 중인 Pod에서 사용하는 값은 동적으로 변경되지 않습니다. 보안을 변경하려면 원래 Pod를 삭제하고 새 Pod를 생성해야 합니다(대개 동일한 PodSpec 사용).

보안 업데이트 작업에서는 새 컨테이너 이미지를 배포하는 것과 동일한 워크플로를 따릅니다. kubectl rolling-update 명령을 사용할 수 있습니다.

보안의 resourceVersion 값은 참조 시 지정되지 않습니다. 따라서 Pod가 시작되는 동시에 보안이 업데이트되는 경우 Pod에 사용되는 보안의 버전이 정의되지 않습니다.

참고

현재는 Pod가 생성될 때 사용된 보안 오브젝트의 리소스 버전을 확인할 수 없습니다. 컨트롤러에서 이전 resourceVersion 을 사용하여 재시작할 수 있도록 Pod에서 이 정보를 보고하도록 계획되어 있습니다. 그동안 기존 보안 데이터를 업데이트하지 말고 고유한 이름으로 새 보안을 생성하십시오.

2.6.4. 보안 생성 및 사용

관리자는 서비스 계정 토큰 시크릿을 생성할 수 있습니다. 이를 통해 API에 인증해야 하는 애플리케이션에 서비스 계정 토큰을 배포할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 네임스페이스에 서비스 계정을 생성합니다.

    $ oc create sa <service_account_name> -n <your_namespace>
  2. 다음 YAML 예제를 service-account-token-secret.yaml 이라는 파일에 저장합니다. 예제에는 서비스 계정 토큰을 생성하는 데 사용할 수 있는 Secret 오브젝트 구성이 포함되어 있습니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret_name> 1
      annotations:
        kubernetes.io/service-account.name: "sa-name" 2
    type: kubernetes.io/service-account-token 3
    1
    & lt;secret_name >을 서비스 토큰 시크릿 이름으로 교체합니다.
    2
    기존 서비스 계정 이름을 지정합니다. ServiceAccountSecret 오브젝트를 모두 생성하는 경우 ServiceAccount 오브젝트를 먼저 생성합니다.
    3
    서비스 계정 토큰 시크릿 유형을 지정합니다.
  3. 파일을 적용하여 서비스 계정 토큰을 생성합니다.

    $ oc apply -f service-account-token-secret.yaml
  4. 다음 명령을 실행하여 시크릿에서 서비스 계정 토큰을 가져옵니다.

    $ oc get secret <sa_token_secret> -o jsonpath='{.data.token}' | base64 --decode) 1

    출력 예

    ayJhbGciOiJSUzI1NiIsImtpZCI6IklOb2dtck1qZ3hCSWpoNnh5YnZhSE9QMkk3YnRZMVZoclFfQTZfRFp1YlUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImJ1aWxkZXItdG9rZW4tdHZrbnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYnVpbGRlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNmZGU2MGZmLTA1NGYtNDkyZi04YzhjLTNlZjE0NDk3MmFmNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmJ1aWxkZXIifQ.OmqFTDuMHC_lYvvEUrjr1x453hlEEHYcxS9VKSzmRkP1SiVZWPNPkTWlfNRp6bIUZD3U6aN3N7dMSN0eI5hu36xPgpKTdvuckKLTCnelMx6cxOdAbrcw1mCmOClNscwjS1KO1kzMtYnnq8rXHiMJELsNlhnRyyIXRTtNBsy4t64T3283s3SLsancyx0gy0ujx-Ch3uKAKdZi5iT-I8jnnQ-ds5THDs2h65RJhgglQEmSxpHrLGZFmyHAQI-_SjvmHZPXEc482x3SkaQHNLqpmrpJorNqh1M8ZHKzlujhZgVooMvJmWPXTb2vnvi3DGn2XI-hZxl1yD2yGH1RBpYUHA

    1
    <sa_token_secret>을 서비스 토큰 시크릿 이름으로 교체합니다.
  5. 서비스 계정 토큰을 사용하여 클러스터 API로 인증합니다.

    $ curl -X GET <openshift_cluster_api> --header "Authorization: Bearer <token>" 1 2
    1
    &lt ;openshift_cluster_api&gt;를 OpenShift 클러스터 API로 바꿉니다.
    2
    & lt;token >을 이전 명령에서 출력되는 서비스 계정 토큰으로 바꿉니다.

2.6.5. 보안이 포함된 서명된 인증서 사용 정보

서비스에 대한 통신을 보호하려면 프로젝트의 보안에 추가할 수 있는 서명된 제공 인증서/키 쌍을 생성하도록 OpenShift Container Platform을 구성하면 됩니다.

서비스 제공 인증서 보안은 즉시 사용 가능한 인증서가 필요한 복잡한 미들웨어 애플리케이션을 지원하기 위한 것입니다. 해당 설정은 관리자 툴에서 노드 및 마스터에 대해 생성하는 서버 인증서와 동일합니다.

서비스 Pod 사양은 서비스 제공 인증서 보안에 대해 구성됩니다.

apiVersion: v1
kind: Service
metadata:
  name: registry
  annotations:
    service.beta.openshift.io/serving-cert-secret-name: registry-cert1
# ...

1
인증서 이름을 지정합니다.

기타 Pod는 해당 Pod에 자동으로 마운트되는 /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt 파일의 CA 번들을 사용하여 내부 DNS 이름에만 서명되는 클러스터 생성 인증서를 신뢰할 수 있습니다.

이 기능의 서명 알고리즘은 x509.SHA256WithRSA입니다. 직접 교대하려면 생성된 보안을 삭제합니다. 새 인증서가 생성됩니다.

2.6.5.1. 보안과 함께 사용할 서명된 인증서 생성

Pod와 함께 서명된 제공 인증서/키 쌍을 사용하려면 서비스를 생성하거나 편집하여 service.beta.openshift.io/serving-cert-secret-name 주석을 추가한 다음 Pod에 보안을 추가합니다.

프로세스

서비스 제공 인증서 보안을 생성하려면 다음을 수행합니다.

  1. 서비스에 대한 Pod 사양을 편집합니다.
  2. 보안에 사용할 이름으로 service.beta.openshift.io/serving-cert-secret-name 주석을 추가합니다.

    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
      annotations:
          service.beta.openshift.io/serving-cert-secret-name: my-cert 1
    spec:
      selector:
        app: MyApp
      ports:
      - protocol: TCP
        port: 80
        targetPort: 9376

    인증서 및 키는 PEM 형식이며 각각 tls.crttls.key에 저장됩니다.

  3. 서비스를 생성합니다.

    $ oc create -f <file-name>.yaml
  4. 보안이 생성되었는지 확인합니다.

    1. 모든 보안 목록을 확인합니다.

      $ oc get secrets

      출력 예

      NAME                     TYPE                                  DATA      AGE
      my-cert                  kubernetes.io/tls                     2         9m

    2. 보안에 대한 세부 정보를 확인합니다.

      $ oc describe secret my-cert

      출력 예

      Name:         my-cert
      Namespace:    openshift-console
      Labels:       <none>
      Annotations:  service.beta.openshift.io/expiry: 2023-03-08T23:22:40Z
                    service.beta.openshift.io/originating-service-name: my-service
                    service.beta.openshift.io/originating-service-uid: 640f0ec3-afc2-4380-bf31-a8c784846a11
                    service.beta.openshift.io/expiry: 2023-03-08T23:22:40Z
      
      Type:  kubernetes.io/tls
      
      Data
      ====
      tls.key:  1679 bytes
      tls.crt:  2595 bytes

  5. 해당 보안을 사용하여 Pod 사양을 편집합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-service-pod
    spec:
      containers:
      - name: mypod
        image: redis
        volumeMounts:
        - name: my-container
          mountPath: "/etc/my-path"
      volumes:
      - name: my-volume
        secret:
          secretName: my-cert
          items:
          - key: username
            path: my-group/my-username
            mode: 511

    사용 가능한 경우 Pod가 실행됩니다. 인증서는 내부 서비스 DNS 이름인 <service.name>.<service.namespace>.svc에 적합합니다.

    인증서/키 쌍은 만료 시기가 다가오면 자동으로 교체됩니다. 보안의 service.beta.openshift.io/expiry 주석에서 RFC3339 형식의 만료 날짜를 확인합니다.

    참고

    대부분의 경우 서비스 DNS 이름 <service.name>.<service.namespace>.svc는 외부에서 라우팅할 수 없습니다. <service.name>.<service.namespace>.svc는 주로 클러스터 내 또는 서비스 내 통신과 경로 재암호화에 사용됩니다.

2.6.6. 보안 문제 해결

를 사용하여 서비스 인증서 생성이 실패하는 경우 (서비스의 service.beta.openshift.io/serving-cert-generation-error 주석에 다음이 포함됩니다).

secret/ssl-key references serviceUID 62ad25ca-d703-11e6-9d6f-0e9c0057b608, which does not match 77b6dd80-d716-11e6-9d6f-0e9c0057b60

인증서를 생성한 서비스가 더 이상 존재하지 않거나 serviceUID가 다릅니다. 이전 보안을 제거하고 service.beta.openshift.io/serving-cert-generation-error , service.beta.openshift.io/serving-cert-generation-error -num 주석을 지워 인증서를 강제로 다시 생성해야 합니다.

  1. 보안을 삭제합니다.

    $ oc delete secret <secret_name>
  2. 주석을 지웁니다.

    $ oc annotate service <service_name> service.beta.openshift.io/serving-cert-generation-error-
    $ oc annotate service <service_name> service.beta.openshift.io/serving-cert-generation-error-num-
참고

주석을 제거하는 명령에는 제거할 주석 이름 뒤에 -가 있습니다.

2.7. 구성 맵 생성 및 사용

다음 섹션에서는 구성 맵과 이를 생성하고 사용하는 방법을 정의합니다.

2.7.1. 구성 맵 이해

많은 애플리케이션에는 구성 파일, 명령줄 인수 및 환경 변수 조합을 사용하여 구성이 필요합니다. OpenShift Container Platform에서 컨테이너화된 애플리케이션을 이식하기 위해 이러한 구성 아티팩트는 이미지 콘텐츠와 분리됩니다.

ConfigMap 오브젝트는 컨테이너를 OpenShift Container Platform과 무관하게 유지하면서 구성 데이터를 사용하여 컨테이너를 삽입하는 메커니즘을 제공합니다. 구성 맵은 개별 속성 또는 전체 구성 파일 또는 JSON Blob과 같은 세분화된 정보를 저장하는 데 사용할 수 있습니다.

ConfigMap 오브젝트에는 Pod에서 사용하거나 컨트롤러와 같은 시스템 구성 요소의 구성 데이터를 저장하는 데 사용할 수 있는 구성 데이터의 키-값 쌍이 있습니다. 예를 들면 다음과 같습니다.

ConfigMap 오브젝트 정의

kind: ConfigMap
apiVersion: v1
metadata:
  creationTimestamp: 2016-02-18T19:14:38Z
  name: example-config
  namespace: my-namespace
data: 1
  example.property.1: hello
  example.property.2: world
  example.property.file: |-
    property.1=value-1
    property.2=value-2
    property.3=value-3
binaryData:
  bar: L3Jvb3QvMTAw 2

1 1
구성 데이터를 포함합니다.
2
UTF8이 아닌 데이터를 포함한 파일을 가리킵니다(예: 바이너리 Java 키 저장소 파일). Base 64에 파일 데이터를 입력합니다.
참고

이미지와 같은 바이너리 파일에서 구성 맵을 생성할 때 binaryData 필드를 사용할 수 있습니다.

다양한 방법으로 Pod에서 구성 데이터를 사용할 수 있습니다. 구성 맵을 다음과 같이 사용할 수 있습니다.

  • 컨테이너에서 환경 변수 값 채우기
  • 컨테이너에서 명령줄 인수 설정
  • 볼륨에 구성 파일 채우기

사용자 및 시스템 구성 요소는 구성 데이터를 구성 맵에 저장할 수 있습니다.

구성 맵은 보안과 유사하지만 민감한 정보가 포함되지 않은 문자열 작업을 더 편리하게 지원하도록 설계되었습니다.

구성 맵 제한 사항

Pod에서 콘텐츠를 사용하기 전에 구성 맵을 생성해야 합니다.

컨트롤러는 누락된 구성 데이터를 허용하도록 작성할 수 있습니다. 상황에 따라 구성 맵을 사용하여 구성된 개별 구성 요소를 참조하십시오.

ConfigMap 오브젝트는 프로젝트에 있습니다.

동일한 프로젝트의 Pod에서만 참조할 수 있습니다.

Kubelet은 API 서버에서 가져오는 Pod에 대한 구성 맵만 지원합니다.

여기에는 CLI를 사용하거나 복제 컨트롤러에서 간접적으로 생성되는 모든 Pod가 포함됩니다. OpenShift Container Platform 노드의 --manifest-url 플래그, --config 플래그 또는 해당 REST API를 사용하여 생성한 Pod를 포함하지 않으며 이는 Pod를 생성하는 일반적인 방법이 아니기 때문입니다.

2.7.2. OpenShift Container Platform 웹 콘솔에서 구성 맵 생성

OpenShift Container Platform 웹 콘솔에서 구성 맵을 생성할 수 있습니다.

프로세스

  • 클러스터 관리자로 구성 맵을 생성하려면 다음을 수행합니다.

    1. 관리자 관점에서 WorkloadsConfig Maps을 선택합니다.
    2. 페이지 오른쪽 상단에서 구성 맵 생성을 선택합니다.
    3. 구성 맵의 콘텐츠를 입력합니다.
    4. 생성을 선택합니다.
  • 개발자로 구성 맵을 생성하려면 다음을 수행합니다.

    1. 개발자 관점에서 Config Maps을 선택합니다.
    2. 페이지 오른쪽 상단에서 구성 맵 생성을 선택합니다.
    3. 구성 맵의 콘텐츠를 입력합니다.
    4. 생성을 선택합니다.

2.7.3. CLI를 사용하여 구성 맵 생성

다음 명령을 사용하여 디렉토리, 특정 파일 또는 리터럴 값에서 구성 맵을 생성할 수 있습니다.

프로세스

  • 구성 맵 생성:

    $ oc create configmap <configmap_name> [options]
2.7.3.1. 디렉토리에서 구성 맵 생성

--from-file 플래그를 사용하여 디렉터리에서 구성 맵을 생성할 수 있습니다. 이 방법을 사용하면 디렉토리 내 여러 파일을 사용하여 구성 맵을 생성할 수 있습니다.

디렉터리의 각 파일은 구성 맵에서 키를 채우는 데 사용됩니다. 여기서 키 이름은 파일 이름이며 키 값은 파일의 내용입니다.

예를 들어 다음 명령은 example-files 디렉터리의 콘텐츠를 사용하여 구성 맵을 생성합니다.

$ oc create configmap game-config --from-file=example-files/

구성 맵에서 키를 표시합니다.

$ oc describe configmaps game-config

출력 예

Name:           game-config
Namespace:      default
Labels:         <none>
Annotations:    <none>

Data

game.properties:        158 bytes
ui.properties:          83 bytes

맵의 두 키가 명령에 지정된 디렉토리의 파일 이름에서 생성되는 것을 확인할 수 있습니다. 해당 키의 내용은 커질 수 있으므로 oc describe 의 출력은 키와 크기의 이름만 표시합니다.

사전 요구 사항

  • 구성 맵을 채우려는 데이터가 포함된 파일이 있는 디렉터리가 있어야 합니다.

    다음 절차에서는 다음 예제 파일을 사용합니다. game.propertiesui.properties:

    $ cat example-files/game.properties

    출력 예

    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30

    $ cat example-files/ui.properties

    출력 예

    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice

프로세스

  • 다음 명령을 입력하여 이 디렉터리의 각 파일의 내용을 보유한 구성 맵을 생성합니다.

    $ oc create configmap game-config \
        --from-file=example-files/

검증

  • 키 값을 보려면 -o 옵션을 사용하여 오브젝트에 대한 oc get 명령을 입력합니다.

    $ oc get configmaps game-config -o yaml

    출력 예

    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:34:05Z
      name: game-config
      namespace: default
      resourceVersion: "407"
      selflink: /api/v1/namespaces/default/configmaps/game-config
      uid: 30944725-d66e-11e5-8cd0-68f728db1985

2.7.3.2. 파일에서 구성 맵 생성

--from-file 플래그를 사용하여 파일에서 구성 맵을 생성할 수 있습니다. --from-file 옵션을 CLI에 여러 번 전달할 수 있습니다.

key=value 표현식을 --from-file 옵션에 전달하여 파일에서 가져온 콘텐츠의 구성 맵에 설정할 키를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.

$ oc create configmap game-config-3 --from-file=game-special-key=example-files/game.properties
참고

파일에서 구성 맵을 생성하는 경우 UTF8이 아닌 데이터를 손상시키지 않고 이 필드에 배치된 UTF8이 아닌 데이터가 포함된 파일을 포함할 수 있습니다. OpenShift Container Platform에서는 바이너리 파일을 감지하고 파일을 MIME로 투명하게 인코딩합니다. 서버에서 MIME 페이로드는 데이터 손상 없이 디코딩되어 저장됩니다.

사전 요구 사항

  • 구성 맵을 채우려는 데이터가 포함된 파일이 있는 디렉터리가 있어야 합니다.

    다음 절차에서는 다음 예제 파일을 사용합니다. game.propertiesui.properties:

    $ cat example-files/game.properties

    출력 예

    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30

    $ cat example-files/ui.properties

    출력 예

    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice

프로세스

  • 특정 파일을 지정하여 구성 맵을 생성합니다.

    $ oc create configmap game-config-2 \
        --from-file=example-files/game.properties \
        --from-file=example-files/ui.properties
  • 키-값 쌍을 지정하여 구성 맵을 생성합니다.

    $ oc create configmap game-config-3 \
        --from-file=game-special-key=example-files/game.properties

검증

  • 파일에서 키 값을 확인하려면 -o 옵션을 사용하여 오브젝트에 대한 oc get 명령을 입력합니다.

    $ oc get configmaps game-config-2 -o yaml

    출력 예

    apiVersion: v1
    data:
      game.properties: |-
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
      ui.properties: |
        color.good=purple
        color.bad=yellow
        allow.textmode=true
        how.nice.to.look=fairlyNice
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:52:05Z
      name: game-config-2
      namespace: default
      resourceVersion: "516"
      selflink: /api/v1/namespaces/default/configmaps/game-config-2
      uid: b4952dc3-d670-11e5-8cd0-68f728db1985

  • 키-값 쌍의 키 값을 확인하려면 -o 옵션을 사용하여 오브젝트에 대한 oc get 명령을 입력합니다.

    $ oc get configmaps game-config-3 -o yaml

    출력 예

    apiVersion: v1
    data:
      game-special-key: |- 1
        enemies=aliens
        lives=3
        enemies.cheat=true
        enemies.cheat.level=noGoodRotten
        secret.code.passphrase=UUDDLRLRBABAS
        secret.code.allowed=true
        secret.code.lives=30
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T18:54:22Z
      name: game-config-3
      namespace: default
      resourceVersion: "530"
      selflink: /api/v1/namespaces/default/configmaps/game-config-3
      uid: 05f8da22-d671-11e5-8cd0-68f728db1985

    1
    이전 단계에서 설정한 키입니다.
2.7.3.3. 리터럴 값에서 구성 맵 생성

구성 맵에 리터럴 값을 제공할 수 있습니다.

--from-literal 옵션은 key=value 구문을 사용하므로 명령줄에서 직접 리터럴 값을 제공할 수 있습니다.

프로세스

  • 리터럴 값을 지정하여 구성 맵을 생성합니다.

    $ oc create configmap special-config \
        --from-literal=special.how=very \
        --from-literal=special.type=charm

검증

  • 키 값을 보려면 -o 옵션을 사용하여 오브젝트에 대한 oc get 명령을 입력합니다.

    $ oc get configmaps special-config -o yaml

    출력 예

    apiVersion: v1
    data:
      special.how: very
      special.type: charm
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-02-18T19:14:38Z
      name: special-config
      namespace: default
      resourceVersion: "651"
      selflink: /api/v1/namespaces/default/configmaps/special-config
      uid: dadce046-d673-11e5-8cd0-68f728db1985

2.7.4. 사용 사례: Pod에서 구성 맵 사용

다음 섹션에서는 Pod에서 ConfigMap 오브젝트를 사용할 때 몇 가지 사용 사례에 대해 설명합니다.

2.7.4.1. 구성 맵을 사용하여 컨테이너에서 환경 변수 채우기

구성 맵을 사용하여 컨테이너에서 개별 환경 변수를 채우거나 유효한 환경 변수 이름을 형성하는 모든 키에서 컨테이너의 환경 변수를 채울 수 있습니다.

예를 들어 다음 구성 맵을 고려하십시오.

두 개의 환경 변수가 있는 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config 1
  namespace: default 2
data:
  special.how: very 3
  special.type: charm 4

1
구성 맵의 이름입니다.
2
구성 맵이 있는 프로젝트입니다. 구성 맵은 동일한 프로젝트의 Pod에서만 참조할 수 있습니다.
3 4
삽입할 환경 변수입니다.

하나의 환경 변수가 있는 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config 1
  namespace: default
data:
  log_level: INFO 2

1
구성 맵의 이름입니다.
2
삽입할 환경 변수입니다.

프로세스

  • configMapKeyRef 섹션을 사용하여 Pod에서 이 ConfigMap의 키를 사용할 수 있습니다.

    특정 환경 변수를 삽입하도록 구성된 샘플 Pod 사양

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "env" ]
          env: 1
            - name: SPECIAL_LEVEL_KEY 2
              valueFrom:
                configMapKeyRef:
                  name: special-config 3
                  key: special.how 4
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config 5
                  key: special.type 6
                  optional: true 7
          envFrom: 8
            - configMapRef:
                name: env-config 9
      restartPolicy: Never

    1
    ConfigMap에서 지정된 환경 변수를 가져오는 스탠자입니다.
    2
    키 값을 삽입하는 pod 환경 변수의 이름입니다.
    3 5
    특정 환경 변수를 끌어올 ConfigMap의 이름입니다.
    4 6
    ConfigMap에서 가져올 환경 변수입니다.
    7
    환경 변수를 선택적으로 만듭니다. 선택 사항으로 지정된 ConfigMap 및 키가 없는 경우에도 Pod가 시작됩니다.
    8
    ConfigMap에서 모든 환경 변수를 가져오는 스탠자입니다.
    9
    모든 환경 변수를 가져올 ConfigMap의 이름입니다.

    이 Pod가 실행되면 Pod 로그에 다음 출력이 포함됩니다.

    SPECIAL_LEVEL_KEY=very
    log_level=INFO
참고

SPECIAL_TYPE_KEY=charm은 예제 출력에 나열되지 않습니다. optional: true가 설정되어 있기 때문입니다.

2.7.4.2. 구성 맵을 사용하여 컨테이너 명령에 대한 명령줄 인수 설정

구성 맵을 사용하여 Kubernetes 대체 구문 $(VAR_NAME) 을 사용하여 컨테이너에서 명령 또는 인수 값을 설정할 수 있습니다.

예를 들어 다음 구성 맵을 고려하십시오.

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

프로세스

  • 컨테이너의 명령에 값을 삽입하려면 환경 변수로 사용할 키를 사용해야 합니다. 그런 다음 $(VAR_NAME) 구문을 사용하여 컨테이너의 명령에서 참조할 수 있습니다.

    특정 환경 변수를 삽입하도록 구성된 샘플 Pod 사양

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] 1
          env:
            - name: SPECIAL_LEVEL_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.how
            - name: SPECIAL_TYPE_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: special.type
      restartPolicy: Never

    1
    환경 변수로 사용할 키를 사용하여 컨테이너의 명령에 값을 삽입합니다.

    이 Pod가 실행되면 test-container 컨테이너에서 실행되는 echo 명령의 출력은 다음과 같습니다.

    very charm
2.7.4.3. 구성 맵을 사용하여 볼륨에 콘텐츠 삽입

구성 맵을 사용하여 볼륨에 콘텐츠를 삽입할 수 있습니다.

ConfigMap CR(사용자 정의 리소스)의 예

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

프로세스

구성 맵을 사용하여 볼륨에 콘텐츠를 삽입하는 몇 가지 다른 옵션이 있습니다.

  • 구성 맵을 사용하여 콘텐츠를 볼륨에 삽입하는 가장 기본적인 방법은 키가 파일 이름이고 파일의 콘텐츠가 키의 값인 파일로 볼륨을 채우는 것입니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/special.how" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: special-config 1
      restartPolicy: Never
    1
    키가 포함된 파일입니다.

    이 Pod가 실행되면 cat 명령의 출력은 다음과 같습니다.

    very
  • 구성 맵 키가 예상된 볼륨 내의 경로를 제어할 수도 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dapi-test-pod
    spec:
      containers:
        - name: test-container
          image: gcr.io/google_containers/busybox
          command: [ "/bin/sh", "-c", "cat", "/etc/config/path/to/special-key" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: special-config
            items:
            - key: special.how
              path: path/to/special-key 1
      restartPolicy: Never
    1
    구성 맵 키의 경로입니다.

    이 Pod가 실행되면 cat 명령의 출력은 다음과 같습니다.

    very

2.8. 장치 플러그인을 사용하여 Pod가 있는 외부 리소스에 액세스

장치 플러그인을 사용하면 사용자 정의 코드를 작성하지 않고도 OpenShift Container Platform Pod에서 특정 장치 유형(GPU, InfiniBand 또는 벤더별 초기화 및 설정이 필요한 기타 유사한 컴퓨팅 리소스)을 사용할 수 있습니다.

2.8.1. 장치 플러그인 이해

장치 플러그인은 클러스터 전체에서 하드웨어 장치를 소비할 수 있는 일관되고 이식 가능한 솔루션을 제공합니다. 장치 플러그인은 확장 메커니즘을 통해 이러한 장치를 지원하여 컨테이너에서 이러한 장치를 사용할 수 있게 하고 장치의 상태 점검을 제공하며 안전하게 공유합니다.

중요

OpenShift Container Platform은 장치 플러그인 API를 지원하지만 장치 플러그인 컨테이너는 개별 공급 업체에서 지원합니다.

장치 플러그인은 특정 하드웨어 리소스를 관리하는 노드( kubelet외부)에서 실행되는 gRPC 서비스입니다. 모든 장치 플러그인은 다음 원격 프로시저 호출 (RPC)을 지원해야 합니다.

service DevicePlugin {
      // GetDevicePluginOptions returns options to be communicated with Device
      // Manager
      rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {}

      // ListAndWatch returns a stream of List of Devices
      // Whenever a Device state change or a Device disappears, ListAndWatch
      // returns the new list
      rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}

      // Allocate is called during container creation so that the Device
      // Plug-in can run device specific operations and instruct Kubelet
      // of the steps to make the Device available in the container
      rpc Allocate(AllocateRequest) returns (AllocateResponse) {}

      // PreStartcontainer is called, if indicated by Device Plug-in during
      // registration phase, before each container start. Device plug-in
      // can run device specific operations such as reseting the device
      // before making devices available to the container
      rpc PreStartcontainer(PreStartcontainerRequest) returns (PreStartcontainerResponse) {}
}
장치 플러그인 예
참고

간편한 장치 플러그인 참조 구현을 위해 장치 관리자 코드에 vendor/k8s.io/kubernetes/pkg/kubelet/cm/deviceplugin/device_plugin_stub.go 의 스텁 장치 플러그인이 있습니다.

2.8.1.1. 장치 플러그인을 배포하는 방법
  • 장치 플러그인 배포에는 데몬 세트 접근 방식을 사용하는 것이 좋습니다.
  • 시작 시 장치 플러그인은 노드의 /var/lib/kubelet/device-plugin/ 에 UNIX 도메인 소켓을 만들어 장치 관리자의 RPC를 제공하려고 합니다.
  • 장치 플러그인은 하드웨어 리소스, 호스트 파일 시스템에 대한 액세스 및 소켓 생성을 관리해야 하므로 권한 있는 보안 컨텍스트에서 실행해야 합니다.
  • 배포 단계에 대한 보다 구체적인 세부 정보는 각 장치 플러그인 구현에서 확인할 수 있습니다.

2.8.2. 장치 관리자 이해

장치 관리자는 장치 플러그인이라는 플러그인을 사용하여 특수 노드 하드웨어 리소스를 알리기 위한 메커니즘을 제공합니다.

업스트림 코드 변경없이 특수 하드웨어를 공개할 수 있습니다.

중요

OpenShift Container Platform은 장치 플러그인 API를 지원하지만 장치 플러그인 컨테이너는 개별 공급 업체에서 지원합니다.

장치 관리자는 장치를 확장 리소스(Extended Resources)으로 공개합니다. 사용자 pod는 다른 확장 리소스 를 요청하는 데 사용되는 동일한 제한/요청 메커니즘을 사용하여 장치 관리자에 의해 공개된 장치를 사용할 수 있습니다.

시작시 장치 플러그인은 /var/lib/kubelet/device-plugins/kubelet.sock 에서 Register 를 호출하는 장치 관리자에 직접 등록하고 장치 관리자 요청을 제공하기 위해 /var/lib/kubelet/device-plugins/<plugin>.sock 에서 gRPC 서비스를 시작합니다.

장치 관리자는 새 등록 요청을 처리하는 동안 장치 플러그인 서비스에서 ListAndWatch 원격 프로시저 호출(RPC)을 호출합니다. 이에 대한 응답으로 장치 관리자는 플러그인에서 gRPC 스트림을 통해 장치 오브젝트 목록을 가져옵니다. 장치 관리자는 플러그인에서 새로운 업데이트를 위해 스트림을 모니터링합니다. 플러그인 측에서도 플러그인은 스트림을 열린 상태로 유지하고 장치 상태가 변경될 때마다 동일한 스트리밍 연결을 통해 새 장치 목록이 장치 관리자로 전송됩니다.

새로운 pod 승인 요청을 처리하는 동안 Kubelet은 장치 할당을 위해 요청된 Extended Resources를 장치 관리자에게 전달합니다. 장치 관리자는 데이터베이스에서 해당 플러그인이 존재하는지 확인합니다. 플러그인이 존재하고 로컬 캐시별로 할당 가능한 장치가 있는 경우 Allocate RPC가 특정 장치 플러그인에서 호출됩니다.

또한 장치 플러그인은 드라이버 설치, 장치 초기화 및 장치 재설정과 같은 몇 가지 다른 장치 관련 작업을 수행할 수도 있습니다. 이러한 기능은 구현마다 다릅니다.

2.8.3. 장치 관리자 활성화

장치 관리자는 장치 플러그인을 구현하여 업스트림 코드 변경없이 특수 하드웨어를 사용할 수 있습니다.

장치 관리자는 장치 플러그인이라는 플러그인을 사용하여 특수 노드 하드웨어 리소스를 알리기 위한 메커니즘을 제공합니다.

  1. 다음 명령을 입력하여 구성할 노드 유형의 정적 MachineConfigPool CRD와 연관된 라벨을 가져옵니다. 다음 중 하나를 실행합니다.

    1. Machine config를 표시합니다:

      # oc describe machineconfig <name>

      예를 들면 다음과 같습니다.

      # oc describe machineconfig 00-worker

      출력 예

      Name:         00-worker
      Namespace:
      Labels:       machineconfiguration.openshift.io/role=worker 1

      1
      장치 관리자에 필요한 라벨입니다.

프로세스

  1. 구성 변경을 위한 사용자 정의 리소스 (CR)를 만듭니다.

    장치 관리자 CR의 설정 예

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: devicemgr 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
           machineconfiguration.openshift.io: devicemgr 2
      kubeletConfig:
        feature-gates:
          - DevicePlugins=true 3

    1
    CR에 이름을 지정합니다.
    2
    Machine Config Pool에서 라벨을 입력합니다.
    3
    DevicePlugins를 'true'로 설정합니다.
  2. 장치 관리자를 만듭니다.

    $ oc create -f devicemgr.yaml

    출력 예

    kubeletconfig.machineconfiguration.openshift.io/devicemgr created

  3. 노드에서 /var/lib/kubelet/device-plugins/kubelet.sock이 작성되었는지 확인하여 장치 관리자가 실제로 사용 가능한지 확인합니다. 이는 장치 관리자의 gRPC 서버가 새 플러그인 등록을 수신하는 UNIX 도메인 소켓입니다. 이 소켓 파일은 장치 관리자가 활성화된 경우에만 Kubelet을 시작할 때 생성됩니다.

2.9. Pod 예약 결정에 Pod 우선순위 포함

클러스터에서 Pod 우선순위 및 선점을 활성화할 수 있습니다. Pod 우선순위는 다른 Pod와 관련된 Pod의 중요성을 나타내고 해당 우선 순위를 기반으로 하는 Pod를 대기열에 넣습니다. Pod 선점을 사용하면 우선순위가 낮은 Pod를 제거하거나 선점할 수 있으므로 적절한 노드 pod 우선순위에 사용 가능한 공간이 없는 경우 우선순위가 높은 Pod를 예약할 수 있습니다. 또한 노드의 Pod 예약 순서 및 리소스 부족 제거 순서에 영향을 미칩니다.

우선순위 및 선점 기능을 사용하려면 Pod의 상대적 가중치를 정의하는 우선순위 클래스를 생성합니다. 그런 다음 Pod 사양의 우선순위 클래스를 참조하여 예약에 해당 값을 적용합니다.

2.9.1. Pod 우선순위 이해

Pod 우선순위 및 선점 기능을 사용하면 스케줄러에서 보류 중인 Pod를 우선순위에 따라 정렬하고, 보류 중인 Pod는 예약 큐에서 우선순위가 더 낮은 다른 대기 중인 Pod보다 앞에 배치됩니다. 그 결과 예약 요구 사항이 충족되는 경우 우선순위가 높은 Pod가 우선순위가 낮은 Pod보다 더 빨리 예약될 수 있습니다. Pod를 예약할 수 없는 경우에는 스케줄러에서 우선순위가 낮은 다른 Pod를 계속 예약합니다.

2.9.1.1. Pod 우선순위 클래스

네임스페이스가 지정되지 않은 오브젝트로서 이름에서 우선순위 정수 값으로의 매핑을 정의하는 우선순위 클래스를 Pod에 할당할 수 있습니다. 값이 클수록 우선순위가 높습니다.

우선순위 클래스 오브젝트에는 1000000000(10억)보다 작거나 같은 32비트 정수 값을 사용할 수 있습니다. 선점하거나 제거해서는 안 되는 중요한 Pod의 경우 10억보다 크거나 같은 숫자를 예약합니다. 기본적으로 OpenShift Container Platform에는 중요한 시스템 Pod의 예약을 보장하기 위해 우선순위 클래스가 2개 예약되어 있습니다.

$ oc get priorityclasses

출력 예

NAME                      VALUE        GLOBAL-DEFAULT   AGE
system-node-critical      2000001000   false            72m
system-cluster-critical   2000000000   false            72m
openshift-user-critical   1000000000   false            3d13h
cluster-logging           1000000      false            29s

  • system-node-critical - 이 우선순위 클래스의 값은 2000001000이며 노드에서 제거해서는 안 되는 모든 Pod에 사용합니다. 이 우선순위 클래스가 있는 Pod의 예로는 sdn-ovs, sdn 등이 있습니다. 대다수의 중요한 구성 요소에는 기본적으로 system-node-critical 우선순위 클래스가 포함됩니다. 예를 들면 다음과 같습니다.

    • master-api
    • master-controller
    • master-etcd
    • sdn
    • sdn-ovs
    • sync
  • system-cluster-critical - 이 우선순위 클래스의 값은 2000000000(10억)이며 클러스터에 중요한 Pod에 사용합니다. 이 우선순위 클래스가 있는 Pod는 특정 상황에서 노드에서 제거할 수 있습니다. 예를 들어 system-node-critical 우선순위 클래스를 사용하여 구성한 Pod가 우선할 수 있습니다. 그러나 이 우선순위 클래스는 예약을 보장합니다. 이 우선순위 클래스를 사용할 수 있는 Pod의 예로는 fluentd, Descheduler와 같은 추가 기능 구성 요소 등이 있습니다. 대다수의 중요한 구성 요소에는 기본적으로 system-cluster-critical 우선순위 클래스가 포함됩니다. 예를 들면 다음과 같습니다.

    • fluentd
    • metrics-server
    • Descheduler
  • OpenShift-user-critical - 리소스 소비를 바인딩할 수 없고 예측 가능한 리소스 사용 동작이 없는 중요한 Pod와 함께 priorityClassName 필드를 사용할 수 있습니다. openshift-monitoringopenshift-user-workload-monitoring 네임스페이스의 Prometheus Pod는 openshift-user-critical priorityClassName 을 사용합니다. 워크로드 모니터링은 첫 번째 우선순위 클래스로 시스템이 중요하게 사용하지만 모니터링에서 과도한 메모리를 사용하고 노드가 이를 제거할 수 없는 경우 문제가 발생합니다. 결과적으로 모니터링 방울 우선 순위로 스케줄러의 유연성을 제공하여 중요한 노드가 작동할 수 있도록 워크로드를 많이 이동하고 있습니다.
  • cluster-logging - 이 우선순위는 Fluentd에서 Fluentd Pod가 다른 앱보다 먼저 노드에 예약되도록 하는 데 사용합니다.
2.9.1.2. Pod 우선순위 이름

우선순위 클래스가 한 개 이상 있으면 Pod 사양에서 우선순위 클래스 이름을 지정하는 Pod를 생성할 수 있습니다. 우선순위 승인 컨트롤러는 우선순위 클래스 이름 필드를 사용하여 정수 값으로 된 우선순위를 채웁니다. 이름이 지정된 우선순위 클래스가 없는 경우 Pod가 거부됩니다.

2.9.2. Pod 선점 이해

개발자가 Pod를 생성하면 Pod가 큐로 들어갑니다. 개발자가 Pod에 Pod 우선순위 또는 선점을 구성한 경우 스케줄러는 큐에서 Pod를 선택하고 해당 Pod를 노드에 예약하려고 합니다. 스케줄러가 노드에서 Pod의 지정된 요구 사항을 모두 충족하는 적절한 공간을 찾을 수 없는 경우 보류 중인 Pod에 대한 선점 논리가 트리거됩니다.

스케줄러가 노드에서 Pod를 하나 이상 선점하면 우선순위가 높은 Pod 사양의 nominatedNodeName 필드가 nodename 필드와 함께 노드의 이름으로 설정됩니다. 스케줄러는 nominatedNodeName 필드를 사용하여 Pod용으로 예약된 리소스를 계속 추적하고 클러스터의 선점에 대한 정보도 사용자에게 제공합니다.

스케줄러에서 우선순위가 낮은 Pod를 선점한 후에는 Pod의 정상 종료 기간을 따릅니다. 스케줄러에서 우선순위가 낮은 Pod가 종료되기를 기다리는 동안 다른 노드를 사용할 수 있게 되는 경우 스케줄러는 해당 노드에서 우선순위가 더 높은 Pod를 예약할 수 있습니다. 따라서 Pod 사양의 nominatedNodeName 필드 및 nodeName 필드가 다를 수 있습니다.

또한 스케줄러가 노드의 Pod를 선점하고 종료되기를 기다리고 있는 상태에서 보류 중인 Pod보다 우선순위가 높은 Pod를 예약해야 하는 경우, 스케줄러는 우선순위가 더 높은 Pod를 대신 예약할 수 있습니다. 이러한 경우 스케줄러는 보류 중인 Pod의 nominatedNodeName을 지워 해당 Pod를 다른 노드에 사용할 수 있도록 합니다.

선점을 수행해도 우선순위가 낮은 Pod가 노드에서 모두 제거되는 것은 아닙니다. 스케줄러는 우선순위가 낮은 Pod의 일부를 제거하여 보류 중인 Pod를 예약할 수 있습니다.

스케줄러는 노드에서 보류 중인 Pod를 예약할 수 있는 경우에만 해당 노드에서 Pod 선점을 고려합니다.

2.9.2.1. 비 선점 우선순위 클래스(기술 프리뷰)

선점 정책이 Never로 설정된 Pod는 예약 큐에서 우선순위가 낮은 Pod보다 앞에 배치되지만 다른 Pod는 선점할 수 없습니다. 예약 대기 중인 비 선점 Pod는 사용 가능한 리소스가 충분하고 해당 Pod를 예약할 수 있을 때까지 예약 큐에 남아 있습니다. 비 선점 Pod는 다른 Pod와 마찬가지로 스케줄러 백오프의 영향을 받습니다. 즉 스케줄러에서 이러한 Pod를 예약하지 못하면 더 낮은 빈도로 다시 예약을 시도하여 우선순위가 더 낮은 기타 Pod를 먼저 예약할 수 있습니다.

비 선점 Pod는 우선순위가 높은 다른 Pod에서 계속 선점할 수 있습니다.

2.9.2.2. Pod 선점 및 기타 스케줄러 설정

Pod 우선순위 및 선점 기능을 활성화하는 경우 다른 스케줄러 설정을 고려하십시오.

Pod 우선순위 및 Pod 중단 예산
Pod 중단 예산은 동시에 작동해야 하는 최소 복제본 수 또는 백분율을 지정합니다. Pod 중단 예산을 지정하면 Pod를 최적의 노력 수준에서 선점할 때 OpenShift Container Platform에서 해당 예산을 준수합니다. 스케줄러는 Pod 중단 예산을 위반하지 않고 Pod를 선점하려고 합니다. 이러한 Pod를 찾을 수 없는 경우 Pod 중단 예산 요구 사항과 관계없이 우선순위가 낮은 Pod를 선점할 수 있습니다.
Pod 우선순위 및 Pod 유사성
Pod 유사성을 위해서는 동일한 라벨이 있는 다른 Pod와 같은 노드에서 새 Pod를 예약해야 합니다.

노드에서 우선순위가 낮은 하나 이상의 Pod와 보류 중인 Pod에 Pod 간 유사성이 있는 경우 스케줄러는 선호도 요구 사항을 위반하지 않고 우선순위가 낮은 Pod를 선점할 수 없습니다. 이 경우 스케줄러는 보류 중인 Pod를 예약할 다른 노드를 찾습니다. 그러나 스케줄러에서 적절한 노드를 찾을 수 있다는 보장이 없고 보류 중인 Pod가 예약되지 않을 수 있습니다.

이러한 상황을 방지하려면 우선순위가 같은 Pod를 사용하여 Pod 유사성을 신중하게 구성합니다.

2.9.2.3. 선점된 Pod의 정상 종료

Pod를 선점할 때 스케줄러는 Pod의 정상 종료 기간이 만료될 때까지 대기하여 Pod가 작동을 완료하고 종료할 수 있도록 합니다. 기간이 지난 후에도 Pod가 종료되지 않으면 스케줄러에서 Pod를 종료합니다. 이러한 정상 종료 기간으로 인해 스케줄러에서 Pod를 선점하는 시점과 노드에서 보류 중인 Pod를 예약할 수 있는 시간 사이에 시차가 발생합니다.

이 간격을 최소화하려면 우선순위가 낮은 Pod의 정상 종료 기간을 짧게 구성하십시오.

2.9.3. 우선순위 및 선점 구성

Pod 사양에 priorityClassName 을 사용하여 우선순위 클래스 오브젝트를 생성하고 Pod를 우선순위에 연결하여 우선순위 및 선점을 적용합니다.

참고

예약된 기존 Pod에 우선순위 클래스를 직접 추가할 수 없습니다.

프로세스

우선순위 및 선점을 사용하도록 클러스터를 구성하려면 다음을 수행합니다.

  1. 우선순위 클래스를 한 개 이상 생성합니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: scheduling.k8s.io/v1
      kind: PriorityClass
      metadata:
        name: high-priority 1
      value: 1000000 2
      preemptionPolicy: PreemptLowerPriority 3
      globalDefault: false 4
      description: "This priority class should be used for XYZ service pods only." 5
      1
      우선순위 클래스 오브젝트의 이름입니다.
      2
      오브젝트의 우선순위 값입니다.
      3
      선택 사항입니다. 이 우선순위 클래스가 선점인지 또는 선점되지 않는지 여부를 지정합니다. 선점 정책의 기본값은 PreemptLowerPriority로, 해당 우선순위 클래스의 Pod에서 우선순위가 낮은 Pod를 선점할 수 있습니다. 선점 정책이 Never로 설정된 경우 해당 우선순위 클래스의 Pod는 선점하지 않습니다.
      4
      선택 사항입니다. 우선순위 클래스 이름이 지정되지 않은 Pod에 이 우선순위 클래스를 사용해야 하는지 여부를 지정합니다. 이 필드는 기본적으로 false입니다. globalDefaulttrue로 설정된 하나의 우선순위 클래스만 클러스터에 존재할 수 있습니다. globalDefault:true가 설정된 우선순위 클래스가 없는 경우 우선순위 클래스 이름이 없는 Pod의 우선순위는 0입니다. globalDefault:true를 사용하여 우선순위 클래스를 추가하면 우선순위 클래스를 추가한 후 생성된 Pod에만 영향을 미치고 기존 Pod의 우선순위는 변경되지 않습니다.
      5
      선택 사항입니다. 개발자가 이 우선순위 클래스와 함께 사용해야 하는 Pod를 설명합니다. 임의의 텍스트 문자열을 입력합니다.
    2. 우선순위 클래스를 생성합니다.

      $ oc create -f <file-name>.yaml
  2. 우선순위 클래스의 이름을 포함할 Pod 사양을 생성합니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
        labels:
          env: test
      spec:
        containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
        priorityClassName: high-priority 1
      1
      이 Pod에 사용할 우선순위 클래스를 지정합니다.
    2. Pod를 생성합니다.

      $ oc create -f <file-name>.yaml

      Pod 구성 또는 Pod 템플릿에 우선순위 이름을 직접 추가할 수 있습니다.

2.10. 노드 선택기를 사용하여 특정 노드에 Pod 배치

노드 선택기는 키-값 쌍으로 구성된 맵을 지정합니다. 규칙은 노드의 사용자 정의 라벨과 Pod에 지정된 선택기를 사용하여 정의합니다.

Pod를 노드에서 실행하려면 Pod에 노드의 라벨로 표시된 키-값 쌍이 있어야 합니다.

동일한 Pod 구성에서 노드 유사성 및 노드 선택기를 사용하는 경우 아래의 중요 고려 사항을 참조하십시오.

2.10.1. 노드 선택기를 사용하여 Pod 배치 제어

Pod의 노드 선택기와 노드의 라벨을 사용하여 Pod가 예약되는 위치를 제어할 수 있습니다. 노드 선택기를 사용하면 OpenShift Container Platform에서 일치하는 라벨이 포함된 노드에 Pod를 예약합니다.

노드, 머신 세트 또는 머신 구성에 라벨을 추가합니다. 머신 세트에 라벨을 추가하면 노드 또는 머신이 중단되는 경우 새 노드에 라벨이 지정됩니다. 노드 또는 머신이 중단된 경우 노드 또는 머신 구성에 추가된 라벨이 유지되지 않습니다.

기존 Pod에 노드 선택기를 추가하려면 ReplicaSet 오브젝트, DaemonSet 오브젝트, StatefulSet 오브젝트, Deployment 오브젝트 또는 DeploymentConfig 오브젝트와 같이 해당 Pod의 제어 오브젝트에 노드 선택기를 추가합니다. 이 제어 오브젝트 아래의 기존 Pod는 라벨이 일치하는 노드에서 재생성됩니다. 새 Pod를 생성하는 경우 Pod 사양에 노드 선택기를 직접 추가할 수 있습니다. Pod에 제어 오브젝트가 없는 경우 Pod를 삭제하고 Pod 사양을 편집하고 Pod를 다시 생성해야 합니다.

참고

예약된 기존 Pod에 노드 선택기를 직접 추가할 수 없습니다.

사전 요구 사항

기존 Pod에 노드 선택기를 추가하려면 해당 Pod의 제어 오브젝트를 결정하십시오. 예를 들어 router-default-66d5cf9464-m2g75 Pod는 router-default-66d5cf9464 복제본 세트에서 제어합니다.

$ oc describe pod router-default-66d5cf9464-7pwkc

출력 예

kind: Pod
apiVersion: v1
metadata:
#...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...

웹 콘솔에서 Pod YAML의 ownerReferences 아래에 제어 오브젝트가 나열됩니다.

apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...

프로세스

  1. 머신 세트를 사용하거나 노드를 직접 편집하여 노드에 라벨을 추가합니다.

    • 노드를 생성할 때 머신 세트에서 관리하는 노드에 라벨을 추가하려면 MachineSet 오브젝트를 사용합니다.

      1. 다음 명령을 실행하여 MachineSet 오브젝트에 라벨을 추가합니다.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        예를 들면 다음과 같습니다.

        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        작은 정보

        다음 YAML을 적용하여 머신 세트에 라벨을 추가할 수 있습니다.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: xf2bd-infra-us-east-2a
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
        #...
      2. oc edit 명령을 사용하여 라벨이 MachineSet 오브젝트에 추가되었는지 확인합니다.

        예를 들면 다음과 같습니다.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet 오브젝트의 예

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        
        # ...
        
        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...

    • 라벨을 노드에 직접 추가합니다.

      1. 노드의 Node 오브젝트를 편집합니다.

        $ oc label nodes <name> <key>=<value>

        예를 들어 노드에 라벨을 지정하려면 다음을 수행합니다.

        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east
        작은 정보

        다음 YAML을 적용하여 노드에 라벨을 추가할 수도 있습니다.

        kind: Node
        apiVersion: v1
        metadata:
          name: hello-node-6fbccf8d9
          labels:
            type: "user-node"
            region: "east"
        #...
      2. 라벨이 노드에 추가되었는지 확인합니다.

        $ oc get nodes -l type=user-node,region=east

        출력 예

        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.23.0

  2. Pod에 일치하는 노드 선택기를 추가합니다.

    • 기존 및 향후 Pod에 노드 선택기를 추가하려면 Pod의 제어 오브젝트에 노드 선택기를 추가합니다.

      라벨이 있는 ReplicaSet 오브젝트의 예

      kind: ReplicaSet
      apiVersion: apps/v1
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
      # ...
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node 1
      #...

      1
      노드 선택기를 추가합니다.
    • 특정 새 Pod에 노드 선택기를 추가하려면 선택기를 Pod 오브젝트에 직접 추가합니다.

      노드 선택기가 있는 Pod 오브젝트의 예

      apiVersion: v1
      kind: Pod
      metadata:
        name: hello-node-6fbccf8d9
      #...
      spec:
        nodeSelector:
          region: east
          type: user-node
      #...

      참고

      예약된 기존 Pod에 노드 선택기를 직접 추가할 수 없습니다.

3장. Custom Metrics Autoscaler Operator를 사용하여 Pod 자동 스케일링

3.1. 사용자 정의 Metrics Autoscaler Operator 개요

개발자는 Red Hat OpenShift에 Custom Metrics Autoscaler Operator를 사용하여 OpenShift Container Platform에서 CPU 또는 메모리를 기반으로 하지 않는 사용자 정의 메트릭을 기반으로 배포, 상태 저장 세트, 사용자 정의 리소스 또는 작업의 Pod 수를 자동으로 늘리거나 줄이는 방법을 지정할 수 있습니다.

Custom Metrics Autoscaler Operator는 쿠버네티스 이벤트 기반 자동 스케일러(KEDA)를 기반으로 하는 선택적 Operator로, Pod 메트릭 이외의 추가 메트릭 소스를 사용하여 워크로드를 확장할 수 있습니다.

사용자 정의 메트릭 자동 스케일러는 현재 Prometheus, CPU, 메모리 및 Apache Kafka 메트릭만 지원합니다.

Custom Metrics Autoscaler Operator는 특정 애플리케이션의 사용자 정의 외부 지표를 기반으로 Pod를 확장 및 축소합니다. 다른 애플리케이션에서는 다른 확장 방법을 계속 사용합니다. 사용자 정의 메트릭 자동 스케일러가 스케일링하는 방법을 결정하는 데 사용하는 이벤트 및 메트릭의 소스인 scalers라고도 하는 트리거 를 구성합니다. 사용자 정의 메트릭 자동 스케일러는 메트릭 API를 사용하여 외부 메트릭을 OpenShift Container Platform에서 사용할 수 있는 양식으로 변환합니다. 사용자 정의 메트릭 자동 스케일러는 실제 스케일링을 수행하는 HPA(수평 Pod 자동 스케일러)를 생성합니다.

사용자 정의 메트릭 자동 스케일러를 사용하려면 스케일링 메타데이터를 정의하는 사용자 정의 리소스(CR)인 ScaledObject 또는 ScaledJob 오브젝트를 생성합니다. 확장할 배포 또는 작업, 스케일링할 지표의 소스(trigger) 및 허용된 최소 및 최대 복제본 수와 같은 기타 매개변수를 지정합니다.

참고

스케일링할 각 워크로드에 대해 확장된 오브젝트 또는 스케일링된 작업을 하나만 생성할 수 있습니다. 또한 동일한 워크로드에서 확장된 오브젝트 또는 스케일링된 작업 및 HPA(수평 Pod 자동 스케일러)를 사용할 수 없습니다.

HPA와 달리 사용자 정의 메트릭 자동 스케일러는 0으로 확장할 수 있습니다. 사용자 정의 메트릭 자동 스케일러 CR에서 minReplicaCount 값을 0 으로 설정하면 사용자 정의 메트릭 자동 스케일러는 워크로드를 복제본이 0개에서 복제본 수로 또는 최대 0개의 복제본으로 축소합니다. 이를 활성화 단계라고 합니다. 최대 1개의 복제본으로 확장한 후 HPA는 스케일링을 제어합니다. 이를 스케일링 단계라고 합니다.

일부 트리거를 사용하면 클러스터 지표 자동 스케일러에서 스케일링하는 복제본 수를 변경할 수 있습니다. 모든 경우, 활성화 단계를 구성하는 매개 변수는 항상 활성화 접두사가 지정된 동일한 문구를 사용합니다. 예를 들어 threshold 매개변수가 스케일링을 구성하는 경우 activationThreshold 가 활성화를 구성합니다. 활성화 및 확장 단계를 구성하면 확장 정책에 따라 유연성을 높일 수 있습니다. 예를 들어 메트릭이 특히 낮은 경우 확장 또는 축소되지 않도록 더 높은 활성화 단계를 구성할 수 있습니다.

활성화 값은 서로 다른 결정에 따라 스케일링 값보다 우선 순위가 높습니다. 예를 들어 임계값10 으로 설정되고 활성화Threshold50 개이면 메트릭에서 40 개를 보고하면 scaler가 활성 상태가 아니며 HPA에 4개의 인스턴스가 필요한 경우에도 Pod가 0으로 확장됩니다.

사용자 정의 리소스의 Pod 수를 검토하거나 Custom Metrics Autoscaler Operator 로그에서 다음과 유사한 메시지가 있는지 확인하여 자동 스케일링이 수행되었는지 확인할 수 있습니다.

Successfully set ScaleTarget replica count
Successfully updated ScaleTarget

필요한 경우 워크로드 오브젝트의 자동 스케일링을 일시적으로 일시 정지할 수 있습니다. 예를 들어 클러스터 유지 관리를 수행하기 전에 자동 스케일링을 일시 중지할 수 있습니다.

3.2. 사용자 정의 Metrics Autoscaler Operator 릴리스 정보

Custom Metrics Autoscaler Operator for Red Hat OpenShift의 릴리스 노트는 새로운 기능 및 개선 사항, 더 이상 사용되지 않는 기능 및 알려진 문제에 대해 설명합니다.

Custom Metrics Autoscaler Operator는 Kubernetes 기반 Event driven Autoscaler(KEDA)를 사용하며 OpenShift Container Platform HPA(수평 Pod 자동 스케일러) 상단에 빌드됩니다.

참고

Custom Metrics Autoscaler Operator for Red Hat OpenShift는 핵심 OpenShift Container Platform과 별도의 릴리스 사이클로 설치 가능한 구성 요소로 제공됩니다. Red Hat OpenShift Container Platform 라이프 사이클 정책은 릴리스 호환성에 대해 간단히 설명합니다.

3.2.1. 지원되는 버전

다음 표는 각 OpenShift Container Platform 버전에 대한 Custom Metrics Autoscaler Operator 버전을 정의합니다.

버전OpenShift Container Platform 버전정식 출시일 (GA)

2.10.1-267

4.13

정식 출시일 (GA)

2.10.1-267

4.12

정식 출시일 (GA)

2.10.1-267

4.11

정식 출시일 (GA)

2.10.1-267

4.10

정식 출시일 (GA)

3.2.2. 사용자 정의 지표 Autoscaler Operator 2.10.1-267 릴리스 노트

이번 Custom Metrics Autoscaler Operator 2.10.1-267 릴리스는 OpenShift Container Platform 클러스터에서 Operator를 실행하기 위한 새로운 기능 및 버그 수정을 제공합니다. Custom Metrics Autoscaler Operator 2.10.1-267의 구성 요소는 RHBA-2023:4089 에서 릴리스되었습니다.

중요

이 버전의 Custom Metrics Autoscaler Operator를 설치하기 전에 이전에 설치한 기술 프리뷰 버전 또는 커뮤니티 지원 KEDA 버전을 제거합니다.

3.2.2.1. 버그 수정
  • 이전에는 custom-metrics-autoscalercustom-metrics-autoscaler-adapter 이미지에 시간대 정보가 포함되지 않았습니다. 이로 인해 컨트롤러가 시간대 정보를 찾을 수 없기 때문에 cron 트리거를 사용하여 확장 개체가 작동하지 않았습니다. 이번 수정으로 이미지 빌드에 시간대 정보가 포함됩니다. 결과적으로 cron 트리거를 포함하는 확장 오브젝트가 올바르게 작동합니다. (OCPBUGS-15264)
  • 이전에는 Custom Metrics Autoscaler Operator에서 다른 네임스페이스 및 클러스터 범위 오브젝트의 오브젝트를 포함하여 모든 관리 오브젝트의 소유권을 시도했습니다. 이로 인해 Custom Metrics Autoscaler Operator에서 API 서버가 되는 데 필요한 인증 정보를 읽기 위해 역할 바인딩을 생성할 수 없었습니다. 이로 인해 kube-system 네임 스페이스에 오류가 발생했습니다. 이번 수정을 통해 Custom Metrics Autoscaler Operator는 ownerReference 필드를 다른 네임스페이스 또는 클러스터 범위 오브젝트의 오브젝트에 추가하는 것을 건너뜁니다. 결과적으로 이제 오류 없이 역할 바인딩이 생성됩니다. (OCPBUGS-15038)
  • 이전에는 Custom Metrics Autoscaler Operator에서 ownerReferences 필드를 openshift-keda 네임스페이스에 추가했습니다. 이로 인해 기능 문제가 발생하지 않았지만 이 필드가 있으면 클러스터 관리자에게 혼동이 발생할 수 있었습니다. 이번 수정으로 Custom Metrics Autoscaler Operator는 ownerReference 필드를 openshift-keda 네임스페이스에 추가하지 않습니다. 결과적으로 openshift-keda 네임스페이스에 더 이상 불필요한 ownerReference 필드가 없습니다. (OCPBUGS-15293)
  • 이전 버전에서는 Pod ID 이외의 인증 방법으로 구성된 Prometheus 트리거를 사용한 후 podIdentity 매개변수가 none 으로 설정된 경우 트리거를 스케일링하지 못했습니다. 이번 수정으로 OpenShift의 Custom Metrics Autoscaler에서 이제 none Pod ID 공급자 유형을 올바르게 처리합니다. 결과적으로 Prometheus 트리거는 Pod ID 이외의 인증 방법으로 구성되고 podIdentity 매개변수 sset을 none 으로 올바르게 스케일링합니다. (OCPBUGS-15274)

3.2.3. 사용자 정의 Metrics Autoscaler Operator 2.10.1 릴리스 노트

이번 Custom Metrics Autoscaler Operator 2.10.1 릴리스는 OpenShift Container Platform 클러스터에서 Operator를 실행하기 위한 새로운 기능 및 버그 수정을 제공합니다. Custom Metrics Autoscaler Operator 2.10.1의 구성 요소는 RHEA-2023:3199 에서 릴리스되었습니다.

중요

이 버전의 Custom Metrics Autoscaler Operator를 설치하기 전에 이전에 설치한 기술 프리뷰 버전 또는 커뮤니티 지원 KEDA 버전을 제거합니다.

3.2.3.1. 새로운 기능 및 개선 사항
3.2.3.1.1. 사용자 정의 지표 Autoscaler Operator 일반 가용성

Custom Metrics Autoscaler Operator는 이제 일반적으로 Custom Metrics Autoscaler Operator 버전 2.10.1에서 사용할 수 있습니다.

중요

확장된 작업을 사용하여 스케일링하는 것은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

3.2.3.1.2. 성능 지표

이제 PromQL(Prometheus Query Language)을 사용하여 Custom Metrics Autoscaler Operator에서 지표를 쿼리할 수 있습니다.

3.2.3.1.3. 확장된 오브젝트에 대한 사용자 정의 지표 자동 스케일링 일시 중지

이제 필요에 따라 확장 오브젝트의 자동 스케일링을 일시 중지하고 준비가 되면 자동 스케일링을 재개할 수 있습니다.

3.2.3.1.4. 확장 오브젝트의 복제본 대체

이제 스케일링된 오브젝트가 소스에서 메트릭을 가져오지 못하는 경우 다시 대체할 복제본 수를 지정할 수 있습니다.

3.2.3.1.5. 확장된 오브젝트에 대해 사용자 정의 가능한 HPA 이름 지정

확장된 오브젝트에서 수평 Pod 자동 스케일러의 사용자 정의 이름을 지정할 수 있습니다.

3.2.3.1.6. 활성화 및 스케일링 임계값

HPA(수평 Pod 자동 스케일러)는 복제본 0개로 스케일링할 수 없으므로 Custom Metrics Autoscaler Operator는 해당 스케일링을 수행하여 HPA에서 스케일링을 수행합니다. 이제 HPA에서 복제본 수에 따라 자동 스케일링을 인수하는 시기를 지정할 수 있습니다. 이를 통해 확장 정책을 통해 유연성을 높일 수 있습니다.

3.2.4. 사용자 정의 메트릭 자동 스케일러 Operator 2.8.2-174 릴리스 노트

이번 Custom Metrics Autoscaler Operator 2.8.2-174 릴리스는 OpenShift Container Platform 클러스터에서 Operator를 실행하기 위한 새로운 기능 및 버그 수정을 제공합니다. Custom Metrics Autoscaler Operator 2.8.2-174의 구성 요소는 RHEA-2023:1683 에서 릴리스되었습니다.

중요

Custom Metrics Autoscaler Operator 버전 2.8.2-174는 기술 프리뷰 기능입니다.

3.2.4.1. 새로운 기능 및 개선 사항
3.2.4.1.1. Operator 업그레이드 지원

이제 이전 버전의 Custom Metrics Autoscaler Operator에서 업그레이드할 수 있습니다. Operator 업그레이드에 대한 자세한 내용은 "ECDHE 리소스"의 "Operator 업데이트 채널 변경"을 참조하십시오.

3.2.4.1.2. must-gather 지원

OpenShift Container Platform must-gather 툴을 사용하여 Custom Metrics Autoscaler Operator 및 해당 구성 요소에 대한 데이터를 수집할 수 있습니다. 현재 사용자 정의 메트릭 자동 스케일러와 함께 must-gather 툴을 사용하는 프로세스는 다른 Operator와 다릅니다. 자세한 내용은 "ECDHE 리소스"의 디버깅 데이터를 참조하십시오.

3.2.5. 사용자 정의 Metrics Autoscaler Operator 2.8.2 릴리스 정보

이번 Custom Metrics Autoscaler Operator 2.8.2 릴리스는 OpenShift Container Platform 클러스터에서 Operator를 실행하기 위한 새로운 기능 및 버그 수정을 제공합니다. Custom Metrics Autoscaler Operator 2.8.2의 구성 요소는 RHSA-2023:1042 에서 릴리스되었습니다.

중요

Custom Metrics Autoscaler Operator 버전 2.8.2는 기술 프리뷰 기능입니다.

3.2.5.1. 새로운 기능 및 개선 사항
3.2.5.1.1. 감사 로깅

Custom Metrics Autoscaler Operator 및 관련 구성 요소에 대한 감사 로그를 수집하고 볼 수 있습니다. 감사 로그는 시스템의 개별 사용자, 관리자 또는 기타 구성 요소가 시스템에 영향을 준 활동 순서를 문서화하는 보안 관련 레코드 세트입니다.

3.2.5.1.2. Apache Kafka 메트릭을 기반으로 애플리케이션 확장

이제 KEDA Apache kafka 트리거/scaler를 사용하여 Apache Kafka 주제를 기반으로 배포를 확장할 수 있습니다.

3.2.5.1.3. CPU 메트릭을 기반으로 애플리케이션 스케일링

이제 KEDA CPU 트리거/scaler를 사용하여 CPU 메트릭을 기반으로 배포를 확장할 수 있습니다.

3.2.5.1.4. 메모리 메트릭을 기반으로 애플리케이션 스케일링

이제 KEDA 메모리 트리거/scaler를 사용하여 메모리 메트릭에 따라 배포를 확장할 수 있습니다.

3.3. 사용자 정의 메트릭 자동 스케일러 설치

OpenShift Container Platform 웹 콘솔을 사용하여 Custom Metrics Autoscaler Operator를 설치할 수 있습니다.

설치 시 다음 5개의 CRD가 생성됩니다.

  • ClusterTriggerAuthentication
  • KedaController
  • scaledJob
  • ScaledObject
  • TriggerAuthentication

3.3.1. 사용자 정의 메트릭 자동 스케일러 설치

다음 절차를 사용하여 Custom Metrics Autoscaler Operator를 설치할 수 있습니다.

사전 요구 사항

  • Cluster Metrics Autoscaler Operator의 이전에 설치한 기술 프리뷰 버전을 제거합니다.
  • 커뮤니티 기반 KEDA 버전을 제거합니다.

    또한 다음 명령을 실행하여 KEDA 1.x 사용자 지정 리소스 정의를 제거합니다.

    $ oc delete crd scaledobjects.keda.k8s.io
    $ oc delete crd triggerauthentications.keda.k8s.io

절차

  1. OpenShift Container Platform 웹 콘솔에서 OperatorOperatorHub를 클릭합니다.
  2. 사용 가능한 Operator 목록에서 Custom Metrics Autoscaler 를 선택한 다음 설치를 클릭합니다.
  3. Operator 설치 페이지에서 설치 모드에 대해 클러스터의 모든 네임스페이스(기본값) 옵션이 선택되어 있는지 확인합니다. 그러면 모든 네임스페이스에 Operator가 설치됩니다.
  4. 설치된 네임스페이스에 대해 openshift-keda 네임스페이스가 선택되어 있는지 확인합니다. OpenShift Container Platform은 클러스터에 없는 경우 네임스페이스를 생성합니다.
  5. 설치를 클릭합니다.
  6. Custom Metrics Autoscaler Operator 구성 요소를 나열하여 설치를 확인합니다.

    1. 워크로드Pod로 이동합니다.
    2. 드롭다운 메뉴에서 openshift-keda 프로젝트를 선택하고 custom-metrics-autoscaler-operator-* Pod가 실행 중인지 확인합니다.
    3. 워크로드배포 로 이동하여 custom-metrics-autoscaler-operator 배포가 실행 중인지 확인합니다.
  7. 선택 사항: 다음 명령을 사용하여 OpenShift CLI에서 설치를 확인합니다.

    $ oc get all -n openshift-keda

    출력은 다음과 유사합니다.

    출력 예

    NAME                                                      READY   STATUS    RESTARTS   AGE
    pod/custom-metrics-autoscaler-operator-5fd8d9ffd8-xt4xp   1/1     Running   0          18m
    
    NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-metrics-autoscaler-operator   1/1     1            1           18m
    
    NAME                                                            DESIRED   CURRENT   READY   AGE
    replicaset.apps/custom-metrics-autoscaler-operator-5fd8d9ffd8   1         1         1       18m

  8. 필요한 CRD를 생성하는ECDHEda Controller 사용자 지정 리소스를 설치합니다.

    1. OpenShift Container Platform 웹 콘솔에서 Operator설치된 Operator를 클릭합니다.
    2. Custom Metrics Autoscaler 를 클릭합니다.
    3. Operator 세부 정보 페이지에서 DestinationRuleda Controller 탭을 클릭합니다.
    4. > :<daController 탭에서 CreateECDHEdaController 를 클릭하고 파일을 편집합니다.

      kind: KedaController
      apiVersion: keda.sh/v1alpha1
      metadata:
        name: keda
        namespace: openshift-keda
      spec:
        watchNamespace: '' 1
        operator:
          logLevel: info 2
          logEncoder: console 3
        metricsServer:
          logLevel: '0' 4
          auditConfig: 5
            logFormat: "json"
            logOutputVolumeClaim: "persistentVolumeClaimName"
            policy:
              rules:
              - level: Metadata
              omitStages: "RequestReceived"
              omitManagedFields: false
            lifetime:
              maxAge: "2"
              maxBackup: "1"
              maxSize: "50"
        serviceAccount: {}
      1
      사용자 정의 자동 스케일러가 감시해야 하는 네임스페이스를 지정합니다. 쉼표로 구분된 목록에 이름을 입력합니다. 모든 네임스페이스를 조사하려면 비어 있는 생략 또는 설정합니다. 기본값은 비어 있습니다.
      2
      Custom Metrics Autoscaler Operator 로그 메시지의 상세 수준을 지정합니다. 허용되는 값은 debug,info,error 입니다. 기본값은 info 입니다.
      3
      Custom Metrics Autoscaler Operator 로그 메시지의 로깅 형식을 지정합니다. 허용되는 값은 console 또는 json 입니다. 기본값은 console 입니다.
      4
      Custom Metrics Autoscaler Metrics Server의 로깅 수준을 지정합니다. 허용되는 값은 info4 또는 debug 에 대해 0 입니다. 기본값은 0입니다.
      5
      Custom Metrics Autoscaler Operator에 대한 감사 로깅을 활성화하고 "감사 로깅 구성" 섹션에 설명된 대로 사용할 감사 정책을 지정합니다.
    5. 만들기를 클릭하여 KEDAController를 생성합니다.

3.4. 사용자 정의 메트릭 자동 스케일러 트리거 이해

scalers라고도 하는 트리거는 Custom Metrics Autoscaler Operator에서 Pod를 확장하는 데 사용하는 메트릭을 제공합니다.

사용자 정의 메트릭 자동 스케일러는 현재 Prometheus, CPU, 메모리 및 Apache Kafka 트리거만 지원합니다.

다음 섹션에 설명된 대로 scaledObject 또는 scaled Job 사용자 지정 리소스를 사용하여 특정 오브젝트에 대한 트리거를 구성합니다.

3.4.1. Prometheus 트리거 이해

설치된 OpenShift Container Platform 모니터링을 사용하거나 외부 Prometheus 서버를 메트릭 소스로 사용할 수 있는 Prometheus 메트릭을 기반으로 Pod를 확장할 수 있습니다. 메트릭의 소스로 OpenShift Container Platform 모니터링을 사용하는 데 필요한 구성에 대한 자세한 내용은 "추가 리소스"를 참조하십시오.

참고

Prometheus가 사용자 정의 지표 자동 스케일러가 스케일링하는 애플리케이션에서 지표를 수집하는 경우 사용자 정의 리소스에서 최소 복제본을 0 으로 설정하지 마십시오. 애플리케이션 Pod가 없는 경우 사용자 정의 지표 자동 스케일러에 스케일링할 메트릭이 없습니다.

Prometheus 대상을 사용하여 스케일링 오브젝트의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prom-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: prometheus 1
    metadata:
      serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092 2
      namespace: kedatest 3
      metricName: http_requests_total 4
      threshold: '5' 5
      query: sum(rate(http_requests_total{job="test-app"}[1m])) 6
      authModes: basic 7
      cortexOrgID: my-org 8
      ignoreNullValues: false 9
      unsafeSsl: false 10

1
Prometheus를 트리거 유형으로 지정합니다.
2
Prometheus 서버의 주소를 지정합니다. 이 예에서는 OpenShift Container Platform 모니터링을 사용합니다.
3
선택 사항: 스케일링할 오브젝트의 네임스페이스를 지정합니다. OpenShift Container Platform 모니터링을 메트릭 소스로 사용하는 경우 이 매개변수가 필요합니다.
4
external.metrics.k8s.io API에서 메트릭을 식별하는 이름을 지정합니다. 둘 이상의 트리거를 사용하는 경우 모든 메트릭 이름은 고유해야 합니다.
5
스케일링을 트리거하는 값을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다.
6
사용할 Prometheus 쿼리를 지정합니다.
7
사용할 인증 방법을 지정합니다. Prometheus 스케일러는 전달자 인증( 베어러 인증), 기본 인증(기본인증) 또는 TLS 인증(tls)을 지원합니다. 다음 섹션에서 설명하는 대로 트리거 인증에 특정 인증 매개변수를 구성합니다. 필요에 따라 시크릿을 사용할 수도 있습니다.
8
선택 사항: Prometheus의 X-Scope-OrgID 헤더를 다중 테넌트 Cortex 또는 Mimir 스토리지로 전달합니다. 이 매개변수는 반환해야 하는 데이터를 나타내기 위해 다중 테넌트 Prometheus 스토리지에서만 필요합니다.
9
선택 사항: Prometheus 대상이 손실되는 경우 트리거를 진행하는 방법을 지정합니다.
  • true 인 경우 Prometheus 대상이 손실되면 트리거가 계속 작동합니다. 이는 기본 동작입니다.
  • false 인 경우 Prometheus 대상이 손실되면 트리거에서 오류를 반환합니다.
10
선택 사항: 인증서 검사를 건너뛰어야 하는지 여부를 지정합니다. 예를 들어 Prometheus 끝점에서 자체 서명된 인증서를 사용하는 경우 검사를 건너뛸 수 있습니다.
  • true 인 경우 인증서 검사가 수행됩니다.
  • false 인 경우 인증서 검사가 수행되지 않습니다. 이는 기본 동작입니다.
3.4.1.1. OpenShift Container Platform 모니터링을 사용하도록 사용자 정의 메트릭 자동 스케일러 구성

설치된 OpenShift Container Platform Prometheus 모니터링을 사용자 정의 메트릭 자동 스케일러에서 사용하는 메트릭의 소스로 사용할 수 있습니다. 그러나 수행해야 하는 몇 가지 추가 구성이 있습니다.

참고

이러한 단계는 외부 Prometheus 소스에 필요하지 않습니다.

이 섹션에 설명된 대로 다음 작업을 수행해야 합니다.

  • 토큰을 가져올 서비스 계정을 생성합니다.
  • 역할을 생성합니다.
  • 해당 역할을 서비스 계정에 추가합니다.
  • Prometheus에서 사용하는 트리거 인증 오브젝트에서 토큰을 참조합니다.

사전 요구 사항

  • OpenShift Container Platform 모니터링이 설치되어 있어야 합니다.
  • 사용자 정의 워크로드 생성 구성 맵 생성 섹션에 설명된 대로 OpenShift Container Platform 모니터링에서 사용자 정의 워크로드 모니터링 모니터링이 활성화되어야 합니다.
  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.

절차

  1. 스케일링할 오브젝트를 사용하여 프로젝트로 변경합니다.

    $ oc project my-project
  2. 클러스터에 서비스 계정이 없는 경우 다음 명령을 사용하여 서비스 계정을 생성합니다.

    $ oc create serviceaccount <service_account>

    다음과 같습니다.

    <service_account>
    서비스 계정의 이름을 지정합니다.
  3. 다음 명령을 사용하여 서비스 계정에 할당된 토큰을 찾습니다.

    $ oc describe serviceaccount <service_account>

    다음과 같습니다.

    <service_account>
    서비스 계정의 이름을 지정합니다.

    출력 예

    Name:                thanos
    Namespace:           my-project
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  thanos-dockercfg-nnwgj
    Mountable secrets:   thanos-dockercfg-nnwgj
    Tokens:              thanos-token-9g4n5 1
    Events:              <none>

    1
    트리거 인증에 이 토큰을 사용합니다.
  4. 서비스 계정 토큰을 사용하여 트리거 인증을 생성합니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-trigger-auth-prometheus
      spec:
        secretTargetRef: 1
        - parameter: bearerToken 2
          name: thanos-token-9g4n5 3
          key: token 4
        - parameter: ca
          name: thanos-token-9g4n5
          key: ca.crt
      1
      이 오브젝트가 권한 부여에 보안을 사용하도록 지정합니다.
      2
      토큰을 사용하여 제공할 인증 매개 변수를 지정합니다.
      3
      사용할 토큰의 이름을 지정합니다.
      4
      지정된 매개변수와 함께 사용할 토큰의 키를 지정합니다.
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
  5. Thanos 지표를 읽는 역할을 생성합니다.

    1. 다음 매개변수를 사용하여 YAML 파일을 생성합니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: thanos-metrics-reader
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
      - apiGroups:
        - metrics.k8s.io
        resources:
        - pods
        - nodes
        verbs:
        - get
        - list
        - watch
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
  6. Thanos 지표를 읽기 위한 역할 바인딩을 생성합니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: thanos-metrics-reader 1
        namespace: my-project 2
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: thanos-metrics-reader
      subjects:
      - kind: ServiceAccount
        name: thanos 3
        namespace: my-project 4
      1
      생성한 역할의 이름을 지정합니다.
      2
      스케일링할 오브젝트의 네임스페이스를 지정합니다.
      3
      역할에 바인딩할 서비스 계정의 이름을 지정합니다.
      4
      스케일링할 오브젝트의 네임스페이스를 지정합니다.
    2. CR 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml

"사용자 정의 메트릭 자동 스케일러를 추가하는 방법 이해"에 설명된 대로 확장 오브젝트 또는 확장 작업을 배포하여 애플리케이션에 대한 자동 스케일링을 활성화할 수 있습니다. OpenShift Container Platform 모니터링을 소스, 트리거 또는 scaler로 사용하려면 다음 매개변수를 포함해야 합니다.

  • triggers.typeprometheus여야 합니다
  • triggers.metadata.serverAddresshttps://thanos-querier.openshift-monitoring.svc.cluster.local:9092이어야 합니다
  • triggers.metadata.authModes베어러여야 합니다.
  • Trigger.metadata.namespace 는 스케일링할 오브젝트의 네임스페이스로 설정해야 합니다.
  • triggers.authenticationRef 는 이전 단계에서 지정된 트리거 인증 리소스를 가리켜야 합니다.

3.4.2. CPU 트리거 이해

CPU 메트릭을 기반으로 Pod를 확장할 수 있습니다. 이 트리거는 클러스터 지표를 메트릭의 소스로 사용합니다.

사용자 정의 메트릭 자동 스케일러는 지정한 CPU 사용량을 유지하도록 오브젝트와 연결된 Pod를 스케일링합니다. 자동 스케일러는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 모든 Pod에서 지정된 CPU 사용률을 유지합니다. 메모리 트리거는 전체 Pod의 메모리 사용률을 고려합니다. Pod에 컨테이너가 여러 개 있는 경우 메모리 트리거는 Pod에 있는 모든 컨테이너의 총 메모리 사용률을 고려합니다.

참고
  • 이 트리거는 ScaledJob 사용자 정의 리소스와 함께 사용할 수 없습니다.
  • 메모리 트리거를 사용하여 오브젝트를 스케일링할 때 여러 트리거를 사용하는 경우에도 개체는 0 으로 스케일링되지 않습니다.

CPU 대상이 있는 확장된 오브젝트의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: cpu 1
    metricType: Utilization 2
    metadata:
      value: '60' 3
      containerName: api 4

1
CPU를 트리거 유형으로 지정합니다.
2
사용할 메트릭의 유형( Utilization 또는 AverageValue )을 지정합니다.
3
스케일링을 트리거하는 값을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다.
  • Utilization 을 사용하는 경우 target 값은 Pod에 대해 요청된 리소스의 백분율로 표시되는 모든 관련 Pod에서 리소스 지표의 평균값입니다.
  • AverageValue 를 사용하는 경우 target 값은 모든 관련 Pod의 평균 지표입니다.
4
선택 사항: 전체 Pod가 아닌 해당 컨테이너의 메모리 사용률에 따라 스케일링할 개별 컨테이너를 지정합니다. 이 예제에서는 api 라는 컨테이너만 스케일링할 수 있습니다.

3.4.3. 메모리 트리거 이해

메모리 메트릭을 기반으로 Pod를 확장할 수 있습니다. 이 트리거는 클러스터 지표를 메트릭의 소스로 사용합니다.

사용자 정의 메트릭 자동 스케일러는 오브젝트와 연결된 Pod를 스케일링하여 지정한 평균 메모리 사용량을 유지합니다. 자동 스케일러는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 모든 Pod에서 지정된 메모리 사용률을 유지합니다. 메모리 트리거는 전체 Pod의 메모리 사용률을 고려합니다. Pod에 컨테이너가 여러 개 있는 경우 메모리 사용률은 모든 컨테이너의 합계입니다.

참고
  • 이 트리거는 ScaledJob 사용자 정의 리소스와 함께 사용할 수 없습니다.
  • 메모리 트리거를 사용하여 오브젝트를 스케일링할 때 여러 트리거를 사용하는 경우에도 개체는 0 으로 스케일링되지 않습니다.

메모리 대상이 있는 확장된 오브젝트의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: memory-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: memory 1
    metricType: Utilization 2
    metadata:
      value: '60' 3
      containerName: api 4

1
memory를 트리거 유형으로 지정합니다.
2
사용할 메트릭의 유형( Utilization 또는 AverageValue )을 지정합니다.
3
스케일링을 트리거하는 값을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다.
  • Utilization 을 사용하는 경우 target 값은 Pod에 대해 요청된 리소스의 백분율로 표시되는 모든 관련 Pod에서 리소스 지표의 평균값입니다.
  • AverageValue 를 사용하는 경우 target 값은 모든 관련 Pod의 평균 지표입니다.
4
선택 사항: 전체 Pod가 아닌 해당 컨테이너의 메모리 사용률에 따라 스케일링할 개별 컨테이너를 지정합니다. 이 예제에서는 api 라는 컨테이너만 스케일링할 수 있습니다.

3.4.4. Kafka 트리거 이해

Apache Kafka 주제 또는 Kafka 프로토콜을 지원하는 기타 서비스를 기반으로 Pod를 확장할 수 있습니다. 사용자 정의 메트릭 자동 스케일러는 스케일링된 오브젝트 또는 스케일링 작업에서 allowIdleConsumers 매개변수를 true 로 설정하지 않는 한 Kafka 파티션 수보다 크게 확장되지 않습니다.

참고

소비자 그룹의 수가 주제의 파티션 수를 초과하면 추가 소비자 그룹은 유휴 상태로 유지됩니다. 이 문제를 방지하려면 기본적으로 복제본 수는 다음을 초과하지 않습니다.

  • 주제가 지정된 경우 주제의 파티션 수
  • 주제가 지정되지 않은 경우 소비자 그룹에 있는 모든 항목의 파티션 수
  • 확장 오브젝트 또는 확장 작업 CR에 지정된 maxReplicaCount

allowIdleConsumers 매개변수를 사용하여 이러한 기본 동작을 비활성화할 수 있습니다.

Kafka 대상이 있는 확장된 오브젝트의 예

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: kafka 1
    metadata:
      topic: my-topic 2
      bootstrapServers: my-cluster-kafka-bootstrap.openshift-operators.svc:9092 3
      consumerGroup: my-group 4
      lagThreshold: '10' 5
      activationLagThreshold: '5' 6
      offsetResetPolicy: latest 7
      allowIdleConsumers: true 8
      scaleToZeroOnInvalidOffset: false 9
      excludePersistentLag: false 10
      version: '1.0.0' 11
      partitionLimitation: '1,2,10-20,31' 12

1
Kafka를 트리거 유형으로 지정합니다.
2
Kafka가 오프셋 지연을 처리하는 Kafka 항목의 이름을 지정합니다.
3
연결할 Kafka 브로커의 쉼표로 구분된 목록을 지정합니다.
4
주제에서 오프셋을 확인하고 관련 지연을 처리하는 데 사용되는 Kafka 소비자 그룹의 이름을 지정합니다.
5
선택 사항: 스케일링을 트리거하는 평균 대상 값을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다. 기본값은 5 입니다.
6
선택 사항: 활성화 단계의 대상 값을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다.
7
선택 사항: Kafka 소비자에 대한 Kafka 오프셋 재설정 정책을 지정합니다. 사용 가능한 값은 latestearliest 입니다. 기본값은 latest 입니다.
8
선택 사항: Kafka 복제본 수가 주제의 파티션 수를 초과할 수 있는지 여부를 지정합니다.
  • true 인 경우 Kafka 복제본 수는 주제의 파티션 수를 초과할 수 있습니다. 이를 통해 유휴 상태의 Kafka 소비자를 사용할 수 있습니다.
  • false 인 경우 Kafka 복제본 수는 주제의 파티션 수를 초과할 수 없습니다. 이는 기본값입니다.
9
Kafka 파티션에 유효한 오프셋이 없을 때 트리거가 작동하는 방법을 지정합니다.
  • true 인 경우 소비자는 해당 파티션에 대해 0으로 확장됩니다.
  • false 인 경우 scaler는 해당 파티션에 대한 단일 소비자를 유지합니다. 이는 기본값입니다.
10
선택 사항: 현재 오프셋이 이전 폴링 사이클의 현재 오프셋과 동일한 파티션에 대해 트리거에 파티션 지연을 포함하거나 제외하는지 여부를 지정합니다.
  • true 인 경우 scaler는 이러한 파티션에서 파티션 지연을 제외합니다.
  • false 인 경우 트리거는 모든 파티션에 모든 소비자 지연을 포함합니다. 이는 기본값입니다.
11
선택 사항: Kafka 브로커의 버전을 지정합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다. 기본값은 1.0.0 입니다.
12
선택 사항: 스케일링 범위를 지정할 쉼표로 구분된 파티션 ID 목록을 지정합니다. 설정된 경우 지연을 계산할 때 나열된 ID만 고려합니다. 따옴표로 묶은 문자열 값으로 지정해야 합니다. 기본값은 모든 파티션을 고려하는 것입니다.

3.5. 사용자 정의 메트릭 자동 스케일러 트리거 인증 이해

트리거 인증을 사용하면 확장된 오브젝트에 인증 정보를 포함하거나 관련 컨테이너에서 사용할 수 있는 스케일링 작업을 포함할 수 있습니다. 트리거 인증을 사용하여 OpenShift Container Platform 시크릿, 플랫폼 네이티브 Pod 인증 메커니즘, 환경 변수 등을 전달할 수 있습니다.

스케일링할 오브젝트와 동일한 네임스페이스에 TriggerAuthentication 오브젝트를 정의합니다. 이 트리거 인증은 해당 네임스페이스의 오브젝트에서만 사용할 수 있습니다.

또는 여러 네임스페이스의 오브젝트 간에 자격 증명을 공유하려면 모든 네임스페이스에서 사용할 수 있는 ClusterTriggerAuthentication 오브젝트를 생성할 수 있습니다.

인증 트리거 및 클러스터 트리거 인증은 동일한 구성을 사용합니다. 그러나 클러스터 트리거 인증에는 스케일링된 오브젝트의 인증 참조에 추가 kind 매개변수가 필요합니다.

시크릿을 사용한 트리거 인증의 예

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: secret-triggerauthentication
  namespace: my-namespace 1
spec:
  secretTargetRef: 2
  - parameter: user-name 3
    name: my-secret 4
    key: USER_NAME 5
  - parameter: password
    name: my-secret
    key: USER_PASSWORD

1
스케일링할 오브젝트의 네임스페이스를 지정합니다.
2
이 트리거 인증이 권한 부여에 보안을 사용하도록 지정합니다.
3
보안을 사용하여 제공할 인증 매개 변수를 지정합니다.
4
사용할 보안의 이름을 지정합니다.
5
지정된 매개변수와 함께 사용할 시크릿의 키를 지정합니다.

시크릿을 사용한 클러스터 트리거 인증의 예

kind: ClusterTriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata: 1
  name: secret-cluster-triggerauthentication
spec:
  secretTargetRef: 2
  - parameter: user-name 3
    name: secret-name 4
    key: USER_NAME 5
  - parameter: user-password
    name: secret-name
    key: USER_PASSWORD

1
클러스터 트리거 인증과 함께 사용되는 네임스페이스는 없습니다.
2
이 트리거 인증이 권한 부여에 보안을 사용하도록 지정합니다.
3
보안을 사용하여 제공할 인증 매개 변수를 지정합니다.
4
사용할 보안의 이름을 지정합니다.
5
지정된 매개변수와 함께 사용할 시크릿의 키를 지정합니다.

토큰을 사용한 트리거 인증 예

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: token-triggerauthentication
  namespace: my-namespace 1
spec:
  secretTargetRef: 2
  - parameter: bearerToken 3
    name: my-token-2vzfq 4
    key: token 5
  - parameter: ca
    name: my-token-2vzfq
    key: ca.crt

1
스케일링할 오브젝트의 네임스페이스를 지정합니다.
2
이 트리거 인증이 권한 부여에 보안을 사용하도록 지정합니다.
3
토큰을 사용하여 제공할 인증 매개 변수를 지정합니다.
4
사용할 토큰의 이름을 지정합니다.
5
지정된 매개변수와 함께 사용할 토큰의 키를 지정합니다.

환경 변수를 사용한 트리거 인증 예

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: env-var-triggerauthentication
  namespace: my-namespace 1
spec:
  env: 2
  - parameter: access_key 3
    name: ACCESS_KEY 4
    containerName: my-container 5

1
스케일링할 오브젝트의 네임스페이스를 지정합니다.
2
이 트리거 인증이 권한 부여에 환경 변수를 사용하도록 지정합니다.
3
이 변수로 설정할 매개변수를 지정합니다.
4
환경 변수의 이름을 지정합니다.
5
선택 사항: 인증이 필요한 컨테이너를 지정합니다. 컨테이너는 스케일링된 오브젝트의 scaleTargetRef 에서 참조하는 것과 동일한 리소스에 있어야 합니다.

Pod 인증 공급자를 사용한 트리거 인증의 예

kind: TriggerAuthentication
apiVersion: keda.sh/v1alpha1
metadata:
  name: pod-id-triggerauthentication
  namespace: my-namespace 1
spec:
  podIdentity: 2
    provider: aws-eks 3

1
스케일링할 오브젝트의 네임스페이스를 지정합니다.
2
이 트리거 인증에서 권한 부여에 플랫폼 네이티브 Pod 인증 방법을 사용하도록 지정합니다.
3
Pod ID를 지정합니다. 지원되는 값은 none,azure,aws-eks, 또는 aws-kiam 입니다. 기본값은 none 입니다.

추가 리소스

3.5.1. 트리거 인증 사용

사용자 정의 리소스를 사용하여 인증을 생성한 다음 확장된 오브젝트 또는 확장된 작업에 대한 참조를 추가하여 트리거 인증 및 클러스터 트리거 인증을 사용합니다.

사전 요구 사항

  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.
  • 보안을 사용하는 경우 Secret 오브젝트가 있어야 합니다. 예를 들면 다음과 같습니다.

    시크릿 예

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    data:
      user-name: <base64_USER_NAME>
      password: <base64_USER_PASSWORD>

프로세스

  1. TriggerAuthentication 또는 ClusterTriggerAuthentication 오브젝트를 생성합니다.

    1. 오브젝트를 정의하는 YAML 파일을 생성합니다.

      시크릿을 사용한 트리거 인증의 예

      kind: TriggerAuthentication
      apiVersion: keda.sh/v1alpha1
      metadata:
        name: prom-triggerauthentication
        namespace: my-namespace
      spec:
        secretTargetRef:
        - parameter: user-name
          name: my-secret
          key: USER_NAME
        - parameter: password
          name: my-secret
          key: USER_PASSWORD

    2. TriggerAuthentication 오브젝트를 생성합니다.

      $ oc create -f <file-name>.yaml
  2. scaled Object YAML 파일을 생성하거나 편집합니다.

    스케일링 오브젝트의 예

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: scaledobject
      namespace: my-namespace
    spec:
      scaleTargetRef:
        name: example-deployment
      maxReplicaCount: 100
      minReplicaCount: 0
      pollingInterval: 30
      triggers:
      - authenticationRef:
        type: prometheus
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest # replace <NAMESPACE>
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: "basic"
        - authenticationRef: 1
            name: prom-triggerauthentication
          metadata:
            name: prom-triggerauthentication
          type: object
        - authenticationRef: 2
            name: prom-cluster-triggerauthentication
            kind: ClusterTriggerAuthentication
          metadata:
            name: prom-cluster-triggerauthentication
          type: object

    1
    선택 사항: 트리거 인증을 지정합니다.
    2
    선택 사항: 클러스터 트리거 인증을 지정합니다. kind: ClusterTriggerAuthentication 매개변수를 포함해야 합니다.
    참고

    네임스페이스 트리거 인증과 클러스터 트리거 인증을 모두 지정할 필요는 없습니다.

  3. 오브젝트를 생성합니다. 예를 들면 다음과 같습니다.

    $ oc apply -f <file-name>

3.6. 확장 오브젝트에 대한 사용자 정의 지표 자동 스케일러 일시 중지

필요에 따라 워크로드 자동 스케일링을 일시 중지하고 다시 시작할 수 있습니다.

예를 들어 클러스터 유지 관리를 수행하기 전에 자동 스케일링을 중지하거나 누락되지 않은 워크로드를 제거하여 리소스 부족을 방지할 수 있습니다.

3.6.1. 사용자 정의 메트릭 자동 스케일러 일시 중지

확장된 오브젝트의 사용자 정의 지표 자동 스케일러에 autoscaling.keda.sh/paused-replicas 주석을 추가하여 확장 오브젝트의 자동 스케일링을 일시 중지할 수 있습니다. 사용자 정의 메트릭 자동 스케일러는 해당 워크로드의 복제본을 지정된 값으로 스케일링하고 주석이 제거될 때까지 자동 스케일링을 일시 중지합니다.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  annotations:
    autoscaling.keda.sh/paused-replicas: "4"
# ...

프로세스

  1. 다음 명령을 사용하여 워크로드에 대한 scaledObject CR을 편집합니다.

    $ oc edit ScaledObject scaledobject
  2. 다음 값을 사용하여 autoscaling.keda.sh/paused-replicas 주석을 추가합니다.

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "4" 1
      creationTimestamp: "2023-02-08T14:41:01Z"
      generation: 1
      name: scaledobject
      namespace: my-project
      resourceVersion: '65729'
      uid: f5aec682-acdf-4232-a783-58b5b82f5dd0
    1
    Custom Metrics Autoscaler Operator가 복제본을 지정된 값으로 스케일링하고 자동 스케일링을 중지하도록 지정합니다.

3.6.2. 확장 오브젝트의 사용자 정의 지표 자동 스케일러를 다시 시작

해당 scaled Object에 대한 autoscaling.keda.sh/paused-replicas 주석을 제거하여 일시 중지된 사용자 정의 지표 자동 스케일러를 다시 시작할 수 있습니다.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  annotations:
    autoscaling.keda.sh/paused-replicas: "4"
# ...

프로세스

  1. 다음 명령을 사용하여 워크로드에 대한 scaledObject CR을 편집합니다.

    $ oc edit ScaledObject scaledobject
  2. autoscaling.keda.sh/paused-replicas 주석을 제거합니다.

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "4" 1
      creationTimestamp: "2023-02-08T14:41:01Z"
      generation: 1
      name: scaledobject
      namespace: my-project
      resourceVersion: '65729'
      uid: f5aec682-acdf-4232-a783-58b5b82f5dd0
    1
    일시 중지된 사용자 정의 메트릭 자동 스케일러를 다시 시작하려면 이 주석을 제거합니다.

3.7. 감사 로그 수집

시스템의 개별 사용자, 관리자 또는 기타 구성 요소가 시스템에 영향을 준 활동 순서를 문서화하는 보안 관련 레코드 세트인 감사 로그를 수집할 수 있습니다.

예를 들어 감사 로그는 자동 스케일링 요청이 발생하는 위치를 이해하는 데 도움이 될 수 있습니다. 이는 사용자 애플리케이션에서 수행한 자동 확장 요청에 의해 백엔드가 과부하되는 경우 주요 정보입니다. 이로 인해 문제가 발생한 애플리케이션을 결정해야 합니다.

3.7.1. 감사 로깅 구성

CloudEventda Controller 사용자 정의 리소스를 편집하여 Custom Metrics Autoscaler Operator에 대한 감사를 구성할 수 있습니다. 로그는 CloudEventda Controller CR의 영구 볼륨 클레임을 사용하여 보안되는 볼륨의 감사 로그 파일로 전송됩니다.

사전 요구 사항

  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.

프로세스

  1. CloudEventda Controller 사용자 지정 리소스를 편집하여 auditConfig 스탠자를 추가합니다.

    kind: KedaController
    apiVersion: keda.sh/v1alpha1
    metadata:
      name: keda
      namespace: openshift-keda
    spec:
    # ...
      metricsServer:
    # ...
        auditConfig:
          logFormat: "json" 1
          logOutputVolumeClaim: "pvc-audit-log" 2
          policy:
            rules: 3
            - level: Metadata
            omitStages: "RequestReceived" 4
            omitManagedFields: false 5
          lifetime: 6
            maxAge: "2"
            maxBackup: "1"
            maxSize: "50"
    1
    audit 로그의 출력 형식( legacy 또는 json )을 지정합니다.
    2
    로그 데이터를 저장하기 위한 기존 영구 볼륨 클레임을 지정합니다. API 서버에 들어오는 모든 요청은 이 영구 볼륨 클레임에 기록됩니다. 이 필드를 비워 두면 로그 데이터가 stdout으로 전송됩니다.
    3
    기록해야 하는 이벤트와 어떤 데이터를 포함해야 하는지 지정합니다.
    • none: 이벤트를 기록하지 않습니다.
    • metadata: 사용자, 타임스탬프 등과 같은 요청에 대한 메타데이터만 기록합니다. 요청 텍스트와 응답 텍스트를 기록하지 마십시오. 이는 기본값입니다.
    • request: 메타데이터와 요청 텍스트만 기록하지만 응답 텍스트는 기록하지 않습니다. 이 옵션은 리소스가 아닌 요청에는 적용되지 않습니다.
    • RequestResponse: 이벤트 메타데이터, 요청 텍스트 및 응답 텍스트를 기록합니다. 이 옵션은 리소스가 아닌 요청에는 적용되지 않습니다.
    4
    이벤트가 생성되지 않는 단계를 지정합니다.
    5
    요청 및 응답 본문의 관리 필드를 API 감사 로그에 작성하지 못하도록 하려면 true 로 필드를 생략할지 아니면 필드를 생략할 false 를 생략할지 여부를 지정합니다.
    6
    감사 로그의 크기 및 수명을 지정합니다.
    • maxAge: 파일 이름에 인코딩된 타임스탬프에 따라 감사 로그 파일을 유지하는 최대 일 수입니다.
    • maxBackup: 유지할 감사 로그 파일의 최대 수입니다. 모든 감사 로그 파일을 유지하려면 0 으로 설정합니다.
    • maxSize: 감사 로그 파일의 최대 크기(MB)가 순환되기 전에 이루어집니다.

검증

  1. 감사 로그 파일을 직접 확인합니다.

    1. keda-metrics-apiserver-* Pod 이름을 가져옵니다.

      oc get pod -n openshift-keda

      출력 예

      NAME                                                  READY   STATUS    RESTARTS   AGE
      custom-metrics-autoscaler-operator-5cb44cd75d-9v4lv   1/1     Running   0          8m20s
      keda-metrics-apiserver-65c7cc44fd-rrl4r               1/1     Running   0          2m55s
      keda-operator-776cbb6768-zpj5b                        1/1     Running   0          2m55s

    2. 다음과 유사한 명령을 사용하여 로그 데이터를 확인합니다.

      $ oc logs keda-metrics-apiserver-<hash>|grep -i metadata 1
      1
      선택 사항: grep 명령을 사용하여 표시할 로그 수준을 지정할 수 있습니다. 메타데이터, 요청 ,Request Response.

      예를 들면 다음과 같습니다.

      $ oc logs keda-metrics-apiserver-65c7cc44fd-rrl4r|grep -i metadata

      출력 예

       ...
      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"4c81d41b-3dab-4675-90ce-20b87ce24013","stage":"ResponseComplete","requestURI":"/healthz","verb":"get","user":{"username":"system:anonymous","groups":["system:unauthenticated"]},"sourceIPs":["10.131.0.1"],"userAgent":"kube-probe/1.26","responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2023-02-16T13:00:03.554567Z","stageTimestamp":"2023-02-16T13:00:03.555032Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":""}}
       ...

  2. 또는 특정 로그를 볼 수 있습니다.

    1. keda-metrics-apiserver-* Pod에 로그인하려면 다음과 유사한 명령을 사용합니다.

      $ oc rsh pod/keda-metrics-apiserver-<hash> -n openshift-keda

      예를 들면 다음과 같습니다.

      $ oc rsh pod/keda-metrics-apiserver-65c7cc44fd-rrl4r -n openshift-keda
    2. /var/audit-policy/ 디렉터리로 변경합니다.

      sh-4.4$ cd /var/audit-policy/
    3. 사용 가능한 로그를 나열합니다.

      sh-4.4$ ls

      출력 예

      log-2023.02.17-14:50  policy.yaml

    4. 필요한 경우 로그를 확인합니다.

      sh-4.4$ cat <log_name>/<pvc_name>|grep -i <log_level> 1
      1
      선택 사항: grep 명령을 사용하여 표시할 로그 수준을 지정할 수 있습니다. 메타데이터, 요청 ,Request Response.

      예를 들면 다음과 같습니다.

      sh-4.4$ cat log-2023.02.17-14:50/pvc-audit-log|grep -i Request

      출력 예

       ...
      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Request","auditID":"63e7f68c-04ec-4f4d-8749-bf1656572a41","stage":"ResponseComplete","requestURI":"/openapi/v2","verb":"get","user":{"username":"system:aggregator","groups":["system:authenticated"]},"sourceIPs":["10.128.0.1"],"responseStatus":{"metadata":{},"code":304},"requestReceivedTimestamp":"2023-02-17T13:12:55.035478Z","stageTimestamp":"2023-02-17T13:12:55.038346Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:discovery\" of ClusterRole \"system:discovery\" to Group \"system:authenticated\""}}
       ...

3.8. 디버깅 데이터 수집

지원 사례를 여는 경우 클러스터에 대한 디버깅 정보를 Red Hat 지원에 제공하면 도움이 됩니다.

문제를 해결하려면 다음 정보를 입력합니다.

  • must-gather 툴을 사용하여 수집된 데이터입니다.
  • 고유한 클러스터 ID입니다.

must-gather 툴을 사용하여 다음 항목을 포함하여 Custom Metrics Autoscaler Operator 및 해당 구성 요소에 대한 데이터를 수집할 수 있습니다.

  • openshift-keda 네임스페이스와 해당 하위 오브젝트입니다.
  • Custom Metric Autoscaler Operator 설치 오브젝트입니다.
  • Custom Metric Autoscaler Operator CRD 오브젝트입니다.

3.8.1. 디버깅 데이터 수집

다음 명령은 Custom Metrics Autoscaler Operator에 대한 must-gather 툴을 실행합니다.

$ oc adm must-gather --image="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
-n openshift-marketplace \
-o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"
참고

표준 OpenShift Container Platform must-gather 명령 oc adm must-gather, Custom Metrics Autoscaler Operator 데이터를 수집하지 않습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenShift Container Platform CLI(oc)가 설치되어 있어야 합니다.

프로세스

  1. must-gather 데이터를 저장하려는 디렉터리로 이동합니다.

    참고

    클러스터에서 제한된 네트워크를 사용하는 경우 추가 단계를 수행해야 합니다. 미러 레지스트리에 신뢰할 수 있는 CA가 있는 경우 먼저 신뢰할 수 있는 CA를 클러스터에 추가해야 합니다. 제한된 네트워크의 모든 클러스터에 대해 다음 명령을 실행하여 기본 must-gather 이미지를 이미지 스트림으로 가져와야 합니다.

    $ oc import-image is/must-gather -n openshift
  2. 다음 중 하나를 수행합니다.

    • Custom Metrics Autoscaler Operator must-gather 데이터만 가져오려면 다음 명령을 사용합니다.

      $ oc adm must-gather --image="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
      -n openshift-marketplace \
      -o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"

      must-gather 명령의 사용자 정의 이미지는 Operator 패키지 매니페스트에서 직접 가져와서 Custom Metric Autoscaler Operator를 사용할 수 있는 모든 클러스터에서 작동합니다.

    • Custom Metric Autoscaler Operator 정보 외에 기본 must-gather 데이터를 수집하려면 다음을 수행합니다.

      1. 다음 명령을 사용하여 Custom Metrics Autoscaler Operator 이미지를 가져와서 환경 변수로 설정합니다.

        $ IMAGE="$(oc get packagemanifests openshift-custom-metrics-autoscaler-operator \
          -n openshift-marketplace \
          -o jsonpath='{.status.channels[?(@.name=="stable")].currentCSVDesc.annotations.containerImage}')"
      2. 사용자 정의 Metrics Autoscaler Operator 이미지와 함께 oc adm must-gather 를 사용합니다.

        $ oc adm must-gather --image-stream=openshift/must-gather --image=${IMAGE}

    예 3.1. Custom Metric Autoscaler의 must-gather 출력 예:

    └── openshift-keda
        ├── apps
        │   ├── daemonsets.yaml
        │   ├── deployments.yaml
        │   ├── replicasets.yaml
        │   └── statefulsets.yaml
        ├── apps.openshift.io
        │   └── deploymentconfigs.yaml
        ├── autoscaling
        │   └── horizontalpodautoscalers.yaml
        ├── batch
        │   ├── cronjobs.yaml
        │   └── jobs.yaml
        ├── build.openshift.io
        │   ├── buildconfigs.yaml
        │   └── builds.yaml
        ├── core
        │   ├── configmaps.yaml
        │   ├── endpoints.yaml
        │   ├── events.yaml
        │   ├── persistentvolumeclaims.yaml
        │   ├── pods.yaml
        │   ├── replicationcontrollers.yaml
        │   ├── secrets.yaml
        │   └── services.yaml
        ├── discovery.k8s.io
        │   └── endpointslices.yaml
        ├── image.openshift.io
        │   └── imagestreams.yaml
        ├── k8s.ovn.org
        │   ├── egressfirewalls.yaml
        │   └── egressqoses.yaml
        ├── keda.sh
        │   ├── kedacontrollers
        │   │   └── keda.yaml
        │   ├── scaledobjects
        │   │   └── example-scaledobject.yaml
        │   └── triggerauthentications
        │       └── example-triggerauthentication.yaml
        ├── monitoring.coreos.com
        │   └── servicemonitors.yaml
        ├── networking.k8s.io
        │   └── networkpolicies.yaml
        ├── openshift-keda.yaml
        ├── pods
        │   ├── custom-metrics-autoscaler-operator-58bd9f458-ptgwx
        │   │   ├── custom-metrics-autoscaler-operator
        │   │   │   └── custom-metrics-autoscaler-operator
        │   │   │       └── logs
        │   │   │           ├── current.log
        │   │   │           ├── previous.insecure.log
        │   │   │           └── previous.log
        │   │   └── custom-metrics-autoscaler-operator-58bd9f458-ptgwx.yaml
        │   ├── custom-metrics-autoscaler-operator-58bd9f458-thbsh
        │   │   └── custom-metrics-autoscaler-operator
        │   │       └── custom-metrics-autoscaler-operator
        │   │           └── logs
        │   ├── keda-metrics-apiserver-65c7cc44fd-6wq4g
        │   │   ├── keda-metrics-apiserver
        │   │   │   └── keda-metrics-apiserver
        │   │   │       └── logs
        │   │   │           ├── current.log
        │   │   │           ├── previous.insecure.log
        │   │   │           └── previous.log
        │   │   └── keda-metrics-apiserver-65c7cc44fd-6wq4g.yaml
        │   └── keda-operator-776cbb6768-fb6m5
        │       ├── keda-operator
        │       │   └── keda-operator
        │       │       └── logs
        │       │           ├── current.log
        │       │           ├── previous.insecure.log
        │       │           └── previous.log
        │       └── keda-operator-776cbb6768-fb6m5.yaml
        ├── policy
        │   └── poddisruptionbudgets.yaml
        └── route.openshift.io
            └── routes.yaml
  3. 작업 디렉터리에 생성된 must-gather 디렉터리의 압축 파일을 생성합니다. 예를 들어 Linux 운영 체제를 사용하는 컴퓨터에서 다음 명령을 실행합니다.

    $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
    1
    must-gather-local.5421342344627712289/를 실제 디렉터리 이름으로 바꿉니다.
  4. Red Hat Customer Portal에서 해당 지원 사례에 압축 파일을 첨부합니다.

3.9. Operator 메트릭 보기

Custom Metrics Autoscaler Operator는 클러스터 내 모니터링 구성 요소에서 가져오는 즉시 사용 가능한 지표를 표시합니다. PromQL(Prometheus Query Language)을 사용하여 메트릭을 쿼리하여 문제를 분석하고 진단할 수 있습니다. 컨트롤러 Pod가 다시 시작되면 모든 메트릭이 재설정됩니다.

3.9.1. 성능 지표 액세스

OpenShift Container Platform 웹 콘솔을 사용하여 메트릭에 액세스하고 쿼리를 실행할 수 있습니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 관리자 화면을 선택합니다.
  2. ObserveMetrics 를 선택합니다.
  3. 사용자 지정 쿼리를 만들려면 Expression 필드에 PromQL 쿼리를 추가합니다.
  4. 여러 쿼리를 추가하려면 쿼리 추가를 선택합니다.
3.9.1.1. 제공된 Operator 지표

Custom Metrics Autoscaler Operator는 OpenShift Container Platform 웹 콘솔을 사용하여 볼 수 있는 다음 메트릭을 노출합니다.

표 3.1. 사용자 정의 메트릭 자동 스케일러 Operator 메트릭
메트릭 이름설명

keda_scaler_activity

특정 스케일러가 활성 상태인지 아니면 비활성인지 여부입니다. 값 1 은 scaler가 활성 상태임을 나타냅니다. 값 0 은 스케일러가 비활성 상태임을 나타냅니다.

keda_scaler_metrics_value

대상 평균을 계산하는 HPA(Horizontal Pod Autoscaler)에서 사용하는 각 스케일러의 메트릭의 현재 값입니다.

keda_scaler_metrics_latency

각 스케일러에서 현재 메트릭을 검색하는 대기 시간입니다.

keda_scaler_errors

각 확장기에 발생한 오류 수입니다.

keda_scaler_errors_total

모든 scalers에 대해 발생한 총 오류 수입니다.

keda_scaled_object_errors

스케일링된 각 obejct에 대해 발생한 오류 수입니다.

keda_resource_totals

각 사용자 정의 리소스 유형의 각 네임스페이스에 있는 총 사용자 정의 메트릭 자동 스케일러 사용자 정의 리소스의 수입니다.

keda_trigger_totals

트리거 유형별 총 트리거 수입니다.

사용자 정의 메트릭 자동 스케일러 Admission Webhook 메트릭

사용자 정의 지표 자동 스케일러 Admission Webhook에서는 다음 Prometheus 메트릭도 노출합니다.

메트릭 이름설명

keda_scaled_object_validation_total

스케일링된 오브젝트 검증 수입니다.

keda_scaled_object_validation_errors

검증 오류 수입니다.

3.10. 사용자 정의 메트릭 자동 스케일러 추가 방법 이해

사용자 정의 메트릭 자동 스케일러를 추가하려면 배포, 상태 저장 세트 또는 사용자 정의 리소스에 대한 scaledObject 사용자 정의 리소스를 생성합니다. 작업에 대한 scaledJob 사용자 정의 리소스를 생성합니다.

스케일링할 각 워크로드에 대해 하나의 확장 오브젝트만 생성할 수 있습니다. 또한 동일한 워크로드에서 스케일링된 오브젝트와 HPA(수평 Pod 자동 스케일러)를 사용할 수 없습니다.

3.10.1. 워크로드에 사용자 정의 메트릭 자동 스케일러 추가

Deployment,StatefulSet 또는 사용자 정의 리소스 오브젝트로 생성된 워크로드에 대한 사용자 정의 지표 자동 스케일러를 생성할 수 있습니다.

사전 요구 사항

  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.
  • CPU 또는 메모리를 기반으로 스케일링에 사용자 정의 메트릭 자동 스케일러를 사용하는 경우:

    • 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 Usage에 CPU 및 메모리가 표시됩니다.

      $ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

      출력 예

      Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
      Namespace:    openshift-kube-scheduler
      Labels:       <none>
      Annotations:  <none>
      API Version:  metrics.k8s.io/v1beta1
      Containers:
        Name:  wait-for-host-port
        Usage:
          Memory:  0
        Name:      scheduler
        Usage:
          Cpu:     8m
          Memory:  45440Ki
      Kind:        PodMetrics
      Metadata:
        Creation Timestamp:  2019-05-23T18:47:56Z
        Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
      Timestamp:             2019-05-23T18:47:56Z
      Window:                1m0s
      Events:                <none>

    • 스케일링하려는 오브젝트와 연결된 Pod에는 지정된 메모리 및 CPU 제한이 포함되어야 합니다. 예를 들면 다음과 같습니다.

      Pod 사양의 예

      apiVersion: v1
      kind: Pod
      # ...
      spec:
        containers:
        - name: app
          image: images.my-company.example/app:v4
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
      # ...

프로세스

  1. 다음과 유사한 YAML 파일을 생성합니다. &lt ;2> 이름, 오브젝트 이름 &lt ;4& gt; 및 오브젝트 종류 &lt ;5> 만 필요합니다.

    스케일링 오브젝트의 예

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      annotations:
        autoscaling.keda.sh/paused-replicas: "0" 1
      name: scaledobject 2
      namespace: my-namespace
    spec:
      scaleTargetRef:
        apiVersion: apps/v1 3
        name: example-deployment 4
        kind: Deployment 5
        envSourceContainerName: .spec.template.spec.containers[0] 6
      cooldownPeriod:  200 7
      maxReplicaCount: 100 8
      minReplicaCount: 0 9
      metricsServer: 10
        auditConfig:
          logFormat: "json"
          logOutputVolumeClaim: "persistentVolumeClaimName"
          policy:
            rules:
            - level: Metadata
            omitStages: "RequestReceived"
            omitManagedFields: false
          lifetime:
            maxAge: "2"
            maxBackup: "1"
            maxSize: "50"
      fallback: 11
        failureThreshold: 3
        replicas: 6
      pollingInterval: 30 12
      advanced:
        restoreToOriginalReplicaCount: false 13
        horizontalPodAutoscalerConfig:
          name: keda-hpa-scale-down 14
          behavior: 15
            scaleDown:
              stabilizationWindowSeconds: 300
              policies:
              - type: Percent
                value: 100
                periodSeconds: 15
      triggers:
      - type: prometheus 16
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: basic
      - authenticationRef: 17
          name: prom-triggerauthentication
        metadata:
          name: prom-triggerauthentication
        type: object
      - authenticationRef: 18
          name: prom-cluster-triggerauthentication
        metadata:
          name: prom-cluster-triggerauthentication
        type: object

    1
    선택 사항: Custom Metrics Autoscaler Operator가 "작업에 대한 사용자 정의 지표 자동 스케일러 사용" 섹션에 설명된 대로 복제본을 지정된 값으로 스케일링하고 자동 스케일링을 중지하도록 지정합니다.
    2
    이 사용자 정의 메트릭 자동 스케일러의 이름을 지정합니다.
    3
    선택 사항: 대상 리소스의 API 버전을 지정합니다. 기본값은 apps/v1 입니다.
    4
    스케일링할 오브젝트의 이름을 지정합니다.
    5
    유형을 Deployment,StatefulSet 또는 CustomResource 로 지정합니다.
    6
    선택 사항: 사용자 정의 메트릭 자동 스케일러가 시크릿을 보유하는 환경 변수를 가져오는 대상 리소스의 컨테이너 이름을 지정합니다. 기본값은 .spec.template.spec.containers[0] 입니다.
    7
    선택 사항입니다. minReplicaCount 0 으로 설정하면 배포를 다시 스케일링하기 전에 마지막 트리거가 보고될 때까지 대기하는 기간(초)을 지정합니다. 기본값은 300 입니다.
    8
    선택 사항: 확장 시 최대 복제본 수를 지정합니다. 기본값은 100입니다.
    9
    선택 사항: 축소 시 최소 복제본 수를 지정합니다.
    10
    선택 사항: "감사 로깅 구성" 섹션에 설명된 대로 감사 로그의 매개변수를 지정합니다.
    11
    선택 사항: 스케일링기가 failureThreshold 매개변수에 정의된 횟수에 대한 소스에서 메트릭을 가져오지 못하는 경우 대체할 복제본 수를 지정합니다. 대체 동작에 대한 자세한 내용은 KEDA 설명서 를 참조하십시오.
    12
    선택 사항: 각 트리거를 확인하기 위해 간격(초)을 지정합니다. 기본값은 30 입니다.
    13
    선택 사항: 스케일링된 오브젝트가 삭제된 후 대상 리소스를 원래 복제본 수로 확장할지 여부를 지정합니다. 기본값은 false 이며 스케일링된 오브젝트가 삭제될 때 복제본 수를 유지합니다.
    14
    선택 사항: 수평 Pod 자동 스케일러의 이름을 지정합니다. 기본값은 keda-hpa-{scaled-object-name} 입니다.
    15
    선택 사항: "스케이딩 정책" 섹션에 설명된 대로 Pod를 확장 또는 확장하는 데 사용할 스케일링 정책을 지정합니다.
    16
    "사용자 정의 메트릭 자동 스케일러 트리거 이해" 섹션에 설명된 대로 스케일링 기준으로 사용할 트리거를 지정합니다. 이 예에서는 OpenShift Container Platform 모니터링을 사용합니다.
    17
    선택 사항: "사용자 정의 지표 자동 스케일러 트리거 인증 생성" 섹션에 설명된 대로 트리거 인증을 지정합니다.
    18
    선택 사항: "사용자 정의 지표 자동 스케일러 트리거 인증 생성" 섹션에 설명된 대로 클러스터 트리거 인증을 지정합니다.
    참고

    네임스페이스 트리거 인증과 클러스터 트리거 인증을 모두 지정할 필요는 없습니다.

  2. 사용자 정의 메트릭 자동 스케일러를 생성합니다.

    $ oc create -f <file-name>.yaml

검증

  • 명령 출력을 보고 사용자 정의 지표 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get scaledobject <scaled_object_name>

    출력 예

    NAME            SCALETARGETKIND      SCALETARGETNAME        MIN   MAX   TRIGGERS     AUTHENTICATION               READY   ACTIVE   FALLBACK   AGE
    scaledobject    apps/v1.Deployment   example-deployment     0     50    prometheus   prom-triggerauthentication   True    True     True       17s

    출력에서 다음 필드를 기록해 둡니다.

    • lg GERS: 사용 중인 트리거 또는 scaler를 나타냅니다.
    • AUTHENTICATION: 사용되는 트리거 인증의 이름을 나타냅니다.
    • READY: 스케일링을 시작할 준비가 되었는지 여부를 나타냅니다.

      • True 인 경우 스케일링된 오브젝트가 준비됩니다.
      • False 인 경우 생성한 오브젝트 중 하나 이상에 있는 문제로 인해 확장된 오브젝트가 준비되지 않습니다.
    • : 스케일링이 진행되고 있는지 여부를 나타냅니다.

      • True 인 경우 확장이 수행됩니다.
      • False 인 경우 메트릭이 없거나 생성한 오브젝트 중 하나 이상에 문제가 있기 때문에 스케일링이 수행되지 않습니다.
    • FALLBACK: 사용자 정의 메트릭 자동 스케일러가 소스에서 메트릭을 가져올 수 있는지 여부를 나타냅니다.

      • False 인 경우 사용자 정의 지표 자동 스케일러에서 지표를 가져옵니다.
      • True 인 경우 메트릭이 없거나 생성한 오브젝트 중 하나 이상에 문제가 있기 때문에 사용자 정의 지표 자동 스케일러가 지표를 가져옵니다.

3.10.2. 작업에 사용자 정의 메트릭 자동 스케일러 추가

모든 Job 오브젝트에 대한 사용자 정의 메트릭 자동 스케일러를 생성할 수 있습니다.

중요

확장된 작업을 사용하여 스케일링하는 것은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

사전 요구 사항

  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.

프로세스

  1. 다음과 유사한 YAML 파일을 생성합니다.

    kind: ScaledJob
    apiVersion: keda.sh/v1alpha1
    metadata:
      name: scaledjob
      namespace: my-namespace
    spec:
      failedJobsHistoryLimit: 5
      jobTargetRef:
        activeDeadlineSeconds: 600 1
        backoffLimit: 6 2
        parallelism: 1 3
        completions: 1 4
        template:  5
          metadata:
            name: pi
          spec:
            containers:
            - name: pi
              image: perl
              command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      maxReplicaCount: 100 6
      pollingInterval: 30 7
      successfulJobsHistoryLimit: 5 8
      failedJobsHistoryLimit: 5 9
      envSourceContainerName: 10
      rolloutStrategy: gradual 11
      scalingStrategy: 12
        strategy: "custom"
        customScalingQueueLengthDeduction: 1
        customScalingRunningJobPercentage: "0.5"
        pendingPodConditions:
          - "Ready"
          - "PodScheduled"
          - "AnyOtherCustomPodCondition"
        multipleScalersCalculation : "max"
      triggers:
      - type: prometheus 13
        metadata:
          serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
          namespace: kedatest
          metricName: http_requests_total
          threshold: '5'
          query: sum(rate(http_requests_total{job="test-app"}[1m]))
          authModes: "bearer"
      - authenticationRef: 14
          name: prom-triggerauthentication
        metadata:
          name: prom-triggerauthentication
         type: object
      - authenticationRef: 15
          name: prom-cluster-triggerauthentication
        metadata:
          name: prom-cluster-triggerauthentication
        type: object
    1
    작업을 실행할 수 있는 최대 기간을 지정합니다.
    2
    작업 재시도 횟수를 지정합니다. 기본값은 6 입니다.
    3
    선택 사항: 작업이 병렬로 실행해야 하는 Pod 복제본 수를 지정합니다. 기본값은 1 입니다.
    • 비병렬 작업의 경우 설정되지 않은 상태로 둡니다. 설정되지 않은 경우 기본값은 1 입니다.
    4
    선택 사항: 작업이 완료된 것으로 표시하는 데 필요한 성공적인 Pod 완료 횟수를 지정합니다.
    • 비병렬 작업의 경우 설정되지 않은 상태로 둡니다. 설정되지 않은 경우 기본값은 1 입니다.
    • 완료 횟수가 고정된 병렬 작업의 경우 완료 횟수를 지정합니다.
    • 작업 큐가 있는 병렬 작업의 경우 설정되지 않은 상태로 둡니다. 기본값을 설정하지 않으면 parallelism 매개변수의 값이 됩니다.
    5
    컨트롤러에서 생성하는 Pod의 템플릿을 지정합니다.
    6
    선택 사항: 확장 시 최대 복제본 수를 지정합니다. 기본값은 100입니다.
    7
    선택 사항: 각 트리거를 확인하기 위해 간격(초)을 지정합니다. 기본값은 30 입니다.
    8
    선택 사항: 성공한 작업 수를 유지해야 합니다. 기본값은 100입니다.
    9
    선택 사항: 유지해야 하는 실패한 작업 수를 지정합니다. 기본값은 100입니다.
    10
    선택 사항: 사용자 정의 자동 스케일러가 시크릿을 보유하는 환경 변수를 가져오는 대상 리소스의 컨테이너 이름을 지정합니다. 기본값은 .spec.template.spec.containers[0] 입니다.
    11
    선택 사항: 확장된 작업이 업데이트될 때마다 기존 작업이 종료되는지 여부를 지정합니다.
    • 기본값: 자동 스케일러는 연결된 확장 작업이 업데이트되면 기존 작업을 종료합니다. 자동 스케일러는 최신 사양으로 작업을 다시 생성합니다.
    • 관련된 스케일링 작업이 업데이트되면 자동 스케일러가 기존 작업을 종료하지 않습니다. 자동 스케일러는 최신 사양을 사용하여 새 작업을 생성합니다.
    12
    선택 사항: 스케일링 전략을 기본,사용자 지정 또는 정확한. 기본값은 default 입니다. 자세한 내용은 다음 "리소스" 섹션의 링크를 참조하십시오.
    13
    "사용자 정의 메트릭 자동 스케일러 트리거 이해" 섹션에 설명된 대로 스케일링 기준으로 사용할 트리거를 지정합니다.
    14
    선택 사항: "사용자 정의 지표 자동 스케일러 트리거 인증 생성" 섹션에 설명된 대로 트리거 인증을 지정합니다.
    15
    선택 사항: "사용자 정의 지표 자동 스케일러 트리거 인증 생성" 섹션에 설명된 대로 클러스터 트리거 인증을 지정합니다.
    참고

    네임스페이스 트리거 인증과 클러스터 트리거 인증을 모두 지정할 필요는 없습니다.

  2. 사용자 정의 메트릭 자동 스케일러를 생성합니다.

    $ oc create -f <file-name>.yaml

검증

  • 명령 출력을 보고 사용자 정의 지표 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get scaledjob <scaled_job_name>

    출력 예

    NAME        MAX   TRIGGERS     AUTHENTICATION              READY   ACTIVE    AGE
    scaledjob   100   prometheus   prom-triggerauthentication  True    True      8s

    출력에서 다음 필드를 기록해 둡니다.

    • lg GERS: 사용 중인 트리거 또는 scaler를 나타냅니다.
    • AUTHENTICATION: 사용되는 트리거 인증의 이름을 나타냅니다.
    • READY: 스케일링을 시작할 준비가 되었는지 여부를 나타냅니다.

      • True 인 경우 스케일링된 오브젝트가 준비됩니다.
      • False 인 경우 생성한 오브젝트 중 하나 이상에 있는 문제로 인해 확장된 오브젝트가 준비되지 않습니다.
    • : 스케일링이 진행되고 있는지 여부를 나타냅니다.

      • True 인 경우 확장이 수행됩니다.
      • False 인 경우 메트릭이 없거나 생성한 오브젝트 중 하나 이상에 문제가 있기 때문에 스케일링이 수행되지 않습니다.

3.11. Custom Metrics Autoscaler Operator 제거

OpenShift Container Platform 클러스터에서 사용자 정의 메트릭 자동 스케일러를 제거할 수 있습니다. Custom Metrics Autoscaler Operator를 제거한 후 Operator와 관련된 다른 구성 요소를 제거하여 잠재적인 문제를 방지합니다.

참고

KedaController CR(사용자 정의 리소스)을 먼저 삭제합니다. KedaController CR을 삭제하지 않으면 openshift-keda 프로젝트를 삭제할 때 OpenShift Container Platform이 중단될 수 있습니다. CR을 삭제하기 전에 Custom Metrics Autoscaler Operator를 삭제하는 경우 CR을 삭제할 수 없습니다.

3.11.1. Custom Metrics Autoscaler Operator 설치 제거

다음 절차에 따라 OpenShift Container Platform 클러스터에서 사용자 정의 메트릭 자동 스케일러를 제거합니다.

사전 요구 사항

  • Custom Metrics Autoscaler Operator가 설치되어 있어야 합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 Operator설치된 Operator를 클릭합니다.
  2. openshift-keda 프로젝트로 전환합니다.
  3. ECDHEda Controller 사용자 정의 리소스를 제거합니다.

    1. CustomMetricsAutoscaler Operator를 찾아ECDHEda Controller 탭을 클릭합니다.
    2. 사용자 정의 리소스를 찾은 다음 DeleteECDHEdaController를 클릭합니다.
    3. 제거를 클릭합니다.
  4. Custom Metrics Autoscaler Operator를 제거합니다.

    1. Operators설치된 Operators를 클릭합니다.
    2. CustomMetricsAutoscaler Operator를 찾아 옵션 메뉴 kebab 를 클릭하고 Operator 설치 제거를 선택합니다.
    3. 제거를 클릭합니다.
  5. 선택 사항: OpenShift CLI를 사용하여 사용자 정의 지표 자동 스케일러 구성 요소를 제거합니다.

    1. 사용자 정의 지표 자동 스케일러 CRD를 삭제합니다.

      • clustertriggerauthentications.keda.sh
      • kedacontrollers.keda.sh
      • scaledjobs.keda.sh
      • scaledobjects.keda.sh
      • triggerauthentications.keda.sh
      $ oc delete crd clustertriggerauthentications.keda.sh kedacontrollers.keda.sh scaledjobs.keda.sh scaledobjects.keda.sh triggerauthentications.keda.sh

      CRD를 삭제하면 관련 역할, 클러스터 역할, 역할 바인딩이 제거됩니다. 그러나 수동으로 삭제해야 하는 몇 가지 클러스터 역할이 있을 수 있습니다.

    2. 사용자 정의 메트릭 자동 스케일러 클러스터 역할을 나열합니다.

      $ oc get clusterrole | grep keda.sh
    3. 나열된 사용자 정의 지표 자동 스케일러 클러스터 역할을 삭제합니다. 예를 들면 다음과 같습니다.

      $ oc delete clusterrole.keda.sh-v1alpha1-admin
    4. 사용자 정의 메트릭 자동 스케일러 클러스터 역할 바인딩을 나열합니다.

      $ oc get clusterrolebinding | grep keda.sh
    5. 나열된 사용자 정의 지표 자동 스케일러 클러스터 역할 바인딩을 삭제합니다. 예를 들면 다음과 같습니다.

      $ oc delete clusterrolebinding.keda.sh-v1alpha1-admin
  6. 사용자 정의 메트릭 자동 스케일러 프로젝트를 삭제합니다.

    $ oc delete project openshift-keda
  7. Cluster Metric Autoscaler Operator를 삭제합니다.

    $ oc delete operator/openshift-custom-metrics-autoscaler-operator.openshift-keda

4장. 노드에 대한 Pod 배치 제어(예약)

4.1. 스케줄러를 사용하여 Pod 배치 제어

Pod 예약은 클러스터 내 노드에 대한 새 Pod 배치를 결정하는 내부 프로세스입니다.

스케줄러 코드는 새 Pod가 생성될 때 해당 Pod를 감시하고 이를 호스팅하는 데 가장 적합한 노드를 확인할 수 있도록 깔끔하게 분리되어 있습니다. 그런 다음 마스터 API를 사용하여 Pod에 대한 바인딩(Pod와 노드의 바인딩)을 생성합니다.

기본 Pod 예약
OpenShift Container Platform에는 대부분의 사용자의 요구 사항을 충족하는 기본 스케줄러가 제공됩니다. 기본 스케줄러는 고유 툴과 사용자 정의 툴을 모두 사용하여 Pod에 가장 적합한 항목을 결정합니다.
고급 Pod 예약

새 Pod가 배치되는 위치를 더 많이 제어해야 하는 경우 OpenShift Container Platform 고급 예약 기능을 사용하면 Pod가 필요하거나 특정 노드에서 또는 특정 Pod와 함께 실행하는 기본 설정이 있도록 Pod를 구성할 수 있습니다.

다음 스케줄링 기능을 사용하여 Pod 배치를 제어할 수 있습니다.

4.1.1. 기본 스케줄러 정보

기본 OpenShift Container Platform Pod 스케줄러는 클러스터 내의 노드에 대한 새 Pod 배치를 결정합니다. Pod에서 데이터를 읽고 구성된 프로필에 따라 적합한 노드를 찾습니다. 완전히 독립적이며 독립 실행형 솔루션으로 존재합니다. Pod를 수정하지 않습니다. Pod를 특정 노드에 연결하는 Pod에 대한 바인딩을 생성합니다.

4.1.1.1. 기본 예약 이해

기존 일반 스케줄러는 3단계 작업에서 Pod를 호스팅할 노드를 선택하는 기본 플랫폼 제공 스케줄러 엔진에 해당합니다.

노드 필터링
사용 가능한 노드를 지정된 제약 조건 또는 요구 사항에 따라 필터링합니다. 이 작업은 서술자 또는 필터라는 필터 함수 목록을 통해 각 노드 실행하여 수행됩니다.
필터링된 노드 목록의 우선순위 지정
이 작업은 일련의 우선 순위 또는 스크래핑을 통해 각 노드를 전달하면 0~10 사이의 점수를 지정하는 함수입니다. 0은 Pod를 호스팅하는 데 적합하지 않음을 나타내고 10이 표시됩니다. 스케줄러 구성은 각 점수 지정 함수에 대해 간단한 가중치 (정의 숫자 값)를 사용할 수도 있습니다. 각 점수 함수에서 제공하는 노드 점수에 가중치(대부분 점수의 기본 가중치는 1임)를 곱한 다음 모든 점수에서 제공하는 각 노드의 점수를 추가하여 결합됩니다. 관리자가 이 가중치 특성을 사용하여 일부 점수에 더 높은 의미를 부여할 수 있습니다.
최적의 노드 선택
노드는 해당 점수에 따라 정렬되며 점수가 가장 높은 노드가 Pod를 호스팅하도록 선택됩니다. 여러 노드의 점수가 동일한 경우 해당 노드 중 하나가 무작위로 선택됩니다.

4.1.2. 스케줄러 사용 사례

OpenShift Container Platform 내에서 예약하는 중요 사용 사례 중 하나는 유연한 유사성 및 유사성 방지 정책을 지원하는 것입니다.

4.1.2.1. 인프라 토폴로지 수준

관리자는 노드에 라벨을 지정하여 인프라(노드)에 다양한 토폴로지 수준을 정의할 수 있습니다. 예를 들면 region=r1, zone=z1, rack=s1과 같습니다.

이러한 라벨 이름에는 특별한 의미가 없으며 관리자는 도시/빌딩/방과 같은 인프라 수준의 이름을 자유롭게 지정할 수 있습니다. 또한 관리자는 인프라 토폴로지에 원하는 수의 수준을 정의할 수 있으며 일반적으로 세 가지 수준이 적합합니다(예: regionzonesracks). 관리자는 모든 조합에 유사성 및 유사성 방지 규칙을 지정할 수 있습니다.

4.1.2.2. 유사성

관리자는 임의의 토폴로지 수준 또는 여러 수준에도 유사성을 지정하도록 스케줄러를 구성할 수 있어야 합니다. 특정 수준의 유사성은 동일한 서비스에 속하는 모든 Pod가 동일한 수준에 속하는 노드에 예약됨을 나타냅니다. 이렇게 하면 관리자가 피어 Pod가 지리적으로 너무 멀리 떨어져 있지 않도록 할 수 있어 애플리케이션의 대기 시간 요구 사항이 처리됩니다. 동일한 유사성 그룹 내에서 Pod를 호스팅할 수 있는 노드가 없는 경우 Pod를 예약하지 않습니다.

Pod를 예약할 위치를 더 잘 제어해야 하는 경우 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어유사성 및 유사성 방지 규칙을 사용하여 기타 Pod와 관련된 Pod 배치를 참조하십시오.

관리자는 이러한 고급 예약 기능을 사용하여 Pod를 예약할 수 있는 노드를 지정하고 기타 Pod와 관련된 예약을 강제 적용하거나 거부할 수 있습니다.

4.1.2.3. 유사성 방지

관리자는 임의의 토폴로지 수준 또는 여러 수준에도 유사성 방지를 지정하도록 스케줄러를 구성할 수 있어야 합니다. 특정 수준의 유사성 방지(또는 '분배')는 동일한 서비스에 속하는 모든 Pod가 해당 수준에 속하는 노드에 분배되어 있음을 나타냅니다. 이 경우 고가용성을 위해 애플리케이션이 잘 분배됩니다. 스케줄러는 적용 가능한 모든 노드에서 가능한 한 균등하게 서비스 Pod의 균형을 맞추려고 합니다.

Pod를 예약할 위치를 더 잘 제어해야 하는 경우 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어유사성 및 유사성 방지 규칙을 사용하여 기타 Pod와 관련된 Pod 배치를 참조하십시오.

관리자는 이러한 고급 예약 기능을 사용하여 Pod를 예약할 수 있는 노드를 지정하고 기타 Pod와 관련된 예약을 강제 적용하거나 거부할 수 있습니다.

4.2. 스케줄러 프로필을 사용하여 Pod 예약

예약 프로필을 사용하여 클러스터 내의 노드에 Pod를 예약하도록 OpenShift Container Platform을 구성할 수 있습니다.

4.2.1. 스케줄러 프로필 정보

스케줄러 프로필을 지정하여 노드에 Pod를 예약하는 방법을 제어할 수 있습니다.

다음 스케줄러 프로필을 사용할 수 있습니다.

LowNodeUtilization
이 프로필은 여러 노드에 Pod를 균등하게 분배하여 노드당 리소스 사용량을 줄입니다. 이 프로필은 기본 스케줄러 동작을 제공합니다.
HighNodeUtilization
이 프로필은 가능한 한 많은 Pod를 가능한 한 소수의 노드에 배치하려고 합니다. 이렇게 하면 노드 수가 최소화되고 노드당 리소스 사용량이 늘어납니다.
NoScoring
모든 점수 플러그인을 비활성화하여 가장 빠른 스케줄링 주기를 위해 대기 시간이 짧은 프로필입니다. 이렇게 하면 보다 신속하게 더 나은 예약 결정을 내릴 수 있습니다.

4.2.2. 스케줄러 프로필 구성

스케줄러 프로필을 사용하도록 스케줄러를 구성할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

절차

  1. Scheduler 오브젝트를 편집합니다.

    $ oc edit scheduler cluster
  2. spec.profile 필드에 사용할 프로필을 지정합니다.

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      name: cluster
    #...
    spec:
      mastersSchedulable: false
      profile: HighNodeUtilization 1
    #...
    1
    LowNodeUtilization, HighNodeUtilization 또는 NoScoring으로 설정합니다.
  3. 파일을 저장하여 변경 사항을 적용합니다.

4.3. 유사성 및 유사성 방지 규칙을 사용하여 다른 Pod에 상대적인 Pod 배치

유사성은 예약할 노드를 제어하는 Pod의 속성입니다. 유사성 방지는 Pod가 노드에서 예약되지 않도록 하는 Pod의 속성입니다.

OpenShift Container Platform에서 Pod 유사성Pod 유사성 방지를 사용하면 다른 Pod의 키/값 라벨에 따라 Pod를 예약할 수 있는 노드를 제한할 수 있습니다.

4.3.1. Pod 유사성 이해

Pod 유사성Pod 유사성 방지를 사용하면 다른 Pod의 키/값 라벨에 따라 Pod를 예약할 수 있는 노드를 제한할 수 있습니다.

  • Pod 유사성을 사용하면 새 Pod의 라벨 선택기가 현재 Pod의 라벨과 일치하는 경우 다른 Pod와 동일한 노드에서 새 Pod를 찾도록 스케줄러에 지시할 수 있습니다.
  • Pod 유사성 방지를 사용하면 새 Pod의 라벨 선택기가 현재 Pod의 라벨과 일치하는 경우 스케줄러에서 동일한 라벨을 사용하여 Pod와 동일한 노드에서 새 Pod를 찾지 않도록 할 수 있습니다.

예를 들어 유사성 규칙을 사용하여 서비스 내에서 또는 다른 서비스의 Pod와 관련하여 Pod를 분배하거나 패키징할 수 있습니다. 유사성 방지 규칙을 사용하면 특정 서비스의 Pod가 첫 번째 서비스의 Pod 성능을 방해하는 것으로 알려진 다른 서비스의 Pod와 동일한 노드에 예약되지 않도록 할 수 있습니다. 또는 서비스의 Pod를 노드, 가용성 영역 또는 가용성 집합에 분배하여 관련 오류를 줄일 수 있습니다.

참고

라벨 선택기는 여러 Pod 배포가 있는 Pod와 일치할 수 있습니다. 일치하는 Pod를 방지하도록 유사성 방지 규칙을 구성할 때 라벨의 고유한 조합을 사용합니다.

Pod 유사성 규칙에는 필수기본 두 가지의 유형이 있습니다.

노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다. 기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.

참고

Pod 우선순위 및 선점 설정에 따라 유사성 요구 사항을 위반하지 않으면 스케줄러에서 Pod에 적절한 노드를 찾지 못하는 경우가 있습니다. 이 경우 Pod를 예약하지 못할 수 있습니다.

이러한 상황을 방지하려면 우선순위가 같은 Pod를 사용하여 Pod 유사성을 신중하게 구성합니다.

Pod 사양 파일을 통해 Pod 유사성/유사성 방지를 구성합니다. 필수 규칙, 기본 규칙 또는 둘 다 지정할 수 있습니다. 둘 다 지정하는 경우 노드는 먼저 필수 규칙을 충족한 다음 기본 규칙을 충족하려고 합니다.

다음 예제에서는 Pod 유사성 및 유사성 방지를 위해 구성된 Pod 사양을 보여줍니다.

이 예제에서 Pod 유사성 규칙은 노드에 이미 실행 중인 Pod가 한 개 이상 있고 키가 security이고 값이 S1인 라벨이 있는 경우에만 노드에 Pod를 예약할 수 있음을 나타냅니다. Pod 유사성 방지 규칙은 노드에서 이미 Pod를 실행 중이고 키가 security이고 값이 S2인 라벨이 있는 경우 Pod를 노드에 예약하지 않는 것을 선호함을 나타냅니다.

Pod 유사성이 포함된 샘플 Pod 구성 파일

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity: 1
      requiredDuringSchedulingIgnoredDuringExecution: 2
      - labelSelector:
          matchExpressions:
          - key: security 3
            operator: In 4
            values:
            - S1 5
        topologyKey: failure-domain.beta.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: docker.io/ocpqe/hello-pod

1
Pod 유사성을 구성하는 스탠자입니다.
2
필요한 규칙을 정의합니다.
3 5
규칙을 적용하려면 일치해야 하는 키 및 값(라벨)입니다.
4
이 연산자는 기존 Pod의 라벨과 새 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. In, NotIn, Exists 또는 DoesNotExist일 수 있습니다.

Pod 유사성 방지가 포함된 샘플 Pod 구성 파일

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-antiaffinity
spec:
  affinity:
    podAntiAffinity: 1
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 100  3
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security 4
              operator: In 5
              values:
              - S2
          topologyKey: kubernetes.io/hostname
  containers:
  - name: with-pod-affinity
    image: docker.io/ocpqe/hello-pod

1
Pod 유사성 방지를 구성하는 스탠자입니다.
2
기본 규칙을 정의합니다.
3
기본 규칙의 가중치를 지정합니다. 가중치가 가장 높은 노드가 우선합니다.
4
유사성 방지 규칙이 적용되는 시기를 결정하는 Pod 라벨에 대한 설명입니다. 라벨의 키와 값을 지정합니다.
5
이 연산자는 기존 Pod의 라벨과 새 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. In, NotIn, Exists 또는 DoesNotExist일 수 있습니다.
참고

런타임 시 노드의 라벨이 변경되어 Pod의 유사성 규칙이 더 이상 충족되지 않는 경우 Pod가 노드에서 계속 실행됩니다.

4.3.2. Pod 유사성 규칙 구성

다음 단계에서는 라벨이 있는 Pod 및 유사성을 사용하여 해당 Pod에 예약할 수 있는 Pod를 생성하는 간단한 2-Pod 구성을 보여줍니다.

참고

예약된 Pod에 선호도를 직접 추가할 수 없습니다.

절차

  1. Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1
        labels:
          security: S1
      spec:
        containers:
        - name: security-s1
          image: docker.io/ocpqe/hello-pod
    2. Pod를 생성합니다.

      $ oc create -f <pod-spec>.yaml
  2. 다른 Pod를 생성할 때 유사성을 추가하도록 다음 매개변수를 구성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1-east
      #...
      spec
        affinity 1
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: 2
            - labelSelector:
                matchExpressions:
                - key: security 3
                  values:
                  - S1
                  operator: In 4
              topologyKey: topology.kubernetes.io/zone 5
      #...
      1
      Pod 유사성을 추가합니다.
      2
      requiredDuringSchedulingIgnoredDuringExecution 매개변수 또는 preferredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.
      3
      충족해야 하는 키와 값을 지정합니다. 새 Pod를 다른 Pod와 함께 예약하려면 첫 번째 Pod의 라벨과 동일한 keyvalues 매개변수를 사용합니다.
      4
      연산자 를 지정합니다. 연산자는 In, NotIn, Exists 또는 DoesNotExist일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.
      5
      이러한 토폴로지 도메인을 나타내기 위해 사용하며 미리 채워져 있는 Kubernetes 라벨topologyKey를 지정합니다.
    2. Pod를 생성합니다.

      $ oc create -f <pod-spec>.yaml

4.3.3. Pod 유사성 방지 규칙 구성

다음 단계에서는 라벨이 있는 Pod 및 유사성 방지 기본 규칙을 사용하여 해당 Pod에 예약하지 않는 Pod를 생성하는 간단한 2-Pod 구성을 보여줍니다.

참고

예약된 Pod에 선호도를 직접 추가할 수 없습니다.

프로세스

  1. Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s1
        labels:
          security: S1
      spec:
        containers:
        - name: security-s1
          image: docker.io/ocpqe/hello-pod
    2. Pod를 생성합니다.

      $ oc create -f <pod-spec>.yaml
  2. 다른 Pod를 생성할 때 다음 매개변수를 구성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: security-s2-east
      #...
      spec
        affinity 1
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 2
            - weight: 100 3
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                  - key: security 4
                    values:
                    - S1
                    operator: In 5
                topologyKey: kubernetes.io/hostname 6
      #...
      1
      Pod 유사성 방지를 추가합니다.
      2
      requiredDuringSchedulingIgnoredDuringExecution 매개변수 또는 preferredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.
      3
      기본 규칙의 경우 노드의 가중치 1-100을 지정합니다. 가중치가 높은 노드가 우선합니다.
      4
      충족해야 하는 키와 값을 지정합니다. 새 Pod를 다른 Pod와 함께 예약하지 않으려면 첫 번째 Pod의 라벨과 동일한 keyvalues 매개변수를 사용합니다.
      5
      연산자 를 지정합니다. 연산자는 In, NotIn, Exists 또는 DoesNotExist일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.
      6
      이러한 토폴로지 도메인을 나타내는 데 사용하는 미리 채워진 Kubernetes 라벨topologyKey 를 지정합니다.
    2. Pod를 생성합니다.

      $ oc create -f <pod-spec>.yaml

4.3.4. 샘플 Pod 유사성 및 유사성 방지 규칙

다음 예제에서는 Pod 유사성 및 Pod 유사성 방지를 보여줍니다.

4.3.4.1. Pod 유사성

다음 예제에서는 일치하는 라벨 및 라벨 선택기가 있는 Pod의 Pod 유사성을 보여줍니다.

  • Pod team4에는 라벨 team:4가 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: team4
      labels:
         team: "4"
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod team4a에는 podAffinity 아래에 라벨 선택기 team:4가 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: team4a
    #...
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: team
                operator: In
                values:
                - "4"
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-affinity
        image: docker.io/ocpqe/hello-pod
    #...
  • team4a Pod는 team4 Pod와 동일한 노드에 예약됩니다.
4.3.4.2. Pod 유사성 방지

다음 예제에서는 일치하는 라벨 및 라벨 선택기가 있는 Pod의 Pod 유사성 방지를 보여줍니다.

  • Pod pod-s1에는 라벨 security:s1이 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
      labels:
        security: s1
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2에는 podAntiAffinity 아래에 라벨 선택기 security:s1이 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s2
    #...
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - s1
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-antiaffinity
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2pod-s1과 동일한 노드에 예약할 수 없습니다.
4.3.4.3. 일치하는 라벨이 없는 Pod 유사성

다음 예제에서는 일치하는 라벨 및 라벨 선택기가 없는 Pod의 Pod 유사성을 보여줍니다.

  • Pod pod-s1에는 라벨 security:s1이 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
      labels:
        security: s1
    #...
    spec:
      containers:
      - name: ocp
        image: docker.io/ocpqe/hello-pod
    #...
  • Pod pod-s2에는 라벨 선택기 security:s2가 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s2
    #...
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - s2
            topologyKey: kubernetes.io/hostname
      containers:
      - name: pod-affinity
        image: docker.io/ocpqe/hello-pod
    #...
  • security:s2 라벨이 있는 Pod가 포함된 노드가 없는 경우 Pod pod-s2는 예약되지 않습니다. 해당 라벨이 있는 기타 Pod가 없는 경우 새 Pod는 보류 중인 상태로 유지됩니다.

    출력 예

    NAME      READY     STATUS    RESTARTS   AGE       IP        NODE
    pod-s2    0/1       Pending   0          32s       <none>

4.4. 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어

유사성은 예약할 노드를 제어하는 Pod의 속성입니다.

OpenShift Container Platform 노드 유사성은 스케줄러에서 Pod를 배치할 수 있는 위치를 결정하는 데 사용하는 규칙 집합입니다. 규칙은 노드의 사용자 정의 라벨과 Pod에 지정된 라벨 선택기를 사용하여 정의합니다.

4.4.1. 노드 유사성 이해

노드 유사성을 사용하면 Pod에서 Pod를 배치할 수 있는 노드 그룹에 대한 유사성을 지정할 수 있습니다. 노드는 배치를 제어할 수 없습니다.

예를 들어 특정 CPU 또는 특정 가용성 영역이 있는 노드에서만 실행하도록 Pod를 구성할 수 있습니다.

노드 유사성 규칙에는 필수기본 두 가지의 유형이 있습니다.

노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다. 기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.

참고

노드의 라벨이 런타임에 변경되어 Pod에 대한 노드 유사성 규칙이 더 이상 충족되지 않으면 Pod가 해당 노드에서 계속 실행됩니다.

노드 유사성은 Pod 사양 파일을 통해 구성합니다. 필수 규칙, 기본 규칙 또는 둘 다 지정할 수 있습니다. 둘 다 지정하는 경우 노드는 먼저 필수 규칙을 충족한 다음 기본 규칙을 충족하려고 합니다.

다음 예제는 키가 e2e-az-NorthSouth이고 값이 e2e-az-North 또는 e2e-az-South인 라벨이 있는 노드에 Pod를 배치해야 하는 규칙이 있는 Pod 사양입니다.

노드 유사성 필수 규칙이 있는 Pod 구성 파일의 예

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity: 1
      requiredDuringSchedulingIgnoredDuringExecution: 2
        nodeSelectorTerms:
        - matchExpressions:
          - key: e2e-az-NorthSouth 3
            operator: In 4
            values:
            - e2e-az-North 5
            - e2e-az-South 6
  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
#...

1
노드 유사성을 구성하는 스탠자입니다.
2
필요한 규칙을 정의합니다.
3 5 6
규칙을 적용하려면 일치해야 하는 키/값(라벨)입니다.
4
연산자는 노드의 라벨과 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. 이 값은 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다.

다음 예제는 Pod에 대해 키가 e2e-az-EastWest이고 값이 e2e-az-East 또는 e2e-az-West인 라벨이 있는 노드를 선호하는 기본 규칙이 있는 노드 사양입니다.

노드 유사성 기본 규칙이 있는 Pod 구성 파일의 예

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity: 1
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 1 3
        preference:
          matchExpressions:
          - key: e2e-az-EastWest 4
            operator: In 5
            values:
            - e2e-az-East 6
            - e2e-az-West 7
  containers:
  - name: with-node-affinity
    image: docker.io/ocpqe/hello-pod
#...

1
노드 유사성을 구성하는 스탠자입니다.
2
기본 규칙을 정의합니다.
3
기본 규칙의 가중치를 지정합니다. 가중치가 높은 노드가 우선합니다.
4 6 7
규칙을 적용하려면 일치해야 하는 키/값(라벨)입니다.
5
연산자는 노드의 라벨과 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. 이 값은 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다.

명시적인 노드 유사성 방지 개념은 없지만 NotIn 또는 DoesNotExist 연산자를 사용하여 해당 동작을 복제합니다.

참고

노드 유사성 및 노드 선택기를 동일한 Pod 구성으로 사용하는 경우 다음 사항에 유의하십시오.

  • nodeSelectornodeAffinity를 둘 다 구성하는 경우 Pod를 후보 노드에 예약하기 위해서는 두 상태를 모두 충족해야 합니다.
  • nodeAffinity 유형과 연결된 nodeSelectorTerms를 여러 개 지정하는 경우 nodeSelectorTerms 중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다.
  • nodeSelectorTerms와 연결된 matchExpressions를 여러 개 지정하는 경우 모든 matchExpressions를 충족할 때만 Pod를 노드에 예약할 수 있습니다.

4.4.2. 필수 노드 유사성 규칙 구성

노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다.

프로세스

다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치해야 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.

  1. oc label node 명령을 사용하여 노드에 라벨을 추가합니다.

    $ oc label node node1 e2e-az-name=e2e-az1
    작은 정보

    다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        e2e-az-name: e2e-az1
    #...
  2. Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      참고

      예약된 Pod에 선호도를 직접 추가할 수 없습니다.

      출력 예

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 1
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: 2
              nodeSelectorTerms:
              - matchExpressions:
                - key: e2e-az-name 3
                  values:
                  - e2e-az1
                  - e2e-az2
                  operator: In 4
      #...

      1
      Pod 유사성을 추가합니다.
      2
      requiredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.
      3
      충족해야 하는 키와 값을 지정합니다. 편집한 노드에 새 Pod를 예약하려면 노드의 라벨과 동일한 keyvalues 매개변수를 사용합니다.
      4
      연산자 를 지정합니다. 연산자는 In, NotIn, Exists 또는 DoesNotExist일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.
    2. Pod를 생성합니다.

      $ oc create -f <file-name>.yaml

4.4.3. 기본 노드 유사성 규칙 구성

기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.

프로세스

다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치하려고 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.

  1. oc label node 명령을 사용하여 노드에 라벨을 추가합니다.

    $ oc label node node1 e2e-az-name=e2e-az3
  2. 특정 라벨을 사용하여 Pod를 생성합니다.

    1. 다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.

      참고

      예약된 Pod에 선호도를 직접 추가할 수 없습니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: s1
      spec:
        affinity: 1
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 2
            - weight: 3
              preference:
                matchExpressions:
                - key: e2e-az-name 4
                  values:
                  - e2e-az3
                  operator: In 5
      #...
      1
      Pod 유사성을 추가합니다.
      2
      preferredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.
      3
      노드의 가중치를 숫자 1~100으로 지정합니다. 가중치가 높은 노드가 우선합니다.
      4
      충족해야 하는 키와 값을 지정합니다. 편집한 노드에 새 Pod를 예약하려면 노드의 라벨과 동일한 keyvalues 매개변수를 사용합니다.
      5
      연산자 를 지정합니다. 연산자는 In, NotIn, Exists 또는 DoesNotExist일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.
    2. Pod를 생성합니다.

      $ oc create -f <file-name>.yaml

4.4.4. 노드 유사성 규칙 샘플

다음 예제에서는 노드 유사성을 보여줍니다.

4.4.4.1. 일치하는 라벨이 있는 노드 유사성

다음 예제에서는 일치하는 라벨이 있는 노드 및 Pod의 노드 유사성을 보여줍니다.

  • Node1 노드에는 라벨 zone:us가 있습니다.

    $ oc label node node1 zone=us
    작은 정보

    다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: us
    #...
  • pod-s1 Pod에는 필수 노드 유사성 규칙에 따라 zoneus 키/값 쌍이 있습니다.

    $ cat pod-s1.yaml

    출력 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...

  • pod-s1 Pod를 Node1에 예약할 수 있습니다.

    $ oc get pod -o wide

    출력 예

    NAME     READY     STATUS       RESTARTS   AGE      IP      NODE
    pod-s1   1/1       Running      0          4m       IP1     node1

4.4.4.2. 일치하는 라벨이 없는 노드 유사성

다음 예제에서는 일치하는 라벨이 없는 노드 및 Pod의 노드 유사성을 보여줍니다.

  • Node1 노드에는 라벨 zone:emea가 있습니다.

    $ oc label node node1 zone=emea
    작은 정보

    다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: <node_name>
      labels:
        zone: emea
    #...
  • pod-s1 Pod에는 필수 노드 유사성 규칙에 따라 zoneus 키/값 쌍이 있습니다.

    $ cat pod-s1.yaml

    출력 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "zone"
                  operator: In
                  values:
                  - us
    #...

  • pod-s1 Pod는 Node1에 예약할 수 없습니다.

    $ oc describe pod pod-s1

    출력 예

    ...
    
    Events:
     FirstSeen LastSeen Count From              SubObjectPath  Type                Reason
     --------- -------- ----- ----              -------------  --------            ------
     1m        33s      8     default-scheduler Warning        FailedScheduling    No nodes are available that match all of the following predicates:: MatchNodeSelector (1).

4.4.5. 추가 리소스

4.5. 과다 할당된 노드에 Pod 배치

과다 할당 상태에서는 컨테이너 컴퓨팅 리소스 요청과 제한의 합이 시스템에서 사용 가능한 리소스를 초과합니다. 용량에 맞게 보장된 성능을 절충할 수 있는 개발 환경에서는 과다 할당이 바람직할 수 있습니다.

관리자는 요청 및 제한을 통해 노드의 리소스 과다 할당을 허용하고 관리할 수 있습니다. 스케줄러는 요청을 사용하여 컨테이너를 예약하고 최소 서비스 보장 기능을 제공합니다. 제한은 노드에서 사용할 수 있는 컴퓨팅 리소스의 양을 제한합니다.

4.5.1. 과다 할당 이해

관리자는 요청 및 제한을 통해 노드의 리소스 과다 할당을 허용하고 관리할 수 있습니다. 스케줄러는 요청을 사용하여 컨테이너를 예약하고 최소 서비스 보장 기능을 제공합니다. 제한은 노드에서 사용할 수 있는 컴퓨팅 리소스의 양을 제한합니다.

OpenShift Container Platform 관리자는 개발자 컨테이너에 설정된 요청과 제한 사이의 비율을 덮어쓰도록 마스터를 구성하여 노드에서 과다 할당 수준을 제어하고 컨테이너 밀도를 관리할 수 있습니다. 제한 및 기본값을 지정하는 프로젝트별 LimitRange 오브젝트와 함께 컨테이너 제한 및 요청을 조정하여 원하는 수준의 과다 할당을 구현합니다.

참고

컨테이너에 제한이 설정되어 있지 않은 경우 이러한 덮어쓰기가 적용되지 않습니다. 덮어쓰기를 적용하려면 개별 프로젝트별로 또는 프로젝트 템플릿에 기본 제한을 사용하여 LimitRange 오브젝트를 생성합니다.

이러한 덮어쓰기 이후에도 프로젝트의 모든 LimitRange 오브젝트에서 컨테이너 제한 및 요청의 유효성을 검사해야 합니다. 예를 들어 개발자가 최소 제한에 가까운 제한을 지정하고 요청에서 최소 제한 미만을 덮어쓰도록 하여 Pod를 금지할 수 있습니다. 이처럼 잘못된 사용자 경험은 향후 작업에서 해결해야 하지만 현재는 이 기능과 LimitRange 오브젝트를 주의해서 구성하십시오.

4.5.2. 노드 과다 할당 이해

오버 커밋된 환경에서는 최상의 시스템 동작을 제공하도록 노드를 올바르게 구성하는 것이 중요합니다.

노드가 시작되면 메모리 관리를 위한 커널 조정 가능한 플래그가 올바르게 설정됩니다. 커널은 실제 메모리가 소진되지 않는 한 메모리 할당에 실패해서는 안됩니다.

이 동작을 확인하기 위해 OpenShift Container Platform은 vm.overcommit_memory 매개변수를 1로 설정하여 기본 운영 체제 설정을 재정의하여 커널이 항상 메모리를 오버 커밋하도록 구성합니다.

OpenShift Container Platform은 vm.panic_on_oom 매개변수를 0으로 설정하여 메모리 부족시 커널이 패닉 상태가되지 않도록 구성합니다. 0으로 설정하면 커널에서 OOM (메모리 부족) 상태일 때 oom_killer를 호출하여 우선 순위에 따라 프로세스를 종료합니다.

노드에서 다음 명령을 실행하여 현재 설정을 볼 수 있습니다.

$ sysctl -a |grep commit

출력 예

#...
vm.overcommit_memory = 0
#...

$ sysctl -a |grep panic

출력 예

#...
vm.panic_on_oom = 0
#...

참고

위의 플래그는 이미 노드에 설정되어 있어야하며 추가 조치가 필요하지 않습니다.

각 노드에 대해 다음 구성을 수행할 수도 있습니다.

  • CPU CFS 할당량을 사용하여 CPU 제한 비활성화 또는 실행
  • 시스템 프로세스의 리소스 예약
  • Quality of Service (QoS) 계층에서의 메모리 예약

4.6. 노드 테인트를 사용하여 Pod 배치 제어

테인트 및 허용 오차를 사용하면 노드에서 예약해야 하는 (또는 예약해서는 안 되는) Pod를 제어할 수 있습니다.

4.6.1. 테인트(Taints) 및 톨러레이션(Tolerations)의 이해

테인트를 사용하면 Pod에 일치하는 허용 오차가 없는 경우 노드에서 Pod 예약을 거부할 수 있습니다.

Node 사양(NodeSpec)을 통해 노드에 테인트를 적용하고 Pod 사양(PodSpec)을 통해 Pod에 허용 오차를 적용합니다. 노드에 테인트를 적용할 때 Pod에서 테인트를 허용할 수 없는 경우 스케줄러에서 해당 노드에 Pod를 배치할 수 없습니다.

노드 사양의 테인트 예

apiVersion: v1
kind: Node
metadata:
  name: my-node
#...
spec:
  taints:
  - effect: NoExecute
    key: key1
    value: value1
#...

Pod 사양의 허용 오차 예

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
#...

테인트 및 톨러레이션은 key, value 및 effect로 구성되어 있습니다.

표 4.1. 테인트 및 톨러레이션 구성 요소
매개변수설명

key

key는 최대 253 자의 문자열입니다. 키는 문자 또는 숫자로 시작해야 하며 문자, 숫자, 하이픈, 점, 밑줄을 포함할 수 있습니다.

value

value는 최대 63 자의 문자열입니다. 값은 문자 또는 숫자로 시작해야 하며 문자, 숫자, 하이픈, 점, 밑줄을 포함할 수 있습니다.

effect

다음 명령 중 하나를 실행합니다.

NoSchedule [1]

  • 테인트에 일치하지 않는 새 pod는 해당 노드에 예약되지 않습니다.
  • 노드의 기존 pod는 그대로 유지됩니다.

PreferNoSchedule

  • 테인트와 일치하지 않는 새 pod는 해당 노드에 예약할 수 있지만 스케줄러는 그렇게하지 않습니다.
  • 노드의 기존 pod는 그대로 유지됩니다.

NoExecute

  • 테인트에 일치하지 않는 새 pod는 해당 노드에 예약할 수 없습니다.
  • 일치하는 톨러레이션이 없는 노드의 기존 pod는 제거됩니다.

operator

Equal

key/value/effect 매개변수가 일치해야합니다. 이는 기본값입니다.

Exists

key/effect 매개변수가 일치해야합니다. 일치하는 빈 value 매개변수를 남겨 두어야합니다.

  1. 컨트롤 플레인 노드에 NoSchedule 테인트를 추가하는 경우 노드에 기본적으로 추가되는 node-role.kubernetes.io/master=:NoSchedule 테인트가 있어야 합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
        machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
      name: my-node
    #...
    spec:
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    #...

톨러레이션은 테인트와 일치합니다.

  • operator 매개변수가 Equal로 설정된 경우:

    • key 매개변수는 동일합니다.
    • value 매개변수는 동일합니다.
    • effect 매개변수는 동일합니다.
  • operator 매개변수가 Exists로 설정된 경우:

    • key 매개변수는 동일합니다.
    • effect 매개변수는 동일합니다.

다음 테인트는 OpenShift Container Platform에 빌드됩니다.

  • node.kubernetes.io/not-ready: 노드가 준비 상태에 있지 않습니다. 이는 노드 조건 Ready=False에 해당합니다.
  • node.kubernetes.io/unreachable: 노드가 노드 컨트롤러에서 연결할 수 없습니다. 이는 노드 조건 Ready=Unknown에 해당합니다.
  • node.kubernetes.io/memory-pressure: 노드에 메모리 부족 문제가 있습니다. 이는 노드 조건 MemoryPressure=True에 해당합니다.
  • node.kubernetes.io/disk-pressure: 노드에 디스크 부족 문제가 있습니다. 이는 노드 조건 DiskPressure=True에 해당합니다.
  • node.kubernetes.io/network-unavailable: 노드 네트워크를 사용할 수 없습니다.
  • node.kubernetes.io/unschedulable: 노드를 예약할 수 없습니다.
  • node.cloudprovider.kubernetes.io/uninitialized: 노드 컨트롤러가 외부 클라우드 공급자로 시작되면 이 테인트 노드에 사용 불가능으로 표시됩니다. cloud-controller-manager의 컨트롤러가 이 노드를 초기화하면 kubelet이 이 테인트를 제거합니다.
  • node.kubernetes.io/pid-pressure: 노드에 pid 압력이 있습니다. 이는 노드 조건 PIDPressure=True 에 해당합니다.

    중요

    OpenShift Container Platform은 기본 pid.available evictionHard 를 설정하지 않습니다.

4.6.1.1. tolerationSeconds를 사용하여 pod 제거를 지연하는 방법

Pod 사양 또는 MachineSet 오브젝트에 tolerationSeconds 매개변수를 지정하면 Pod를 제거하기 전에 노드에 바인딩되는 시간을 지정할 수 있습니다. NoExecute 효과가 있는 테인트가 tolerationSeconds 매개변수가 있는 테인트를 허용하는 Pod인 노드에 추가되면 해당 기간이 만료될 때까지 Pod가 제거되지 않습니다.

출력 예

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
#...

여기에서 이 Pod가 실행 중이지만 일치하는 허용 오차가 없으면 Pod는 3,600초 동안 노드에 바인딩된 후 제거됩니다. 이 시간 이전에 테인트가 제거되면 pod가 제거되지 않습니다.

4.6.1.2. 여러 테인트를 사용하는 방법

동일한 노드에 여러 테인트를 배치하고 동일한 pod에 여러 톨러레이션을 배치할 수 있습니다. OpenShift Container Platform은 다음과 같이 여러 테인트 및 톨러레이션을 처리합니다.

  1. Pod에 일치하는 톨러레이션이 있는 테인트를 처리합니다.
  2. 나머지 일치하지 테인트는 pod에서 다음 effect를 갖습니다.

    • effect가 NoSchedule인 일치하지 않는 테인트가 하나 이상있는 경우 OpenShift Container Platform은 해당 노드에 pod를 예약할 수 없습니다.
    • effect가 NoSchedule인 일치하지 않는 테인트가 없지만 effect가 PreferNoSchedule인 일치하지 않는 테인트가 하나 이상있는 경우, OpenShift 컨테이너 플랫폼은 노드에 pod를 예약 시도하지 않습니다.
    • 효과가 NoExecute인 일치하지 않는 테인트가 하나 이상 있는 경우 OpenShift Container Platform은 Pod가 노드에서 이미 실행되고 있으면 노드에서 Pod를 제거합니다. Pod가 노드에서 아직 실행되고 있지 않으면 Pod가 노드에 예약되지 않습니다.

      • 테인트를 허용하지 Pod는 즉시 제거됩니다.
      • Pod 사양에 tolerationSeconds를 지정하지 않은 테인트를 허용하는 Pod는 영구적으로 바인딩된 상태를 유지합니다.
      • tolerationSeconds가 지정된 테인트를 허용하는 Pod는 지정된 시간 동안 바인딩된 상태로 유지됩니다.

예를 들면 다음과 같습니다.

  • 노드에 다음 테인트를 추가합니다.

    $ oc adm taint nodes node1 key1=value1:NoSchedule
    $ oc adm taint nodes node1 key1=value1:NoExecute
    $ oc adm taint nodes node1 key2=value2:NoSchedule
  • Pod에는 다음과 같은 톨러레이션이 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule"
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoExecute"
    #...

이 경우 세 번째 테인트와 일치하는 톨러레이션이 없기 때문에 pod를 노드에 예약할 수 없습니다. 세 번째 테인트는 pod에서 허용되지 않는 세 번째 테인트 중 하나이기 때문에 테인트가 추가될 때 노드에서 이미 실행되고 있는 경우 pod가 계속 실행됩니다.

4.6.1.3. Pod 예약 및 노드 상태 (taint node by condition)

상태별 노드 테인트 기능은 기본적으로 활성화되어 있으며 메모리 부족 및 디스크 부족과 같은 상태를 보고하는 노드를 자동으로 테인트합니다. 노드가 상태를 보고하면 상태가 해제될 때까지 테인트가 추가됩니다. 테인트에는 NoSchedule effect가 있습니다. 즉, pod에 일치하는 톨러레이션이 없으면 노드에서 pod를 예약할 수 없습니다.

스케줄러는 pod를 예약하기 전에 노드에서 이러한 테인트를 확인합니다. 테인트가 있는 경우 pod는 다른 노드에 예약됩니다. 스케줄러는 실제 노드 상태가 아닌 테인트를 확인하기 때문에 적절한 pod 톨러레이션을 추가하여 이러한 노드 상태 중 일부를 무시하도록 스케줄러를 구성합니다.

이전 버전과의 호환성을 보장하기 위해 데몬 세트 컨트롤러는 모든 데몬에 다음과 같은 허용 오차를 자동으로 추가합니다.

  • node.kubernetes.io/memory-pressure
  • node.kubernetes.io/disk-pressure
  • node.kubernetes.io/unschedulable (1.10 이상)
  • node.kubernetes.io/network-unavailable (호스트 네트워크 만)

데몬 세트에 임의의 허용 오차를 추가할 수 있습니다.

참고

컨트롤 플레인은 QoS 클래스가 있는 Pod에 node.kubernetes.io/memory-pressure 허용 오차도 추가합니다. 이는 Kubernetes가 Guaranteed 또는 Burstable QoS 클래스에서 Pod를 관리하기 때문입니다. 새 BestEffort Pod는 영향을 받는 노드에 예약되지 않습니다.

4.6.1.4. 상태 별 pod 제거 (taint-based evictions)

기본적으로 활성화된 Taint-Based Evictions 기능은 not-readyunreachable과 같은 특정 상태에 있는 노드에서 Pod를 제거합니다. 노드에 이러한 상태 중 하나가 발생하면 OpenShift Container Platform은 자동으로 노드에 테인트를 추가하고 pod를 제거하여 다른 도드에서 다시 예약하기 시작합니다.

Taint Based Evictions에는 NoExecute 효과가 있으며, 여기서 테인트를 허용하지 않는 Pod는 즉시 제거되고 테인트를 허용하는 모든 Pod는 tolerationSeconds 매개변수를 사용하지 않는 한 제거되지 않습니다.

tolerationSeconds 매개변수를 사용하면 노드 조건이 설정된 노드에 Pod가 바인딩되는 기간을 지정할 수 있습니다. tolerationSeconds 기간 후에도 이 상태가 계속되면 테인트가 노드에 남아 있고 허용 오차가 일치하는 Pod가 제거됩니다. tolerationSeconds 기간 전에 상태 조건이 지워지면 허용 오차가 일치하는 Pod가 제거되지 않습니다.

값이 없는 tolerationSeconds 매개변수를 사용하는 경우 준비되지 않고 연결할 수 없는 노드 상태로 인해 Pod가 제거되지 않습니다.

참고

OpenShift Container Platform은 속도가 제한된 방식으로 pod를 제거하여 마스터가 노드에서 분할되는 등의 시나리오에서 대규모 pod 제거를 방지합니다.

기본적으로 지정된 영역의 노드 중 5 % 이상이 비정상이면 노드 라이프사이클 컨트롤러에서 해당 영역의 상태를 PartialDisruption 으로 변경하고 Pod 제거 비율이 감소됩니다. 이 상태의 소규모 클러스터(기본적으로 50개 노드 이하)의 경우 이 영역의 노드는 테인트되지 않고 제거가 중지됩니다.

자세한 내용은 Kubernetes 설명서 의 제거에 대한 속도 제한 을 참조하십시오.

Pod 구성에서 허용 오차를 지정하지 않는 경우 OpenShift Container Platform은 자동으로 node.kubernetes.io/not-readynode.kubernetes.io/unreachable의 허용 오차를 tolerationSeconds=300으로 추가합니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - key: node.kubernetes.io/not-ready
    operator: Exists
    effect: NoExecute
    tolerationSeconds: 300 1
  - key: node.kubernetes.io/unreachable
    operator: Exists
    effect: NoExecute
    tolerationSeconds: 300
#...
1
이러한 톨러레이션은 이러한 노드 상태 문제 중 하나가 감지된 후 기본 pod 동작을 5 분 동안 바인딩된 상태로 유지할 수 있도록 합니다.

필요에 따라 이러한 톨러레이션을 구성할 수 있습니다. 예를 들어 애플리케이션에 다수의 로컬 상태가 있는 경우 네트워크 파티션 등에 따라 pod를 노드에 더 오래 바인딩하여 파티션을 복구하고 pod 제거를 방지할 수 있습니다.

데몬 세트에 의해 생성된 Pod는 tolerationSeconds가 없는 다음 테인트의 NoExecute 허용 오차를 사용하여 생성됩니다.

  • node.kubernetes.io/unreachable
  • node.kubernetes.io/not-ready

결과적으로 이러한 노드 상태로 인해 데몬 세트 Pod가 제거되지 않습니다.

4.6.1.5. 모든 테인트 허용

keyvalues 매개변수 없이 operator: "Exists" 허용 오차를 추가하여 모든 테인트를 허용하도록 Pod를 구성할 수 있습니다. 이 허용 오차가 있는 Pod는 테인트가 있는 노드에서 제거되지 않습니다.

모든 테인트를 허용하는 Pod 사양

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
#...
spec:
  tolerations:
  - operator: "Exists"
#...

4.6.2. 테인트 및 톨러레이션 추가

Pod에 허용 오차를 추가하고 노드에 테인트를 추가하면 노드에 예약하거나 예약하지 않아야 하는 Pod를 노드에서 제어할 수 있습니다. 기존 Pod 및 노드의 경우 먼저 Pod에 허용 오차를 추가한 다음 노드에 테인트를 추가하여 허용 오차를 추가하기 전에 노드에서 Pod가 제거되지 않도록 합니다.

프로세스

  1. tolerations 스탠자를 포함하도록 Pod 사양을 편집하여 Pod에 허용 오차를 추가합니다.

    Equal 연산자가 있는 Pod 구성 파일 샘플

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1" 1
        value: "value1"
        operator: "Equal"
        effect: "NoExecute"
        tolerationSeconds: 3600 2
    #...

    1
    테인트 및 허용 오차 구성 요소 테이블에 설명된 허용 오차 매개변수입니다.
    2
    tolerationSeconds 매개변수를 지정하여 pod가 제거되기 전까지 노드에 바인딩되는 시간을 설정합니다.

    예를 들면 다음과 같습니다.

    Exists 연산자가 있는 Pod 구성 파일 샘플

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
       tolerations:
        - key: "key1"
          operator: "Exists" 1
          effect: "NoExecute"
          tolerationSeconds: 3600
    #...

    1
    Exists 연산자는 value를 사용하지 않습니다.

    이 예에서는 key key1, value value1, 테인트 effect NoExecute를 갖는 node1에 테인트를 배치합니다.

  2. 테인트 및 허용 오차 구성 요소 테이블에 설명된 매개변수로 다음 명령을 사용하여 노드에 테인트를 추가합니다.

    $ oc adm taint nodes <node_name> <key>=<value>:<effect>

    예를 들면 다음과 같습니다.

    $ oc adm taint nodes node1 key1=value1:NoExecute

    이 명령은 키가 key1, 값이 value1, 효과가 NoExecutenode1에 테인트를 배치합니다.

    참고

    컨트롤 플레인 노드에 NoSchedule 테인트를 추가하는 경우 노드에 기본적으로 추가되는 node-role.kubernetes.io/master=:NoSchedule 테인트가 있어야 합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0
        machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c
      name: my-node
    #...
    spec:
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    #...

    Pod의 허용 오차가 노드의 테인트와 일치합니다. 허용 오차 중 하나가 있는 Pod를 node1에 예약할 수 있습니다.

4.6.2.1. 머신 세트를 사용하여 테인트 및 허용 오차 추가

머신 세트를 사용하여 노드에 테인트를 추가할 수 있습니다. MachineSet 오브젝트와 연결된 모든 노드는 테인트를 사용하여 업데이트됩니다. 허용 오차는 노드에 직접 추가된 테인트와 동일한 방식으로 머신 세트에 의해 추가된 테인트에 응답합니다.

프로세스

  1. tolerations 스탠자를 포함하도록 Pod 사양을 편집하여 Pod에 허용 오차를 추가합니다.

    Equal 연산자가 있는 Pod 구성 파일의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1" 1
        value: "value1"
        operator: "Equal"
        effect: "NoExecute"
        tolerationSeconds: 3600 2
    #...

    1
    테인트 및 허용 오차 구성 요소 테이블에 설명된 허용 오차 매개변수입니다.
    2
    tolerationSeconds 매개변수는 Pod가 제거될 때까지 노드에 바인딩되는 시간을 지정합니다.

    예를 들면 다음과 같습니다.

    Exists 연산자가 있는 pod 구성 파일의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key1"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 3600
    #...

  2. MachineSet 오브젝트에 테인트를 추가합니다.

    1. 테인트할 노드의 MachineSet YAML을 편집하거나 새 MachineSet 오브젝트를 생성할 수 있습니다.

      $ oc edit machineset <machineset>
    2. spec.template.spec 섹션에 테인트를 추가합니다.

      머신 세트 사양의 테인트 예

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        name: my-machineset
      #...
      spec:
      #...
        template:
      #...
          spec:
            taints:
            - effect: NoExecute
              key: key1
              value: value1
      #...

      이 예제에서는 키가 key1, 값이 value1, 테인트 효과가 NoExecute인 테인트를 노드에 배치합니다.

    3. 머신 세트를 0 으로 축소합니다.

      $ oc scale --replicas=0 machineset <machineset> -n openshift-machine-api
      작은 정보

      또는 다음 YAML을 적용하여 머신 세트를 스케일링할 수 있습니다.

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        name: <machineset>
        namespace: openshift-machine-api
      spec:
        replicas: 0

      머신이 제거될 때까지 기다립니다.

    4. 필요에 따라 머신 세트를 확장합니다.

      $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

      또는 다음을 수행합니다.

      $ oc edit machineset <machineset> -n openshift-machine-api

      머신이 시작될 때까지 기다립니다. 테인트는 MachineSet 오브젝트와 연결된 노드에 추가됩니다.

4.6.2.2. 테인트 및 톨러레이션을 사용하여 사용자를 노드에 바인딩

특정 사용자 집합에서 독점적으로 사용하도록 노드 세트를 전용으로 지정하려면 해당 Pod에 허용 오차를 추가합니다. 그런 다음 해당 노드에 해당 테인트를 추가합니다. 허용 오차가 있는 Pod는 테인트된 노드 또는 클러스터의 기타 노드를 사용할 수 있습니다.

이렇게 테인트된 노드에만 Pod를 예약하려면 동일한 노드 세트에도 라벨을 추가하고 해당 라벨이 있는 노드에만 Pod를 예약할 수 있도록 Pod에 노드 유사성을 추가합니다.

프로세스

사용자가 해당 노드 만 사용할 수 있도록 노드를 구성하려면 다음을 수행합니다.

  1. 해당 노드에 해당 테인트를 추가합니다.

    예를 들면 다음과 같습니다.

    $ oc adm taint nodes node1 dedicated=groupName:NoSchedule
    작은 정보

    다음 YAML을 적용하여 테인트를 추가할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: my-node
    #...
    spec:
      taints:
        - key: dedicated
          value: groupName
          effect: NoSchedule
    #...
  2. 사용자 정의 승인 컨트롤러를 작성하여 Pod에 허용 오차를 추가합니다.
4.6.2.3. 노드 선택기 및 허용 오차를 사용하여 프로젝트 생성

노드 선택기 및 허용 오차를 사용하여 특정 노드에 Pod 배치를 제어하는 프로젝트를 생성할 수 있습니다. 그런 다음 프로젝트에서 생성된 후속 리소스는 허용 오차와 일치하는 테인트가 있는 노드에 예약됩니다.

사전 요구 사항

  • 머신 세트를 사용하거나 노드를 직접 편집하여 노드 선택의 레이블이 하나 이상의 노드에 추가되어 있습니다.
  • 머신 세트를 사용하거나 노드를 직접 편집하여 테인트가 하나 이상의 노드에 추가되어 있습니다.

프로세스

  1. metadata.annotations 섹션에서 노드 선택기 및 허용 오차를 지정하여 Project 리소스 정의를 생성합니다.

    project.yaml 파일 예

    kind: Project
    apiVersion: project.openshift.io/v1
    metadata:
      name: <project_name> 1
      annotations:
        openshift.io/node-selector: '<label>' 2
        scheduler.alpha.kubernetes.io/defaultTolerations: >-
          [{"operator": "Exists", "effect": "NoSchedule", "key":
          "<key_name>"} 3
          ]

    1
    프로젝트 이름입니다.
    2
    기본 노드 선택기 레이블입니다.
    3
    테인트 및 허용 오차 구성 요소 테이블에 설명된 허용 오차 매개변수입니다. 이 예에서는 노드의 기존 pod를 유지할 수 있는 NoSchedule 효과와 값을 사용하지 않는 Exists 연산자를 사용합니다.
  2. oc apply 명령을 사용하여 프로젝트를 생성합니다.

    $ oc apply -f project.yaml

<project_name> 네임스페이스에서 생성된 후속 리소스는 이제 지정된 노드에서 예약해야 합니다.

4.6.2.4. 테인트 및 톨러레이션을 사용하여 특수 하드웨어로 노드 제어

소규모 노드 하위 집합에 특수 하드웨어가 있는 클러스터에서는 테인트 및 허용 오차를 사용하여 특수 하드웨어가 필요하지 않은 Pod를 해당 노드에서 분리하여 특수 하드웨어가 필요한 Pod를 위해 노드를 남겨 둘 수 있습니다. 또한 특정 노드를 사용하기 위해 특수 하드웨어가 필요한 Pod를 요청할 수도 있습니다.

이 작업은 특수 하드웨어가 필요한 Pod에 허용 오차를 추가하고 특수 하드웨어가 있는 노드를 테인트하여 수행할 수 있습니다.

프로세스

특수 하드웨어가 있는 노드를 특정 Pod용으로 예약하려면 다음을 수행합니다.

  1. 특수 하드웨어가 필요한 Pod에 허용 오차를 추가합니다.

    예를 들면 다음과 같습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
        - key: "disktype"
          value: "ssd"
          operator: "Equal"
          effect: "NoSchedule"
          tolerationSeconds: 3600
    #...
  2. 다음 명령 중 하나를 사용하여 특수 하드웨어가 있는 노드에 테인트를 설정합니다.

    $ oc adm taint nodes <node-name> disktype=ssd:NoSchedule

    또는 다음을 수행합니다.

    $ oc adm taint nodes <node-name> disktype=ssd:PreferNoSchedule
    작은 정보

    다음 YAML을 적용하여 테인트를 추가할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: my_node
    #...
    spec:
      taints:
        - key: disktype
          value: ssd
          effect: PreferNoSchedule
    #...

4.6.3. 테인트 및 톨러레이션 제거

필요에 따라 노드에서 테인트를 제거하고 Pod에서 톨러레이션을 제거할 수 있습니다. 허용 오차를 추가하려면 먼저 Pod에 허용 오차를 추가한 다음 노드에서 Pod가 제거되지 않도록 노드에 테인트를 추가해야 합니다.

프로세스

테인트 및 톨러레이션을 제거하려면 다음을 수행합니다.

  1. 노드에서 테인트를 제거하려면 다음을 수행합니다.

    $ oc adm taint nodes <node-name> <key>-

    예를 들면 다음과 같습니다.

    $ oc adm taint nodes ip-10-0-132-248.ec2.internal key1-

    출력 예

    node/ip-10-0-132-248.ec2.internal untainted

  2. Pod에서 허용 오차를 제거하려면 Pod 사양을 편집하여 허용 오차를 제거합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    #...
    spec:
      tolerations:
      - key: "key2"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 3600
    #...

4.7. 노드 선택기를 사용하여 특정 노드에 Pod 배치

노드 선택기는 노드의 사용자 정의 라벨 및 Pod에 지정된 선택기를 사용하여 정의한 키/값 쌍으로 구성된 맵을 지정합니다.

노드에서 Pod를 실행하려면 노드의 라벨과 동일한 키/값 노드 선택기가 Pod에 있어야 합니다.

4.7.1. 노드 선택기 정보

Pod의 노드 선택기와 노드의 라벨을 사용하여 Pod가 예약되는 위치를 제어할 수 있습니다. 노드 선택기를 사용하면 OpenShift Container Platform에서 일치하는 라벨이 포함된 노드에 Pod를 예약합니다.

노드 선택기를 사용하여 특정 노드에 특정 Pod를 배치하고, 클러스터 수준 노드 선택기를 사용하여 클러스터의 특정 노드에 새 Pod를 배치하고, 프로젝트 노드 선택기를 사용하여 특정 노드의 프로젝트에 새 Pod를 배치할 수 있습니다.

예를 들어 클러스터 관리자는 애플리케이션 개발자가 생성하는 모든 Pod에 노드 선택기를 포함하여 지리적으로 가장 가까운 노드에만 Pod를 배포할 수 있는 인프라를 생성할 수 있습니다. 이 예제에서 클러스터는 두 지역에 분배된 데이터센터 5개로 구성됩니다. 미국에서는 노드의 라벨을 us-east, us-central 또는 us-west로 지정합니다. 아시아 태평양 지역(APAC)에서는 노드의 라벨을 apac-east 또는 apac-west로 지정합니다. 개발자는 생성한 Pod에 노드 선택기를 추가하여 해당 노드에 Pod가 예약되도록 할 수 있습니다.

Pod 오브젝트에 노드 선택기가 포함되어 있지만 일치하는 라벨이 있는 노드가 없는 경우 Pod를 예약하지 않습니다.

중요

동일한 Pod 구성의 노드 선택기 및 노드 유사성을 사용 중인 경우 다음 규칙에서 노드에 대한 Pod 배치를 제어합니다.

  • nodeSelectornodeAffinity를 둘 다 구성하는 경우 Pod를 후보 노드에 예약하기 위해서는 두 상태를 모두 충족해야 합니다.
  • nodeAffinity 유형과 연결된 nodeSelectorTerms를 여러 개 지정하는 경우 nodeSelectorTerms 중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다.
  • nodeSelectorTerms와 연결된 matchExpressions를 여러 개 지정하는 경우 모든 matchExpressions를 충족할 때만 Pod를 노드에 예약할 수 있습니다.
특정 Pod 및 노드의 노드 선택기

노드 선택기 및 라벨을 사용하여 특정 Pod가 예약된 노드를 제어할 수 있습니다.

노드 선택기와 라벨을 사용하려면 먼저 Pod의 일정이 조정되지 않도록 노드에 라벨을 지정한 다음 노드 선택기를 Pod에 추가합니다.

참고

예약된 기존 Pod에 노드 선택기를 직접 추가할 수 없습니다. 배포 구성과 같이 Pod를 제어하는 오브젝트에 라벨을 지정해야 합니다.

예를 들어 다음 Node 오브젝트에는 region: east 라벨이 있습니다.

라벨이 있는 Node 오브젝트 샘플

kind: Node
apiVersion: v1
metadata:
  name: ip-10-0-131-14.ec2.internal
  selfLink: /api/v1/nodes/ip-10-0-131-14.ec2.internal
  uid: 7bc2580a-8b8e-11e9-8e01-021ab4174c74
  resourceVersion: '478704'
  creationTimestamp: '2019-06-10T14:46:08Z'
  labels:
    kubernetes.io/os: linux
    failure-domain.beta.kubernetes.io/zone: us-east-1a
    node.openshift.io/os_version: '4.5'
    node-role.kubernetes.io/worker: ''
    failure-domain.beta.kubernetes.io/region: us-east-1
    node.openshift.io/os_id: rhcos
    beta.kubernetes.io/instance-type: m4.large
    kubernetes.io/hostname: ip-10-0-131-14
    beta.kubernetes.io/arch: amd64
    region: east 1
    type: user-node
#...

1
Pod 노드 선택기와 일치해야 하는 라벨입니다.

Pod에는 type: user-node,region: east 노드 선택기가 있습니다.

노드 선택기가 있는 Pod 오브젝트 샘플

apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector: 1
    region: east
    type: user-node
#...

1
노드 라벨과 일치해야 하는 노드 선택기입니다. 노드에는 각 노드 선택기에 대한 레이블이 있어야 합니다.

예제 Pod 사양을 사용하여 Pod를 생성하면 예제 노드에 예약할 수 있습니다.

기본 클러스터 수준 노드 선택기

기본 클러스터 수준 노드 선택기를 사용하면 해당 클러스터에서 Pod를 생성할 때 OpenShift Container Platform에서 기본 노드 선택기를 Pod에 추가하고 일치하는 라벨을 사용하여 노드에서 Pod를 예약합니다.

예를 들어 다음 Scheduler 오브젝트에는 기본 클러스터 수준 region=easttype=user-node 노드 선택기가 있습니다.

스케줄러 Operator 사용자 정의 리소스의 예

apiVersion: config.openshift.io/v1
kind: Scheduler
metadata:
  name: cluster
#...
spec:
  defaultNodeSelector: type=user-node,region=east
#...

해당 클러스터의 노드에는 type=user-node,region=east 라벨이 있습니다.

Node 오브젝트의 예

apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...

노드 선택기가 있는 Pod 오브젝트의 예

apiVersion: v1
kind: Pod
metadata:
  name: s1
#...
spec:
  nodeSelector:
    region: east
#...

예제 클러스터에서 예제 Pod 사양을 사용하여 Pod를 생성하면 Pod가 클러스터 수준 노드 선택기와 함께 생성되어 라벨이 지정된 노드에 예약됩니다.

Pod가 라벨이 지정된 노드에 있는 Pod 목록의 예

NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

참고

Pod를 생성하는 프로젝트에 프로젝트 노드 선택기가 있는 경우 해당 선택기가 클러스터 수준 노드 선택기보다 우선합니다. Pod에 프로젝트 노드 선택기가 없으면 Pod가 생성되거나 예약되지 않습니다.

프로젝트 노드 선택기

프로젝트 노드 선택기를 사용하면 이 프로젝트에서 Pod를 생성할 때 OpenShift Container Platform에서 Pod에 노드 선택기를 추가하고 라벨이 일치하는 노드에 Pod를 예약합니다. 클러스터 수준 기본 노드 선택기가 있는 경우 프로젝트 노드 선택기가 우선합니다.

예를 들어 다음 프로젝트에는 region=east 노드 선택기가 있습니다.

Namespace 오브젝트의 예

apiVersion: v1
kind: Namespace
metadata:
  name: east-region
  annotations:
    openshift.io/node-selector: "region=east"
#...

다음 노드에는 type=user-node,region=east 라벨이 있습니다.

Node 오브젝트의 예

apiVersion: v1
kind: Node
metadata:
  name: ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4
#...
  labels:
    region: east
    type: user-node
#...

이 예제 프로젝트에서 예제 Pod 사양을 사용하여 Pod를 생성하면 Pod가 프로젝트 노드 선택기와 함께 생성되어 라벨이 지정된 노드에 예약됩니다.

Pod 오브젝트의 예

apiVersion: v1
kind: Pod
metadata:
  namespace: east-region
#...
spec:
  nodeSelector:
    region: east
    type: user-node
#...

Pod가 라벨이 지정된 노드에 있는 Pod 목록의 예

NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
pod-s1   1/1     Running   0          20s   10.131.2.6   ci-ln-qg1il3k-f76d1-hlmhl-worker-b-df2s4   <none>           <none>

Pod에 다른 노드 선택기가 포함된 경우 프로젝트의 Pod가 생성되거나 예약되지 않습니다. 예를 들어 다음 Pod를 예제 프로젝트에 배포하면 Pod가 생성되지 않습니다.

노드 선택기가 유효하지 않은 Pod 오브젝트의 예

apiVersion: v1
kind: Pod
metadata:
  name: west-region
#...
spec:
  nodeSelector:
    region: west
#...

4.7.2. 노드 선택기를 사용하여 Pod 배치 제어

Pod의 노드 선택기와 노드의 라벨을 사용하여 Pod가 예약되는 위치를 제어할 수 있습니다. 노드 선택기를 사용하면 OpenShift Container Platform에서 일치하는 라벨이 포함된 노드에 Pod를 예약합니다.

노드, 머신 세트 또는 머신 구성에 라벨을 추가합니다. 머신 세트에 라벨을 추가하면 노드 또는 머신이 중단되는 경우 새 노드에 라벨이 지정됩니다. 노드 또는 머신이 중단된 경우 노드 또는 머신 구성에 추가된 라벨이 유지되지 않습니다.

기존 Pod에 노드 선택기를 추가하려면 ReplicaSet 오브젝트, DaemonSet 오브젝트, StatefulSet 오브젝트, Deployment 오브젝트 또는 DeploymentConfig 오브젝트와 같이 해당 Pod의 제어 오브젝트에 노드 선택기를 추가합니다. 이 제어 오브젝트 아래의 기존 Pod는 라벨이 일치하는 노드에서 재생성됩니다. 새 Pod를 생성하는 경우 Pod 사양에 노드 선택기를 직접 추가할 수 있습니다. Pod에 제어 오브젝트가 없는 경우 Pod를 삭제하고 Pod 사양을 편집하고 Pod를 다시 생성해야 합니다.

참고

예약된 기존 Pod에 노드 선택기를 직접 추가할 수 없습니다.

사전 요구 사항

기존 Pod에 노드 선택기를 추가하려면 해당 Pod의 제어 오브젝트를 결정하십시오. 예를 들어 router-default-66d5cf9464-m2g75 Pod는 router-default-66d5cf9464 복제본 세트에서 제어합니다.

$ oc describe pod router-default-66d5cf9464-7pwkc

출력 예

kind: Pod
apiVersion: v1
metadata:
#...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...

웹 콘솔에서 Pod YAML의 ownerReferences 아래에 제어 오브젝트가 나열됩니다.

apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...

프로세스

  1. 머신 세트를 사용하거나 노드를 직접 편집하여 노드에 라벨을 추가합니다.

    • 노드를 생성할 때 머신 세트에서 관리하는 노드에 라벨을 추가하려면 MachineSet 오브젝트를 사용합니다.

      1. 다음 명령을 실행하여 MachineSet 오브젝트에 라벨을 추가합니다.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        예를 들면 다음과 같습니다.

        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        작은 정보

        다음 YAML을 적용하여 머신 세트에 라벨을 추가할 수 있습니다.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: xf2bd-infra-us-east-2a
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
        #...
      2. oc edit 명령을 사용하여 라벨이 MachineSet 오브젝트에 추가되었는지 확인합니다.

        예를 들면 다음과 같습니다.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet 오브젝트의 예

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        
        # ...
        
        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...

    • 라벨을 노드에 직접 추가합니다.

      1. 노드의 Node 오브젝트를 편집합니다.

        $ oc label nodes <name> <key>=<value>

        예를 들어 노드에 라벨을 지정하려면 다음을 수행합니다.

        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east
        작은 정보

        다음 YAML을 적용하여 노드에 라벨을 추가할 수도 있습니다.

        kind: Node
        apiVersion: v1
        metadata:
          name: hello-node-6fbccf8d9
          labels:
            type: "user-node"
            region: "east"
        #...
      2. 라벨이 노드에 추가되었는지 확인합니다.

        $ oc get nodes -l type=user-node,region=east

        출력 예

        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.23.0

  2. Pod에 일치하는 노드 선택기를 추가합니다.

    • 기존 및 향후 Pod에 노드 선택기를 추가하려면 Pod의 제어 오브젝트에 노드 선택기를 추가합니다.

      라벨이 있는 ReplicaSet 오브젝트의 예

      kind: ReplicaSet
      apiVersion: apps/v1
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
      # ...
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node 1
      #...

      1
      노드 선택기를 추가합니다.
    • 특정 새 Pod에 노드 선택기를 추가하려면 선택기를 Pod 오브젝트에 직접 추가합니다.

      노드 선택기가 있는 Pod 오브젝트의 예

      apiVersion: v1
      kind: Pod
      metadata:
        name: hello-node-6fbccf8d9
      #...
      spec:
        nodeSelector:
          region: east
          type: user-node
      #...

      참고

      예약된 기존 Pod에 노드 선택기를 직접 추가할 수 없습니다.

4.7.3. 기본 클러스터 수준 노드 선택기 생성

Pod의 기본 클러스터 수준 노드 선택기와 노드의 라벨을 함께 사용하면 클러스터에 생성되는 모든 Pod를 특정 노드로 제한할 수 있습니다.

클러스터 수준 노드 선택기를 사용하여 해당 클러스터에서 Pod를 생성하면 OpenShift Container Platform에서 기본 노드 선택기를 Pod에 추가하고 라벨이 일치하는 노드에 Pod를 예약합니다.

Scheduler Operator CR(사용자 정의 리소스)을 편집하여 클러스터 수준 노드 선택기를 구성합니다. 노드, 머신 세트 또는 머신 구성에 라벨을 추가합니다. 머신 세트에 라벨을 추가하면 노드 또는 머신이 중단되는 경우 새 노드에 라벨이 지정됩니다. 노드 또는 머신이 중단된 경우 노드 또는 머신 구성에 추가된 라벨이 유지되지 않습니다.

참고

Pod에 키/값 쌍을 추가할 수 있습니다. 그러나 기본 키에는 다른 값을 추가할 수 없습니다.

프로세스

기본 클러스터 수준 노드 선택기를 추가하려면 다음을 수행합니다.

  1. Scheduler Operator CR을 편집하여 기본 클러스터 수준 노드 선택기를 추가합니다.

    $ oc edit scheduler cluster

    노드 선택기를 사용하는 Scheduler Operator CR의 예

    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      name: cluster
    ...
    spec:
      defaultNodeSelector: type=user-node,region=east 1
      mastersSchedulable: false

    1
    적절한 <key>:<value> 쌍을 사용하여 노드 선택기를 추가합니다.

    변경 후 openshift-kube-apiserver 프로젝트의 pod가 재배포될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. 기본 클러스터 수준 노드 선택기는 Pod가 재배포된 후 적용됩니다.

  2. 머신 세트를 사용하거나 노드를 직접 편집하여 노드에 라벨을 추가합니다.

    • 노드를 생성할 때 머신 세트에서 관리하는 노드에 라벨을 추가하려면 머신 세트를 사용합니다.

      1. 다음 명령을 실행하여 MachineSet 오브젝트에 라벨을 추가합니다.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api 1
        1
        각 라벨에 <key>/<value> 쌍을 추가합니다.

        예를 들면 다음과 같습니다.

        $ oc patch MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        작은 정보

        다음 YAML을 적용하여 머신 세트에 라벨을 추가할 수 있습니다.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: <machineset>
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
      2. oc edit 명령을 사용하여 라벨이 MachineSet 오브젝트에 추가되었는지 확인합니다.

        예를 들면 다음과 같습니다.

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api

        MachineSet 오브젝트의 예

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
          ...
        spec:
          ...
          template:
            metadata:
          ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
          ...

      3. 0 으로 축소하고 노드를 확장하여 해당 머신 세트와 관련된 노드를 다시 배포합니다.

        예를 들면 다음과 같습니다.

        $ oc scale --replicas=0 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
        $ oc scale --replicas=1 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
      4. 노드가 준비되고 사용 가능한 경우 oc get 명령을 사용하여 라벨이 노드에 추가되었는지 확인합니다.

        $ oc get nodes -l <key>=<value>

        예를 들면 다음과 같습니다.

        $ oc get nodes -l type=user-node

        출력 예

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-c-vmqzp   Ready    worker   61s   v1.23.0

    • 라벨을 노드에 직접 추가합니다.

      1. 노드의 Node 오브젝트를 편집합니다.

        $ oc label nodes <name> <key>=<value>

        예를 들어 노드에 라벨을 지정하려면 다음을 수행합니다.

        $ oc label nodes ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49 type=user-node region=east
        작은 정보

        다음 YAML을 적용하여 노드에 라벨을 추가할 수도 있습니다.

        kind: Node
        apiVersion: v1
        metadata:
          name: <node_name>
          labels:
            type: "user-node"
            region: "east"
      2. oc get 명령을 사용하여 노드에 라벨이 추가되었는지 확인합니다.

        $ oc get nodes -l <key>=<value>,<key>=<value>

        예를 들면 다음과 같습니다.

        $ oc get nodes -l type=user-node,region=east

        출력 예

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49   Ready    worker   17m   v1.23.0

4.7.4. 프로젝트 수준 노드 선택기 생성

프로젝트의 노드 선택기와 함께 노드의 라벨을 사용하여 해당 프로젝트에서 생성되는 모든 Pod를 라벨이 지정된 노드로 제한할 수 있습니다.

이 프로젝트에서 Pod를 생성하면 OpenShift Container Platform에서 프로젝트의 Pod에 노드 선택기를 추가하고 프로젝트의 라벨이 일치하는 노드에 Pod를 예약합니다. 클러스터 수준 기본 노드 선택기가 있는 경우 프로젝트 노드 선택기가 우선합니다.

openshift.io/node-selector 매개변수를 추가하도록 Namespace 오브젝트를 편집하여 프로젝트에 노드 선택기를 추가합니다. 노드, 머신 세트 또는 머신 구성에 라벨을 추가합니다. 머신 세트에 라벨을 추가하면 노드 또는 머신이 중단되는 경우 새 노드에 라벨이 지정됩니다. 노드 또는 머신이 중단된 경우 노드 또는 머신 구성에 추가된 라벨이 유지되지 않습니다.

Pod 오브젝트에 노드 선택기가 포함되어 있지만 일치하는 노드 선택기가 있는 프로젝트가 없는 경우 Pod를 예약하지 않습니다. 해당 사양에서 Pod를 생성하면 다음 메시지와 유사한 오류가 발생합니다.

오류 메시지의 예

Error from server (Forbidden): error when creating "pod.yaml": pods "pod-4" is forbidden: pod node label selector conflicts with its project node label selector

참고

Pod에 키/값 쌍을 추가할 수 있습니다. 그러나 프로젝트 키에는 다른 값을 추가할 수 없습니다.

프로세스

기본 프로젝트 노드 선택기를 추가하려면 다음을 수행합니다.

  1. 네임스페이스를 생성하거나 기존 네임스페이스를 편집하여 openshift.io/node-selector 매개변수를 추가합니다.

    $ oc edit namespace <name>

    출력 예

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        openshift.io/node-selector: "type=user-node,region=east" 1
        openshift.io/description: ""
        openshift.io/display-name: ""
        openshift.io/requester: kube:admin
        openshift.io/sa.scc.mcs: s0:c30,c5
        openshift.io/sa.scc.supplemental-groups: 1000880000/10000
        openshift.io/sa.scc.uid-range: 1000880000/10000
      creationTimestamp: "2021-05-10T12:35:04Z"
      labels:
        kubernetes.io/metadata.name: demo
      name: demo
      resourceVersion: "145537"
      uid: 3f8786e3-1fcb-42e3-a0e3-e2ac54d15001
    spec:
      finalizers:
      - kubernetes

    1
    적절한 <key>:<value> 쌍이 포함된 openshift.io/node-selector를 추가합니다.
  2. 머신 세트를 사용하거나 노드를 직접 편집하여 노드에 라벨을 추가합니다.

    • 노드를 생성할 때 머신 세트에서 관리하는 노드에 라벨을 추가하려면 MachineSet 오브젝트를 사용합니다.

      1. 다음 명령을 실행하여 MachineSet 오브젝트에 라벨을 추가합니다.

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        예를 들면 다음과 같습니다.

        $ oc patch MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        작은 정보

        다음 YAML을 적용하여 머신 세트에 라벨을 추가할 수 있습니다.

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: <machineset>
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
      2. oc edit 명령을 사용하여 라벨이 MachineSet 오브젝트에 추가되었는지 확인합니다.

        예를 들면 다음과 같습니다.

        $ oc edit MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api

        출력 예

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
        ...
        spec:
        ...
          template:
            metadata:
        ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node

      3. 해당 머신 세트와 관련된 노드를 재배포합니다.

        예를 들면 다음과 같습니다.

        $ oc scale --replicas=0 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
        $ oc scale --replicas=1 MachineSet ci-ln-l8nry52-f76d1-hl7m7-worker-c -n openshift-machine-api
      4. 노드가 준비되고 사용 가능한 경우 oc get 명령을 사용하여 라벨이 노드에 추가되었는지 확인합니다.

        $ oc get nodes -l <key>=<value>

        예를 들면 다음과 같습니다.

        $ oc get nodes -l type=user-node,region=east

        출력 예

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-c-vmqzp   Ready    worker   61s   v1.23.0

    • 라벨을 노드에 직접 추가합니다.

      1. 라벨을 추가할 Node 오브젝트를 편집합니다.

        $ oc label <resource> <name> <key>=<value>

        예를 들어 노드에 라벨을 지정하려면 다음을 수행합니다.

        $ oc label nodes ci-ln-l8nry52-f76d1-hl7m7-worker-c-tgq49 type=user-node region=east
        작은 정보

        다음 YAML을 적용하여 노드에 라벨을 추가할 수도 있습니다.

        kind: Node
        apiVersion: v1
        metadata:
          name: <node_name>
          labels:
            type: "user-node"
            region: "east"
      2. oc get 명령을 사용하여 Node 오브젝트에 라벨이 추가되었는지 확인합니다.

        $ oc get nodes -l <key>=<value>

        예를 들면 다음과 같습니다.

        $ oc get nodes -l type=user-node,region=east

        출력 예

        NAME                                       STATUS   ROLES    AGE   VERSION
        ci-ln-l8nry52-f76d1-hl7m7-worker-b-tgq49   Ready    worker   17m   v1.23.0

4.8. Pod 토폴로지 분배 제약 조건을 사용하여 Pod 배치 제어

Pod 토폴로지 분배 제약 조건을 사용하여 노드, 영역, 지역 또는 기타 사용자 정의 토폴로지 도메인에서 Pod의 배치를 제어할 수 있습니다.

4.8.1. Pod 토폴로지 분배 제약 조건 정보

Pod 토폴로지 분배 제약 조건을 사용하면 전체 장애 도메인에서 Pod 배포를 세밀하게 제어하여 고가용성을 실현하고 리소스를 더 효율적으로 활용하는 데 도움이 됩니다.

OpenShift Container Platform 관리자는 노드에 라벨을 지정하여 지역, 영역, 노드 또는 기타 사용자 정의 도메인과 같은 토폴로지 정보를 제공할 수 있습니다. 노드에 이러한 라벨이 설정되면 사용자가 Pod 토폴로지 분배 제약 조건을 정의하여 이러한 토폴로지 도메인 전반에서 Pod 배치를 제어할 수 있습니다.

함께 그룹화할 Pod, Pod를 분배할 토폴로지 도메인, 허용 가능한 불일치를 지정합니다. 제약 조건으로 인해 분배 시 동일한 네임스페이스 내의 Pod만 일치하고 함께 그룹화됩니다.

4.8.2. Pod 토폴로지 분배 제약 조건 구성

다음 단계에서는 영역에 따라 지정된 라벨과 일치하는 Pod를 배포하기 위해 Pod 토폴로지 분배 제약 조건을 구성하는 방법을 보여줍니다.

여러 Pod 토폴로지 분배 제약 조건을 지정할 수 있지만 서로 충돌하지 않도록 해야 합니다. Pod를 배치하려면 모든 Pod 토폴로지 분배 제약 조건을 충족해야 합니다.

사전 요구 사항

  • 클러스터 관리자가 노드에 필수 라벨을 추가했습니다.

프로세스

  1. Pod 사양을 생성하고 Pod 토폴로지 분배 제약 조건을 지정합니다.

    pod-spec.yaml 파일의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      labels:
        region: us-east
    spec:
      topologySpreadConstraints:
      - maxSkew: 1 1
        topologyKey: topology.kubernetes.io/zone 2
        whenUnsatisfiable: DoNotSchedule 3
        labelSelector: 4
          matchLabels:
            region: us-east 5
      containers:
      - image: "docker.io/ocpqe/hello-pod"
        name: hello-pod

    1
    두 토폴로지 도메인 간 최대 Pod 수 차이입니다. 기본값은 1이고 값 0은 지정할 수 없습니다.
    2
    노드 라벨의 키입니다. 이 키 및 동일한 값이 있는 노드는 동일한 토폴로지에 있는 것으로 간주됩니다.
    3
    분배 제약 조건을 충족하지 않는 경우 Pod를 처리하는 방법입니다. 기본값은 스케줄러에 Pod를 예약하지 않도록 지시하는 DoNotSchedule입니다. Pod를 계속 예약하기 위해 ScheduleAnyway로 설정하지만 스케줄러는 클러스터의 불균형이 더 심해지지 않도록 불일치에 따라 우선순위를 부여합니다.
    4
    이 라벨 선택기와 일치하는 Pod는 제약 조건을 충족하기 위해 분배될 때 계산되고 그룹으로 인식됩니다. 라벨 선택기를 지정해야 합니다. 그러지 않으면 일치하는 Pod가 없습니다.
    5
    Pod 사양도 나중에 올바르게 계산되도록 하려면 해당 라벨을 이 라벨 선택기와 일치하도록 설정해야 합니다.
  2. Pod를 생성합니다.

    $ oc create -f pod-spec.yaml

4.8.3. Pod 토폴로지 분배 제약 조건의 예

다음 예제에서는 Pod 토폴로지 분배 제약 조건 구성을 보여줍니다.

4.8.3.1. 단일 Pod 토폴로지 분배 제약 조건의 예

이 예제 Pod 사양에서는 하나의 Pod 토폴로지 분배 제약 조건을 정의합니다. region 레이블이 지정된 Pod와 일치합니다. us-east 는 영역에 배포되고, 1 의 스큐를 지정하고, 이러한 요구 사항을 충족하지 않는 경우 Pod를 예약하지 않습니다.

kind: Pod
apiVersion: v1
metadata:
  name: my-pod
  labels:
    region: us-east
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod
4.8.3.2. 다중 Pod 토폴로지 분배 제약 조건의 예

이 예제 Pod 사양에서는 두 개의 Pod 토폴로지 분배 제약 조건을 정의합니다. 둘 다 region: us-east 레이블이 지정된 Pod와 일치하고, 불일치를 1 로 지정하고, 이러한 요구 사항을 충족하지 않는 경우 Pod를 예약하지 않습니다.

첫 번째 제약 조건에서는 사용자 정의 라벨 node를 기반으로 Pod를 배포하고, 두 번째는 제약 조건에서는 사용자 정의 라벨 rack을 기반으로 Pod를 배포합니다. Pod를 예약하려면 두 제약 조건을 모두 충족해야 합니다.

kind: Pod
apiVersion: v1
metadata:
  name: my-pod-2
  labels:
    region: us-east
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: node
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  - maxSkew: 1
    topologyKey: rack
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod

4.8.4. 추가 리소스

4.9. 사용자 정의 스케줄러 실행

기본 스케줄러와 함께 여러 사용자 정의 스케줄러를 실행하고 각 Pod에 사용할 스케줄러를 구성할 수 있습니다.

중요

OpenShift Container Platform에서 사용자 정의 스케줄러를 사용하는 것은 지원되지만 Red Hat은 사용자 정의 스케줄러의 기능을 직접 지원하지 않습니다.

기본 스케줄러 구성 방법에 대한 자세한 내용은 스케줄러를 사용하여 Pod 배치 제어를 참조하십시오.

특정 스케줄러를 사용하여 지정된 Pod를 예약하려면 해당 Pod 사양에 스케줄러 이름을 지정합니다.

4.9.1. 사용자 정의 스케줄러 배포

클러스터에 사용자 정의 스케줄러를 포함하려면 배포에 사용자 정의 스케줄러 이미지를 포함합니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • 스케줄러 바이너리가 있습니다.

    참고

    스케줄러 바이너리 생성 방법에 대한 정보는 이 문서의 범위를 벗어납니다. 예를 들어 Kubernetes 설명서에서 다중 스케줄러 구성을 참조하십시오. Red Hat에서는 사용자 정의 스케줄러의 실제 기능을 지원하지 않습니다.

  • 스케줄러 바이너리가 포함된 이미지를 생성하여 레지스트리로 푸시했습니다.

프로세스

  1. 스케줄러 구성 파일을 보유한 구성 맵이 포함된 파일을 생성합니다.

    scheduler-config-map.yaml의 예

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: scheduler-config
      namespace: kube-system 1
    data:
      scheduler-config.yaml: | 2
        apiVersion: kubescheduler.config.k8s.io/v1beta2
        kind: KubeSchedulerConfiguration
        profiles:
          - schedulerName: custom-scheduler 3
        leaderElection:
          leaderElect: false

    1
    이 절차에서는 kube-system 네임스페이스를 사용하지만 선택한 네임스페이스를 사용할 수 있습니다.
    2
    이 절차의 뒷부분에서 Deployment 리소스를 정의할 때 --config 인수를 사용하여 이 파일을 스케줄러 명령에 전달합니다.
    3
    사용자 정의 스케줄러의 스케줄러 프로필을 정의합니다. 이 스케줄러 이름은 Pod 구성에서 schedulerName 을 정의할 때 사용됩니다.
  2. config map을 생성합니다.

    $ oc create -f scheduler-config-map.yaml
  3. 사용자 정의 스케줄러에 대한 배포 리소스가 포함된 파일을 생성합니다.

    custom-scheduler.yaml 파일의 예

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: custom-scheduler
      namespace: kube-system 1
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-kube-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 2
    roleRef:
      kind: ClusterRole
      name: system:kube-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-volume-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 3
    roleRef:
      kind: ClusterRole
      name: system:volume-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        component: scheduler
        tier: control-plane
      name: custom-scheduler
      namespace: kube-system 4
    spec:
      selector:
        matchLabels:
          component: scheduler
          tier: control-plane
      replicas: 1
      template:
        metadata:
          labels:
            component: scheduler
            tier: control-plane
            version: second
        spec:
          serviceAccountName: custom-scheduler
          containers:
          - command:
            - /usr/local/bin/kube-scheduler
            - --config=/etc/config/scheduler-config.yaml 5
            image: "<namespace>/<image_name>:<tag>" 6
            livenessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
              initialDelaySeconds: 15
            name: kube-second-scheduler
            readinessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
            resources:
              requests:
                cpu: '0.1'
            securityContext:
              privileged: false
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          hostNetwork: false
          hostPID: false
          volumes:
            - name: config-volume
              configMap:
                name: scheduler-config

    1 2 3 4
    이 절차에서는 kube-system 네임스페이스를 사용하지만 선택한 네임스페이스를 사용할 수 있습니다.
    5
    사용자 정의 스케줄러에 대한 명령에는 다른 인수가 필요할 수 있습니다.
    6
    사용자 정의 스케줄러용으로 생성한 컨테이너 이미지를 지정합니다.
  4. 클러스터에 배포 리소스를 생성합니다.

    $ oc create -f custom-scheduler.yaml

검증

  • 스케줄러 Pod가 실행 중인지 확인합니다.

    $ oc get pods -n kube-system

    사용자 정의 스케줄러 Pod는 실행 중 으로 나열됩니다.

    NAME                                                       READY   STATUS    RESTARTS   AGE
    custom-scheduler-6cd7c4b8bc-854zb                          1/1     Running   0          2m

4.9.2. 사용자 정의 스케줄러를 사용하여 Pod 배포

사용자 정의 스케줄러가 클러스터에 배포된 후 기본 스케줄러 대신 해당 스케줄러를 사용하도록 Pod를 구성할 수 있습니다.

참고

각 스케줄러에는 클러스터에서 리소스를 별도로 볼 수 있습니다. 따라서 각 스케줄러는 자체 노드 집합에서 작동해야 합니다.

두 개 이상의 스케줄러가 동일한 노드에서 작동하는 경우 서로 개입하여 에 사용 가능한 리소스와 동일한 노드에 더 많은 Pod를 예약할 수 있습니다. 이 경우 리소스가 부족하여 Pod가 거부될 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • 사용자 정의 스케줄러가 클러스터에 배포되었습니다.

프로세스

  1. 클러스터에서 역할 기반 액세스 제어(RBAC)를 사용하는 경우 사용자 정의 스케줄러 이름을 system:kube-scheduler 클러스터 역할에 추가합니다.

    1. system:kube-scheduler 클러스터 역할을 편집합니다.

      $ oc edit clusterrole system:kube-scheduler
    2. 사용자 정의 스케줄러의 이름을 리스끝점 리소스에 대한 resourceNames 목록에 추가합니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        annotations:
          rbac.authorization.kubernetes.io/autoupdate: "true"
        creationTimestamp: "2021-07-07T10:19:14Z"
        labels:
          kubernetes.io/bootstrapping: rbac-defaults
        name: system:kube-scheduler
        resourceVersion: "125"
        uid: 53896c70-b332-420a-b2a4-f72c822313f2
      rules:
      ...
      - apiGroups:
        - coordination.k8s.io
        resources:
        - leases
        verbs:
        - create
      - apiGroups:
        - coordination.k8s.io
        resourceNames:
        - kube-scheduler
        - custom-scheduler 1
        resources:
        - leases
        verbs:
        - get
        - update
      - apiGroups:
        - ""
        resources:
        - endpoints
        verbs:
        - create
      - apiGroups:
        - ""
        resourceNames:
        - kube-scheduler
        - custom-scheduler 2
        resources:
        - endpoints
        verbs:
        - get
        - update
      ...
      1 2
      이 예에서는 custom-scheduler 를 사용자 정의 스케줄러 이름으로 사용합니다.
  2. Pod 구성을 생성하고 schedulerName 매개변수에서 사용자 정의 스케줄러의 이름을 지정합니다.

    custom-scheduler-example.yaml 파일의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: custom-scheduler-example
      labels:
        name: custom-scheduler-example
    spec:
      schedulerName: custom-scheduler 1
      containers:
      - name: pod-with-second-annotation-container
        image: docker.io/ocpqe/hello-pod

    1
    사용할 사용자 정의 스케줄러의 이름(이 예에서는 custom-scheduler )입니다. 스케줄러 이름을 제공하지 않으면 Pod가 기본 스케줄러를 사용하여 자동으로 예약됩니다.
  3. Pod를 생성합니다.

    $ oc create -f custom-scheduler-example.yaml

검증

  1. 다음 명령을 입력하여 Pod가 생성되었는지 확인합니다.

    $ oc get pod custom-scheduler-example

    custom-scheduler-example Pod는 출력에 나열됩니다.

    NAME                       READY     STATUS    RESTARTS   AGE
    custom-scheduler-example   1/1       Running   0          4m
  2. 다음 명령을 입력하여 사용자 정의 스케줄러가 Pod를 예약했는지 확인합니다.

    $ oc describe pod custom-scheduler-example

    스케줄러, custom-scheduler 는 다음 잘린 출력에 표시된 대로 나열됩니다.

    Events:
      Type    Reason          Age        From                                               Message
      ----    ------          ----       ----                                               -------
      Normal  Scheduled       <unknown>  custom-scheduler                                   Successfully assigned default/custom-scheduler-example to <node_name>

4.9.3. 추가 리소스

4.10. Descheduler를 사용하여 Pod 제거

스케줄러는 새 Pod를 호스팅하는 데 가장 적합한 노드를 결정하는 데 사용하고 Descheduler는 더 적합한 노드에 다시 예약할 수 있도록 실행 중인 Pod를 제거하는 데 사용할 수 있습니다.

4.10.1. Descheduler 정보

Descheduler를 사용하면 특정 전략에 따라 Pod를 제거하여 Pod를 더 적절한 노드에 다시 예약할 수 있습니다.

다음과 같은 상황에서 실행 중인 Pod의 일정을 조정하면 이점을 누릴 수 있습니다.

  • 노드가 충분히 사용되지 않았거나 너무 많이 사용되었습니다.
  • 오염 또는 라벨과 같은 Pod 및 노드 선호도 요구 사항이 변경되었으며, 원래 일정 결정이 더 이상 특정 노드에 적합하지 않습니다.
  • 노드 장애로 Pod를 이동해야 합니다.
  • 새 노드가 클러스터에 추가되었습니다.
  • Pod가 너무 많이 재시작되었습니다.
중요

Descheduler는 제거된 Pod의 교체를 예약하지 않습니다. 제거된 Pod에 대한 이러한 작업은 스케줄러에서 자동으로 수행합니다.

Descheduler가 노드에서 Pod를 제거하도록 결정하는 경우 다음과 같은 일반 메커니즘을 사용합니다.

  • openshift-*kube-system 네임스페이스의 Pod는 제거되지 않습니다.
  • priorityClassNamesystem-cluster-critical 또는 system-node-critical로 설정된 중요 Pod는 제거되지 않습니다.
  • 복제 컨트롤러, 복제본 세트, 배포 또는 작업에 포함되지 않는 정적, 미러링 또는 독립형 Pod는 다시 생성되지 않기 때문에 제거되지 않습니다.
  • 데몬 세트와 연결된 Pod는 제거되지 않습니다.
  • 로컬 스토리지가 있는 Pod는 제거되지 않습니다.
  • 최상의 Pod가 버스트 가능 Pod 및 보장된 Pod보다 먼저 제거됩니다.
  • descheduler.alpha.kubernetes.io/evict 주석이 있는 모든 Pod 유형을 제거할 수 있습니다. 이 주석은 제거를 방지하는 검사를 덮어쓰는 데 사용되며 사용자는 제거할 Pod를 선택할 수 있습니다. 사용자는 Pod를 다시 생성하는 방법과 다시 생성되는지의 여부를 알아야 합니다.
  • PDB(Pod 중단 예산)가 적용되는 Pod는 일정 조정에서 해당 PDB를 위반하는 경우 제거되지 않습니다. Pod는 PDB를 처리하는 제거 하위 리소스를 사용하여 제거합니다.

4.10.2. Descheduler 프로필

다음 Descheduler 프로필을 사용할 수 있습니다.

AffinityAndTaints

이 프로필은 Pod 간 유사성 방지, 노드 유사성, 노드 테인트를 위반하는 Pod를 제거합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsViolatingInterPodAntiAffinity: Pod 간 유사성 방지를 위반하는 Pod를 제거합니다.
  • RemovePodsViolatingNodeAffinity: 노드 유사성을 위반하는 Pod를 제거합니다.
  • RemovePodsViolatingNodeTaints: 노드에서 NoSchedule 테인트를 위반하는 Pod를 제거합니다.

    노드 유사성 유형이 requiredDuringSchedulingIgnoredDuringExecution인 Pod가 제거됩니다.

TopologyAndDuplicates

이 프로필은 노드 간에 유사한 Pod 또는 동일한 토폴로지 도메인의 Pod를 균등하게 분배하기 위해 Pod를 제거합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsViolatingTopologySpreadConstraint: DoNotSchedule 제약 조건을 위반하는 경우 균형이 맞지 않는 토폴로지 도메인을 찾아 더 큰 도메인에서 Pod를 제거합니다.
  • RemoveDuplicates: 동일한 노드에서 실행 중인 복제본 세트, 복제 컨트롤러, 배포 또는 작업과 연결된 Pod가 하나뿐인지 확인합니다. Pod가 두 개 이상인 경우 클러스터에서 Pod를 더 잘 배포하기 위해 이러한 중복 Pod를 제거합니다.
LifecycleAndUtilization

이 프로필은 장기 실행 Pod를 제거하고 노드 간 리소스 사용량의 균형을 조정합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsHavingTooManyRestarts: 컨테이너가 너무 여러 번 다시 시작된 Pod를 제거합니다.

    모든 컨테이너(Init Container 포함)에서 다시 시작되는 Pod는 100개 이상입니다.

  • LowNodeUtilization: 활용도가 낮은 노드를 찾고, Pod 재생성 시 Pod가 이처럼 활용도가 낮은 노드에 예약되도록 가능하면 과도하게 사용된 노드에서 Pod를 제거합니다.

    모든 임계값(CPU, 메모리, Pod 수)에서 사용량이 20% 미만인 경우 노드는 활용도가 낮은 것으로 간주됩니다.

    모든 임계값(CPU, 메모리, Pod 수)에서 사용량이 50%를 초과하면 노드는 과도하게 사용되는 것으로 간주됩니다.

  • PodLifeTime: 너무 오래된 Pod를 제거합니다.

    기본적으로 24시간이 지난 Pod가 제거됩니다. Pod 수명 값을 사용자 지정할 수 있습니다.

SoftTopologyAndDuplicates

이 프로필은 whenUnsatisfiable: ScheduleAnyway 와 같은 소프트 토폴로지 제약 조건이 있는 Pod를 제거하는 것을 제외하고 TopologyAndDuplicates 와 동일합니다.

참고

softTopologyAndDuplicates와 TopologyAndDuplicates 를 모두 활성화하지 마십시오. 두 결과 모두 충돌이 발생합니다.

EvictPodsWithLocalStorage
이 프로필을 사용하면 로컬 스토리지가 있는 Pod를 제거할 수 있습니다.
EvictPodsWithPVC
이 프로필을 사용하면 영구 볼륨 클레임이 있는 Pod를 제거할 수 있습니다.

4.10.3. Descheduler 설치

Descheduler는 기본적으로 사용할 수 없습니다. Descheduler를 활성화하려면 OperatorHub에서 Kube Descheduler Operator를 설치하고 Descheduler 프로필을 한 개 이상 활성화해야 합니다.

사전 요구 사항

  • 클러스터 관리자 권한이 있어야 합니다.
  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에 로그인합니다.
  2. Kube Descheduler Operator에 필요한 네임스페이스를 생성합니다.

    1. 관리네임스페이스로 이동하여 네임스페이스 생성을 클릭합니다.
    2. 이름 필드에 openshift-kube-descheduler-operator 를 입력하고 Labels 필드에 openshift.io/cluster-monitoring=true 를 입력하여 Descheduler 지표를 활성화한 후 생성 을 클릭합니다.
  3. Kube Descheduler Operator를 설치합니다.

    1. OperatorsOperatorHub로 이동합니다.
    2. 필터 박스에 Kube Descheduler Operator를 입력합니다.
    3. Kube Descheduler Operator를 선택하고 설치를 클릭합니다.
    4. Operator 설치 페이지에서 클러스터의 특정 네임스페이스를 선택합니다. 드롭다운 메뉴에서 openshift-kube-descheduler-operator를 선택합니다.
    5. 업데이트 채널승인 전략 값을 원하는 값으로 조정합니다.
    6. 설치를 클릭합니다.
  4. Descheduler 인스턴스를 생성합니다.

    1. Operator설치된 Operator 페이지에서 Kube Descheduler Operator를 클릭합니다.
    2. Kube Descheduler 탭을 선택하고 KubeDescheduler 생성을 클릭합니다.
    3. 필요에 따라 설정을 편집합니다.

      1. 프로필 섹션을 확장하여 활성화할 프로필을 하나 이상 선택합니다. AffinityAndTaints 프로파일은 기본적으로 활성화되어 있습니다. 프로필 추가 를 클릭하여 추가 프로필을 선택합니다.

        참고

        TopologyAndDuplicatessoftTopologyAndDuplicates 를 모두 활성화하지 마십시오. 두 결과 모두 충돌이 발생합니다.

      2. 선택 사항: 프로필 사용자 지정 섹션을 확장하여 LifecycleAndUtilization 프로필의 사용자 정의 Pod 수명 값을 설정합니다. 유효한 단위는 s,m 또는 h 입니다. 기본 Pod 수명은 24시간입니다.
      3. 선택 사항: Descheduling Interval Seconds 필드를 사용하여 Descheduler 실행 간격을 초 단위로 변경합니다. 기본값은 3600 초입니다.
    4. 생성을 클릭합니다.

나중에 OpenShift CLI(oc)를 사용하여 Descheduler의 프로필 및 설정을 구성할 수도 있습니다. 웹 콘솔에서 Descheduler 인스턴스를 생성할 때 프로필을 조정하지 않은 경우 기본적으로 AffinityAndTaints 프로필이 활성화됩니다.

4.10.4. Descheduler 프로필 구성

Descheduler에서 Pod를 제거하는 데 사용하는 프로필을 구성할 수 있습니다.

사전 요구 사항

  • 클러스터 관리자 권한

프로세스

  1. KubeDescheduler 오브젝트를 편집합니다.

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. spec.profiles