6.4. 수동 성능 설정으로 NUMA 인식 워크로드 예약

대기 시간에 민감한 워크로드를 실행하는 클러스터는 일반적으로 워크로드 대기 시간을 최소화하고 성능을 최적화하는 데 도움이 되는 성능 프로필을 제공합니다. 그러나 성능 프로필을 사용하지 않는 초기 클러스터에서 NUMA 인식 워크로드를 예약할 수 있습니다. 다음 워크플로에는 KubeletConfig 리소스를 사용하여 성능을 위해 수동으로 구성할 수 있는 초기 클러스터가 있습니다. 이는 NUMA 인식 워크로드를 예약하기 위한 일반적인 환경이 아닙니다.

6.4.1. 수동 성능 설정으로 NUMAResourcesOperator 사용자 정의 리소스 생성

NUMA Resources Operator 를 설치한 경우 NUMA Resources Operator에 데몬 세트 및 API를 포함하여 NUMA 인식 스케줄러를 지원하는 데 필요한 모든 클러스터 인프라를 설치하도록 지시하는 NUMAResourcesOperator CR(사용자 정의 리소스)을 생성합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.
  • NUMA Resources Operator를 설치합니다.

절차

  1. 선택 사항: 작업자 노드에 사용자 정의 kubelet 구성을 활성화하는 MachineConfigPool 사용자 정의 리소스를 생성합니다.

    참고

    기본적으로 OpenShift Container Platform은 클러스터의 작업자 노드에 대한 MachineConfigPool 리소스를 생성합니다. 필요한 경우 사용자 정의 MachineConfigPool 리소스를 생성할 수 있습니다.

    1. nro-machineconfig.yaml 파일에 다음 YAML을 저장합니다.

      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfigPool
      metadata:
        labels:
          cnf-worker-tuning: enabled
          machineconfiguration.openshift.io/mco-built-in: ""
          pools.operator.machineconfiguration.openshift.io/worker: ""
        name: worker
      spec:
        machineConfigSelector:
          matchLabels:
            machineconfiguration.openshift.io/role: worker
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
    2. 다음 명령을 실행하여 MachineConfigPool CR을 생성합니다.

      $ oc create -f nro-machineconfig.yaml
  2. NUMAResourcesOperator 사용자 정의 리소스를 만듭니다.

    1. 다음 YAML을 nrop.yaml 파일에 저장합니다.

      apiVersion: nodetopology.openshift.io/v1
      kind: NUMAResourcesOperator
      metadata:
        name: numaresourcesoperator
      spec:
        nodeGroups:
        - machineConfigPoolSelector:
            matchLabels:
              pools.operator.machineconfiguration.openshift.io/worker: "" 1
      1
      관련 MachineConfigPool CR의 작업자 노드에 적용되는 레이블과 일치해야 합니다.
    2. 다음 명령을 실행하여 NUMAResourcesOperator CR을 만듭니다.

      $ oc create -f nrop.yaml

검증

  • 다음 명령을 실행하여 NUMA Resources Operator가 성공적으로 배포되었는지 확인합니다.

    $ oc get numaresourcesoperators.nodetopology.openshift.io

    출력 예

    NAME                    AGE
    numaresourcesoperator   10m

6.4.2. 수동 성능 설정을 사용하여 NUMA 인식 보조 Pod 스케줄러 배포

NUMA Resources Operator를 설치한 후 다음을 수행하여 NUMA 인식 보조 Pod 스케줄러를 배포합니다.

  • 필수 머신 프로필에 대한 Pod 승인 정책 구성
  • 필요한 머신 구성 풀을 생성합니다.
  • NUMA 인식 보조 스케줄러 배포

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.
  • NUMA Resources Operator를 설치합니다.

