14장. 리소스 예약
14.1. 노드 선택기를 사용하여 로깅 리소스 이동
노드 선택기는 노드의 사용자 정의 라벨 및 Pod에 지정된 선택기를 사용하여 정의한 키/값 쌍으로 구성된 맵을 지정합니다.
노드에서 Pod를 실행하려면 노드의 라벨과 동일한 키/값 노드 선택기가 Pod에 있어야 합니다.
14.1.1. 노드 선택기 정보
Pod의 노드 선택기와 노드의 라벨을 사용하여 Pod가 예약되는 위치를 제어할 수 있습니다. 노드 선택기를 사용하면 OpenShift Dedicated에서 일치하는 라벨이 포함된 노드에 Pod를 예약합니다.
노드 선택기를 사용하여 특정 노드에 특정 Pod를 배치하고, 클러스터 수준 노드 선택기를 사용하여 클러스터의 특정 노드에 새 Pod를 배치하고, 프로젝트 노드 선택기를 사용하여 특정 노드의 프로젝트에 새 Pod를 배치할 수 있습니다.
예를 들어 클러스터 관리자는 애플리케이션 개발자가 생성하는 모든 Pod에 노드 선택기를 포함하여 지리적으로 가장 가까운 노드에만 Pod를 배포할 수 있는 인프라를 생성할 수 있습니다. 이 예제에서 클러스터는 두 지역에 분배된 데이터센터 5개로 구성됩니다. 미국에서는 노드의 라벨을 us-east
, us-central
또는 us-west
로 지정합니다. 아시아 태평양 지역(APAC)에서는 노드의 라벨을 apac-east
또는 apac-west
로 지정합니다. 개발자는 생성한 Pod에 노드 선택기를 추가하여 해당 노드에 Pod가 예약되도록 할 수 있습니다.
Pod
오브젝트에 노드 선택기가 포함되어 있지만 일치하는 라벨이 있는 노드가 없는 경우 Pod를 예약하지 않습니다.
동일한 Pod 구성의 노드 선택기 및 노드 유사성을 사용 중인 경우 다음 규칙에서 노드에 대한 Pod 배치를 제어합니다.
-
nodeSelector
와nodeAffinity
를 둘 다 구성하는 경우 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 topology.kubernetes.io/zone: us-east-1a node.openshift.io/os_version: '4.5' node-role.kubernetes.io/worker: '' topology.kubernetes.io/region: us-east-1 node.openshift.io/os_id: rhcos node.kubernetes.io/instance-type: m4.large kubernetes.io/hostname: ip-10-0-131-14 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 Dedicated에서 기본 노드 선택기를 Pod에 추가하고 라벨이 일치하는 노드에 Pod를 예약합니다.
예를 들어 다음
Scheduler
오브젝트에는 기본 클러스터 수준region=east
및type=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 Dedicated에서 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 #...
14.1.2. Loki Pod 배치
Pod의 허용 오차 또는 노드 선택기를 사용하여 Loki Pod가 실행되는 노드를 제어하고 다른 워크로드가 해당 노드를 사용하지 못하도록 할 수 있습니다.
LokiStack CR(사용자 정의 리소스)을 사용하여 로그 저장소 Pod에 허용 오차를 적용하고 노드 사양이 있는 노드에 taint를 적용할 수 있습니다. 노드의 테인트는 테인트를 허용하지 않는 모든 Pod를 거절하도록 노드에 지시하는 키:값
쌍입니다. 다른 Pod에 없는 특정 키:값
쌍을 사용하면 해당 노드에서 로그 저장소 Pod만 실행할 수 있습니다.
노드 선택기가 있는 LokiStack의 예
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: # ... template: compactor: 1 nodeSelector: node-role.kubernetes.io/infra: "" 2 distributor: nodeSelector: node-role.kubernetes.io/infra: "" gateway: nodeSelector: node-role.kubernetes.io/infra: "" indexGateway: nodeSelector: node-role.kubernetes.io/infra: "" ingester: nodeSelector: node-role.kubernetes.io/infra: "" querier: nodeSelector: node-role.kubernetes.io/infra: "" queryFrontend: nodeSelector: node-role.kubernetes.io/infra: "" ruler: nodeSelector: node-role.kubernetes.io/infra: "" # ...
이전 예제 구성에서 모든 Loki Pod는 node-role.kubernetes.io/infra: ""
라벨이 포함된 노드로 이동합니다.
노드 선택기 및 허용 오차가 있는 LokiStack CR의 예
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: # ... template: compactor: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved distributor: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved indexGateway: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved ingester: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved querier: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved queryFrontend: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved ruler: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved gateway: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: NoSchedule key: node-role.kubernetes.io/infra value: reserved - effect: NoExecute key: node-role.kubernetes.io/infra value: reserved # ...
LokiStack(CR)의 nodeSelector
및 허용 오차
필드를 구성하려면 oc explain
명령을 사용하여 특정 리소스에 대한 설명 및 필드를 볼 수 있습니다.
$ oc explain lokistack.spec.template
출력 예
KIND: LokiStack VERSION: loki.grafana.com/v1 RESOURCE: template <Object> DESCRIPTION: Template defines the resource/limits/tolerations/nodeselectors per component FIELDS: compactor <Object> Compactor defines the compaction component spec. distributor <Object> Distributor defines the distributor component spec. ...
자세한 내용은 특정 필드를 추가할 수 있습니다.
$ oc explain lokistack.spec.template.compactor
출력 예
KIND: LokiStack VERSION: loki.grafana.com/v1 RESOURCE: compactor <Object> DESCRIPTION: Compactor defines the compaction component spec. FIELDS: nodeSelector <map[string]string> NodeSelector defines the labels required by a node to schedule the component onto it. ...
14.1.3. 로깅 수집기에 대한 리소스 구성 및 스케줄링
관리자는 동일한 네임스페이스에 있고 지원되는 ClusterLogForwarder
CR과 동일한 이름이 있는 ClusterLogging
사용자 정의 리소스(CR)를 생성하여 수집기의 리소스 또는 스케줄링을 수정할 수 있습니다.
배포에서 여러 로그 전달자를 사용할 때 ClusterLogging
CR에 적용되는 스탠자는 managementState
및 collection
입니다. 다른 모든 스탠자는 무시됩니다.
사전 요구 사항
- 관리자 권한이 있습니다.
- Red Hat OpenShift Logging Operator 버전 5.8 이상이 설치되어 있습니다.
-
ClusterLogForwarder
CR을 생성했습니다.
절차
기존
ClusterLogForwarder
CR을 지원하는ClusterLogging
CR을 생성합니다.ClusterLogging
CR YAML의 예apiVersion: logging.openshift.io/v1 kind: ClusterLogging metadata: name: <name> 1 namespace: <namespace> 2 spec: managementState: "Managed" collection: type: "vector" tolerations: - key: "logging" operator: "Exists" effect: "NoExecute" tolerationSeconds: 6000 resources: limits: memory: 1Gi requests: cpu: 100m memory: 1Gi nodeSelector: collector: needed # ...
다음 명령을 실행하여
ClusterLogging
CR을 적용합니다.$ oc apply -f <filename>.yaml
14.1.4. 로깅 수집기 Pod 보기
로깅 수집기 Pod 및 실행 중인 해당 노드를 볼 수 있습니다.
절차
프로젝트에서 다음 명령을 실행하여 로깅 수집기 Pod 및 세부 정보를 확인합니다.
$ oc get pods --selector component=collector -o wide -n <project_name>
출력 예
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES collector-8d69v 1/1 Running 0 134m 10.130.2.30 master1.example.com <none> <none> collector-bd225 1/1 Running 0 134m 10.131.1.11 master2.example.com <none> <none> collector-cvrzs 1/1 Running 0 134m 10.130.0.21 master3.example.com <none> <none> collector-gpqg2 1/1 Running 0 134m 10.128.2.27 worker1.example.com <none> <none> collector-l9j7j 1/1 Running 0 134m 10.129.2.31 worker2.example.com <none> <none>