절차

  1. 머신 프로필에 대한 Pod 승인 정책을 구성하는 KubeletConfig 사용자 정의 리소스를 생성합니다.

    1. nro-kubeletconfig.yaml 파일에 다음 YAML을 저장합니다.

      apiVersion: machineconfiguration.openshift.io/v1
      kind: KubeletConfig
      metadata:
        name: cnf-worker-tuning
      spec:
        machineConfigPoolSelector:
          matchLabels:
            cnf-worker-tuning: enabled
        kubeletConfig:
          cpuManagerPolicy: "static" 1
          cpuManagerReconcilePeriod: "5s"
          reservedSystemCPUs: "0,1"
          memoryManagerPolicy: "Static" 2
          evictionHard:
            memory.available: "100Mi"
          kubeReserved:
            memory: "512Mi"
          reservedMemory:
            - numaNode: 0
              limits:
                memory: "1124Mi"
          systemReserved:
            memory: "512Mi"
          topologyManagerPolicy: "single-numa-node" 3
          topologyManagerScope: "pod"
      1
      cpuManagerPolicy 의 경우static 은 소문자 s 를 사용해야 합니다.
      2
      memoryManagerPolicy 의 경우정적 에서는 대문자 S 를 사용해야 합니다.
      3
      topologyManagerPolicysingle-numa-node 로 설정해야 합니다.
    2. 다음 명령을 실행하여 KubeletConfig CR(사용자 정의 리소스)을 생성합니다.

      $ oc create -f nro-kubeletconfig.yaml
  2. NUMA 인식 사용자 정의 Pod 스케줄러를 배포하는 NUMAResourcesScheduler 사용자 정의 리소스를 생성합니다.

    1. nro-scheduler.yaml 파일에 다음 YAML을 저장합니다.

      apiVersion: nodetopology.openshift.io/v1
      kind: NUMAResourcesScheduler
      metadata:
        name: numaresourcesscheduler
      spec:
        imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.13"
        cacheResyncPeriod: "5s" 1
      1
      스케줄러 캐시의 동기화를 위해 간격 값(초)을 입력합니다. 대부분의 구현에서 값은 일반적인 5s 입니다.
      참고
      • cacheResyncPeriod 사양을 활성화하여 NUMA Resource Operator가 노드에서 보류 중인 리소스를 모니터링하고 이 정보를 정의된 간격으로 스케줄러 캐시에 동기화하여 보다 정확한 리소스 가용성을 보고할 수 있도록 지원합니다. 이는 또한 하위 선택 예약 결정에 따라 토폴로지 선호도 오류 오류를 최소화하는 데 도움이 됩니다. 네트워크 로드가 늘어납니다. cacheResyncPeriod 사양은 기본적으로 비활성화되어 있습니다.
      • NUMAResourcesOperator CR에서 podsFingerprinting 사양에 대해 Enabled 값을 설정하는 것은 cacheResyncPeriod 사양의 구현이 필요합니다.
    2. 다음 명령을 실행하여 NUMAResourcesScheduler CR을 생성합니다.

      $ oc create -f nro-scheduler.yaml

검증

  • 다음 명령을 실행하여 필요한 리소스가 성공적으로 배포되었는지 확인합니다.

    $ oc get all -n openshift-numaresources

    출력 예

    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/numaresources-controller-manager-7575848485-bns4s   1/1     Running   0          13m
    pod/numaresourcesoperator-worker-dvj4n                  2/2     Running   0          16m
    pod/numaresourcesoperator-worker-lcg4t                  2/2     Running   0          16m
    pod/secondary-scheduler-56994cf6cf-7qf4q                1/1     Running   0          16m
    NAME                                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                     AGE
    daemonset.apps/numaresourcesoperator-worker   2         2         2       2            2           node-role.kubernetes.io/worker=   16m
    NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/numaresources-controller-manager   1/1     1            1           13m
    deployment.apps/secondary-scheduler                1/1     1            1           16m
    NAME                                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/numaresources-controller-manager-7575848485   1         1         1       13m
    replicaset.apps/secondary-scheduler-56994cf6cf                1         1         1       16m

6.4.3. 수동 성능 설정으로 NUMA 인식 스케줄러를 사용하여 워크로드 예약

워크로드를 처리하는 데 필요한 최소 리소스를 지정하는 Deployment CR을 사용하여 NUMA 인식 스케줄러로 워크로드를 예약할 수 있습니다.

다음 예제 배포에서는 샘플 워크로드에 대해 NUMA 인식 스케줄링을 사용합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.
  • NUMA Resources Operator를 설치하고 NUMA 인식 보조 스케줄러를 배포합니다.

절차

  1. 다음 명령을 실행하여 클러스터에 배포된 NUMA 인식 스케줄러의 이름을 가져옵니다.

    $ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'

    출력 예

    topo-aware-scheduler

  2. 다음과 같이 topo-aware-scheduler 라는 스케줄러를 사용하는 배포 CR을 생성합니다.

    1. nro-deployment.yaml 파일에 다음 YAML을 저장합니다.

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: numa-deployment-1
        namespace: <namespace> 1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: test
        template:
          metadata:
            labels:
              app: test
          spec:
            schedulerName: topo-aware-scheduler 2
            containers:
            - name: ctnr
              image: quay.io/openshifttest/hello-openshift:openshift
              imagePullPolicy: IfNotPresent
              resources:
                limits:
                  memory: "100Mi"
                  cpu: "10"
                requests:
                  memory: "100Mi"
                  cpu: "10"
            - name: ctnr2
              image: gcr.io/google_containers/pause-amd64:3.0
              imagePullPolicy: IfNotPresent
              resources:
                limits:
                  memory: "100Mi"
                  cpu: "8"
                requests:
                  memory: "100Mi"
                  cpu: "8"
      1
      배포 네임스페이스로 바꿉니다.
      2
      schedulerName 은 클러스터에 배포된 NUMA 인식 스케줄러의 이름과 일치해야 합니다(예: topo-aware-scheduler ).
    2. 다음 명령을 실행하여 Deployment CR을 생성합니다.

      $ oc create -f nro-deployment.yaml

검증

  1. 배포가 성공했는지 확인합니다.

    $ oc get pods -n openshift-numaresources

    출력 예

    NAME                                                READY   STATUS    RESTARTS   AGE
    numa-deployment-1-56954b7b46-pfgw8                  2/2     Running   0          129m
    numaresources-controller-manager-7575848485-bns4s   1/1     Running   0          15h
    numaresourcesoperator-worker-dvj4n                  2/2     Running   0          18h
    numaresourcesoperator-worker-lcg4t                  2/2     Running   0          16h
    secondary-scheduler-56994cf6cf-7qf4q                1/1     Running   0          18h

  2. 다음 명령을 실행하여 topo-aware-scheduler 에서 배포된 Pod를 예약하는지 확인합니다.

    $ oc describe pod numa-deployment-1-56954b7b46-pfgw8 -n openshift-numaresources

    출력 예

    Events:
      Type    Reason          Age   From                  Message
      ----    ------          ----  ----                  -------
      Normal  Scheduled       130m  topo-aware-scheduler  Successfully assigned openshift-numaresources/numa-deployment-1-56954b7b46-pfgw8 to compute-0.example.com

    참고

    예약에 사용할 수 있는 것보다 많은 리소스를 요청하는 배포는 MinimumReplicasUnavailable 오류로 실패합니다. 필요한 리소스를 사용할 수 있게 되면 배포에 성공합니다. Pod는 필요한 리소스를 사용할 수 있을 때까지 Pending 상태로 유지됩니다.

  3. 예상 할당된 리소스가 노드에 나열되어 있는지 확인합니다.

    1. 다음 명령을 실행하여 배포 Pod를 실행 중인 노드를 확인하고 <namespace>를 Deployment CR에 지정한 네임스페이스로 교체합니다.

      $ oc get pods -n <namespace> -o wide

      출력 예

      NAME                                 READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
      numa-deployment-1-65684f8fcc-bw4bw   0/2     Running   0          82m   10.128.2.50   worker-0   <none>  <none>

    2. 다음 명령을 실행하여 <node_name>을 배포 Pod를 실행 중인 해당 노드의 이름으로 교체합니다.

      $ oc describe noderesourcetopologies.topology.node.k8s.io <node_name>

      출력 예

      ...
      
      Zones:
        Costs:
          Name:   node-0
          Value:  10
          Name:   node-1
          Value:  21
        Name:     node-0
        Resources:
          Allocatable:  39
          Available:    21 1
          Capacity:     40
          Name:         cpu
          Allocatable:  6442450944
          Available:    6442450944
          Capacity:     6442450944
          Name:         hugepages-1Gi
          Allocatable:  134217728
          Available:    134217728
          Capacity:     134217728
          Name:         hugepages-2Mi
          Allocatable:  262415904768
          Available:    262206189568
          Capacity:     270146007040
          Name:         memory
        Type:           Node

      1
      보장된 Pod에 할당된 리소스로 인해 사용 가능한 용량이 줄어듭니다.

      보장된 Pod에서 사용하는 리소스는 node resourcetopology.node.k8s.io에 나열된 사용 가능한 노드 리소스에서 차감됩니다.

  4. Best-effort 또는 Burstable 서비스 품질(qosClass)이 있는 Pod의 리소스 할당은 node resourcetopology.topology.node.k8s.io의 NUMA 노드 리소스에 반영되지 않습니다. Pod의 소비된 리소스가 노드 리소스 계산에 반영되지 않으면 Pod에 Guaranteed 가 있고 CPU 요청은 10진수 값이 아닌 정수 값인지 확인합니다. 다음 명령을 실행하여 Pod에 Guaranteed qosClass 가 있는지 확인할 수 있습니다.

    $ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"

    출력 예

    Guaranteed