확장 및 성능
프로덕션 환경에서 OpenShift Container Platform 클러스터 스케일링 및 성능 튜닝
초록
1장. 권장 성능 및 확장성 사례
1.1. 컨트롤 플레인 권장 사례
이 주제에서는 OpenShift Container Platform의 컨트롤 플레인에 대한 성능 및 확장성 관련 권장 사례를 제공합니다.
1.1.1. 클러스터 스케일링에 대한 권장 사례
이 섹션의 지침은 클라우드 공급자 통합을 통한 설치에만 관련이 있습니다.
다음 모범 사례를 적용하여 OpenShift Container Platform 클러스터의 작업자 머신 수를 스케일링하십시오. 작업자 머신 세트에 정의된 복제본 수를 늘리거나 줄여 작업자 머신을 스케일링합니다.
노드 수가 많아지도록 클러스터를 확장하는 경우 다음을 수행합니다.
- 고가용성을 위해 모든 사용 가능한 영역으로 노드를 분산합니다.
- 한 번에 확장하는 머신 수가 25~50개를 넘지 않도록 합니다.
- 주기적인 공급자 용량 제약 조건을 완화하는 데 도움이 되도록 유사한 크기의 대체 인스턴스 유형을 사용하여 사용 가능한 각 영역에 새 컴퓨팅 머신 세트를 생성하는 것이 좋습니다. 예를 들어 AWS에서 m5.large 및 m5d.large를 사용합니다.
클라우드 제공자는 API 서비스 할당량을 구현할 수 있습니다. 따라서 점진적으로 클러스터를 스케일링하십시오.
컴퓨팅 머신 세트의 복제본이 한 번에 모두 더 높은 숫자로 설정된 경우 컨트롤러가 머신을 생성하지 못할 수 있습니다. OpenShift Container Platform이 배포된 클라우드 플랫폼에서 처리할 수 있는 요청 수는 프로세스에 영향을 미칩니다. 컨트롤러는 상태를 사용하여 머신을 생성하고, 점검하고, 업데이트하는 동안 더 많이 쿼리하기 시작합니다. OpenShift Container Platform이 배포된 클라우드 플랫폼에는 API 요청 제한이 있습니다. 과도한 쿼리로 인해 클라우드 플랫폼 제한으로 인해 머신 생성이 실패할 수 있습니다.
노드 수가 많아지도록 스케일링하는 경우 머신 상태 점검을 활성화하십시오. 실패가 발생하면 상태 점검에서 상태를 모니터링하고 비정상 머신을 자동으로 복구합니다.
대규모 및 밀도가 높은 클러스터의 노드 수를 줄이는 경우 프로세스가 종료되는 노드에서 실행되는 오브젝트를 병렬로 드레이닝하거나 제거해야 하므로 많은 시간이 걸릴 수 있습니다. 또한 제거할 개체가 너무 많으면 클라이언트 요청 처리에 병목 현상이 발생할 수 있습니다. 초당 기본 클라이언트 쿼리(QPS) 및 버스트 비율은 현재 각각 5 및 10 으로 설정됩니다. 이러한 값은 OpenShift Container Platform에서 수정할 수 없습니다.
1.1.2. 컨트롤 플레인 노드 크기 조정
컨트롤 플레인 노드 리소스 요구사항은 클러스터의 노드 및 오브젝트 수에 따라 달라집니다. 다음 컨트롤 플레인 노드 크기 권장 사항은 컨트롤 플레인 밀도 중심 테스트 또는 Cluster-density 의 결과를 기반으로 합니다. 이 테스트에서는 지정된 수의 네임스페이스에서 다음 오브젝트를 생성합니다.
- 이미지 스트림 한 개
- 빌드 1개
-
5 배포:
절전상태의 Pod 복제본 2개, 시크릿 4개, 구성 맵 4개, Downward API 볼륨 1개 - 서비스 5개, 이전 배포 중 하나의 TCP/8080 및 TCP/8443 포트를 가리킵니다.
- 이전 서비스 중 첫 번째를 가리키는 경로 1개
- 2048 임의의 문자열을 포함하는 10개의 보안
- 2048 임의 문자열 문자가 포함된 구성 맵 10개
| 작업자 노드 수 | cluster-density(네임스페이스) | CPU 코어 수 | 메모리(GB) |
|---|---|---|---|
| 24 | 500 | 4 | 16 |
| 120 | 1000 | 8 | 32 |
| 252 | 4000 | 16하지만 OVN-Kubernetes 네트워크 플러그인을 사용하는 경우 24개 | OVN-Kubernetes 네트워크 플러그인을 사용하는 경우 64이지만 128 |
| 501 그러나 OVN-Kubernetes 네트워크 플러그인에서는 테스트되지 않았습니다. | 4000 | 16 | 96 |
위의 표의 데이터는 AWS 상단에서 실행되는 OpenShift Container Platform을 기반으로 하며 r5.4xlarge 인스턴스를 control-plane 노드로 사용하고 m5.2xlarge 인스턴스를 작업자 노드로 사용합니다.
3개의 컨트롤 플레인 노드가 있는 대규모 및 밀도가 높은 클러스터에서는 노드 중 하나가 중지, 재부팅 또는 실패할 때 CPU 및 메모리 사용량이 증가합니다. 전원, 네트워크, 기본 인프라 또는 비용 절감을 위해 클러스터를 종료한 후 클러스터를 다시 시작하는 의도적인 사례로 인해 오류가 발생할 수 있습니다. 나머지 두 컨트롤 플레인 노드는 고가용성이 되기 위해 부하를 처리하여 리소스 사용량을 늘려야 합니다. 이는 컨트롤 플레인 노드가 직렬로 연결, 드레이닝, 재부팅되어 운영 체제 업데이트를 적용하고 컨트롤 플레인 Operator 업데이트를 적용하기 때문에 업그레이드 중에도 이 문제가 발생할 수 있습니다. 단계적 오류를 방지하려면 컨트롤 플레인 노드의 전체 CPU 및 메모리 사용량을 리소스 사용량 급증을 처리할 수 있는 사용 가능한 모든 용량의 60%로 유지합니다. 리소스 부족으로 인한 다운타임을 방지하기 위해 컨트롤 플레인 노드에서 CPU 및 메모리를 늘립니다.
노드 크기 조정은 클러스터의 노드 수와 개체 수에 따라 달라집니다. 또한 클러스터에서 개체가 현재 생성되는지에 따라 달라집니다. 개체 생성 중에 컨트롤 플레인은 개체가 running 단계에 있을 때보다 리소스 사용량 측면에서 더 활성화됩니다.
OLM(Operator Lifecycle Manager)은 컨트롤 플레인 노드에서 실행되며, 메모리 공간은 OLM이 클러스터에서 관리해야 하는 네임스페이스 및 사용자 설치된 Operator 수에 따라 다릅니다. OOM이 종료되지 않도록 컨트를 플레인 노드의 크기를 적절하게 조정해야 합니다. 다음 데이터 지점은 클러스터 최대값 테스트 결과를 기반으로 합니다.
| 네임스페이스 수 | 유휴 상태의 OLM 메모리(GB) | 5명의 사용자 operator가 설치된 OLM 메모리(GB) |
|---|---|---|
| 500 | 0.823 | 1.7 |
| 1000 | 1.2 | 2.5 |
| 1500 | 1.7 | 3.2 |
| 2000 | 2 | 4.4 |
| 3000 | 2.7 | 5.6 |
| 4000 | 3.8 | 7.6 |
| 5000 | 4.2 | 9.02 |
| 6000 | 5.8 | 11.3 |
| 7000 | 6.6 | 12.9 |
| 8000 | 6.9 | 14.8 |
| 9000 | 8 | 17.7 |
| 10,000 | 9.9 | 21.6 |
실행 중인 OpenShift Container Platform 4.13 클러스터에서만 컨트롤 플레인 노드 크기를 수정할 수 있습니다.
- 사용자 프로비저닝 설치 방법으로 설치된 클러스터입니다.
- 설치 관리자 프로비저닝 인프라 설치 방법으로 설치된 AWS 클러스터
- 컨트롤 플레인 머신 세트를 사용하여 컨트롤 플레인 시스템을 관리하는 클러스터입니다.
다른 모든 구성의 경우 총 노드 수를 추정하고 설치 중에 제안된 컨트롤 플레인 노드 크기를 사용해야 합니다.
권장 사항은 OpenShift SDN이 있는 OpenShift Container Platform 클러스터에서 네트워크 플러그인으로 캡처된 데이터 포인트를 기반으로 합니다.
OpenShift Container Platform 3.11 및 이전 버전과 비교하면 OpenShift Container Platform 4.13에서는 기본적으로 CPU 코어의 절반(500밀리코어)이 시스템에 의해 예약되어 있습니다. 이러한 점을 고려하여 크기가 결정됩니다.
1.1.2.1. 컨트롤 플레인 머신에 더 큰 Amazon Web Services 인스턴스 유형 선택
AWS(Amazon Web Services) 클러스터의 컨트롤 플레인 시스템에 더 많은 리소스가 필요한 경우 사용할 컨트롤 플레인 시스템의 더 큰 AWS 인스턴스 유형을 선택할 수 있습니다.
컨트롤 플레인 머신 세트를 사용하는 클러스터의 절차는 컨트롤 플레인 머신 세트를 사용하지 않는 클러스터의 절차와 다릅니다.
클러스터의 ControlPlaneMachineSet CR 상태에 대해 확실하지 않은 경우 CR 상태를 확인할 수 있습니다.
1.1.2.1.1. 컨트롤 플레인 머신 세트를 사용하여 Amazon Web Services 인스턴스 유형 변경
컨트롤 플레인 머신 세트 CR(사용자 정의 리소스)에서 사양을 업데이트하여 컨트롤 플레인 시스템이 사용하는 AWS(Amazon Web Services) 인스턴스 유형을 변경할 수 있습니다.
사전 요구 사항
- AWS 클러스터는 컨트롤 플레인 머신 세트를 사용합니다.
절차
다음 명령을 실행하여 컨트롤 플레인 머신 세트 CR을 편집합니다.
$ oc --namespace openshift-machine-api edit controlplanemachineset.machine.openshift.io cluster
providerSpec필드 아래에 다음 행을 편집합니다.providerSpec: value: ... instanceType: <compatible_aws_instance_type> 1- 1
- 이전 선택과 동일한 기본으로 더 큰 AWS 인스턴스 유형을 지정합니다. 예를 들어
m6i.xlarge를m6i.2xlarge또는m6i.4xlarge로 변경할 수 있습니다.
변경 사항을 저장하십시오.
-
기본
RollingUpdate업데이트 전략을 사용하는 클러스터의 경우 Operator는 변경 사항을 컨트롤 플레인 구성에 자동으로 전파합니다. -
OnDelete업데이트 전략을 사용하도록 구성된 클러스터의 경우 컨트롤 플레인 시스템을 수동으로 교체해야 합니다.
-
기본
1.1.2.1.2. AWS 콘솔을 사용하여 Amazon Web Services 인스턴스 유형 변경
컨트롤 플레인 시스템이 AWS 콘솔에서 인스턴스 유형을 업데이트하여 사용하는 AWS(Amazon Web Services) 인스턴스 유형을 변경할 수 있습니다.
사전 요구 사항
- 클러스터의 EC2 인스턴스를 수정하는 데 필요한 권한을 사용하여 AWS 콘솔에 액세스할 수 있습니다.
-
cluster-admin역할의 사용자로 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
절차
- AWS 콘솔을 열고 컨트롤 플레인 시스템의 인스턴스를 가져옵니다.
컨트롤 플레인 시스템 인스턴스 하나를 선택합니다.
- 선택한 컨트롤 플레인 시스템의 경우 etcd 스냅샷을 생성하여 etcd 데이터를 백업하십시오. 자세한 내용은 "Backing up etcd"를 참조하십시오.
- AWS 콘솔에서 컨트롤 플레인 머신 인스턴스를 중지합니다.
- 중지된 인스턴스를 선택하고 작업 → 인스턴스 설정 → 인스턴스 유형 변경을 클릭합니다.
-
인스턴스를 더 큰 유형으로 변경하여 유형이 이전 선택 기준과 동일한지 확인하고 변경 사항을 적용합니다. 예를 들어
m6i.xlarge를m6i.2xlarge또는m6i.4xlarge로 변경할 수 있습니다. - 인스턴스를 시작합니다.
-
OpenShift Container Platform 클러스터에 인스턴스에 대한 해당
Machine오브젝트가 있는 경우 AWS 콘솔에 설정된 인스턴스 유형과 일치하도록 오브젝트의 인스턴스 유형을 업데이트합니다.
- 각 컨트롤 플레인 시스템에 대해 이 프로세스를 반복합니다.
추가 리소스
1.2. 인프라 권장 사례
이 주제에서는 OpenShift Container Platform의 인프라에 대한 권장 성능 및 확장성 사례를 설명합니다.
1.2.1. 인프라 노드 크기 조정
인프라 노드는 OpenShift Container Platform 환경의 일부를 실행하도록 레이블이 지정된 노드입니다. 인프라 노드 리소스 요구사항은 클러스터 사용 기간, 노드, 클러스터의 오브젝트에 따라 달라집니다. 이러한 요인으로 인해 Prometheus의 지표 또는 시계열 수가 증가할 수 있기 때문입니다. 다음 인프라 노드 크기 권장 사항은 컨트롤 플레인 노드 크기 조정 섹션에 자세히 설명된 클러스터 밀도 테스트에서 관찰된 결과를 기반으로 합니다. 여기서 모니터링 스택 및 기본 ingress-controller가 이러한 노드로 이동되었습니다.
| 작업자 노드 수 | 클러스터 밀도 또는 네임스페이스 수 | CPU 코어 수 | 메모리(GB) |
|---|---|---|---|
| 27 | 500 | 4 | 24 |
| 120 | 1000 | 8 | 48 |
| 252 | 4000 | 16 | 128 |
| 501 | 4000 | 32 | 128 |
일반적으로 클러스터당 세 개의 인프라 노드를 사용하는 것이 좋습니다.
이러한 크기 조정 권장 사항은 지침으로 사용해야 합니다. Prometheus는 고도의 메모리 집약적 애플리케이션입니다. 리소스 사용량은 노드 수, 오브젝트, Prometheus 지표 스크래핑 간격, 지표 또는 시계열, 클러스터 사용 기간 등 다양한 요인에 따라 달라집니다. 또한 라우터 리소스 사용은 경로 수 및 인바운드 요청의 양/유형의 영향을 받을 수 있습니다.
이러한 권장 사항은 클러스터 생성 중에 설치된 모니터링, Ingress 및 레지스트리 인프라 구성 요소를 호스팅하는 인프라 노드에만 적용됩니다.
OpenShift Container Platform 3.11 및 이전 버전과 비교하면 OpenShift Container Platform 4.13에서는 기본적으로 CPU 코어의 절반(500밀리코어)이 시스템에 의해 예약되어 있습니다. 명시된 크기 조정 권장 사항은 이러한 요인의 영향을 받습니다.
1.2.2. Cluster Monitoring Operator 스케일링
OpenShift Container Platform에서는 Cluster Monitoring Operator가 수집하여 Prometheus 기반 모니터링 스택에 저장하는 지표를 공개합니다. 관리자는 Observe → Dashboards 로 이동하여 OpenShift Container Platform 웹 콘솔에서 시스템 리소스, 컨테이너 및 구성 요소에 대한 대시보드를 볼 수 있습니다.
1.2.3. Prometheus 데이터베이스 스토리지 요구사항
Red Hat은 여러 스케일링 크기에 대해 다양한 테스트를 수행했습니다.
아래 Prometheus 스토리지 요구 사항은 규범이 아니며 참조로 사용해야 합니다. Prometheus에서 수집한 메트릭을 노출하는 Pod, 컨테이너, 경로 또는 기타 리소스 수를 포함하여 워크로드 활동 및 리소스 밀도에 따라 클러스터에서 리소스 사용량이 증가할 수 있습니다.
표 1.1. 클러스터의 노드/Pod 수에 따른 Prometheus 데이터베이스 스토리지 요구사항
| 노드 수 | Pod 수 (2 Pod당 컨테이너) | Prometheus 스토리지 증가(1일당) | Prometheus 스토리지 증가(15일당) | 네트워크(tsdb 청크당) |
|---|---|---|---|---|
| 50 | 1800 | 6.3GB | 94GB | 16MB |
| 100 | 3600 | 13GB | 195GB | 26MB |
| 150 | 5400 | 19GB | 283GB | 36MB |
| 200 | 7200 | 25GB | 375GB | 46MB |
스토리지 요구사항이 계산된 값을 초과하지 않도록 예상 크기의 약 20%가 오버헤드로 추가되었습니다.
위의 계산은 기본 OpenShift Container Platform Cluster Monitoring Operator용입니다.
CPU 사용률은 약간의 영향을 미칩니다. 50개 노드 및 1,800개 Pod당 비율이 약 40개 중 1개 코어입니다.
OpenShift Container Platform 권장 사항
- 인프라(infra) 노드를 두 개 이상 사용합니다.
- SSD 또는 NVMe(Non-volatile Memory express) 드라이브를 사용하여 openshift-container-storage 노드를 3개 이상 사용합니다.
1.2.4. 클러스터 모니터링 구성
클러스터 모니터링 스택에서 Prometheus 구성 요소의 스토리지 용량을 늘릴 수 있습니다.
절차
Prometheus의 스토리지 용량을 늘리려면 다음을 수행합니다.
YAML 구성 파일
cluster-monitoring-config.yaml을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap data: config.yaml: | prometheusK8s: retention: {{PROMETHEUS_RETENTION_PERIOD}} 1 nodeSelector: node-role.kubernetes.io/infra: "" volumeClaimTemplate: spec: storageClassName: {{STORAGE_CLASS}} 2 resources: requests: storage: {{PROMETHEUS_STORAGE_SIZE}} 3 alertmanagerMain: nodeSelector: node-role.kubernetes.io/infra: "" volumeClaimTemplate: spec: storageClassName: {{STORAGE_CLASS}} 4 resources: requests: storage: {{ALERTMANAGER_STORAGE_SIZE}} 5 metadata: name: cluster-monitoring-config namespace: openshift-monitoring- 1
- Prometheus 보존의 기본값은
PROMETHEUS_RETENTION_PERIOD=15d입니다. 단위는 s, m, h, d 접미사 중 하나를 사용하는 시간으로 측정됩니다. - 2 4
- 클러스터의 스토리지 클래스입니다.
- 3
- 일반적인 값은
PROMETHEUS_STORAGE_SIZE=2000Gi입니다. 스토리지 값은 일반 정수 또는 E, P, T, G, M, K 접미사 중 하나를 사용하는 고정 지점 정수일 수 있습니다. Ei, Pi, Ti, Gi, Mi, Ki의 power-of-two를 사용할 수도 있습니다. - 5
- 일반적인 값은
ALERTMANAGER_STORAGE_SIZE=20Gi입니다. 스토리지 값은 일반 정수 또는 E, P, T, G, M, K 접미사 중 하나를 사용하는 고정 지점 정수일 수 있습니다. Ei, Pi, Ti, Gi, Mi, Ki의 power-of-two를 사용할 수도 있습니다.
- 보존 기간, 스토리지 클래스 및 스토리지 크기에 대한 값을 추가합니다.
- 파일을 저장합니다.
다음을 실행하여 변경사항을 적용합니다.
$ oc create -f cluster-monitoring-config.yaml
1.2.5. 추가 리소스
1.3. etcd 관련 권장 사례
이 주제에서는 OpenShift Container Platform의 etcd에 대한 성능 및 확장성 관련 권장 사례를 설명합니다.
1.3.1. etcd 관련 권장 사례
etcd는 디스크에 데이터를 쓰고 디스크에 제안을 지속하므로 etcd 성능은 디스크 성능에 따라 달라집니다. etcd는 특별히 I/O 집약적이 아니지만 성능과 안정성을 최적화하려면 대기 시간이 짧은 블록 장치가 필요합니다. etcd의 비관성 프로토콜은 메타데이터를 로그에 영구적으로 저장하는 데 따라 달라지므로 etcd는 디스크 쓰기 대기 시간에 민감합니다. 다른 프로세스의 디스크 속도 및 디스크 활동 속도 저하로 인해 fsync 대기 시간이 길어질 수 있습니다.
이러한 지연으로 인해 etcd에서 하트비트가 누락되고 새로운 제안을 제때 디스크에 커밋하지 않고 궁극적으로 요청 시간 초과와 일시적인 리더 손실이 발생할 수 있습니다. 또한 쓰기 대기 시간이 길면 OpenShift API 속도가 느려 클러스터 성능에 영향을 미칩니다. 이러한 이유로 I/O 민감하거나 집약적이며 동일한 기본 I/O 인프라를 공유하는 컨트롤 플레인 노드에서 다른 워크로드를 배치하지 마십시오.
대기 시간에서는 블록 장치 위에서 etcd를 실행하여 8000바이트 이상의 IOPS를 순차적으로 작성할 수 있습니다. 즉, 대기 시간이 10ms인 경우 fdatasync를 사용하여 WAL의 각 쓰기를 동기화하는 것을 염두에 두십시오. 로드된 클러스터의 경우 8000바이트(2ms)의 순차적 500 IOPS를 사용하는 것이 좋습니다. 이 숫자를 측정하려면 fio와 같은 벤치마킹 도구를 사용할 수 있습니다.
이러한 성능을 얻으려면 대기 시간이 짧고 처리량이 높은 SSD 또는 NVMe 디스크가 지원되는 머신에서 etcd를 실행하십시오. 메모리 셀당 1비트를 제공하는 SSD(Single-level cell) 솔리드 스테이트 드라이브(SSD)를 고려해야 하며, 쓰기 집약적인 워크로드에 적합합니다.
etcd의 로드는 노드 및 Pod 수와 같은 정적 요인과 Pod 자동 스케일링, Pod 재시작, 작업 실행 및 기타 워크로드 관련 이벤트로 인한 끝점 변경 등 동적 요인에서 발생합니다. etcd 설정의 크기를 정확하게 조정하려면 워크로드의 특정 요구 사항을 분석해야 합니다. etcd의 로드에 영향을 미치는 노드, 포드 및 기타 관련 요인을 고려하십시오.
다음 하드 디스크 기능은 최적의 etcd 성능을 제공합니다.
- 빠른 읽기 작업을 지원하기 위한 대기 시간이 짧습니다.
- 더 빠른 압축 및 조각 모음을 위한 높은 대역폭 쓰기
- 고 대역폭 읽기를 통해 실패로 인한 복구 속도가 빨라집니다.
- 솔리드 스테이트 드라이브는 최소 선택이지만 NVMe 드라이브가 우선합니다.
- 신뢰성을 높이기 위해 다양한 제조 업체의 서버 등급 하드웨어.
- 성능 향상을 위한 RAID 0 기술
- 전용 etcd 드라이브 etcd 드라이브에 로그 파일 또는 기타 많은 워크로드를 배치하지 마십시오.
NAS 또는 SAN 설정 및 회전 드라이브를 사용하지 마십시오. Ceph Rados Block Device(RBD) 및 기타 유형의 네트워크 연결 스토리지로 인해 네트워크 대기 시간이 예측할 수 없습니다. 대규모 etcd 노드에 빠른 스토리지를 제공하려면 PCI 패스스루를 사용하여 NVM 장치를 노드에 직접 전달합니다.
항상 fio와 같은 유틸리티를 사용하여 벤치마크를 수행합니다. 이러한 유틸리티를 사용하여 증가에 따라 클러스터 성능을 지속적으로 모니터링할 수 있습니다.
NFS(Network File System) 프로토콜 또는 기타 네트워크 기반 파일 시스템을 사용하지 마십시오.
배포된 OpenShift Container Platform 클러스터에서 모니터링할 일부 주요 메트릭은 etcd 디스크 쓰기 사전 로그 기간의 p99와 etcd 리더 변경 수입니다. 이러한 지표를 추적하려면 Prometheus를 사용하십시오.
etcd 멤버 데이터베이스 크기는 일반 작업 중에 클러스터에서 다를 수 있습니다. 이 차이점은 리더 크기가 다른 멤버와 다른 경우에도 클러스터 업그레이드에는 영향을 미치지 않습니다.
OpenShift Container Platform 클러스터를 생성하기 전이나 후에 etcd 하드웨어를 확인하려면 fio를 사용할 수 있습니다.
사전 요구 사항
- Podman 또는 Docker와 같은 컨테이너 런타임은 테스트 중인 머신에 설치됩니다.
-
데이터는
/var/lib/etcd경로에 기록됩니다.
절차
Fio를 실행하고 결과를 분석합니다.
Podman을 사용하는 경우 다음 명령을 실행합니다.
$ sudo podman run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/openshift-scale/etcd-perf
Docker를 사용하는 경우 다음 명령을 실행합니다.
$ sudo docker run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/openshift-scale/etcd-perf
실행에서 캡처된 fsync 지표의 99번째 백분위수를 비교하여 10ms 미만인지 확인하여 디스크 속도가 etcd를 호스팅하기에 충분한지 여부를 출력에서 보고합니다. I/O 성능의 영향을 받을 수 있는 가장 중요한 etcd 지표 중 일부는 다음과 같습니다.
-
etcd_disk_wal_fsync_duration_seconds_bucket지표가 etcd의 WAL fsync 기간 보고 -
etcd_disk_backend_commit_duration_seconds_bucket지표에서 etcd 백엔드 커밋 대기 시간 보고 -
etcd_server_leader_changes_seen_total지표에서 리더 변경을 보고
etcd는 모든 멤버 간에 요청을 복제하므로 성능은 네트워크 입력/출력(I/O) 대기 시간에 따라 달라집니다. 네트워크 대기 시간이 길어지면 etcd 하트비트가 선택 시간 초과보다 오래 걸리므로 리더 선택으로 인해 클러스터가 중단됩니다. 배포된 OpenShift Container Platform 클러스터에서 모니터링되는 주요 메트릭은 각 etcd 클러스터 멤버에서 etcd 네트워크 피어 대기 시간의 99번째 백분위 수입니다. 이러한 메트릭을 추적하려면 Prometheus를 사용하십시오.
histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[2m]) 지표는 etcd가 멤버 간 클라이언트 요청을 복제하기 위한 왕복 시간을 보고합니다. 50 ms 미만이어야 합니다.
1.3.2. etcd를 다른 디스크로 이동
공유 디스크에서 etcd를 별도의 디스크로 이동하여 성능 문제를 방지하거나 해결할 수 있습니다.
사전 요구 사항
-
MachineConfigPool은metadata.labels[machineconfiguration.openshift.io/role]과 일치해야 합니다. 컨트롤러, 작업자 또는 사용자 지정 풀에 적용됩니다. -
노드의 스토리지 장치(예:
/dev/sdb)는 sdb와 일치해야 합니다. 파일의 모든 위치에서 이 참조를 변경합니다.
이 절차에서는 루트 파일 시스템의 일부(예: /var/ )를 설치된 노드의 다른 디스크 또는 파티션으로 이동하지 않습니다.
MCO(Machine Config Operator)는 OpenShift Container Platform 4.13 컨테이너 스토리지의 보조 디스크를 마운트합니다.
etcd를 다른 장치로 이동하려면 다음 단계를 사용하십시오.
절차
etcd-mc.yml이라는machineconfigYAML 파일을 생성하고 다음 정보를 추가합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 98-var-lib-etcd spec: config: ignition: version: 3.2.0 systemd: units: - contents: | [Unit] Description=Make File System on /dev/sdb DefaultDependencies=no BindsTo=dev-sdb.device After=dev-sdb.device var.mount Before=systemd-fsck@dev-sdb.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/systemd-makefs xfs /dev/sdb TimeoutSec=0 [Install] WantedBy=var-lib-containers.mount enabled: true name: systemd-mkfs@dev-sdb.service - contents: | [Unit] Description=Mount /dev/sdb to /var/lib/etcd Before=local-fs.target Requires=systemd-mkfs@dev-sdb.service After=systemd-mkfs@dev-sdb.service var.mount [Mount] What=/dev/sdb Where=/var/lib/etcd Type=xfs Options=defaults,prjquota [Install] WantedBy=local-fs.target enabled: true name: var-lib-etcd.mount - contents: | [Unit] Description=Sync etcd data if new mount is empty DefaultDependencies=no After=var-lib-etcd.mount var.mount Before=crio.service [Service] Type=oneshot RemainAfterExit=yes ExecCondition=/usr/bin/test ! -d /var/lib/etcd/member ExecStart=/usr/sbin/setenforce 0 ExecStart=/bin/rsync -ar /sysroot/ostree/deploy/rhcos/var/lib/etcd/ /var/lib/etcd/ ExecStart=/usr/sbin/setenforce 1 TimeoutSec=0 [Install] WantedBy=multi-user.target graphical.target enabled: true name: sync-var-lib-etcd-to-etcd.service - contents: | [Unit] Description=Restore recursive SELinux security contexts DefaultDependencies=no After=var-lib-etcd.mount Before=crio.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/restorecon -R /var/lib/etcd/ TimeoutSec=0 [Install] WantedBy=multi-user.target graphical.target enabled: true name: restorecon-var-lib-etcd.service다음 명령을 입력하여 머신 구성을 생성합니다.
$ oc login -u ${ADMIN} -p ${ADMINPASSWORD} ${API} ... output omitted ...$ oc create -f etcd-mc.yml machineconfig.machineconfiguration.openshift.io/98-var-lib-etcd created
$ oc login -u ${ADMIN} -p ${ADMINPASSWORD} ${API} [... output omitted ...]$ oc create -f etcd-mc.yml machineconfig.machineconfiguration.openshift.io/98-var-lib-etcd created
노드가 업데이트 및 재부팅됩니다. 재부팅이 완료되면 다음 이벤트가 수행됩니다.
- XFS 파일 시스템이 지정된 디스크에 생성됩니다.
-
디스크는
/var/lib/etc에 마운트됩니다. -
/sysroot/ostree/deploy/rhcos/var/lib/etcd의 콘텐츠와/var/lib/etcd입니다. -
/var/lib/etcd에 대해SELinux레이블 복원이 강제 적용됩니다. - 이전 콘텐츠는 제거되지 않습니다.
노드가 별도의 디스크에 있는 후 머신 구성 파일
etcd-mc.yml을 다음 정보로 업데이트합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 98-var-lib-etcd spec: config: ignition: version: 3.2.0 systemd: units: - contents: | [Unit] Description=Mount /dev/sdb to /var/lib/etcd Before=local-fs.target Requires=systemd-mkfs@dev-sdb.service After=systemd-mkfs@dev-sdb.service var.mount [Mount] What=/dev/sdb Where=/var/lib/etcd Type=xfs Options=defaults,prjquota [Install] WantedBy=local-fs.target enabled: true name: var-lib-etcd.mount다음 명령을 입력하여 장치를 생성하고 동기화하기 위한 논리를 제거하는 수정된 버전을 적용합니다.
$ oc replace -f etcd-mc.yml
이전 단계에서는 노드가 재부팅되지 않습니다.
1.3.3. etcd 데이터 조각 모음
대규모 및 밀도가 높은 클러스터의 경우 키 공간이 너무 커져서 공간 할당량을 초과하면 etcd 성능이 저하될 수 있습니다. etcd를 정기적으로 유지 관리하고 조각 모음하여 데이터 저장소의 공간을 확보합니다. Prometheus에서 etcd 지표를 모니터링하고 필요한 경우 조각 모음을 수행합니다. 그렇지 않으면 etcd에서 키 읽기 및 삭제만 허용하는 유지보수 모드로 클러스터를 배치하는 클러스터 전체 경보를 발생시킬 수 있습니다.
다음 주요 메트릭을 모니터링합니다.
-
etcd_server_quota_backend_bytes는 현재 할당량 제한인 -
etcd_mvcc_db_total_size_in_use_in_bytes는 기록 압축 후 실제 데이터베이스 사용량을 나타냅니다. -
etcd_mvcc_db_total_size_in_bytes.gb는 조각 모음 대기 중인 여유 공간을 포함하여 데이터베이스 크기를 표시합니다.
etcd 기록 압축과 같은 디스크 조각화를 초래하는 이벤트 후 디스크 공간을 회수하기 위해 etcd 데이터를 조각 모음합니다.
기록 압축은 5분마다 자동으로 수행되며 백엔드 데이터베이스에서 공백이 남습니다. 이 분할된 공간은 etcd에서 사용할 수 있지만 호스트 파일 시스템에서 사용할 수 없습니다. 호스트 파일 시스템에서 이 공간을 사용할 수 있도록 etcd 조각을 정리해야 합니다.
조각 모음이 자동으로 수행되지만 수동으로 트리거할 수도 있습니다.
etcd Operator는 클러스터 정보를 사용하여 사용자에게 가장 효율적인 작업을 결정하기 때문에 자동 조각 모음은 대부분의 경우에 적합합니다.
1.3.3.1. 자동 조각 모음
etcd Operator는 디스크 조각 모음을 자동으로 수행합니다. 수동 조작이 필요하지 않습니다.
다음 로그 중 하나를 확인하여 조각 모음 프로세스가 성공했는지 확인합니다.
- etcd 로그
- cluster-etcd-operator Pod
- Operator 상태 오류 로그
자동 조각 모음을 사용하면 Kubernetes 컨트롤러 관리자와 같은 다양한 OpenShift 핵심 구성 요소에서 리더 선택 오류가 발생하여 실패한 구성 요소를 다시 시작할 수 있습니다. 재시작은 무해하며 다음 실행 중인 인스턴스로 장애 조치(failover)를 트리거하거나 다시 시작한 후 구성 요소가 다시 작동을 다시 시작합니다.
성공적인 조각 모음을 위한 로그 출력 예
etcd member has been defragmented: <member_name>, memberID: <member_id>
실패한 조각 모음에 대한 로그 출력 예
failed defrag on member: <member_name>, memberID: <member_id>: <error_message>
1.3.3.2. 수동 조각 모음
Prometheus 경고는 수동 조각 모음을 사용해야 할 시기를 나타냅니다. 경고는 다음 두 가지 경우에 표시됩니다.
- etcd가 사용 가능한 공간의 50%를 10분 이상 사용하는 경우
- etcd가 총 데이터베이스 크기의 50% 미만을 10분 이상 사용하는 경우
PromQL 표현식을 사용하여 조각 모음을 통해 해제될 etcd 데이터베이스 크기를 확인함으로써 조각 모음이 필요한지 확인할 수도 있습니다. (etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_in_bytes)/1024/1024
etcd를 분리하는 것은 차단 작업입니다. 조각화가 완료될 때까지 etcd 멤버는 응답하지 않습니다. 따라서 각 pod의 조각 모음 작업 간에 클러스터가 정상 작동을 재개할 수 있도록 1분 이상 대기해야 합니다.
각 etcd 멤버의 etcd 데이터 조각 모음을 수행하려면 다음 절차를 따릅니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
절차
리더가 최종 조각화 처리를 수행하므로 어떤 etcd 멤버가 리더인지 확인합니다.
etcd pod 목록을 가져옵니다.
$ oc -n openshift-etcd get pods -l k8s-app=etcd -o wide
출력 예
etcd-ip-10-0-159-225.example.redhat.com 3/3 Running 0 175m 10.0.159.225 ip-10-0-159-225.example.redhat.com <none> <none> etcd-ip-10-0-191-37.example.redhat.com 3/3 Running 0 173m 10.0.191.37 ip-10-0-191-37.example.redhat.com <none> <none> etcd-ip-10-0-199-170.example.redhat.com 3/3 Running 0 176m 10.0.199.170 ip-10-0-199-170.example.redhat.com <none> <none>
Pod를 선택하고 다음 명령을 실행하여 어떤 etcd 멤버가 리더인지 확인합니다.
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com etcdctl endpoint status --cluster -w table
출력 예
Defaulting container name to etcdctl. Use 'oc describe pod/etcd-ip-10-0-159-225.example.redhat.com -n openshift-etcd' to see all of the containers in this pod. +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.0.191.37:2379 | 251cd44483d811c3 | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.159.225:2379 | 264c7c58ecbdabee | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.199.170:2379 | 9ac311f93915cc79 | 3.4.9 | 104 MB | true | false | 7 | 91624 | 91624 | | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
이 출력의
ISLEADER 열에 따르면https://10.0.199.170:2379엔드 포인트가 리더입니다. 이전 단계의 출력과 이 앤드 포인트가 일치하면 리더의 Pod 이름은etcd-ip-10-0199-170.example.redhat.com입니다.
etcd 멤버를 분리합니다.
실행중인 etcd 컨테이너에 연결하고 리더가 아닌 pod 이름을 전달합니다.
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com
ETCDCTL_ENDPOINTS환경 변수를 설정 해제합니다.sh-4.4# unset ETCDCTL_ENDPOINTS
etcd 멤버를 분리합니다.
sh-4.4# etcdctl --command-timeout=30s --endpoints=https://localhost:2379 defrag
출력 예
Finished defragmenting etcd member[https://localhost:2379]
시간 초과 오류가 발생하면 명령이 성공할 때까지
--command-timeout의 값을 늘립니다.데이터베이스 크기가 감소되었는지 확인합니다.
sh-4.4# etcdctl endpoint status -w table --cluster
출력 예
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.0.191.37:2379 | 251cd44483d811c3 | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.159.225:2379 | 264c7c58ecbdabee | 3.4.9 | 41 MB | false | false | 7 | 91624 | 91624 | | 1 | https://10.0.199.170:2379 | 9ac311f93915cc79 | 3.4.9 | 104 MB | true | false | 7 | 91624 | 91624 | | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+이 예에서는 etcd 멤버의 데이터베이스 크기가 시작 크기인 104MB와 달리 현재 41MB임을 보여줍니다.
다음 단계를 반복하여 다른 etcd 멤버에 연결하고 조각 모음을 수행합니다. 항상 리더의 조각 모음을 마지막으로 수행합니다.
etcd pod가 복구될 수 있도록 조각 모음 작업에서 1분 이상 기다립니다. etcd pod가 복구될 때까지 etcd 멤버는 응답하지 않습니다.
공간 할당량을 초과하여
NOSPACE경고가 발생하는 경우 이를 지우십시오.NOSPACE경고가 있는지 확인합니다.sh-4.4# etcdctl alarm list
출력 예
memberID:12345678912345678912 alarm:NOSPACE
경고를 지웁니다.
sh-4.4# etcdctl alarm disarm
2장. 오브젝트 최대값에 따른 환경 계획
OpenShift Container Platform 클러스터를 계획하는 경우 다음과 같은 테스트된 오브젝트 최대값을 고려하십시오.
이러한 지침은 가능한 가장 큰 클러스터를 기반으로 합니다. 크기가 작은 클러스터의 경우 최대값이 더 낮습니다. etcd 버전 또는 스토리지 데이터 형식을 비롯하여 명시된 임계값에 영향을 주는 요인은 여러 가지가 있습니다.
대부분의 경우 이러한 수치를 초과하면 전체 성능이 저하됩니다. 반드시 클러스터가 실패하는 것은 아닙니다.
Pod 시작 및 중지 Pod와 같이 빠른 변경이 발생하는 클러스터는 문서화된 것보다 실제 가능한 최대 크기를 줄일 수 있습니다.
2.1. OpenShift Container Platform에 대해 테스트된 클러스터 최대값(주요 릴리스)
Red Hat은 OpenShift Container Platform 클러스터 크기 조정에 대한 직접적인 지침을 제공하지 않습니다. 클러스터가 OpenShift Container Platform의 지원되는 범위 내에 있는지 여부를 결정하려면 클러스터 규모를 제한하는 모든 다차원 요소를 신중하게 고려해야 하기 때문입니다.
OpenShift Container Platform은 절대 클러스터 최대값이 아닌 테스트된 클러스터 최대값을 지원합니다. OpenShift Container Platform 버전, 컨트롤 플레인 워크로드 및 네트워크 플러그인의 모든 조합이 테스트된 것은 아니므로 다음 표가 모든 배포에 대한 스케일링을 절대 예상하지는 않습니다. 모든 측면이 동시에 최대로 확장되지 않을 수 있습니다. 이 표에는 특정 워크로드 및 배포 구성에 대해 테스트된 최대값이 포함되어 있으며 유사한 배포에서 예상되는 항목에 대한 스케일링 가이드 역할을 합니다.
| 최대값 유형 | 4.x 테스트된 최대값 |
|---|---|
| 노드 수 | 2,000 [1] |
| Pod 수 [2] | 150,000 |
| 노드당 Pod 수 | 500 [3] |
| 코어당 Pod 수 | 기본값 없음 |
| 네임스페이스 수 [4] | 10,000 |
| 빌드 수 | 10,000(기본 Pod RAM 512Mi) - S2I(Source-to-Image) 빌드 전략 |
| 네임스페이스당 Pod 수 [5] | 25,000 |
| Ingress 컨트롤러당 경로 및 백엔드 수 | 라우터당 2,000개 |
| 보안 수 | 80,000 |
| 구성 맵 수 | 90,000 |
| 다양한 서비스 [6] | 10,000 |
| 네임스페이스당 서비스 수 | 5,000 |
| 서비스당 백엔드 수 | 5,000 |
| 네임스페이스당 배포 수 [5] | 2,000 |
| 빌드 구성 수 | 12,000 |
| CRD(사용자 정의 리소스 정의) 수 | 512 [7] |
- 일시 정지 Pod는 2000 노드 규모에서 OpenShift Container Platform의 컨트롤 플레인 구성 요소를 과부하시키기 위해 배포되었습니다. 유사한 숫자로 확장하는 기능은 특정 배포 및 워크로드 매개변수에 따라 달라집니다.
- 여기에 표시된 Pod 수는 테스트 Pod 수입니다. 실제 Pod 수는 애플리케이션 메모리, CPU 및 스토리지 요구사항에 따라 달라집니다.
-
이 테스트는 작업자 노드가 100개이며 작업자 노드당 Pod가 500개인 클러스터에서 수행되었습니다. 기본
maxPods는 계속 250입니다.maxPods가 500이 되도록 하려면 사용자 정의 kubelet 구성을 사용하여500으로 설정된maxPods가 포함된 클러스터를 생성해야 합니다. 500개의 사용자 Pod가 필요한 경우 노드에서 이미 실행되고 있는 시스템 Pod가 10~15개가 있으므로hostPrefix22가 필요합니다. 연결된 PVC(영구 볼륨 클레임)가 있는 Pod의 최대 수는 PVC가 할당된 스토리지 백엔드에 따라 달라집니다. 테스트에서는 OCS v4(OpenShift Data Foundation v4)만 이 문서에서 설명하는 노드당 Pod 수를 충족할 수 있었습니다. - 활성 프로젝트 수가 많은 경우 키 공간이 지나치게 커져서 공간 할당량을 초과하면 etcd 성능이 저하될 수 있습니다. etcd 스토리지를 확보하려면 조각 모음을 포함하여 etcd에 대한 유지보수를 정기적으로 수행하는 것이 좋습니다.
- 시스템에는 일부 상태 변경에 대한 대응으로 지정된 네임스페이스의 모든 오브젝트에서 반복해야 하는 컨트롤 루프가 많습니다. 단일 네임스페이스에 지정된 유형의 오브젝트가 많이 있으면 루프 비용이 많이 들고 지정된 상태 변경 처리 속도가 느려질 수 있습니다. 이 제한을 적용하면 애플리케이션 요구사항을 충족하기에 충분한 CPU, 메모리 및 디스크가 시스템에 있다고 가정합니다.
- 각 서비스 포트와 각 서비스 백엔드는 iptables에 해당 항목이 있습니다. 지정된 서비스의 백엔드 수는 끝점 오브젝트의 크기에 영향을 미치므로 시스템 전체에서 전송되는 데이터의 크기에 영향을 미칩니다.
-
OpenShift Container Platform에는 OpenShift Container Platform에서 설치한 항목, OpenShift Container Platform 및 사용자 생성 CRD와의 통합 제품 등 512개의 총 CRD(사용자 정의 리소스 정의)가 있습니다. 512개 이상의 CRD가 생성된 경우
oc명령 요청이 제한될 수 있습니다.
2.1.1. 시나리오 예
예를 들어, 500개의 작업자 노드(m5.2xl)가 테스트되었으며 OpenShift Container Platform 4.13, OVN-Kubernetes 네트워크 플러그인 및 다음 워크로드 오브젝트를 사용하여 지원됩니다.
- 기본값 외에도 200 네임스페이스
- 노드당 Pod 60개, 서버 30개 및 클라이언트 Pod 30개(전체 30개)
- 57 이미지 스트림/ns (전체 11.4k)
- 서버 Pod에서 지원하는 서비스/시간 15개 (3k 합계)
- 이전 서비스에서 지원하는 15개의 경로/시간 (3k 합계)
- 20개의 보안/ns (4k 합계)
- 10개의 구성 맵/ns (2k 합계)
- 6개의 네트워크 정책/ns, 거부를 포함한 allow-from 수신 및 네임스페이스 내 규칙
- 57개의 빌드/시간
다음 요인은 클러스터 워크로드 스케일링에 영향을 미치는 것으로 알려져 있으며 배포를 계획할 때 스케일링 수에 반영되어야 합니다. 자세한 정보 및 지침은 영업 담당자 또는 Red Hat 지원에 문의하십시오.
- 노드당 Pod 수
- Pod당 컨테이너 수
- 사용된 프로브 유형(예: liveness/readiness, exec/http)
- 네트워크 정책 수
- 프로젝트 수 또는 네임스페이스 수
- 프로젝트당 이미지 스트림 수
- 프로젝트당 빌드 수
- 서비스/엔드포인트 및 유형
- 경로 수
- shard 수
- 보안 수
- 구성 맵 수
API 호출 속도 또는 클러스터 구성이 얼마나 빠르게 변경되는지 추정하는 클러스터 "churn"입니다.
-
5분 창에 Pod 생성 요청에 대한 Prometheus 쿼리:
sum(irate(apiserver_request_count{resources",verb="POST"}[5m]) -
5분 창을 통해 초당 모든 API 요청에 대한 Prometheus 쿼리:
sum(irate(apiserver_request_count{}[5m]))
-
5분 창에 Pod 생성 요청에 대한 Prometheus 쿼리:
- CPU의 클러스터 노드 리소스 소비
- 메모리의 클러스터 노드 리소스 사용
2.2. 클러스터 최대값 테스트를 위한 OpenShift Container Platform 환경 및 구성
2.2.1. AWS 클라우드 플랫폼
| 노드 | 플레이버 | vCPU | RAM(GiB) | 디스크 유형 | 디스크 크기(GiB)/IOS | 수량 | 리전 |
|---|---|---|---|---|---|---|---|
| 컨트롤 플레인/etcd [1] | r5.4xlarge | 16 | 128 | gp3 | 220 | 3 | us-west-2 |
| 인프라 [2] | m5.12xlarge | 48 | 192 | gp3 | 100 | 3 | us-west-2 |
| 워크로드 [3] | m5.4xlarge | 16 | 64 | gp3 | 500 [4] | 1 | us-west-2 |
| Compute | m5.2xlarge | 8 | 32 | gp3 | 100 | 3/25/250/500 [5] | us-west-2 |
- etcd는 대기 시간에 민감하기 때문에 3000 IOPS 및 125MiB의 성능이 있는 gp3 디스크는 컨트롤 플레인/etcd 노드에 사용됩니다. gp3 볼륨은 버스트 성능을 사용하지 않습니다.
- 인프라 노드는 모니터링, Ingress 및 레지스트리 구성 요소를 호스팅하는데 사용되어 대규모로 실행할 수 있는 충분한 리소스가 있는지 확인합니다.
- 워크로드 노드는 성능 및 확장 가능한 워크로드 생성기 실행 전용입니다.
- 성능 및 확장성 테스트 실행 중에 수집되는 대량의 데이터를 저장할 수 있는 충분한 공간을 확보 할 수 있도록 큰 디스크 크기가 사용됩니다.
- 클러스터는 반복적으로 확장되며 성능 및 확장성 테스트는 지정된 노드 수에 따라 실행됩니다.
2.2.2. IBM Power 플랫폼
| 노드 | vCPU | RAM(GiB) | 디스크 유형 | 디스크 크기(GiB)/IOS | 수량 |
|---|---|---|---|---|---|
| 컨트롤 플레인/etcd [1] | 16 | 32 | io1 | GiB당 120 / 10 IOPS | 3 |
| 인프라 [2] | 16 | 64 | gp2 | 120 | 2 |
| 워크로드 [3] | 16 | 256 | gp2 | 120 [4] | 1 |
| Compute | 16 | 64 | gp2 | 120 | 2~100 [5] |
- etcd는 I/O 집약적이고 지연 시간에 민감하므로 GiB당 120 / 10 IOPS가 있는 io1 디스크는 컨트롤 플레인/etcd 노드에 사용됩니다.
- 인프라 노드는 모니터링, Ingress 및 레지스트리 구성 요소를 호스팅하는데 사용되어 대규모로 실행할 수 있는 충분한 리소스가 있는지 확인합니다.
- 워크로드 노드는 성능 및 확장 가능한 워크로드 생성기 실행 전용입니다.
- 성능 및 확장성 테스트 실행 중에 수집되는 대량의 데이터를 저장할 수 있는 충분한 공간을 확보 할 수 있도록 큰 디스크 크기가 사용됩니다.
- 클러스터는 반복으로 확장됩니다.
2.2.3. IBM Z 플랫폼
| 노드 | vCPU [4] | RAM(GiB)[5] | 디스크 유형 | 디스크 크기(GiB)/IOS | 수량 |
|---|---|---|---|---|---|
| 컨트롤 플레인/etcd [1,2] | 8 | 32 | ds8k | 300 / LCU 1 | 3 |
| Compute [1,3] | 8 | 32 | ds8k | 150 / LCU 2 | 노드 4개 (노드당 100/250/500 Pod로 확장) |
- etcd는 I/O 집약적이고 지연 시간에 민감하므로 두 개의 논리 제어 단위(LCU)에 분산되어 컨트롤 플레인/etcd 노드의 디스크 I/O 로드를 최적화합니다. etcd I/O 수요가 다른 워크로드를 방해하지 않아야 합니다.
- 컴퓨팅 노드 4개가 동시에 100/250/500개의 Pod로 여러 반복을 실행하는 테스트에 사용됩니다. 먼저 유휴 Pod를 사용하여 Pod를 인스턴스할 수 있는지 평가합니다. 다음으로, 네트워크 및 CPU의 우선 순위 클라이언트/서버 워크로드가 강조되는 시스템의 안정성을 평가하는 데 사용되었습니다. 클라이언트 및 서버 Pod가 쌍으로 배포되었으며 각 쌍이 두 개의 컴퓨팅 노드에 분배되었습니다.
- 별도의 워크로드 노드가 사용되지 않았습니다. 워크로드는 두 개의 컴퓨팅 노드 간에 마이크로 서비스 워크로드를 시뮬레이션합니다.
- 사용되는 물리적 프로세서 수는 6개의 IIFL(Integrated F facility)입니다.
- 사용된 총 물리 메모리는 512GiB입니다.
2.3. 테스트된 클러스터 최대값에 따라 환경을 계획하는 방법
노드에서 물리적 리소스에 대한 서브스크립션을 초과하면 Pod를 배치하는 동안 Kubernetes 스케줄러가 보장하는 리소스에 영향을 미칩니다. 메모리 교체가 발생하지 않도록 하기 위해 수행할 수 있는 조치를 알아보십시오.
테스트된 최대값 중 일부는 단일 차원에서만 확장됩니다. 클러스터에서 실행되는 오브젝트가 많으면 최대값이 달라집니다.
이 문서에 명시된 수치는 Red Hat의 테스트 방법론, 설정, 구성, 튜닝을 기반으로 한 것입니다. 고유한 개별 설정 및 환경에 따라 수치가 달라질 수 있습니다.
환경을 계획하는 동안 노드당 몇 개의 Pod가 적합할 것으로 예상되는지 결정하십시오.
required pods per cluster / pods per node = total number of nodes needed
노드당 기본 최대 Pod 수는 250입니다. 하지만 노드에 적합한 Pod 수는 애플리케이션 자체에 따라 달라집니다. "애플리케이션 요구 사항에 따라 환경을 계획하는 방법"에 설명된 대로 애플리케이션의 메모리, CPU 및 스토리지 요구 사항을 고려하십시오.
시나리오 예
클러스터당 2,200개의 Pod로 클러스터 규모를 지정하려면 노드당 최대 500개의 Pod가 있다고 가정하여 최소 5개의 노드가 있어야 합니다.
2200 / 500 = 4.4
노드 수를 20으로 늘리면 Pod 배포는 노드당 110개 Pod로 변경됩니다.
2200 / 20 = 110
다음과 같습니다.
required pods per cluster / total number of nodes = expected pods per node
OpenShift Container Platform에는 SDN, DNS, Operator 등과 같은 여러 시스템 Pod가 제공되며 기본적으로 모든 작업자 노드에서 실행됩니다. 따라서 위 공식의 결과는 다를 수 있습니다.
2.4. 애플리케이션 요구사항에 따라 환경을 계획하는 방법
예에 나온 애플리케이션 환경을 고려해 보십시오.
| Pod 유형 | Pod 수량 | 최대 메모리 | CPU 코어 수 | 영구 스토리지 |
|---|---|---|---|---|
| apache | 100 | 500MB | 0.5 | 1GB |
| node.js | 200 | 1GB | 1 | 1GB |
| postgresql | 100 | 1GB | 2 | 10GB |
| JBoss EAP | 100 | 1GB | 1 | 1GB |
예상 요구사항은 CPU 코어 550개, RAM 450GB 및 스토리지 1.4TB입니다.
노드의 인스턴스 크기는 기본 설정에 따라 높게 또는 낮게 조정될 수 있습니다. 노드에서는 리소스 초과 커밋이 발생하는 경우가 많습니다. 이 배포 시나리오에서는 동일한 양의 리소스를 제공하는 데 더 작은 노드를 추가로 실행하도록 선택할 수도 있고 더 적은 수의 더 큰 노드를 실행하도록 선택할 수도 있습니다. 운영 민첩성 및 인스턴스당 비용과 같은 요인을 고려해야 합니다.
| 노드 유형 | 수량 | CPU | RAM(GB) |
|---|---|---|---|
| 노드(옵션 1) | 100 | 4 | 16 |
| 노드(옵션 2) | 50 | 8 | 32 |
| 노드(옵션 3) | 25 | 16 | 64 |
어떤 애플리케이션은 초과 커밋된 환경에 적합하지만 어떤 애플리케이션은 그렇지 않습니다. 대부분의 Java 애플리케이션과 대규모 페이지를 사용하는 애플리케이션은 초과 커밋에 적합하지 않은 애플리케이션의 예입니다. 해당 메모리는 다른 애플리케이션에 사용할 수 없습니다. 위의 예에 나온 환경에서는 초과 커밋이 약 30%이며, 이는 일반적으로 나타나는 비율입니다.
애플리케이션 Pod는 환경 변수 또는 DNS를 사용하여 서비스에 액세스할 수 있습니다. 환경 변수를 사용하는 경우 노드에서 Pod가 실행될 때 활성 서비스마다 kubelet을 통해 변수를 삽입합니다. 클러스터 인식 DNS 서버는 새로운 서비스의 Kubernetes API를 확인하고 각각에 대해 DNS 레코드 세트를 생성합니다. 클러스터 전체에서 DNS가 활성화된 경우 모든 Pod가 자동으로 해당 DNS 이름을 통해 서비스를 확인할 수 있어야 합니다. 서비스가 5,000개를 넘어야 하는 경우 DNS를 통한 서비스 검색을 사용할 수 있습니다. 서비스 검색에 환경 변수를 사용하는 경우 네임스페이스에서 서비스가 5,000개를 넘은 후 인수 목록이 허용되는 길이를 초과하면 Pod 및 배포가 실패하기 시작합니다. 이 문제를 해결하려면 배포의 서비스 사양 파일에서 서비스 링크를 비활성화하십시오.
---
apiVersion: template.openshift.io/v1
kind: Template
metadata:
name: deployment-config-template
creationTimestamp:
annotations:
description: This template will create a deploymentConfig with 1 replica, 4 env vars and a service.
tags: ''
objects:
- apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
name: deploymentconfig${IDENTIFIER}
spec:
template:
metadata:
labels:
name: replicationcontroller${IDENTIFIER}
spec:
enableServiceLinks: false
containers:
- name: pause${IDENTIFIER}
image: "${IMAGE}"
ports:
- containerPort: 8080
protocol: TCP
env:
- name: ENVVAR1_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR2_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR3_${IDENTIFIER}
value: "${ENV_VALUE}"
- name: ENVVAR4_${IDENTIFIER}
value: "${ENV_VALUE}"
resources: {}
imagePullPolicy: IfNotPresent
capabilities: {}
securityContext:
capabilities: {}
privileged: false
restartPolicy: Always
serviceAccount: ''
replicas: 1
selector:
name: replicationcontroller${IDENTIFIER}
triggers:
- type: ConfigChange
strategy:
type: Rolling
- apiVersion: v1
kind: Service
metadata:
name: service${IDENTIFIER}
spec:
selector:
name: replicationcontroller${IDENTIFIER}
ports:
- name: serviceport${IDENTIFIER}
protocol: TCP
port: 80
targetPort: 8080
clusterIP: ''
type: ClusterIP
sessionAffinity: None
status:
loadBalancer: {}
parameters:
- name: IDENTIFIER
description: Number to append to the name of resources
value: '1'
required: true
- name: IMAGE
description: Image to use for deploymentConfig
value: gcr.io/google-containers/pause-amd64:3.0
required: false
- name: ENV_VALUE
description: Value to use for environment variables
generate: expression
from: "[A-Za-z0-9]{255}"
required: false
labels:
template: deployment-config-template
네임스페이스에서 실행할 수 있는 애플리케이션 Pod 수는 서비스 검색에 환경 변수가 사용될 때 서비스 수와 서비스 이름의 길이에 따라 달라집니다. ARG_MAX 는 새 프로세스의 최대 인수 길이를 정의하고 기본적으로 2097152바이트(2MiB)로 설정됩니다. Kubelet은 네임스페이스에서 실행되도록 예약된 각 pod에 환경 변수를 삽입합니다. 여기에는 다음이 포함됩니다.
-
<SERVICE_NAME>_SERVICE_HOST=<IP> -
<SERVICE_NAME>_SERVICE_PORT=<PORT> -
<SERVICE_NAME>_PORT=tcp://<IP>:<PORT> -
<SERVICE_NAME>_PORT_<PORT>_TCP=tcp://<IP>:<PORT> -
<SERVICE_NAME>_PORT_<PORT>_TCP_PROTO=tcp -
<SERVICE_NAME>_PORT_<PORT>_TCP_PORT=<PORT> -
<SERVICE_NAME>_PORT_<PORT>_TCP_ADDR=<ADDR>
인수 길이가 허용된 값을 초과하고 서비스 이름의 문자 수에 영향을 미치는 경우 네임스페이스의 Pod가 실패합니다. 예를 들어, 5000개의 서비스가 있는 네임스페이스에서 서비스 이름의 제한은 33자이며, 네임스페이스에서 5000개의 Pod를 실행할 수 있습니다.
3장. IBM Z & IBM (R) LinuxONE 환경에 대한 호스트 관련 권장 사례
이 주제에서는 IBM Z 및 IBM® LinuxONE의 OpenShift Container Platform에 대한 권장 호스트 사례를 설명합니다.
s390x 아키텍처는 여러 측면에서 고유합니다. 따라서 여기에 언급된 몇 가지 권장 사항은 다른 플랫폼에 적용되지 않을 수 있습니다.
달리 명시되지 않는 한, 이러한 사례는 IBM Z 및 IBM® LinuxONE의 z/VM 및 RHEL(Red Hat Enterprise Linux) KVM 설치에 모두 적용됩니다.
3.1. CPU 과다 할당 관리
고도로 가상화된 IBM Z 환경에서는 인프라 설정 및 크기를 신중하게 계획해야 합니다. 가상화의 가장 중요한 기능 중 하나는 리소스 과다 할당 기능을 통해 하이퍼바이저 수준에서 실제로 사용 가능한 것보다 더 많은 리소스를 가상 머신에 할당하는 기능입니다. 이는 매우 워크로드에 따라 다르며 모든 설정에 적용할 수 있는 golden 규칙이 없습니다.
설정에 따라 CPU 과다 할당에 대한 다음 모범 사례를 고려하십시오.
- LPAR 수준(PR/SM 하이퍼바이저)에서 사용 가능한 모든 물리적 코어(IFL)를 각 LPAR에 할당하지 마십시오. 예를 들어 4개의 물리적 IFL을 사용할 수 있는 경우 각각 4개의 논리 IFL으로 3개의 LPAR을 정의해서는 안 됩니다.
- LPAR 공유 및 가중치를 확인하고 이해하십시오.
- 과도한 수의 가상 CPU는 성능에 부정적인 영향을 미칠 수 있습니다. 논리 프로세서가 LPAR에 정의되는 것보다 더 많은 가상 프로세서를 게스트에 정의하지 마십시오.
- 최대 워크로드가 아닌 게스트당 가상 프로세서 수를 구성합니다.
- 작은 작업을 시작하고 워크로드를 모니터링합니다. 필요한 경우 vCPU 수를 증분적으로 늘립니다.
- 모든 워크로드가 높은 오버 커밋 비율에 적합하지는 않습니다. 워크로드가 CPU 집약적인 경우 성능 문제 없이 높은 비율을 얻을 수 없습니다. I/O 집약적인 워크로드는 높은 오버 커밋 비율에서도 일관된 성능을 유지할 수 있습니다.
3.2. 투명한 대규모 페이지 비활성화
THP(투명한 대규모 페이지)는 대규모 페이지를 생성, 관리 및 사용하는 대부분의 측면을 자동화합니다. THP는 대규모 페이지를 자동으로 관리하므로 모든 유형의 워크로드에 대해 항상 최적으로 처리되지는 않습니다. THP는 많은 애플리케이션이 자체적으로 대규모 페이지를 처리하므로 성능 저하를 유발할 수 있습니다. 따라서 THP를 비활성화하는 것이 좋습니다.
3.3. Receive Flow Gettering을 사용하여 네트워킹 성능 향상
receive Flow Gettering (RFS)은 네트워크 대기 시간을 추가로 줄여 Receive Packettektonering (RPS)을 확장합니다. RFS는 기술적으로 RPS를 기반으로 하며 CPU 캐시 적중 속도를 증가시켜 패킷 처리의 효율성을 향상시킵니다. RFS는 이를 수행하며, 추가로 큐 길이를 고려하며, 계산에 가장 편리한 CPU를 확인하여 캐시 적중이 CPU 내에서 발생할 가능성이 높아집니다. 따라서 CPU 캐시가 무효화되므로 캐시를 다시 빌드하기 위해 사이클이 줄어듭니다. 이는 패킷 처리 시간을 줄이는 데 도움이 될 수 있습니다.
3.3.1. MCO(Machine Config Operator)를 사용하여 RFS를 활성화합니다.
절차
다음 MCO 샘플 프로필을 YAML 파일에 복사합니다. 예를 들어
enable-rfs.yaml은 다음과 같습니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 50-enable-rfs spec: config: ignition: version: 2.2.0 storage: files: - contents: source: data:text/plain;charset=US-ASCII,%23%20turn%20on%20Receive%20Flow%20Steering%20%28RFS%29%20for%20all%20network%20interfaces%0ASUBSYSTEM%3D%3D%22net%22%2C%20ACTION%3D%3D%22add%22%2C%20RUN%7Bprogram%7D%2B%3D%22/bin/bash%20-c%20%27for%20x%20in%20/sys/%24DEVPATH/queues/rx-%2A%3B%20do%20echo%208192%20%3E%20%24x/rps_flow_cnt%3B%20%20done%27%22%0A filesystem: root mode: 0644 path: /etc/udev/rules.d/70-persistent-net.rules - contents: source: data:text/plain;charset=US-ASCII,%23%20define%20sock%20flow%20enbtried%20for%20%20Receive%20Flow%20Steering%20%28RFS%29%0Anet.core.rps_sock_flow_entries%3D8192%0A filesystem: root mode: 0644 path: /etc/sysctl.d/95-enable-rps.confMCO 프로필을 생성합니다.
$ oc create -f enable-rfs.yaml
50-enable-rfs항목이 나열되어 있는지 확인합니다.$ oc get mc
비활성화하려면 다음을 입력합니다.
$ oc delete mc 50-enable-rfs
3.4. 네트워킹 설정 선택
네트워킹 스택은 OpenShift Container Platform과 같은 Kubernetes 기반 제품의 가장 중요한 구성 요소 중 하나입니다. IBM Z 설정의 경우 네트워킹 설정은 선택한 하이퍼바이저에 따라 다릅니다. 워크로드 및 애플리케이션에 따라 최적은 일반적으로 사용 사례 및 트래픽 패턴에 따라 변경됩니다.
설정에 따라 다음 모범 사례를 고려하십시오.
- 트래픽 패턴을 최적화하기 위해 네트워킹 장치에 관한 모든 옵션을 고려하십시오. OSA-Express, RoCE Express, HiperSockets, z/VM VSwitch, Linux Bridge(KVM) 등의 이점을 살펴보십시오.
- 항상 사용 가능한 최신 NIC 버전을 사용하십시오. 예를 들어 OSA Express 7S 10GbE는 둘 다 10GbE 어댑터이지만 트랜잭션 워크로드 유형의 OSA Express 6S 10GbE와 비교하여 큰 개선을 보여줍니다.
- 각 가상 스위치는 추가 대기 시간 계층을 추가합니다.
- 로드 밸런서는 클러스터 외부의 네트워크 통신에 중요한 역할을 합니다. 애플리케이션에 중요한 경우 프로덕션 수준의 하드웨어 로드 밸런서를 사용하는 것이 좋습니다.
- OpenShift Container Platform SDN에는 네트워킹 성능에 영향을 미치는 흐름과 규칙이 도입되었습니다. 통신이 중요한 서비스의 현지성을 활용하기 위해 Pod의 범위와 배치를 고려해야 합니다.
- 성능과 기능 간의 장단점을 조정합니다.
3.5. z/VM에서 HyperPAV를 사용하여 디스크 성능 확인
DASD 및 ECKD 장치는 IBM Z 환경에서 일반적으로 사용되는 디스크 유형입니다. z/VM 환경에서 일반적인 OpenShift Container Platform 설정에서 DASD 디스크는 일반적으로 노드의 로컬 스토리지를 지원하는 데 사용됩니다. HyperPAV 별칭 장치를 설정하여 z/VM 게스트를 지원하는 DASD 디스크에 더 많은 처리량과 전반적인 I/O 성능을 제공할 수 있습니다.
로컬 스토리지 장치에 HyperPAV를 사용하면 상당한 성능 이점을 얻을 수 있습니다. 그러나 처리량과 CPU 비용 사이에 장단점이 있음을 알고 있어야 합니다.
3.5.1. MCO(Machine Config Operator)를 사용하여 z/VM 풀팩 미니 디스크를 사용하여 노드에서 HyperPAV 별칭을 활성화합니다.
풀팩 미니 디스크를 사용하는 z/VM 기반 OpenShift Container Platform 설정의 경우 모든 노드에서 HyperPAV 별칭을 활성화하여 MCO 프로필의 이점을 활용할 수 있습니다. 컨트롤 플레인 및 컴퓨팅 노드 모두에 YAML 구성을 추가해야 합니다.
절차
다음 MCO 샘플 프로필을 컨트롤 플레인 노드의 YAML 파일에 복사합니다. 예를 들면
05-master-kernelarg-hpav.yaml과 같습니다.$ cat 05-master-kernelarg-hpav.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 05-master-kernelarg-hpav spec: config: ignition: version: 3.1.0 kernelArguments: - rd.dasd=800-805다음 MCO 샘플 프로필을 계산 노드의 YAML 파일에 복사합니다. 예를 들면
05-worker-kernelarg-hpav.yaml과 같습니다.$ cat 05-worker-kernelarg-hpav.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 05-worker-kernelarg-hpav spec: config: ignition: version: 3.1.0 kernelArguments: - rd.dasd=800-805참고장치 ID에 맞게
rd.dasd인수를 수정해야 합니다.MCO 프로필을 생성합니다.
$ oc create -f 05-master-kernelarg-hpav.yaml
$ oc create -f 05-worker-kernelarg-hpav.yaml
비활성화하려면 다음을 입력합니다.
$ oc delete -f 05-master-kernelarg-hpav.yaml
$ oc delete -f 05-worker-kernelarg-hpav.yaml
3.6. IBM Z 호스트의 RHEL KVM 권장 사항
KVM 가상 서버 환경을 최적화하려면 가상 서버의 워크로드와 사용 가능한 리소스에 따라 달라집니다. 한 환경에서의 성능을 향상시키는 동일한 동작이 다른 환경에서 부작용을 일으킬 수 있습니다. 특정 설정에 가장 적합한 균형을 찾는 것은 문제가 될 수 있으며 종종 실험이 포함됩니다.
다음 섹션에서는 IBM Z 및 IBM® LinuxONE 환경에서 RHEL KVM과 함께 OpenShift Container Platform을 사용할 때 몇 가지 모범 사례를 소개합니다.
3.6.1. VirtIO 네트워크 인터페이스에 여러 큐 사용
여러 가상 CPU를 사용하면 수신 및 발신 패킷에 대해 여러 큐를 제공하는 경우 패키지를 병렬로 전송할 수 있습니다. driver 요소의 queues 특성을 사용하여 여러 큐를 구성합니다. 가상 서버의 가상 CPU 수를 초과하지 않는 최소 2의 정수를 지정합니다.
다음 예제 사양은 네트워크 인터페이스에 대해 두 개의 입력 및 출력 대기열을 구성합니다.
<interface type="direct">
<source network="net01"/>
<model type="virtio"/>
<driver ... queues="2"/>
</interface>여러 대기열은 네트워크 인터페이스에 향상된 성능을 제공하도록 설계되었지만 메모리와 CPU 리소스도 사용합니다. 사용 중인 인터페이스에 대해 두 개의 대기열 정의로 시작합니다. 다음으로 트래픽이 적거나 사용 중인 인터페이스를 위해 대기열이 두 개 이상 있는 인터페이스에 대해 대기열을 두 개 이상 시도합니다.
3.6.2. 가상 블록 장치에 I/O 스레드 사용
가상 블록 장치에서 I/O 스레드를 사용하려면 가상 서버 및 각 가상 블록 장치에 대해 하나 이상의 I/O 스레드를 구성하여 이러한 I/O 스레드 중 하나를 사용해야 합니다.
다음 예제에서는 연속적인 10진수 스레드 1, 2 및 3으로 세 개의 I/O 스레드를 구성하도록 <iothreads ></iothreads>를 지정합니다. iothread="2" 매개변수는 ID 2에 I/O 스레드를 사용하도록 디스크 장치의 driver 요소를 지정합니다.
I/O 스레드 사양 샘플
... <domain> <iothreads>3</iothreads>1 ... <devices> ... <disk type="block" device="disk">2 <driver ... iothread="2"/> </disk> ... </devices> ... </domain>
스레드는 디스크 장치의 I/O 작업 성능을 향상시킬 수 있지만 메모리 및 CPU 리소스도 사용합니다. 동일한 스레드를 사용하도록 여러 장치를 구성할 수 있습니다. 스레드를 장치에 가장 잘 매핑하는 것은 사용 가능한 리소스 및 워크로드에 따라 다릅니다.
소수의 I/O 스레드로 시작합니다. 종종 모든 디스크 장치에 대한 단일 I/O 스레드로 충분합니다. 가상 CPU 수보다 더 많은 스레드를 구성하지 말고 유휴 스레드를 구성하지 마십시오.
virsh iothreadadd 명령을 사용하여 특정 스레드 ID가 있는 I/O 스레드를 실행 중인 가상 서버에 추가할 수 있습니다.
3.6.3. 가상 SCSI 장치 방지
SCSI 특정 인터페이스를 통해 장치를 처리해야 하는 경우에만 가상 SCSI 장치를 구성합니다. 호스트의 백업에 관계없이 디스크 공간을 가상 SCSI 장치가 아닌 가상 블록 장치로 구성합니다.
그러나 다음 사항에는 SCSI 관련 인터페이스가 필요할 수 있습니다.
- 호스트의 SCSI 연결 풋프린트 드라이브에 대한 LUN입니다.
- 가상 DVD 드라이브에 마운트된 호스트 파일 시스템의 DVD ISO 파일입니다.
3.6.4. 디스크에 대한 게스트 캐싱 구성
호스트가 아닌 게스트가 캐싱하도록 디스크 장치를 구성합니다.
디스크 장치의 driver 요소에 cache="none" 및 io="native" 매개변수가 포함되어 있는지 확인합니다.
<disk type="block" device="disk">
<driver name="qemu" type="raw" cache="none" io="native" iothread="1"/>
...
</disk>3.6.5. 메모리 balloon 장치 제외
동적 메모리 크기가 필요하지 않은 경우 메모리 balloon 장치를 정의하고 libvirt가 사용자를 생성하지 않도록 합니다. memballoon 매개변수를 도메인 구성 XML 파일의 devices 요소의 하위로 포함합니다.
활성 프로필 목록을 확인합니다.
<memballoon model="none"/>
3.6.6. 호스트 스케줄러의 CPU 마이그레이션 알고리즘 튜닝
해당 영향을 이해하는 전문가가 아닌 한 스케줄러 설정을 변경하지 마십시오. 프로덕션 시스템에 변경 사항을 테스트하지 않고 원하는 효과가 있는지 확인하지 마십시오.
kernel.sched_migration_cost_ns 매개변수는 나노초 단위로 시간 간격을 지정합니다. 작업을 마지막으로 실행한 후 CPU 캐시는 이 간격이 만료될 때까지 유용한 콘텐츠를 갖는 것으로 간주됩니다. 이 간격을 늘리면 작업 마이그레이션이 줄어듭니다. 기본값은 500000 ns입니다.
실행 가능한 프로세스가 있을 때 CPU 유휴 시간이 예상보다 높은 경우 이 간격을 줄입니다. CPU 또는 노드 간에 작업이 너무 자주 수행되면 이를 늘리십시오.
간격을 60000 ns로 동적으로 설정하려면 다음 명령을 입력합니다.
# sysctl kernel.sched_migration_cost_ns=60000
값을 60000 ns로 영구적으로 변경하려면 /etc/sysctl.conf 에 다음 항목을 추가합니다.
kernel.sched_migration_cost_ns=60000
3.6.7. cpuset cgroup 컨트롤러 비활성화
이 설정은 cgroups 버전 1이 있는 KVM 호스트에만 적용됩니다. 호스트에서 CPU 핫플러그를 활성화하려면 cgroup 컨트롤러를 비활성화합니다.
절차
-
선택한 편집기를 사용하여
/etc/libvirt/qemu.conf를 엽니다. -
cgroup_controllers행으로 이동합니다. - 전체 행을 복제하고 복사본에서 선행 숫자 기호(#)를 제거합니다.
cpuset항목을 다음과 같이 제거합니다.cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuacct" ]
새 설정을 적용하려면 libvirtd 데몬을 다시 시작해야 합니다.
- 모든 가상 머신을 중지합니다.
다음 명령을 실행합니다.
# systemctl restart libvirtd
- 가상 머신을 재시작합니다.
이 설정은 호스트를 재부팅해도 유지됩니다.
3.6.8. 유휴 상태의 가상 CPU의 폴링 기간 조정
가상 CPU가 유휴 상태가 되면 KVM은 호스트 리소스를 할당하기 전에 가상 CPU에 대한 대기 상태를 폴링합니다. 폴링이 /sys/module/kvm/parameters/halt_poll_ns 에서 sysfs에서 수행되는 시간 간격을 지정할 수 있습니다. 지정된 시간 동안 폴링을 통해 리소스 사용량을 고려하여 가상 CPU에 대한 대기 시간이 줄어듭니다. 워크로드에 따라 폴링에 더 길거나 짧은 시간이 유용할 수 있습니다. 시간 간격은 나노초로 지정됩니다. 기본값은 50000 ns입니다.
CPU 사용량을 최적화하려면 작은 값을 입력하거나 0을 작성하여 폴링을 비활성화합니다.
# echo 0 > /sys/module/kvm/parameters/halt_poll_ns
짧은 대기 시간을 최적화하려면 트랜잭션 워크로드와 같이 큰 값을 입력합니다.
# echo 80000 > /sys/module/kvm/parameters/halt_poll_ns
4장. Node Tuning Operator 사용
Node Tuning Operator에 대해 알아보고, Node Tuning Operator를 사용하여 Tuned 데몬을 오케스트레이션하고 노드 수준 튜닝을 관리하는 방법도 알아봅니다.
4.1. Node Tuning Operator 정보
Node Tuning Operator는 TuneD 데몬을 오케스트레이션하고 Performance Profile 컨트롤러를 사용하여 짧은 대기 시간 성능을 실현하여 노드 수준 튜닝을 관리하는 데 도움이 됩니다. 대부분의 고성능 애플리케이션에는 일정 수준의 커널 튜닝이 필요합니다. Node Tuning Operator는 노드 수준 sysctls 사용자에게 통합 관리 인터페이스를 제공하며 사용자의 필요에 따라 지정되는 사용자 정의 튜닝을 추가할 수 있는 유연성을 제공합니다.
Operator는 OpenShift Container Platform의 컨테이너화된 TuneD 데몬을 Kubernetes 데몬 세트로 관리합니다. 클러스터에서 실행되는 모든 컨테이너화된 TuneD 데몬에 사용자 정의 튜닝 사양이 데몬이 이해할 수 있는 형식으로 전달되도록 합니다. 데몬은 클러스터의 모든 노드에서 노드당 하나씩 실행됩니다.
컨테이너화된 TuneD 데몬을 통해 적용되는 노드 수준 설정은 프로필 변경을 트리거하는 이벤트 시 또는 컨테이너화된 TuneD 데몬이 종료 신호를 수신하고 처리하여 정상적으로 종료될 때 롤백됩니다.
Node Tuning Operator는 Performance Profile 컨트롤러를 사용하여 OpenShift Container Platform 애플리케이션에 대해 짧은 대기 시간 성능을 실현하도록 자동 튜닝을 구현합니다. 클러스터 관리자는 다음과 같은 노드 수준 설정을 정의하도록 성능 프로필을 구성합니다.
- 커널을 kernel-rt로 업데이트.
- 하우스키핑을 위한 CPU 선택.
- 워크로드 실행을 위한 CPU 선택.
현재 cgroup v2에서는 CPU 부하 분산을 비활성화하지 않습니다. 따라서 cgroup v2가 활성화된 경우 성능 프로필에서 원하는 동작을 얻지 못할 수 있습니다. performace 프로필을 사용하는 경우 cgroup v2를 활성화하는 것은 권장되지 않습니다.
버전 4.1 이상에서는 Node Tuning Operator가 표준 OpenShift Container Platform 설치에 포함되어 있습니다.
이전 버전의 OpenShift Container Platform에서는 Performance Addon Operator를 사용하여 OpenShift 애플리케이션에 대한 대기 시간을 단축할 수 있도록 자동 튜닝을 구현했습니다. OpenShift Container Platform 4.11 이상에서는 이 기능은 Node Tuning Operator의 일부입니다.
4.2. Node Tuning Operator 사양 예에 액세스
이 프로세스를 사용하여 Node Tuning Operator 사양 예에 액세스하십시오.
절차
다음 명령을 실행하여 Node Tuning Operator 사양 예제에 액세스합니다.
$ oc get Tuned/default -o yaml -n openshift-cluster-node-tuning-operator
기본 CR은 OpenShift Container Platform 플랫폼의 표준 노드 수준 튜닝을 제공하기 위한 것이며 Operator 관리 상태를 설정하는 경우에만 수정할 수 있습니다. Operator는 기본 CR에 대한 다른 모든 사용자 정의 변경사항을 덮어씁니다. 사용자 정의 튜닝의 경우 고유한 Tuned CR을 생성합니다. 새로 생성된 CR은 노드 또는 Pod 라벨 및 프로필 우선 순위에 따라 OpenShift Container Platform 노드에 적용된 기본 CR 및 사용자 정의 튜닝과 결합됩니다.
특정 상황에서는 Pod 라벨에 대한 지원이 필요한 튜닝을 자동으로 제공하는 편리한 방법일 수 있지만 이러한 방법은 권장되지 않으며 특히 대규모 클러스터에서는 이러한 방법을 사용하지 않는 것이 좋습니다. 기본 Tuned CR은 Pod 라벨이 일치되지 않은 상태로 제공됩니다. Pod 라벨이 일치된 상태로 사용자 정의 프로필이 생성되면 해당 시점에 이 기능이 활성화됩니다. Pod 레이블 기능은 Node Tuning Operator의 향후 버전에서 더 이상 사용되지 않습니다.
4.3. 클러스터에 설정된 기본 프로필
다음은 클러스터에 설정된 기본 프로필입니다.
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: default
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=Optimize systems running OpenShift (provider specific parent profile)
include=-provider-${f:exec:cat:/var/lib/tuned/provider},openshift
name: openshift
recommend:
- profile: openshift-control-plane
priority: 30
match:
- label: node-role.kubernetes.io/master
- label: node-role.kubernetes.io/infra
- profile: openshift-node
priority: 40
OpenShift Container Platform 4.9부터 모든 OpenShift TuneD 프로필이 TuneD 패키지와 함께 제공됩니다. oc exec 명령을 사용하여 이러한 프로필의 내용을 볼 수 있습니다.
$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/openshift{,-control-plane,-node} -name tuned.conf -exec grep -H ^ {} \;4.4. TuneD 프로필이 적용되었는지 검증
클러스터 노드에 적용되는 TuneD 프로필을 확인합니다.
$ oc get profile -n openshift-cluster-node-tuning-operator
출력 예
NAME TUNED APPLIED DEGRADED AGE master-0 openshift-control-plane True False 6h33m master-1 openshift-control-plane True False 6h33m master-2 openshift-control-plane True False 6h33m worker-a openshift-node True False 6h28m worker-b openshift-node True False 6h28m
-
NAME: Profile 오브젝트의 이름입니다. 노드당 하나의 Profile 오브젝트가 있고 해당 이름이 일치합니다. -
TUNED: 적용할 TuneD 프로파일의 이름입니다. -
APPLIED: TuneD 데몬이 원하는 프로필을 적용한 경우True입니다. (True/False/Unknown). -
DEGRADED: TuneD 프로파일 적용 중에 오류가 보고된 경우 (True)./False/Unknown -
AGE: Profile 개체 생성 이후 경과 시간입니다.
ClusterOperator/node-tuning 오브젝트에는 Operator 및 해당 노드 에이전트의 상태에 대한 유용한 정보도 포함되어 있습니다. 예를 들어 Operator의 잘못된 구성은 ClusterOperator/node-tuning 상태 메시지에 의해 보고됩니다.
ClusterOperator/node-tuning 오브젝트에 대한 상태 정보를 얻으려면 다음 명령을 실행합니다.
$ oc get co/node-tuning -n openshift-cluster-node-tuning-operator
출력 예
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE node-tuning 4.13.1 True False True 60m 1/5 Profiles with bootcmdline conflict
ClusterOperator/node-tuning 또는 프로파일 오브젝트의 상태가 DEGRADED 인 경우 Operator 또는 피연산자 로그에 추가 정보가 제공됩니다.
4.5. 사용자 정의 튜닝 사양
Operator의 CR(사용자 정의 리소스)에는 두 가지 주요 섹션이 있습니다. 첫 번째 섹션인 profile:은 TuneD 프로필 및 해당 이름의 목록입니다. 두 번째인 recommend:은 프로필 선택 논리를 정의합니다.
여러 사용자 정의 튜닝 사양은 Operator의 네임스페이스에 여러 CR로 존재할 수 있습니다. 새로운 CR의 존재 또는 오래된 CR의 삭제는 Operator에서 탐지됩니다. 기존의 모든 사용자 정의 튜닝 사양이 병합되고 컨테이너화된 TuneD 데몬의 해당 오브젝트가 업데이트됩니다.
관리 상태
Operator 관리 상태는 기본 Tuned CR을 조정하여 설정됩니다. 기본적으로 Operator는 Managed 상태이며 기본 Tuned CR에는 spec.managementState 필드가 없습니다. Operator 관리 상태에 유효한 값은 다음과 같습니다.
- Managed: 구성 리소스가 업데이트되면 Operator가 해당 피연산자를 업데이트합니다.
- Unmanaged: Operator가 구성 리소스에 대한 변경을 무시합니다.
- Removed: Operator가 프로비저닝한 해당 피연산자 및 리소스를 Operator가 제거합니다.
프로필 데이터
profile: 섹션에는 TuneD 프로필 및 해당 이름이 나열됩니다.
profile:
- name: tuned_profile_1
data: |
# TuneD profile specification
[main]
summary=Description of tuned_profile_1 profile
[sysctl]
net.ipv4.ip_forward=1
# ... other sysctl's or other TuneD daemon plugins supported by the containerized TuneD
# ...
- name: tuned_profile_n
data: |
# TuneD profile specification
[main]
summary=Description of tuned_profile_n profile
# tuned_profile_n profile settings권장 프로필
profile: 선택 논리는 CR의 recommend: 섹션에 의해 정의됩니다. recommend: 섹션은 선택 기준에 따라 프로필을 권장하는 항목의 목록입니다.
recommend: <recommend-item-1> # ... <recommend-item-n>
목록의 개별 항목은 다음과 같습니다.
- machineConfigLabels: 1 <mcLabels> 2 match: 3 <match> 4 priority: <priority> 5 profile: <tuned_profile_name> 6 operand: 7 debug: <bool> 8 tunedConfig: reapply_sysctl: <bool> 9
- 1
- 선택 사항:
- 2
- 키/값
MachineConfig라벨 사전입니다. 키는 고유해야 합니다. - 3
- 생략하면 우선 순위가 높은 프로필이 먼저 일치되거나
machineConfigLabels가 설정되어 있지 않으면 프로필이 일치하는 것으로 가정합니다. - 4
- 선택사항 목록입니다.
- 5
- 프로필 순서 지정 우선 순위입니다. 숫자가 작을수록 우선 순위가 높습니다(
0이 가장 높은 우선 순위임). - 6
- 일치에 적용할 TuneD 프로필입니다. 예를 들어
tuned_profile_1이 있습니다. - 7
- 선택적 피연산자 구성입니다.
- 8
- TuneD 데몬에 대해 디버깅을 켜거나 끕니다. 옵션은 on 또는
false의 경우true입니다. 기본값은false입니다. - 9
- TuneD 데몬에 대해
reapply_sysctl기능을 켜거나 끄십시오. on 및 off의 경우옵션이true입니다.
<match>는 다음과 같이 재귀적으로 정의되는 선택사항 목록입니다.
- label: <label_name> 1 value: <label_value> 2 type: <label_type> 3 <match> 4
<match>를 생략하지 않으면 모든 중첩 <match> 섹션도 true로 평가되어야 합니다. 생략하면 false로 가정하고 해당 <match> 섹션이 있는 프로필을 적용하지 않거나 권장하지 않습니다. 따라서 중첩(하위 <match> 섹션)은 논리 AND 연산자 역할을 합니다. 반대로 <match> 목록의 항목이 일치하면 전체 <match> 목록이 true로 평가됩니다. 따라서 이 목록이 논리 OR 연산자 역할을 합니다.
machineConfigLabels가 정의되면 지정된 recommend: 목록 항목에 대해 머신 구성 풀 기반 일치가 설정됩니다. <mcLabels>는 머신 구성의 라벨을 지정합니다. 머신 구성은 <tuned_profile_name> 프로필에 대해 커널 부팅 매개변수와 같은 호스트 설정을 적용하기 위해 자동으로 생성됩니다. 여기에는 <mcLabels>와 일치하는 머신 구성 선택기가 있는 모든 머신 구성 풀을 찾고 머신 구성 풀이 할당된 모든 노드에서 <tuned_profile_name> 프로필을 설정하는 작업이 포함됩니다. 마스터 및 작업자 역할이 모두 있는 노드를 대상으로 하려면 마스터 역할을 사용해야 합니다.
목록 항목 match 및 machineConfigLabels는 논리 OR 연산자로 연결됩니다. match 항목은 단락 방식으로 먼저 평가됩니다. 따라서 true로 평가되면 machineConfigLabels 항목이 고려되지 않습니다.
머신 구성 풀 기반 일치를 사용하는 경우 동일한 하드웨어 구성을 가진 노드를 동일한 머신 구성 풀로 그룹화하는 것이 좋습니다. 이 방법을 따르지 않으면 TuneD 피연산자가 동일한 머신 구성 풀을 공유하는 두 개 이상의 노드에 대해 충돌하는 커널 매개변수를 계산할 수 있습니다.
예: 노드 또는 Pod 라벨 기반 일치
- match:
- label: tuned.openshift.io/elasticsearch
match:
- label: node-role.kubernetes.io/master
- label: node-role.kubernetes.io/infra
type: pod
priority: 10
profile: openshift-control-plane-es
- match:
- label: node-role.kubernetes.io/master
- label: node-role.kubernetes.io/infra
priority: 20
profile: openshift-control-plane
- priority: 30
profile: openshift-node
위의 CR은 컨테이너화된 TuneD 데몬의 프로필 우선 순위에 따라 recommended.conf 파일로 변환됩니다. 우선 순위가 가장 높은 프로필(10)이 openshift-control-plane-es이므로 이 프로필을 첫 번째로 고려합니다. 지정된 노드에서 실행되는 컨테이너화된 TuneD 데몬은 tuned.openshift.io/elasticsearch 라벨이 설정된 동일한 노드에서 실행되는 Pod가 있는지 확인합니다. 없는 경우 전체 <match> 섹션이 false로 평가됩니다. 라벨이 있는 Pod가 있는 경우 <match> 섹션을 true로 평가하려면 노드 라벨도 node-role.kubernetes.io/master 또는 node-role.kubernetes.io/infra여야 합니다.
우선 순위가 10인 프로필의 라벨이 일치하면 openshift-control-plane-es 프로필이 적용되고 다른 프로필은 고려되지 않습니다. 노드/Pod 라벨 조합이 일치하지 않으면 두 번째로 높은 우선 순위 프로필(openshift-control-plane)이 고려됩니다. 컨테이너화된 TuneD Pod가 node-role.kubernetes.io/master 또는 node-role.kubernetes.io/infra. 라벨이 있는 노드에서 실행되는 경우 이 프로필이 적용됩니다.
마지막으로, openshift-node 프로필은 우선 순위가 가장 낮은 30입니다. 이 프로필에는 <match> 섹션이 없으므로 항상 일치합니다. 지정된 노드에서 우선 순위가 더 높은 다른 프로필이 일치하지 않는 경우 openshift-node 프로필을 설정하는 데 catch-all 프로필 역할을 합니다.

예: 머신 구성 풀 기반 일치
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: openshift-node-custom
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=Custom OpenShift node profile with an additional kernel parameter
include=openshift-node
[bootloader]
cmdline_openshift_node_custom=+skew_tick=1
name: openshift-node-custom
recommend:
- machineConfigLabels:
machineconfiguration.openshift.io/role: "worker-custom"
priority: 20
profile: openshift-node-custom
노드 재부팅을 최소화하려면 머신 구성 풀의 노드 선택기와 일치하는 라벨로 대상 노드에 라벨을 지정한 후 위의 Tuned CR을 생성하고 마지막으로 사용자 정의 머신 구성 풀을 생성합니다.
클라우드 공급자별 TuneD 프로필
이 기능을 사용하면 모든 클라우드 공급자별 노드에 편리하게 OpenShift Container Platform 클러스터의 특정 클라우드 공급자에 맞게 조정된 TuneD 프로필을 할당할 수 있습니다. 이 작업은 노드 레이블을 추가하거나 노드를 머신 구성 풀로 그룹화하지 않고 수행할 수 있습니다.
이 기능은 spec.providerID 노드 오브젝트 값을 < cloud-provider>://<cloud-provider-specific-id > 형식으로 활용하고 NTO 피연산자 컨테이너에서 < cloud-provider> 값으로 파일을 작성합니다. 그러면 이러한 프로필이 있는 경우 TuneD에서 provider-< /var/lib/tuned/provider cloud-provider > 프로필을 로드하는 데 이 파일의 콘텐츠를 사용합니다.
및 openshift -control-planeopenshift-node 프로필이 모두 설정을 상속하는 openshift 프로필이 이제 조건부 프로파일 로드를 통해 이 기능을 사용하도록 업데이트되었습니다. 현재 NTO 및 TuneD에는 클라우드 공급자별 프로필이 포함되어 있지 않습니다. 그러나 모든 클라우드 공급자별 클러스터 노드에 적용되는 사용자 지정 프로필 provider-<cloud- provider>를 생성할 수 있습니다.
GCE 클라우드 공급자 프로파일의 예
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: provider-gce
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=GCE Cloud provider-specific profile
# Your tuning for GCE Cloud provider goes here.
name: provider-gce
프로파일 없음으로 인해 provider-< cloud-provider > 프로필에 지정된 모든 설정은 openshift 프로필 및 해당 하위 프로필에서 덮어씁니다.
4.6. 사용자 정의 튜닝 예
기본 CR에서 TuneD 프로파일 사용
다음 CR에서는 tuned.openshift.io/ingress-node-label 레이블이 임의의 값으로 설정된 OpenShift Container Platform 노드에 대해 사용자 정의 노드 수준 튜닝을 적용합니다.
예: openshift-control-plane TuneD 프로필을 사용한 사용자 정의 튜닝
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: ingress
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=A custom OpenShift ingress profile
include=openshift-control-plane
[sysctl]
net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.tcp_tw_reuse=1
name: openshift-ingress
recommend:
- match:
- label: tuned.openshift.io/ingress-node-label
priority: 10
profile: openshift-ingress
사용자 정의 프로필 작성자는 기본 TuneD CR에 제공된 기본 Tuned 데몬 프로필을 포함하는 것이 좋습니다. 위의 예에서는 기본 openshift-control-plane 프로필을 사용하여 작업을 수행합니다.
내장된 TuneD 프로필 사용
NTO 관리 데몬 세트가 성공적으로 롤아웃되면 TuneD 피연산자는 모두 동일한 버전의 TuneD 데몬을 관리합니다. 데몬에서 지원하는 기본 제공 TuneD 프로필을 나열하려면 다음 방식으로 TuneD Pod를 쿼리합니다.
$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/ -name tuned.conf -printf '%h\n' | sed 's|^.*/||'
사용자 정의 튜닝 사양에서 이 명령으로 검색한 프로필 이름을 사용할 수 있습니다.
예: 기본 제공 hpc-compute TuneD 프로필 사용
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: openshift-node-hpc-compute
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=Custom OpenShift node profile for HPC compute workloads
include=openshift-node,hpc-compute
name: openshift-node-hpc-compute
recommend:
- match:
- label: tuned.openshift.io/openshift-node-hpc-compute
priority: 20
profile: openshift-node-hpc-compute
기본 제공 hpc-compute 프로필 외에도 위의 예제에는 기본 Tuned CR 내에 제공된 openshift-node TuneD 데몬 프로필이 포함되어 컴퓨팅 노드에 OpenShift별 튜닝을 사용합니다.
호스트 수준 sysctl 덮어쓰기
/run/sysctl.d/, /etc/sysctl.d/, /etc/sysctl.conf 호스트 구성 파일을 사용하여 다양한 커널 매개변수를 런타임 시 변경할 수 있습니다. OpenShift Container Platform은 런타임에 커널 매개변수를 설정하는 여러 호스트 구성 파일을 추가합니다(예: net.ipv[4-6]., fs.inotify., vm.max_map_count ). 이러한 런타임 매개변수는 kubelet 및 Operator가 시작되기 전에 시스템에 기본 기능 튜닝을 제공합니다.
reapply_sysctl 옵션이 false 로 설정되지 않은 한 Operator는 이러한 설정을 재정의하지 않습니다. 이 옵션을 false 로 설정하면 TuneD 가 사용자 지정 프로필을 적용한 후 호스트 구성 파일의 설정을 적용하지 않습니다.
예: 호스트 수준 sysctl 덮어쓰기
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: openshift-no-reapply-sysctl
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=Custom OpenShift profile
include=openshift-node
[sysctl]
vm.max_map_count=>524288
name: openshift-no-reapply-sysctl
recommend:
- match:
- label: tuned.openshift.io/openshift-no-reapply-sysctl
priority: 15
profile: openshift-no-reapply-sysctl
operand:
tunedConfig:
reapply_sysctl: false
4.7. 지원되는 TuneD 데몬 플러그인
Tuned CR의 profile: 섹션에 정의된 사용자 정의 프로필을 사용하는 경우 [main] 섹션을 제외한 다음 TuneD 플러그인이 지원됩니다.
- audio
- cpu
- disk
- eeepc_she
- modules
- mounts
- net
- scheduler
- scsi_host
- selinux
- sysctl
- sysfs
- usb
- video
- vm
- bootloader
일부 플러그인에서 제공하는 동적 튜닝 기능은 지원되지 않습니다. 다음 TuneD 플러그인은 현재 지원되지 않습니다.
- script
- systemd
TuneD 부트로더 플러그인은 현재 RHCOS(Red Hat Enterprise Linux CoreOS) 8.x 작업자 노드에서 지원됩니다. RHEL(Red Hat Enterprise Linux) 7.x 작업자 노드의 경우 TuneD 부트로더 플러그인이 현재 지원되지 않습니다.
참고 자료
4.8. 호스팅된 클러스터에서 노드 튜닝 구성
호스트 컨트롤 플레인은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
호스팅된 클러스터의 노드에 노드 수준 튜닝을 설정하려면 Node Tuning Operator를 사용할 수 있습니다. 호스팅된 컨트롤 플레인에서는 Tuned 오브젝트가 포함된 구성 맵을 생성하고 노드 풀에서 해당 구성 맵을 참조하여 노드 튜닝을 구성할 수 있습니다.
절차
유효한 tuned 매니페스트를 포함하는 구성 맵을 생성하고 노드 풀에서 매니페스트를 참조합니다. 다음 예제에서
Tuned매니페스트는 값이 있는tuned-1-node-label노드 라벨이 포함된 노드에서vm.dirty_ratio를 55로 설정하는 프로필을 정의합니다.tuned-1.yaml이라는 파일에 다음ConfigMap매니페스트를 저장합니다.apiVersion: v1 kind: ConfigMap metadata: name: tuned-1 namespace: clusters data: tuning: | apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: tuned-1 namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom OpenShift profile include=openshift-node [sysctl] vm.dirty_ratio="55" name: tuned-1-profile recommend: - priority: 20 profile: tuned-1-profile참고Tuned 사양의
spec.recommend섹션에 있는 항목에 레이블을 추가하지 않으면 노드 풀 기반 일치로 가정하므로spec.recommend섹션의 우선 순위 프로필이 풀의 노드에 적용됩니다. Tuned.spec.recommend.match섹션에서 레이블 값을 설정하여 더 세분화된 node-label-based 일치를 수행할 수 있지만 노드 풀의.spec.management.upgradeType값을InPlace로 설정하지 않으면 업그레이드 중에 노드 라벨이 유지되지 않습니다.관리 클러스터에
ConfigMap오브젝트를 생성합니다.$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-1.yaml
노드 풀을 편집하거나 생성하여 노드 풀의
spec.tuningConfig필드에서ConfigMap오브젝트를 참조합니다. 이 예에서는 2개의 노드가 포함된nodepool-1이라는NodePool만 있다고 가정합니다.apiVersion: hypershift.openshift.io/v1alpha1 kind: NodePool metadata: ... name: nodepool-1 namespace: clusters ... spec: ... tuningConfig: - name: tuned-1 status: ...참고여러 노드 풀에서 동일한 구성 맵을 참조할 수 있습니다. 호스트 컨트롤 플레인에서 Node Tuning Operator는 노드 풀 이름과 네임스페이스의 해시를 구분하기 위해 Tuned CR의 이름에 추가합니다. 이 경우 동일한 호스팅 클러스터의 Tuned CR에서 동일한 이름의 TuneD 프로필을 여러 개 생성하지 마십시오.
검증
이제 Tuned 매니페스트가 포함된 ConfigMap 오브젝트를 생성하고 NodePool 에서 참조했기 때문에 Node Tuning Operator는 Tuned 오브젝트를 호스트 클러스터에 동기화합니다. 어떤 Tuned 오브젝트가 정의되고 각 노드에 적용되는 TuneD 프로필을 확인할 수 있습니다.
호스팅 클러스터의
Tuned오브젝트를 나열합니다.$ oc --kubeconfig="$HC_KUBECONFIG" get Tuneds -n openshift-cluster-node-tuning-operator
출력 예
NAME AGE default 7m36s rendered 7m36s tuned-1 65s
호스팅된 클러스터의
Profile오브젝트를 나열합니다.$ oc --kubeconfig="$HC_KUBECONFIG" get Profiles -n openshift-cluster-node-tuning-operator
출력 예
NAME TUNED APPLIED DEGRADED AGE nodepool-1-worker-1 tuned-1-profile True False 7m43s nodepool-1-worker-2 tuned-1-profile True False 7m14s
참고사용자 정의 프로필이 생성되지 않으면
openshift-node프로필이 기본적으로 적용됩니다.튜닝이 올바르게 적용되었는지 확인하려면 노드에서 디버그 쉘을 시작하고 sysctl 값을 확인합니다.
$ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host sysctl vm.dirty_ratio
출력 예
vm.dirty_ratio = 55
4.9. 커널 부팅 매개변수를 설정하여 호스팅 클러스터의 고급 노드 튜닝
호스트 컨트롤 플레인은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
커널 부팅 매개변수를 설정해야 하는 호스팅 컨트롤 플레인의 고급 튜닝을 위해 Node Tuning Operator를 사용할 수도 있습니다. 다음 예제에서는 대규모 페이지가 예약된 노드 풀을 생성하는 방법을 보여줍니다.
절차
크기가 2MB인 10개의 대규모 페이지를 생성하기 위한
Tuned오브젝트 매니페스트가 포함된ConfigMap오브젝트를 생성합니다.tuned-hugepages.yaml이라는 파일에 이ConfigMap매니페스트를 저장합니다.apiVersion: v1 kind: ConfigMap metadata: name: tuned-hugepages namespace: clusters data: tuning: | apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: hugepages namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Boot time configuration for hugepages include=openshift-node [bootloader] cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 name: openshift-node-hugepages recommend: - priority: 20 profile: openshift-node-hugepages참고.spec.recommend.match필드는 의도적으로 비어 있습니다. 이 경우 이Tuned오브젝트는 이ConfigMap오브젝트가 참조되는 노드 풀의 모든 노드에 적용됩니다. 동일한 하드웨어 구성을 가진 노드를 동일한 노드 풀로 그룹화합니다. 그렇지 않으면 TuneD 피연산자가 동일한 노드 풀을 공유하는 두 개 이상의 노드에 대해 충돌하는 커널 매개변수를 계산할 수 있습니다.관리 클러스터에
ConfigMap오브젝트를 생성합니다.$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-hugepages.yaml
NodePool매니페스트 YAML 파일을 생성하고NodePool의 업그레이드 유형을 사용자 지정하고spec.tuningConfig섹션에서 생성한ConfigMap오브젝트를 참조합니다.NodePool매니페스트를 생성하고hypershiftCLI를 사용하여hugepages-nodepool.yaml이라는 파일에 저장합니다.NODEPOOL_NAME=hugepages-example INSTANCE_TYPE=m5.2xlarge NODEPOOL_REPLICAS=2 hypershift create nodepool aws \ --cluster-name $CLUSTER_NAME \ --name $NODEPOOL_NAME \ --node-count $NODEPOOL_REPLICAS \ --instance-type $INSTANCE_TYPE \ --render > hugepages-nodepool.yamlhugepages-nodepool.yaml파일에서.spec.management.upgradeType을InPlace.Place.spec.tuningConfig로 설정하고 생성한tuned-hugepagesConfigMap오브젝트를 참조하도록 .spec.tuningConfig를 설정합니다.apiVersion: hypershift.openshift.io/v1alpha1 kind: NodePool metadata: name: hugepages-nodepool namespace: clusters ... spec: management: ... upgradeType: InPlace ... tuningConfig: - name: tuned-hugepages참고새
MachineConfig개체를 적용할 때 노드의 불필요한 재생성을 방지하려면.spec.management.upgradeType을InPlace로 설정합니다.Replace업그레이드 유형을 사용하는 경우 TuneD 피연산자가 계산된 새 커널 부팅 매개변수를 적용하면 노드가 완전히 삭제되고 새 노드가 교체될 수 있습니다.관리 클러스터에
NodePool을 생성합니다.$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f hugepages-nodepool.yaml
검증
노드를 사용할 수 있게 되면 컨테이너화된 TuneD 데몬은 적용된 TuneD 프로필을 기반으로 필요한 커널 부팅 매개변수를 계산합니다. 노드가 준비되고 재부팅되면 생성된 MachineConfig 오브젝트를 적용한 후 TuneD 프로필이 적용되고 커널 부팅 매개변수가 설정되어 있는지 확인할 수 있습니다.
호스팅 클러스터의
Tuned오브젝트를 나열합니다.$ oc --kubeconfig="$HC_KUBECONFIG" get Tuneds -n openshift-cluster-node-tuning-operator
출력 예
NAME AGE default 123m hugepages-8dfb1fed 1m23s rendered 123m
호스팅된 클러스터의
Profile오브젝트를 나열합니다.$ oc --kubeconfig="$HC_KUBECONFIG" get Profiles -n openshift-cluster-node-tuning-operator
출력 예
NAME TUNED APPLIED DEGRADED AGE nodepool-1-worker-1 openshift-node True False 132m nodepool-1-worker-2 openshift-node True False 131m hugepages-nodepool-worker-1 openshift-node-hugepages True False 4m8s hugepages-nodepool-worker-2 openshift-node-hugepages True False 3m57s
새
NodePool의 두 작업자 노드에는openshift-node-hugepages프로필이 적용됩니다.튜닝이 올바르게 적용되었는지 확인하려면 노드에서 디버그 쉘을 시작하고
/proc/cmdline을 확인합니다.$ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host cat /proc/cmdline
출력 예
BOOT_IMAGE=(hd0,gpt3)/ostree/rhcos-... hugepagesz=2M hugepages=50
추가 리소스
호스팅된 컨트롤 플레인에 대한 자세한 내용은 호스팅 컨트롤 플레인 (기술 프리뷰) 을 참조하십시오.
5장. CPU 관리자 및 토폴로지 관리자 사용
CPU 관리자는 CPU 그룹을 관리하고 워크로드를 특정 CPU로 제한합니다.
CPU 관리자는 다음과 같은 속성 중 일부가 포함된 워크로드에 유용합니다.
- 가능한 한 많은 CPU 시간이 필요합니다.
- 프로세서 캐시 누락에 민감합니다.
- 대기 시간이 짧은 네트워크 애플리케이션입니다.
- 다른 프로세스와 조정하고 단일 프로세서 캐시 공유를 통해 얻는 이점이 있습니다.
토폴로지 관리자는 동일한 NUMA(Non-Uniform Memory Access) 노드의 모든 QoS(Quality of Service) 클래스에 대해 CPU 관리자, 장치 관리자, 기타 힌트 공급자로부터 힌트를 수집하여 CPU, SR-IOV VF, 기타 장치 리소스 등의 Pod 리소스를 정렬합니다.
토폴로지 관리자는 토폴로지 관리자 정책 및 요청된 Pod 리소스를 기반으로 수집된 팁의 토폴로지 정보를 사용하여 노드에서 Pod를 수락하거나 거부할 수 있는지 결정합니다.
토폴로지 관리자는 하드웨어 가속기를 사용하여 대기 시간이 중요한 실행과 처리량이 높은 병렬 계산을 지원하는 워크로드에 유용합니다.
토폴로지 관리자를 사용하려면 정적 정책을 사용하여 CPU 관리자를 구성해야 합니다.
5.1. CPU 관리자 설정
프로세스
선택사항: 노드에 레이블을 지정합니다.
# oc label node perf-node.example.com cpumanager=true
CPU 관리자를 활성화해야 하는 노드의
MachineConfigPool을 편집합니다. 이 예에서는 모든 작업자의 CPU 관리자가 활성화됩니다.# oc edit machineconfigpool worker
작업자 머신 구성 풀에 레이블을 추가합니다.
metadata: creationTimestamp: 2020-xx-xxx generation: 3 labels: custom-kubelet: cpumanager-enabledKubeletConfig,cpumanager-kubeletconfig.yaml, CR(사용자 정의 리소스)을 생성합니다. 이전 단계에서 생성한 레이블을 참조하여 올바른 노드가 새 kubelet 구성으로 업데이트되도록 합니다.machineConfigPoolSelector섹션을 참조하십시오.apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cpumanager-enabled spec: machineConfigPoolSelector: matchLabels: custom-kubelet: cpumanager-enabled kubeletConfig: cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s 2동적 kubelet 구성을 생성합니다.
# oc create -f cpumanager-kubeletconfig.yaml
그러면 kubelet 구성에 CPU 관리자 기능이 추가되고 필요한 경우 MCO(Machine Config Operator)가 노드를 재부팅합니다. CPU 관리자를 활성화하는 데는 재부팅이 필요하지 않습니다.
병합된 kubelet 구성을 확인합니다.
# oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7
출력 예
"ownerReferences": [ { "apiVersion": "machineconfiguration.openshift.io/v1", "kind": "KubeletConfig", "name": "cpumanager-enabled", "uid": "7ed5616d-6b72-11e9-aae1-021e1ce18878" } ]작업자에서 업데이트된
kubelet.conf를 확인합니다.# oc debug node/perf-node.example.com sh-4.2# cat /host/etc/kubernetes/kubelet.conf | grep cpuManager
출력 예
cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s 2
코어를 하나 이상 요청하는 Pod를 생성합니다. 제한 및 요청 둘 다 해당 CPU 값이 정수로 설정되어야 합니다. 해당 숫자는 이 Pod 전용으로 사용할 코어 수입니다.
# cat cpumanager-pod.yaml
출력 예
apiVersion: v1 kind: Pod metadata: generateName: cpumanager- spec: containers: - name: cpumanager image: gcr.io/google_containers/pause-amd64:3.0 resources: requests: cpu: 1 memory: "1G" limits: cpu: 1 memory: "1G" nodeSelector: cpumanager: "true"Pod를 생성합니다.
# oc create -f cpumanager-pod.yaml
레이블 지정한 노드에 Pod가 예약되어 있는지 검증합니다.
# oc describe pod cpumanager
출력 예
Name: cpumanager-6cqz7 Namespace: default Priority: 0 PriorityClassName: <none> Node: perf-node.example.com/xxx.xx.xx.xxx ... Limits: cpu: 1 memory: 1G Requests: cpu: 1 memory: 1G ... QoS Class: Guaranteed Node-Selectors: cpumanager=truecgroups가 올바르게 설정되었는지 검증합니다.pause프로세스의 PID(프로세스 ID)를 가져옵니다.# ├─init.scope │ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 17 └─kubepods.slice ├─kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice │ ├─crio-b5437308f1a574c542bdf08563b865c0345c8f8c0b0a655612c.scope │ └─32706 /pause
QoS(Quality of Service) 계층
Guaranteed의 Pod는kubepods.slice에 있습니다. 다른 QoS 계층의 Pod는kubepods의 하위cgroups에 있습니다.# cd /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice/crio-b5437308f1ad1a7db0574c542bdf08563b865c0345c86e9585f8c0b0a655612c.scope # for i in `ls cpuset.cpus tasks` ; do echo -n "$i "; cat $i ; done
출력 예
cpuset.cpus 1 tasks 32706
작업에 허용되는 CPU 목록을 확인합니다.
# grep ^Cpus_allowed_list /proc/32706/status
출력 예
Cpus_allowed_list: 1
GuaranteedPod용으로 할당된 코어에서는 시스템의 다른 Pod(이 경우burstableQoS 계층의 Pod)를 실행할 수 없는지 검증합니다.# cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc494a073_6b77_11e9_98c0_06bba5c387ea.slice/crio-c56982f57b75a2420947f0afc6cafe7534c5734efc34157525fa9abbf99e3849.scope/cpuset.cpus 0 # oc describe node perf-node.example.com
출력 예
... Capacity: attachable-volumes-aws-ebs: 39 cpu: 2 ephemeral-storage: 124768236Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 8162900Ki pods: 250 Allocatable: attachable-volumes-aws-ebs: 39 cpu: 1500m ephemeral-storage: 124768236Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 7548500Ki pods: 250 ------- ---- ------------ ---------- --------------- ------------- --- default cpumanager-6cqz7 1 (66%) 1 (66%) 1G (12%) 1G (12%) 29m Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 1440m (96%) 1 (66%)
이 VM에는 두 개의 CPU 코어가 있습니다.
system-reserved설정은 500밀리코어로 설정되었습니다. 즉,Node Allocatable양이 되는 노드의 전체 용량에서 한 코어의 절반이 감산되었습니다.Allocatable CPU는 1500 밀리코어임을 확인할 수 있습니다. 즉, Pod마다 하나의 전체 코어를 사용하므로 CPU 관리자 Pod 중 하나를 실행할 수 있습니다. 전체 코어는 1000밀리코어에 해당합니다. 두 번째 Pod를 예약하려고 하면 시스템에서 해당 Pod를 수락하지만 Pod가 예약되지 않습니다.NAME READY STATUS RESTARTS AGE cpumanager-6cqz7 1/1 Running 0 33m cpumanager-7qc2t 0/1 Pending 0 11s
5.2. 토폴로지 관리자 정책
토폴로지 관리자는 CPU 관리자 및 장치 관리자와 같은 힌트 공급자로부터 토폴로지 힌트를 수집하고 수집된 힌트로 Pod 리소스를 정렬하는 방법으로 모든 QoS(Quality of Service) 클래스의 Pod 리소스를 정렬합니다.
토폴로지 관리자는 cpumanager-enabled 라는 KubeletConfig CR(사용자 정의 리소스)에서 할당하는 네 가지 할당 정책을 지원합니다.
none정책- 기본 정책으로, 토폴로지 정렬을 수행하지 않습니다.
best-effort정책-
best-effort토폴로지 관리 정책을 사용하는 Pod의 각 컨테이너에서는 kubelet이 각 힌트 공급자를 호출하여 해당 리소스 가용성을 검색합니다. 토폴로지 관리자는 이 정보를 사용하여 해당 컨테이너의 기본 NUMA 노드 선호도를 저장합니다. 선호도를 기본 설정하지 않으면 토폴로지 관리자가 해당 정보를 저장하고 노드에 대해 Pod를 허용합니다. restricted정책-
restricted토폴로지 관리 정책을 사용하는 Pod의 각 컨테이너에서는 kubelet이 각 힌트 공급자를 호출하여 해당 리소스 가용성을 검색합니다. 토폴로지 관리자는 이 정보를 사용하여 해당 컨테이너의 기본 NUMA 노드 선호도를 저장합니다. 선호도를 기본 설정하지 않으면 토폴로지 관리자가 노드에서 이 Pod를 거부합니다. 그러면 Pod는Terminated상태가 되고 Pod 허용 실패가 발생합니다. single-numa-node정책-
single-numa-node토폴로지 관리 정책을 사용하는 Pod의 각 컨테이너에서는 kubelet이 각 힌트 공급자를 호출하여 해당 리소스 가용성을 검색합니다. 토폴로지 관리자는 이 정보를 사용하여 단일 NUMA 노드 선호도가 가능한지 여부를 결정합니다. 가능한 경우 노드에 대해 Pod가 허용됩니다. 단일 NUMA 노드 선호도가 가능하지 않은 경우 토폴로지 관리자가 노드에서 Pod를 거부합니다. 그러면 Pod는 Terminated 상태가 되고 Pod 허용 실패가 발생합니다.
5.3. 토폴로지 관리자 설정
토폴로지 관리자를 사용하려면 cpumanager-enabled 라는 KubeletConfig CR(사용자 정의 리소스)에서 할당 정책을 구성해야 합니다. CPU 관리자를 설정한 경우 해당 파일이 존재할 수 있습니다. 파일이 없으면 파일을 생성할 수 있습니다.
전제 조건
-
CPU 관리자 정책을
static으로 구성하십시오.
절차
토폴로지 관리자를 활성화하려면 다음을 수행합니다.
사용자 정의 리소스에서 토폴로지 관리자 할당 정책을 구성합니다.
$ oc edit KubeletConfig cpumanager-enabled
apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cpumanager-enabled spec: machineConfigPoolSelector: matchLabels: custom-kubelet: cpumanager-enabled kubeletConfig: cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s topologyManagerPolicy: single-numa-node 2
5.4. Pod와 토폴로지 관리자 정책 간의 상호 작용
아래 Pod 사양의 예는 Pod와 토폴로지 관리자 간 상호 작용을 보여주는 데 도움이 됩니다.
다음 Pod는 리소스 요청 또는 제한이 지정되어 있지 않기 때문에 BestEffort QoS 클래스에서 실행됩니다.
spec:
containers:
- name: nginx
image: nginx
다음 Pod는 요청이 제한보다 작기 때문에 Burstable QoS 클래스에서 실행됩니다.
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
선택한 정책이 none이 아니면 토폴로지 관리자는 이러한 Pod 사양 중 하나를 고려하지 않습니다.
아래 마지막 예의 Pod는 요청이 제한과 동일하기 때문에 Guaranteed QoS 클래스에서 실행됩니다.
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "2"
example.com/device: "1"
requests:
memory: "200Mi"
cpu: "2"
example.com/device: "1"토폴로지 관리자는 이러한 Pod를 고려합니다. 토폴로지 관리자는 포드에 대한 토폴로지 힌트 힌트를 얻으려면 CPU 관리자 및 장치 관리자인 힌트 공급자를 참조합니다.
토폴로지 관리자는 이 정보를 사용하여 이 컨테이너에 가장 적합한 토폴로지를 저장합니다. 이 Pod의 경우 CPU 관리자와 장치 관리자는 리소스 할당 단계에서 이러한 저장된 정보를 사용합니다.
6장. NUMA 인식 워크로드 예약
NUMA 인식 스케줄링과 OpenShift Container Platform 클러스터에 고성능 워크로드를 배포하는 데 사용할 수 있는 방법을 알아봅니다.
NUMA Resources Operator를 사용하면 동일한 NUMA 영역에서 고성능 워크로드를 예약할 수 있습니다. 사용 가능한 클러스터 노드 NUMA 리소스 및 워크로드를 관리하는 보조 스케줄러를 보고하는 노드 리소스를 배포합니다.
6.1. NUMA 인식 스케줄링 정보
NUMA(Non-Uniform Memory Access)는 다른 CPU가 다른 속도로 다른 메모리 영역에 액세스할 수 있는 컴퓨팅 플랫폼 아키텍처입니다. NUMA 리소스 토폴로지는 컴퓨팅 노드에서 서로 상대적인 CPU, 메모리 및 PCI 장치의 위치를 나타냅니다. 공동 배치 리소스는 동일한 NUMA 영역에 있다고 합니다. 고성능 애플리케이션의 경우 클러스터는 단일 NUMA 영역에서 Pod 워크로드를 처리해야 합니다.
NUMA 아키텍처를 사용하면 여러 메모리 컨트롤러가 있는 CPU가 메모리가 있는 위치에 관계없이 CPU 복잡성에서 사용 가능한 메모리를 사용할 수 있습니다. 이를 통해 성능을 저하시킬 수 있는 유연성이 향상됩니다. NUMA 영역 외부에 있는 메모리를 사용하여 워크로드를 처리하는 CPU는 단일 NUMA 영역에서 처리된 워크로드보다 속도가 느립니다. 또한 I/O 제한 워크로드의 경우 원격 NUMA 영역의 네트워크 인터페이스가 애플리케이션에 도달할 수 있는 속도가 느려집니다. 통신 워크로드와 같은 고성능 워크로드는 이러한 조건에서 사양으로 작동할 수 없습니다. NUMA 인식 예약은 동일한 NUMA 영역에서 요청된 클러스터 컴퓨팅 리소스(CPU, 메모리, 장치)를 정렬하여 대기 시간에 민감한 또는 고성능 워크로드를 효율적으로 처리합니다. NUMA 인식 스케줄링은 리소스 효율성을 높이기 위해 컴퓨팅 노드당 Pod 밀도도 향상시킵니다.
Node Tuning Operator의 성능 프로필을 NUMA 인식 스케줄링과 통합하면 대기 시간에 민감한 워크로드의 성능을 최적화하도록 CPU 선호도를 추가로 구성할 수 있습니다.
기본 OpenShift Container Platform Pod 스케줄러 스케줄링 논리는 개별 NUMA 영역이 아닌 전체 컴퓨팅 노드의 사용 가능한 리소스를 고려합니다. kubelet 토폴로지 관리자에서 가장 제한적인 리소스 정렬이 요청되면 노드에 Pod를 허용할 때 오류 상태가 발생할 수 있습니다. 반대로, 가장 제한적인 리소스 정렬이 요청되지 않으면 적절한 리소스 정렬 없이 노드에 Pod가 허용되어 성능이 저하되거나 예측되지 않을 수 있습니다. 예를 들어, 토폴로지 유사성 오류 상태를 사용한 runaway Pod 생성은 Pod 스케줄러가 Pod의 요청된 리소스를 사용할 수 있는지 여부를 인식하지 못하여 보장된 Pod 워크로드에 대해 차선적 스케줄링 결정을 내릴 때 발생할 수 있습니다. 불일치 결정에 따라 무기한 Pod 시작 지연이 발생할 수 있습니다. 또한 클러스터 상태 및 리소스 할당에 따라 잘못된 Pod 예약 결정에 따라 시작 시도가 실패하여 클러스터에 추가 로드가 발생할 수 있습니다.
NUMA 리소스 Operator는 사용자 정의 NUMA 리소스 보조 스케줄러 및 기타 리소스를 배포하여 기본 OpenShift Container Platform Pod 스케줄러의 단점에 대해 완화합니다. 다음 다이어그램에서는 NUMA 인식 Pod 스케줄링에 대한 상위 수준 개요를 제공합니다.
그림 6.1. NUMA 인식 스케줄링 개요

- NodeResourceTopology API
-
NodeResourceTopologyAPI는 각 컴퓨팅 노드에서 사용 가능한 NUMA 영역 리소스를 설명합니다. - NUMA 인식 스케줄러
-
NUMA 인식 보조 스케줄러는
NodeResourceTopologyAPI에서 사용 가능한 NUMA 영역에 대한 정보를 수신하고 최적으로 처리할 수 있는 노드에 고성능 워크로드를 예약합니다. - 노드 토폴로지 내보내기
-
노드 토폴로지 내보내기는 각 컴퓨팅 노드에 대해
NodeResourceTopologyAPI에 사용 가능한 NUMA 영역 리소스를 노출합니다. 노드 토폴로지 내보내기 데몬은PodResourcesAPI를 사용하여 kubelet에서 리소스 할당을 추적합니다. - PodResources API
PodResourcesAPI는 각 노드의 로컬이며 리소스 토폴로지 및 사용 가능한 리소스를 kubelet에 노출합니다.참고PodResourcesAPI의List끝점은 특정 컨테이너에 할당된 전용 CPU를 노출합니다. API는 공유 풀에 속하는 CPU를 노출하지 않습니다.GetAllocatableResources끝점은 노드에서 사용 가능한 할당 가능한 리소스를 노출합니다.
추가 리소스
- 클러스터에서 보조 Pod 스케줄러를 실행하는 방법과 보조 Pod 스케줄러를 사용하여 Pod를 배포하는 방법에 대한 자세한 내용은 보조 스케줄러 를 사용하여 Pod 예약을 참조하십시오.
6.2. NUMA Resources Operator 설치
NUMA 리소스 Operator는 NUMA 인식 워크로드 및 배포를 예약할 수 있는 리소스를 배포합니다. OpenShift Container Platform CLI 또는 웹 콘솔을 사용하여 NUMA 리소스 Operator를 설치할 수 있습니다.
6.2.1. CLI를 사용하여 NUMA 리소스 Operator 설치
클러스터 관리자는 CLI를 사용하여 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
NUMA Resources Operator의 네임스페이스를 생성합니다.
nro-namespace.yaml파일에 다음 YAML을 저장합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-numaresources
다음 명령을 실행하여
NamespaceCR을 생성합니다.$ oc create -f nro-namespace.yaml
NUMA 리소스 Operator의 Operator 그룹을 생성합니다.
nro-operatorgroup.yaml파일에 다음 YAML을 저장합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: numaresources-operator namespace: openshift-numaresources spec: targetNamespaces: - openshift-numaresources
다음 명령을 실행하여
OperatorGroupCR을 생성합니다.$ oc create -f nro-operatorgroup.yaml
NUMA Resources Operator에 대한 서브스크립션을 생성합니다.
nro-sub.yaml파일에 다음 YAML을 저장합니다.apiVersion: operators.coreos.com/v1 kind: Subscription metadata: name: numaresources-operator namespace: openshift-numaresources spec: channel: "4.13" name: numaresources-operator source: redhat-operators sourceNamespace: openshift-marketplace
다음 명령을 실행하여
SubscriptionCR을 생성합니다.$ oc create -f nro-sub.yaml
검증
openshift-numaresources네임스페이스에서 CSV 리소스를 검사하여 설치에 성공했는지 확인합니다. 다음 명령을 실행합니다.$ oc get csv -n openshift-numaresources
출력 예
NAME DISPLAY VERSION REPLACES PHASE numaresources-operator.v4.13.2 numaresources-operator 4.13.2 Succeeded
6.2.2. 웹 콘솔을 사용하여 NUMA 리소스 Operator 설치
클러스터 관리자는 웹 콘솔을 사용하여 NUMA 리소스 Operator를 설치할 수 있습니다.
절차
OpenShift Container Platform 웹 콘솔을 사용하여 NUMA 리소스 Operator를 설치합니다.
- OpenShift Container Platform 웹 콘솔에서 Operator → OperatorHub를 클릭합니다.
- 사용 가능한 Operator 목록에서 NUMA Resources Operator 를 선택한 다음 설치를 클릭합니다.
선택 사항: NUMA Resources Operator가 설치되었는지 확인합니다.
- Operator → 설치된 Operator 페이지로 전환합니다.
NUMA 리소스 Operator 가 기본 프로젝트에 InstallSucceeded 상태로 나열되어 있는지 확인합니다.
참고설치 중에 Operator는 실패 상태를 표시할 수 있습니다. 나중에 InstallSucceeded 메시지와 함께 설치에 성공하면 이 실패 메시지를 무시할 수 있습니다.
Operator가 설치된 것으로 나타나지 않으면 다음과 같이 추가 문제 해결을 수행합니다.
- Operator → 설치된 Operator 페이지로 이동하고 Operator 서브스크립션 및 설치 계획 탭의 상태에 장애나 오류가 있는지 검사합니다.
-
워크로드 → Pod 페이지로 이동하여
default프로젝트에서 Pod 로그를 확인합니다.
6.3. NUMA 인식 워크로드 예약
대기 시간에 민감한 워크로드를 실행하는 클러스터는 일반적으로 워크로드 대기 시간을 최소화하고 성능을 최적화하는 데 도움이 되는 성능 프로필을 제공합니다. NUMA 인식 스케줄러는 사용 가능한 노드 NUMA 리소스를 기반으로 워크로드를 배포하고 노드에 적용되는 성능 프로필 설정과 관련하여 워크로드를 배포합니다. NUMA 인식 배포와 워크로드의 성능 프로파일을 결합하면 성능을 극대화하는 방식으로 워크로드를 예약할 수 있습니다.
6.3.1. NUMAResourcesOperator 사용자 정의 리소스 생성
NUMA Resources Operator 를 설치한 경우 NUMA Resources Operator에 데몬 세트 및 API를 포함하여 NUMA 인식 스케줄러를 지원하는 데 필요한 모든 클러스터 인프라를 설치하도록 지시하는 NUMAResourcesOperator CR(사용자 정의 리소스)을 생성합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - NUMA Resources Operator를 설치합니다.
절차
NUMAResourcesOperator사용자 정의 리소스를 만듭니다.다음 YAML을
nrop.yaml파일에 저장합니다.apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: ""다음 명령을 실행하여
NUMAResourcesOperatorCR을 만듭니다.$ oc create -f nrop.yaml
검증
다음 명령을 실행하여 NUMA Resources Operator가 성공적으로 배포되었는지 확인합니다.
$ oc get numaresourcesoperators.nodetopology.openshift.io
출력 예
NAME AGE numaresourcesoperator 10m
6.3.2. NUMA 인식 보조 Pod 스케줄러 배포
NUMA Resources Operator를 설치한 후 다음을 수행하여 NUMA 인식 보조 Pod 스케줄러를 배포합니다.
- 성능 프로필을 구성합니다.
- NUMA 인식 보조 스케줄러를 배포합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - 필요한 머신 구성 풀을 생성합니다.
- NUMA Resources Operator를 설치합니다.
절차
PerformanceProfileCR(사용자 정의 리소스)을 생성합니다.다음 YAML을
nro-perfprof.yaml파일에 저장합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: perfprof-nrop spec: cpu: 1 isolated: "4-51,56-103" reserved: "0,1,2,3,52,53,54,55" nodeSelector: node-role.kubernetes.io/worker: "" numa: topologyPolicy: single-numa-node- 1
cpu.isolated및cpu.reserved사양은 분리된 CPU 및 예약된 CPU의 범위를 정의합니다. CPU 구성에 유효한 값을 입력합니다. 성능 프로필 구성에 대한 자세한 내용은 추가 리소스 섹션을 참조하십시오.
다음 명령을 실행하여
PerformanceProfileCR을 생성합니다.$ oc create -f nro-perfprof.yaml
출력 예
performanceprofile.performance.openshift.io/perfprof-nrop created
NUMA 인식 사용자 정의 Pod 스케줄러를 배포하는
NUMAResourcesScheduler사용자 정의 리소스를 생성합니다.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사양은 기본적으로 비활성화되어 있습니다. -
NUMAResourcesOperatorCR에서podsFingerprinting사양에 대해Enabled값을 설정하는 것은cacheResyncPeriod사양의 구현이 필요합니다.
다음 명령을 실행하여
NUMAResourcesSchedulerCR을 생성합니다.$ oc create -f nro-scheduler.yaml
검증
다음 명령을 실행하여 성능 프로필이 적용되었는지 확인합니다.
$ oc describe performanceprofile <performance-profile-name>
다음 명령을 실행하여 필요한 리소스가 성공적으로 배포되었는지 확인합니다.
$ 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.3.3. NUMA 인식 스케줄러로 워크로드 예약
워크로드를 처리하는 데 필요한 최소 리소스를 지정하는 Deployment CR을 사용하여 NUMA 인식 스케줄러로 워크로드를 예약할 수 있습니다.
다음 예제 배포에서는 샘플 워크로드에 대해 NUMA 인식 스케줄링을 사용합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - NUMA Resources Operator를 설치하고 NUMA 인식 보조 스케줄러를 배포합니다.
절차
다음 명령을 실행하여 클러스터에 배포된 NUMA 인식 스케줄러의 이름을 가져옵니다.
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
출력 예
topo-aware-scheduler
다음과 같이
topo-aware-scheduler라는 스케줄러를 사용하는배포CR을 생성합니다.nro-deployment.yaml파일에 다음 YAML을 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: openshift-numaresources spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler 1 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 command: ["/bin/sh", "-c"] args: [ "while true; do sleep 1h; done;" ] resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"- 1
schedulerName은 클러스터에 배포된 NUMA 인식 스케줄러의 이름과 일치해야 합니다(예:topo-aware-scheduler).
다음 명령을 실행하여
DeploymentCR을 생성합니다.$ oc create -f nro-deployment.yaml
검증
배포가 성공했는지 확인합니다.
$ 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
다음 명령을 실행하여
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상태로 유지됩니다.예상 할당된 리소스가 노드에 나열되어 있는지 확인합니다.
다음 명령을 실행하여 배포 Pod를 실행 중인 노드를 확인하고 <namespace>를
DeploymentCR에 지정한 네임스페이스로 교체합니다.$ 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>
다음 명령을 실행하여 <node_name>을 배포 Pod를 실행 중인 해당 노드의 이름으로 교체합니다.
$ oc describe noderesourcetopologies.topology.node.k8s.io
출력 예
... 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에 나열된 사용 가능한 노드리소스에서 차감됩니다.
Best-effort또는Burstable서비스 품질(qosClass)이 있는 Pod의 리소스 할당은 noderesourcetopology.topology.node.k8s.io의 NUMA 노드리소스에 반영되지 않습니다. Pod의 소비된 리소스가 노드 리소스 계산에 반영되지 않으면 Pod에Guaranteed가 있고 CPU 요청은 10진수 값이 아닌 정수 값인지 확인합니다.다음 명령을 실행하여 Pod에GuaranteedqosClass가 있는지 확인할 수 있습니다.$ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"출력 예
Guaranteed
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를 설치합니다.
절차
선택 사항: 작업자 노드에 사용자 정의 kubelet 구성을 활성화하는
MachineConfigPool사용자 정의 리소스를 생성합니다.참고기본적으로 OpenShift Container Platform은 클러스터의 작업자 노드에 대한
MachineConfigPool리소스를 생성합니다. 필요한 경우 사용자 정의MachineConfigPool리소스를 생성할 수 있습니다.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: ""다음 명령을 실행하여
MachineConfigPoolCR을 생성합니다.$ oc create -f nro-machineconfig.yaml
NUMAResourcesOperator사용자 정의 리소스를 만듭니다.다음 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
- 관련
MachineConfigPoolCR의 작업자 노드에 적용되는 레이블과 일치해야 합니다.
다음 명령을 실행하여
NUMAResourcesOperatorCR을 만듭니다.$ 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를 설치합니다.
절차
머신 프로필에 대한 Pod 승인 정책을 구성하는
KubeletConfig사용자 정의 리소스를 생성합니다.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"다음 명령을 실행하여
KubeletConfigCR(사용자 정의 리소스)을 생성합니다.$ oc create -f nro-kubeletconfig.yaml
NUMA 인식 사용자 정의 Pod 스케줄러를 배포하는
NUMAResourcesScheduler사용자 정의 리소스를 생성합니다.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사양은 기본적으로 비활성화되어 있습니다. -
NUMAResourcesOperatorCR에서podsFingerprinting사양에 대해Enabled값을 설정하는 것은cacheResyncPeriod사양의 구현이 필요합니다.
다음 명령을 실행하여
NUMAResourcesSchedulerCR을 생성합니다.$ 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 인식 보조 스케줄러를 배포합니다.
절차
다음 명령을 실행하여 클러스터에 배포된 NUMA 인식 스케줄러의 이름을 가져옵니다.
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
출력 예
topo-aware-scheduler
다음과 같이
topo-aware-scheduler라는 스케줄러를 사용하는배포CR을 생성합니다.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"
다음 명령을 실행하여
DeploymentCR을 생성합니다.$ oc create -f nro-deployment.yaml
검증
배포가 성공했는지 확인합니다.
$ 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
다음 명령을 실행하여
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상태로 유지됩니다.예상 할당된 리소스가 노드에 나열되어 있는지 확인합니다.
다음 명령을 실행하여 배포 Pod를 실행 중인 노드를 확인하고 <namespace>를
DeploymentCR에 지정한 네임스페이스로 교체합니다.$ 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>
다음 명령을 실행하여 <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에 나열된 사용 가능한 노드리소스에서 차감됩니다.
Best-effort또는Burstable서비스 품질(qosClass)이 있는 Pod의 리소스 할당은 noderesourcetopology.topology.node.k8s.io의 NUMA 노드리소스에 반영되지 않습니다. Pod의 소비된 리소스가 노드 리소스 계산에 반영되지 않으면 Pod에Guaranteed가 있고 CPU 요청은 10진수 값이 아닌 정수 값인지 확인합니다.다음 명령을 실행하여 Pod에GuaranteedqosClass가 있는지 확인할 수 있습니다.$ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"출력 예
Guaranteed
6.5. 선택사항: NUMA 리소스에 대한 폴링 작업 구성
nodeGroup 의 NUMA 리소스 Operator에서 제어하는 데몬은 사용 가능한 NUMA 리소스에 대한 업데이트를 검색합니다. NUMAResourcesOperator CR(사용자 정의 리소스)에서 spec.nodeGroups 사양을 구성하여 이러한 데몬에 대한 폴링 작업을 미세 조정할 수 있습니다. 이를 통해 폴링 작업에 대한 고급 제어가 제공됩니다. 이러한 사양을 구성하여 스케줄링 동작을 개선하고 독점적인 스케줄링 결정을 해결합니다.
구성 옵션은 다음과 같습니다.
-
infoRefreshMode: kubelet을 폴링하기 위한 트리거 조건을 결정합니다. NUMA 리소스 Operator는 결과 정보를 API 서버에 보고합니다. -
infoRefreshPeriod: 폴링 업데이트 간 기간을 결정합니다. podsFingerprinting: 노드에서 실행 중인 현재 Pod 세트에 대한 포인트-시간 정보가 폴링 업데이트에서 노출되는지 확인합니다.참고podsFingerprinting은 기본적으로 활성화되어 있습니다.podsFingerprinting은NUMAResourcesSchedulerCR의cacheResyncPeriod사양에 대한 요구 사항입니다.cacheResyncPeriod사양을 사용하면 노드에서 보류 중인 리소스를 모니터링하여 더 정확한 리소스 가용성을 보고할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - NUMA Resources Operator를 설치합니다.
절차
NUMAResourcesOperatorCR에서spec.nodeGroups사양을 구성합니다.apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - config: infoRefreshMode: Periodic 1 infoRefreshPeriod: 10s 2 podsFingerprinting: Enabled 3 name: worker- 1
- 유효한 값은 마침표 ,
Events,입니다.PeriodicAndEventsPeriodic을 사용하여infoRefreshPeriod에서 정의한 간격에 따라 kubelet을 폴링합니다.이벤트를사용하여 모든 Pod 라이프사이클 이벤트에서 kubelet을 폴링합니다. 두 메서드를 모두 활성화하려면PeriodicAndEvents를 사용합니다. - 2
- 마침표 또는
새로 고침 모드에 대한 폴링 간격을 정의합니다. 새로 고침 모드가PeriodicAndEventsEvents인 경우 필드는 무시됩니다. - 3
- 유효한 값은
Enabled또는Disabled입니다.Enabled로 설정하는 것은NUMAResourcesScheduler의cacheResyncPeriod사양에 대한 요구 사항입니다.
검증
NUMA 리소스 Operator를 배포한 후 다음 명령을 실행하여 노드 그룹 구성이 적용되었는지 확인합니다.
$ oc get numaresop numaresourcesoperator -o json | jq '.status'
출력 예
... "config": { "infoRefreshMode": "Periodic", "infoRefreshPeriod": "10s", "podsFingerprinting": "Enabled" }, "name": "worker" ...
6.6. NUMA 인식 스케줄링 문제 해결
NUMA 인식 Pod 예약으로 일반적인 문제를 해결하려면 다음 단계를 수행합니다.
사전 요구 사항
-
OpenShift Container Platform CLI (
oc)를 설치합니다. - cluster-admin 권한이 있는 사용자로 로그인합니다.
- NUMA Resources Operator를 설치하고 NUMA 인식 보조 스케줄러를 배포합니다.
절차
다음 명령을 실행하여
noderesourcetop의 CRD가 클러스터에 배포되었는지 확인합니다.$ oc get crd | grep noderesourcetopologies
출력 예
NAME CREATED AT noderesourcetopologies.topology.node.k8s.io 2022-01-18T08:28:06Z
다음 명령을 실행하여 NUMA 인식 스케줄러 이름이 NUMA 인식 워크로드에 지정된 이름과 일치하는지 확인합니다.
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
출력 예
topo-aware-scheduler
NUMA 인식 스케이블 노드에
noderesourcetopECDHE CR이적용되었는지 확인합니다. 다음 명령을 실행합니다.$ oc get noderesourcetopologies.topology.node.k8s.io
출력 예
NAME AGE compute-0.example.com 17h compute-1.example.com 17h
참고노드 수는
mcp(머신 구성 풀) 작업자 정의에 의해 구성된 작업자 노드 수와 같아야 합니다.다음 명령을 실행하여 스케줄링 가능한 모든 노드에 대해 NUMA 영역 세분성을 확인합니다.
$ oc get noderesourcetopologies.topology.node.k8s.io -o yaml
출력 예
apiVersion: v1 items: - apiVersion: topology.node.k8s.io/v1 kind: NodeResourceTopology metadata: annotations: k8stopoawareschedwg/rte-update: periodic creationTimestamp: "2022-06-16T08:55:38Z" generation: 63760 name: worker-0 resourceVersion: "8450223" uid: 8b77be46-08c0-4074-927b-d49361471590 topologyPolicies: - SingleNUMANodeContainerLevel zones: - costs: - name: node-0 value: 10 - name: node-1 value: 21 name: node-0 resources: - allocatable: "38" available: "38" capacity: "40" name: cpu - allocatable: "134217728" available: "134217728" capacity: "134217728" name: hugepages-2Mi - allocatable: "262352048128" available: "262352048128" capacity: "270107316224" name: memory - allocatable: "6442450944" available: "6442450944" capacity: "6442450944" name: hugepages-1Gi type: Node - costs: - name: node-0 value: 21 - name: node-1 value: 10 name: node-1 resources: - allocatable: "268435456" available: "268435456" capacity: "268435456" name: hugepages-2Mi - allocatable: "269231067136" available: "269231067136" capacity: "270573244416" name: memory - allocatable: "40" available: "40" capacity: "40" name: cpu - allocatable: "1073741824" available: "1073741824" capacity: "1073741824" name: hugepages-1Gi type: Node - apiVersion: topology.node.k8s.io/v1 kind: NodeResourceTopology metadata: annotations: k8stopoawareschedwg/rte-update: periodic creationTimestamp: "2022-06-16T08:55:37Z" generation: 62061 name: worker-1 resourceVersion: "8450129" uid: e8659390-6f8d-4e67-9a51-1ea34bba1cc3 topologyPolicies: - SingleNUMANodeContainerLevel zones: 1 - costs: - name: node-0 value: 10 - name: node-1 value: 21 name: node-0 resources: 2 - allocatable: "38" available: "38" capacity: "40" name: cpu - allocatable: "6442450944" available: "6442450944" capacity: "6442450944" name: hugepages-1Gi - allocatable: "134217728" available: "134217728" capacity: "134217728" name: hugepages-2Mi - allocatable: "262391033856" available: "262391033856" capacity: "270146301952" name: memory type: Node - costs: - name: node-0 value: 21 - name: node-1 value: 10 name: node-1 resources: - allocatable: "40" available: "40" capacity: "40" name: cpu - allocatable: "1073741824" available: "1073741824" capacity: "1073741824" name: hugepages-1Gi - allocatable: "268435456" available: "268435456" capacity: "268435456" name: hugepages-2Mi - allocatable: "269192085504" available: "269192085504" capacity: "270534262784" name: memory type: Node kind: List metadata: resourceVersion: "" selfLink: ""
6.6.1. NUMA 인식 스케줄러 로그 확인
로그를 검토하여 NUMA 인식 스케줄러의 문제를 해결합니다. 필요한 경우 NUMAResourcesScheduler 리소스의 spec.logLevel 필드를 수정하여 스케줄러 로그 수준을 늘릴 수 있습니다. 허용 가능한 값은 Normal,Debug, and 이며 추적은 가장 자세한 옵션입니다.
Trace
보조 스케줄러의 로그 수준을 변경하려면 실행 중인 스케줄러 리소스를 삭제하고 변경된 로그 수준으로 다시 배포합니다. 이 다운타임 중에 스케줄러는 새 워크로드를 예약할 수 없습니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
현재 실행 중인
NUMAResourcesScheduler리소스를 삭제합니다.다음 명령을 실행하여 활성
NUMAResourcesScheduler를 가져옵니다.$ oc get NUMAResourcesScheduler
출력 예
NAME AGE numaresourcesscheduler 90m
다음 명령을 실행하여 보조 스케줄러 리소스를 삭제합니다.
$ oc delete NUMAResourcesScheduler numaresourcesscheduler
출력 예
numaresourcesscheduler.nodetopology.openshift.io "numaresourcesscheduler" deleted
다음 YAML을
nro-scheduler-debug.yaml파일에 저장합니다. 이 예제에서는 로그 수준을Debug로 변경합니다.apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.13" logLevel: Debug
다음 명령을 실행하여 업데이트된
Debug로깅NUMAResourcesScheduler리소스를 만듭니다.$ oc create -f nro-scheduler-debug.yaml
출력 예
numaresourcesscheduler.nodetopology.openshift.io/numaresourcesscheduler created
검증 단계
NUMA 인식 스케줄러가 성공적으로 배포되었는지 확인합니다.
다음 명령을 실행하여 CRD가 올바르게 생성되었는지 확인합니다.
$ oc get crd | grep numaresourcesschedulers
출력 예
NAME CREATED AT numaresourcesschedulers.nodetopology.openshift.io 2022-02-25T11:57:03Z
다음 명령을 실행하여 새 사용자 정의 스케줄러를 사용할 수 있는지 확인합니다.
$ oc get numaresourcesschedulers.nodetopology.openshift.io
출력 예
NAME AGE numaresourcesscheduler 3h26m
스케줄러의 로그에 증가된 로그 수준이 표시되는지 확인합니다.
다음 명령을 실행하여
openshift-numaresources네임스페이스에서 실행 중인 Pod 목록을 가져옵니다.$ oc get pods -n openshift-numaresources
출력 예
NAME READY STATUS RESTARTS AGE numaresources-controller-manager-d87d79587-76mrm 1/1 Running 0 46h numaresourcesoperator-worker-5wm2k 2/2 Running 0 45h numaresourcesoperator-worker-pb75c 2/2 Running 0 45h secondary-scheduler-7976c4d466-qm4sc 1/1 Running 0 21m
다음 명령을 실행하여 보조 스케줄러 Pod의 로그를 가져옵니다.
$ oc logs secondary-scheduler-7976c4d466-qm4sc -n openshift-numaresources
출력 예
... I0223 11:04:55.614788 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.Namespace total 11 items received I0223 11:04:56.609114 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.ReplicationController total 10 items received I0223 11:05:22.626818 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.StorageClass total 7 items received I0223 11:05:31.610356 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.PodDisruptionBudget total 7 items received I0223 11:05:31.713032 1 eventhandlers.go:186] "Add event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq" I0223 11:05:53.461016 1 eventhandlers.go:244] "Delete event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq"
6.6.2. 리소스 토폴로지 내보내기 문제 해결
해당 리소스 토폴로지의 문제를 해결합니다.
resource-topology-exporter 로그를 검사하여 예기치 않은 결과가 발생하는 노드
클러스터의 NUMA 리소스 토폴로지 내보내기 인스턴스의 이름이 참조하는 노드의 이름을 지정하는 것이 좋습니다. 예를 들어 이름 worker가 있는 작업자 노드에는 라는 해당 worker noderesourcetopECDHE 오브젝트 가 있어야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
NUMA Resources Operator가 관리하는 daemonsets를 가져옵니다. 각 데몬 세트에는
NUMAResourcesOperatorCR에 해당nodeGroup이 있습니다. 다음 명령을 실행합니다.$ oc get numaresourcesoperators.nodetopology.openshift.io numaresourcesoperator -o jsonpath="{.status.daemonsets[0]}"출력 예
{"name":"numaresourcesoperator-worker","namespace":"openshift-numaresources"}이전 단계의
name값을 사용하여 관심 데몬 세트의 레이블을 가져옵니다.$ oc get ds -n openshift-numaresources numaresourcesoperator-worker -o jsonpath="{.spec.selector.matchLabels}"출력 예
{"name":"resource-topology"}다음 명령을 실행하여
resource-topology레이블을 사용하여 Pod를 가져옵니다.$ oc get pods -n openshift-numaresources -l name=resource-topology -o wide
출력 예
NAME READY STATUS RESTARTS AGE IP NODE numaresourcesoperator-worker-5wm2k 2/2 Running 0 2d1h 10.135.0.64 compute-0.example.com numaresourcesoperator-worker-pb75c 2/2 Running 0 2d1h 10.132.2.33 compute-1.example.com
문제 해결 중인 노드에 해당하는 작업자 Pod에서 실행 중인
resource-topology-exporter컨테이너의 로그를 검사합니다. 다음 명령을 실행합니다.$ oc logs -n openshift-numaresources -c resource-topology-exporter numaresourcesoperator-worker-pb75c
출력 예
I0221 13:38:18.334140 1 main.go:206] using sysinfo: reservedCpus: 0,1 reservedMemory: "0": 1178599424 I0221 13:38:18.334370 1 main.go:67] === System information === I0221 13:38:18.334381 1 sysinfo.go:231] cpus: reserved "0-1" I0221 13:38:18.334493 1 sysinfo.go:237] cpus: online "0-103" I0221 13:38:18.546750 1 main.go:72] cpus: allocatable "2-103" hugepages-1Gi: numa cell 0 -> 6 numa cell 1 -> 1 hugepages-2Mi: numa cell 0 -> 64 numa cell 1 -> 128 memory: numa cell 0 -> 45758Mi numa cell 1 -> 48372Mi
6.6.3. 누락된 리소스 토폴로지 내보내기 구성 맵 수정
클러스터 설정이 잘못 구성된 클러스터에 NUMA Resources Operator를 설치하는 경우 일부 상황에서 Operator가 활성으로 표시되지만 RTE(리소스 토폴로지 내보내기er) 데몬 세트 Pod의 로그에 RTE의 구성이 누락된 것으로 표시됩니다.
Info: couldn't find configuration in "/etc/resource-topology-exporter/config.yaml"
이 로그 메시지는 필수 구성이 있는 kubeletconfig 가 클러스터에 제대로 적용되지 않아 RTE 구성 맵이 누락되었음을 나타냅니다. 예를 들어 다음 클러스터에 numaresourcesoperator-worker configmap CR(사용자 정의 리소스)이 누락되어 있습니다.
$ oc get configmap
출력 예
NAME DATA AGE 0e2a6bd3.openshift-kni.io 0 6d21h kube-root-ca.crt 1 6d21h openshift-service-ca.crt 1 6d21h topo-aware-scheduler-config 1 6d18h
올바르게 구성된 클러스터에서 oc get configmap 은 numaresourcesoperator-worker configmap CR도 반환합니다.
사전 요구 사항
-
OpenShift Container Platform CLI (
oc)를 설치합니다. - cluster-admin 권한이 있는 사용자로 로그인합니다.
- NUMA Resources Operator를 설치하고 NUMA 인식 보조 스케줄러를 배포합니다.
절차
다음 명령을 사용하여
MachineConfigPool(mcp) 작업자 CR의kubeletconfig및metadata.labels에서spec.machineConfigPoolSelector.matchLabels의 값을 비교합니다.다음 명령을 실행하여
kubeletconfig라벨을 확인합니다.$ oc get kubeletconfig -o yaml
출력 예
machineConfigPoolSelector: matchLabels: cnf-worker-tuning: enabled다음 명령을 실행하여
mcp레이블을 확인합니다.$ oc get mcp worker -o yaml
출력 예
labels: machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: ""
cnf-worker-tuning: enabled레이블은MachineConfigPool오브젝트에 존재하지 않습니다.
누락된 라벨을 포함하도록
MachineConfigPoolCR을 편집합니다. 예를 들면 다음과 같습니다.$ oc edit mcp worker -o yaml
출력 예
labels: machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: "" cnf-worker-tuning: enabled
- 레이블 변경 사항을 적용하고 클러스터가 업데이트된 구성을 적용할 때까지 기다립니다. 다음 명령을 실행합니다.
검증
누락된
numaresourcesoperator-workerconfigmapCR이 적용되었는지 확인합니다.$ oc get configmap
출력 예
NAME DATA AGE 0e2a6bd3.openshift-kni.io 0 6d21h kube-root-ca.crt 1 6d21h numaresourcesoperator-worker 1 5m openshift-service-ca.crt 1 6d21h topo-aware-scheduler-config 1 6d18h
7장. 확장성 및 성능 최적화
7.1. 스토리지 최적화
스토리지를 최적화하면 모든 리소스에서 스토리지 사용을 최소화할 수 있습니다. 관리자는 스토리지를 최적화하여 기존 스토리지 리소스가 효율적으로 작동하도록 합니다.
7.1.1. 사용 가능한 영구 스토리지 옵션
OpenShift Container Platform 환경을 최적화할 수 있도록 영구 스토리지 옵션에 대해 알아보십시오.
표 7.1. 사용 가능한 스토리지 옵션
| 스토리지 유형 | 설명 | 예 |
|---|---|---|
| 블록 |
| AWS EBS 및 VMware vSphere는 OpenShift Container Platform에서 기본적으로 동적 PV(영구 볼륨) 프로비저닝을 지원합니다. |
| 파일 |
| RHEL NFS, NetApp NFS [1] 및 Vendor NFS |
| 개체 |
| AWS S3 |
- NetApp NFS는 Trident 플러그인을 사용할 때 동적 PV 프로비저닝을 지원합니다.
OpenShift Container Platform 4.13에서는 현재 CNS가 지원되지 않습니다.
7.1.2. 권장되는 구성 가능한 스토리지 기술
다음 표에는 지정된 OpenShift Container Platform 클러스터 애플리케이션에 권장되는 구성 가능한 스토리지 기술이 요약되어 있습니다.
표 7.2. 권장되는 구성 가능한 스토리지 기술
| 스토리지 유형 | 블록 | 파일 | 개체 |
|---|---|---|---|
|
1
2 3 Prometheus는 메트릭에 사용되는 기본 기술입니다. 4 물리적 디스크, VM 물리적 디스크, VMDK, NFS를 통한 루프백, AWS EBS 및 Azure Disk에는 적용되지 않습니다.
5 메트릭의 경우 RWX( 6 로깅은 로그 저장소의 영구 스토리지 구성 섹션에서 권장되는 스토리지 솔루션을 검토하십시오. NFS 스토리지를 영구 볼륨으로 사용하거나 Gluster와 같은 NAS를 통해 데이터가 손상될 수 있습니다. 따라서 OpenShift Container Platform Logging에서 Elasticsearch 스토리지 및 10.0.0.1Stack 로그 저장소에 NFS가 지원되지 않습니다. 로그 저장소당 하나의 영구 볼륨 유형을 사용해야 합니다. 7 OpenShift Container Platform의 PV 또는 PVC를 통해서는 오브젝트 스토리지가 사용되지 않습니다. 앱은 오브젝트 스토리지 REST API와 통합해야 합니다. | |||
| ROX1 | 제공됨4 | 제공됨4 | 예 |
| RWX2 | 없음 | 예 | 예 |
| 레지스트리 | 구성 가능 | 구성 가능 | 권장 |
| 확장 레지스트리 | 구성 불가능 | 구성 가능 | 권장 |
| Metrics3 | 권장 | 구성 가능5 | 구성 불가능 |
| Elasticsearch 로깅 | 권장 | 구성 가능6 | 지원되지 않음6 |
| CloudEvent Logging | 구성 가능 | 구성 불가능 | 권장 |
| 앱 | 권장 | 권장 | 구성 불가능7 |
확장된 레지스트리는 두 개 이상의 포드 복제본이 실행되는 OpenShift 이미지 레지스트리입니다.
7.1.2.1. 특정 애플리케이션 스토리지 권장 사항
테스트에서는 RHEL(Red Hat Enterprise Linux)의 NFS 서버를 핵심 서비스용 스토리지 백엔드로 사용하는 데 문제가 있는 것을 보여줍니다. 여기에는 OpenShift Container Registry and Quay, 스토리지 모니터링을 위한 Prometheus, 로깅 스토리지를 위한 Elasticsearch가 포함됩니다. 따라서 RHEL NFS를 사용하여 핵심 서비스에서 사용하는 PV를 백업하는 것은 권장되지 않습니다.
마켓플레이스의 다른 NFS 구현에는 이러한 문제가 나타나지 않을 수 있습니다. 이러한 OpenShift Container Platform 핵심 구성 요소에 대해 완료된 테스트에 대한 자세한 내용은 개별 NFS 구현 공급업체에 문의하십시오.
7.1.2.1.1. 레지스트리
비 확장/HA(고가용성) OpenShift 이미지 레지스트리 클러스터 배포에서는 다음을 수행합니다.
- 스토리지 기술에서 RWX 액세스 모드를 지원할 필요가 없습니다.
- 스토리지 기술에서 쓰기 후 읽기 일관성을 보장해야 합니다.
- 기본 스토리지 기술은 오브젝트 스토리지, 블록 스토리지 순입니다.
- 프로덕션 워크로드가 있는 OpenShift 이미지 레지스트리 클러스터 배포에는 파일 스토리지를 사용하지 않는 것이 좋습니다.
7.1.2.1.2. 확장 레지스트리
확장/HA OpenShift 이미지 레지스트리 클러스터 배포에서는 다음을 수행합니다.
- 스토리지 기술은 RWX 액세스 모드를 지원해야 합니다.
- 스토리지 기술에서 쓰기 후 읽기 일관성을 보장해야 합니다.
- 기본 스토리지 기술은 오브젝트 스토리지입니다.
- Red Hat OpenShift Data Foundation(ODF), Amazon Simple Storage Service(Amazon S3), GCS(Google Cloud Storage), Microsoft Azure Blob Storage 및 OpenStack Swift가 지원됩니다.
- 오브젝트 스토리지는 S3 또는 Swift와 호환되어야 합니다.
- vSphere, 베어 메탈 설치 등 클라우드 이외의 플랫폼에서는 구성 가능한 유일한 기술이 파일 스토리지입니다.
- 블록 스토리지는 구성 불가능합니다.
7.1.2.1.3. 지표
OpenShift Container Platform 호스트 지표 클러스터 배포에서는 다음 사항에 유의합니다.
- 기본 스토리지 기술은 블록 스토리지입니다.
- 오브젝트 스토리지는 구성 불가능합니다.
프로덕션 워크로드가 있는 호스트 지표 클러스터 배포에는 파일 스토리지를 사용하지 않는 것이 좋습니다.
7.1.2.1.4. 로깅
OpenShift Container Platform 호스트 로깅 클러스터 배포에서는 다음 사항에 유의합니다.
- 기본 스토리지 기술은 블록 스토리지입니다.
- 오브젝트 스토리지는 구성 불가능합니다.
7.1.2.1.5. 애플리케이션
애플리케이션 사용 사례는 다음 예에 설명된 대로 애플리케이션마다 다릅니다.
- 동적 PV 프로비저닝을 지원하는 스토리지 기술은 마운트 대기 시간이 짧고 정상 클러스터를 지원하는 노드와 관련이 없습니다.
- 애플리케이션 개발자는 애플리케이션의 스토리지 요구사항을 잘 알고 있으며 제공된 스토리지로 애플리케이션을 작동시켜 애플리케이션이 스토리지 계층을 스케일링하거나 스토리지 계층과 상호 작용할 때 문제가 발생하지 않도록 하는 방법을 이해하고 있어야 합니다.
7.1.2.2. 다른 특정 애플리케이션 스토리지 권장 사항
etcd 와 같은 쓰기 집약적인 워크로드에서는 RAID 구성을 사용하지 않는 것이 좋습니다. RAID 구성으로 etcd 를 실행하는 경우 워크로드에 성능 문제가 발생할 위험이 있을 수 있습니다.
- RHOSP(Red Hat OpenStack Platform) Cinder: RHOSP Cinder는 ROX 액세스 모드 사용 사례에 적합합니다.
- 데이터베이스: 데이터베이스(RDBMS, NoSQL DB 등)는 전용 블록 스토리지를 사용하는 경우 성능이 최대화되는 경향이 있습니다.
- etcd 데이터베이스에는 대규모 클러스터를 활성화하기에 충분한 스토리지와 적절한 성능 용량이 있어야 합니다. 충분한 스토리지 및 고성능 환경을 설정하는 모니터링 및 벤치마킹 툴에 대한 정보는 권장 etcd 관행에 설명되어 있습니다.
7.1.3. 데이터 스토리지 관리
다음 표에는 OpenShift Container Platform 구성 요소가 데이터를 쓰는 기본 디렉터리가 요약되어 있습니다.
표 7.3. OpenShift Container Platform 데이터를 저장하는 기본 디렉터리
| 디렉터리 | 참고 | 크기 조정 | 예상 증가 |
|---|---|---|---|
| /var/log | 모든 구성 요소의 로그 파일입니다. | 10~30GB입니다. | 로그 파일이 빠르게 증가할 수 있습니다. 크기는 디스크를 늘리거나 로그 회전을 사용하여 관리할 수 있습니다. |
| /var/lib/etcd | 데이터베이스를 저장할 때 etcd 스토리지에 사용됩니다. | 20GB 미만입니다. 데이터베이스는 최대 8GB까지 증가할 수 있습니다. | 환경과 함께 천천히 증가합니다. 메타데이터만 저장합니다. 추가로 메모리가 8GB 증가할 때마다 추가로 20~25GB가 증가합니다. |
| /var/lib/containers | CRI-O 런타임의 마운트 옵션입니다. Pod를 포함한 활성 컨테이너 런타임에 사용되는 스토리지 및 로컬 이미지 스토리지입니다. 레지스트리 스토리지에는 사용되지 않습니다. | 16GB 메모리가 있는 노드의 경우 50GB가 증가합니다. 이 크기 조정은 최소 클러스터 요구사항을 결정하는 데 사용하면 안 됩니다. 추가로 메모리가 8GB 증가할 때마다 추가로 20~25GB가 증가합니다. | 컨테이너 실행 용량에 의해 증가가 제한됩니다. |
| /var/lib/kubelet | Pod용 임시 볼륨 스토리지입니다. 런타임 시 컨테이너로 마운트된 외부 요소가 모두 포함됩니다. 영구 볼륨에서 지원하지 않는 환경 변수, kube 보안 및 데이터 볼륨이 포함됩니다. | 변동 가능 | 스토리지가 필요한 Pod가 영구 볼륨을 사용하는 경우 최소입니다. 임시 스토리지를 사용하는 경우 빠르게 증가할 수 있습니다. |
7.1.4. Microsoft Azure의 스토리지 성능 최적화
OpenShift Container Platform 및 Kubernetes는 디스크 성능에 민감하며 특히 컨트롤 플레인 노드의 etcd에 더 빠른 스토리지를 사용하는 것이 좋습니다.
워크로드가 집약적인 프로덕션 Azure 클러스터 및 클러스터의 경우 컨트롤 플레인 머신용 가상 머신 운영 체제 디스크는 5000 IOPS / 200MBps의 테스트된 권장 최소 처리량을 유지할 수 있어야 합니다. 이 처리량은 최소 1 TiB Premium SSD (P30)를 보유하여 제공할 수 있습니다. Azure 및 Azure Stack Hub에서 디스크 성능은 SSD 디스크 크기에 직접 따라 달라집니다. Standard_D8s_v3 가상 머신 또는 기타 유사한 머신 유형 및 5000 IOPS 대상에서 지원하는 처리량을 달성하려면 최소 P30 디스크가 필요합니다.
짧은 대기 시간과 높은 IOPS 및 처리량은 데이터를 읽을 때 호스트 캐싱을 ReadOnly 로 설정해야 합니다. VM 메모리 또는 로컬 SSD 디스크에 있는 캐시에서 데이터를 읽는 것은 Blob 스토리지에 있는 디스크에서 데이터를 읽는 것보다 훨씬 빠릅니다.
7.1.5. 추가 리소스
7.2. 라우팅 최적화
OpenShift Container Platform HAProxy 라우터는 성능을 최적화하도록 확장 또는 구성할 수 있습니다.
7.2.1. 기본 Ingress 컨트롤러(라우터) 성능
OpenShift Container Platform Ingress 컨트롤러 또는 라우터는 경로 및 인그레스를 사용하여 구성된 애플리케이션 및 서비스의 수신 트래픽의 수신 지점입니다.
초당 처리된 HTTP 요청 측면에서 단일 HAProxy 라우터 성능을 평가할 때 성능은 여러 요인에 따라 달라집니다. 특히 중요한 요인은 다음과 같습니다.
- HTTP 연결 유지/닫기 모드
- 경로 유형
- TLS 세션 재개 클라이언트 지원
- 대상 경로당 동시 연결 수
- 대상 경로 수
- 백엔드 서버 페이지 크기
- 기본 인프라(네트워크/SDN 솔루션, CPU 등)
특정 환경의 성능은 달라질 수 있으나 Red Hat 랩은 크기가 4 vCPU/16GB RAM인 퍼블릭 클라우드 인스턴스에서 테스트합니다. 1kB 정적 페이지를 제공하는 백엔드에서 종료한 100개의 경로를 처리하는 단일 HAProxy 라우터가 처리할 수 있는 초당 트랜잭션 수는 다음과 같습니다.
HTTP 연결 유지 모드 시나리오에서는 다음과 같습니다.
| Encryption | LoadBalancerService | HostNetwork |
|---|---|---|
| none | 21515 | 29622 |
| edge | 16743 | 22913 |
| passthrough | 36786 | 53295 |
| re-encrypt | 21583 | 25198 |
HTTP 닫기(연결 유지 제외) 시나리오에서는 다음과 같습니다.
| Encryption | LoadBalancerService | HostNetwork |
|---|---|---|
| none | 5719 | 8273 |
| edge | 2729 | 4069 |
| passthrough | 4121 | 5344 |
| re-encrypt | 2320 | 2941 |
기본 Ingress 컨트롤러 구성은 spec.tuningOptions.threadCount 필드에서 4 로 설정된 상태에서 사용되었습니다. 두 가지 엔드 포인트 게시 전략이 테스트되었습니다: Load Balancer Service 및 Host Network. 암호화된 경로에는 TLS 세션 재개가 사용되었습니다. HTTP keep-alive를 사용하면 단일 HAProxy 라우터가 8kB의 작은 페이지 크기에서 1Gbit NIC를 포화시킬 수 있습니다.
최신 프로세서가 있는 베어 메탈에서 실행하는 경우 성능이 위 퍼블릭 클라우드 인스턴스의 약 2배가 될 것을 예상할 수 있습니다. 이 오버헤드는 퍼블릭 클라우드에서 가상화 계층에 의해 도입되며 프라이빗 클라우드 기반 가상화에도 적용됩니다. 다음 표는 라우터 뒤에서 사용할 애플리케이션 수에 대한 가이드입니다.
| 애플리케이션 수 | 애플리케이션 유형 |
|---|---|
| 5-10 | 정적 파일/웹 서버 또는 캐싱 프록시 |
| 100-1000 | 동적 콘텐츠를 생성하는 애플리케이션 |
일반적으로 HAProxy는 사용 중인 기술에 따라 최대 1000개의 애플리케이션 경로를 지원할 수 있습니다. Ingress 컨트롤러 성능은 언어 또는 정적 콘텐츠 대비 동적 콘텐츠 등 지원하는 애플리케이션의 기능과 성능에 따라 제한될 수 있습니다.
Ingress 또는 라우터 샤딩을 사용하여 애플리케이션에 대한 경로를 더 많이 제공하면 라우팅 계층을 수평으로 확장하는 데 도움이 됩니다.
Ingress 샤딩에 대한 자세한 내용은 경로 레이블을 사용하여 Ingress 컨트롤러 분할 구성 및 네임스페이스 라벨을 사용하여 Ingress 컨트롤러 샤딩 구성을 참조하십시오.
시간 초과 및 Ingress 컨트롤러 사양의 기타 튜닝 구성에 대한 스레드 및 Ingress 컨트롤러 구성 매개변수 설정에 제공된 정보를 사용하여 Ingress 컨트롤러 배포를 수정할 수 있습니다.
7.2.2. Ingress 컨트롤러 활동성, 준비 상태, 시작 프로브 구성
클러스터 관리자는 OpenShift Container Platform Ingress 컨트롤러(라우터)에서 관리하는 라우터 배포에 대한 kubelet의 활동성, 준비 상태 및 시작 프로브에 대한 시간 초과 값을 구성할 수 있습니다. 라우터의 활성 상태 및 준비 상태 프로브는 기본 시간 초과 값이 1초이며, 네트워킹 또는 런타임 성능이 크게 저하될 때 너무 짧습니다. 프로브 시간 초과로 인해 애플리케이션 연결을 중단하는 원치 않는 라우터 재시작이 발생할 수 있습니다. 더 큰 타임아웃 값을 설정하는 기능은 불필요하고 원치 않는 재시작 위험을 줄일 수 있습니다.
라우터 컨테이너의 livenessProbe,readinessProbe, startupProbe 매개변수에서 timeoutSeconds 값을 업데이트할 수 있습니다.
| 매개변수 | 설명 |
|---|---|
|
|
|
|
|
|
|
|
|
시간 초과 구성 옵션은 문제를 해결하는 데 사용할 수 있는 고급 튜닝 기술입니다. 그러나 이러한 문제는 결국 진단되어야 하며 프로브의 시간 초과를 유발하는 모든 문제에 대해 지원 케이스 또는 Jira 문제가 열리게 됩니다.
다음 예제에서는 기본 라우터 배포를 직접 패치하여 활성 상태 프로브 및 준비 상태 프로브에 대해 5초의 타임아웃을 설정하는 방법을 보여줍니다.
$ oc -n openshift-ingress patch deploy/router-default --type=strategic --patch='{"spec":{"template":{"spec":{"containers":[{"name":"router","livenessProbe":{"timeoutSeconds":5},"readinessProbe":{"timeoutSeconds":5}}]}}}}'검증
$ oc -n openshift-ingress describe deploy/router-default | grep -e Liveness: -e Readiness:
Liveness: http-get http://:1936/healthz delay=0s timeout=5s period=10s #success=1 #failure=3
Readiness: http-get http://:1936/healthz/ready delay=0s timeout=5s period=10s #success=1 #failure=3
7.2.3. HAProxy 재로드 간격 구성
경로 또는 경로와 연결된 끝점을 업데이트하면 OpenShift Container Platform 라우터에서 HAProxy 구성을 업데이트합니다. 그런 다음 HAProxy는 이러한 변경 사항을 적용하기 위해 업데이트된 구성을 다시 로드합니다. HAProxy가 다시 로드되면 업데이트된 구성을 사용하여 새 연결을 처리하는 새 프로세스가 생성됩니다.
HAProxy는 해당 연결이 모두 닫힐 때까지 기존 프로세스를 실행하여 기존 연결을 처리합니다. 이전 프로세스에 수명이 긴 연결이 있는 경우 이러한 프로세스에서 리소스를 누적하고 사용할 수 있습니다.
기본 최소 HAProxy 재로드 간격은 5초입니다. spec.tuningOptions.reloadInterval 필드를 사용하여 Ingress 컨트롤러를 구성하여 최소 다시 로드 간격을 더 길게 설정할 수 있습니다.
최소 HAProxy 재로드 간격에 큰 값을 설정하면 경로 및 해당 엔드포인트에 대한 업데이트를 관찰하는 대기 시간이 발생할 수 있습니다. 위험을 줄이려면 업데이트에 허용 가능한 대기 시간보다 큰 값을 설정하지 마십시오.
절차
다음 명령을 실행하여 기본 Ingress 컨트롤러의 최소 HAProxy 재로드 간격을 15초로 변경합니다.
$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"tuningOptions":{"reloadInterval":"15s"}}}'
7.3. 네트워킹 최적화
OpenShift SDN 은 OpenvSwitch, VXLAN(Virtual Extensible LAN) 터널, OpenFlow 규칙 및 iptables를 사용합니다. 이 네트워크는 점보 프레임, NIC(네트워크 인터페이스 컨트롤러) 오프로드, 멀티 큐, ethtool 설정을 사용하여 조정할 수 있습니다.
OVN-Kubernetes 는 VXLAN 대신 Geneve(Generic Network Virtualization Encapsulation)를 터널 프로토콜로 사용합니다.
VXLAN은 VLAN에 비해 네트워크 수가 4096개에서 1600만 개 이상으로 증가하고 물리적 네트워크 전반에 걸쳐 계층 2 연결과 같은 이점을 제공합니다. 이를 통해 서비스 뒤에 있는 모든 Pod가 서로 다른 시스템에서 실행되는 경우에도 서로 통신할 수 있습니다.
VXLAN은 사용자 데이터그램 프로토콜(UDP) 패킷의 터널링된 모든 트래픽을 캡슐화합니다. 그러나 이로 인해 CPU 사용량이 증가합니다. 이러한 외부 및 내부 패킷은 전송 중에 데이터가 손상되지 않도록하기 위해 일반 체크섬 규칙을 따릅니다. CPU 성능에 따라 이러한 추가 처리 오버헤드는 처리량이 감소하고 기존 비 오버레이 네트워크에 비해 대기 시간이 증가할 수 있습니다.
클라우드, 가상 머신, 베어 메탈 CPU 성능은 많은 Gbps의 네트워크 처리량을 처리할 수 있습니다. 10 또는 40Gbps와 같은 높은 대역폭 링크를 사용하는 경우 성능이 저하될 수 있습니다. 이 문제는 VXLAN 기반 환경에서 알려진 문제이며 컨테이너 또는 OpenShift Container Platform에만 국한되지 않습니다. VXLAN 터널에 의존하는 네트워크는 VXLAN 구현으로 인해 비슷한 작업을 수행할 수 있습니다.
Gbps을 초과하여 푸시하려는 경우 다음을 수행할 수 있습니다.
- BGP(Border Gateway Protocol)와 같은 다른 라우팅 기술을 구현하는 네트워크 플러그인을 평가합니다.
- VXLAN 오프로드 가능 네트워크 어댑터를 사용합니다. VXLAN 오프로드는 패킷 체크섬 계산 및 관련 CPU 오버헤드를 시스템 CPU에서 네트워크 어댑터의 전용 하드웨어로 이동합니다. 이를 통해 Pod 및 애플리케이션에서 사용할 CPU 사이클을 확보하고 사용자는 네트워크 인프라의 전체 대역폭을 사용할 수 있습니다.
VXLAN 오프로드는 대기 시간을 단축시키지 않습니다. 그러나 대기 시간 테스트에서도 CPU 사용량이 감소합니다.
7.3.1. 네트워크에 대한 MTU 최적화
중요한 최대 전송 단위(MTU)는 NIC(네트워크 인터페이스 컨트롤러) MTU와 클러스터 네트워크 MTU입니다.
NIC MTU는 OpenShift Container Platform을 설치할 때만 구성됩니다. MTU는 네트워크 NIC에서 지원되는 최대 값과 작거나 같아야 합니다. 처리량을 최적화하려면 가능한 가장 큰 값을 선택합니다. 최소 지연을 최적화하려면 더 낮은 값을 선택합니다.
OpenShift SDN 네트워크 플러그인 오버레이 MTU는 NIC MTU보다 최소 50바이트 작아야 합니다. 이 계정은 SDN 오버레이 헤더에 대한 계정입니다. 따라서 일반적인 이더넷 네트워크에서는 이 값을 1450 으로 설정해야 합니다. 점보 프레임 이더넷 네트워크에서는 이 값을 8950 으로 설정해야 합니다. 이러한 값은 NIC의 구성된 MTU를 기반으로 Cluster Network Operator에서 자동으로 설정해야 합니다. 따라서 클러스터 관리자는 일반적으로 이러한 값을 업데이트하지 않습니다. AWS(Amazon Web Services) 및 베어 메탈 환경은 점보 프레임 이더넷 네트워크를 지원합니다. 이 설정은 특히 TCP(Transmission Control Protocol)에서 처리량에 도움이 됩니다.
OVN 및 Geneve의 경우 MTU는 NIC MTU보다 최소 100바이트 작아야 합니다.
50바이트 오버레이 헤더는 OpenShift SDN 네트워크 플러그인과 관련이 있습니다. 기타 SDN 솔루션에서는 이 값이 더 크거나 작아야 할 수 있습니다.
7.3.2. 대규모 클러스터 설치에 대한 권장 사례
대규모 클러스터를 설치하거나 클러스터 스케일링을 통해 노드 수를 늘리는 경우 install-config.yaml 파일에서 클러스터 네트워크 cidr을 적절하게 설정한 후 클러스터를 설치하십시오.
networking:
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
machineNetwork:
- cidr: 10.0.0.0/16
networkType: OVNKubernetes
serviceNetwork:
- 172.30.0.0/16
클러스터 크기가 500개 노드를 초과하는 경우 기본 클러스터 네트워크 cidr 10.128.0.0/14를 사용할 수 없습니다. 노드 수가 500개를 초과하게 되면 10.128.0.0/12 또는 10.128.0.0/10으로 설정해야 합니다.
7.3.3. IPsec 영향
노드 호스트의 암호화 및 암호 해독은 CPU를 사용하기 때문에 사용 중인 IP 보안 시스템에 관계없이 암호화를 사용할 때 노드의 처리량과 CPU 사용량 모두에서 성능에 영향을 미칩니다.
IPsec은 NIC에 도달하기 전에 IP 페이로드 수준에서 트래픽을 암호화하여 NIC 오프로드에 사용되는 필드를 보호합니다. 즉, IPSec가 활성화되면 일부 NIC 가속 기능을 사용할 수 없으며 처리량이 감소하고 CPU 사용량이 증가합니다.
7.3.4. 추가 리소스
7.4. 마운트 네임스페이스 캡슐화를 사용하여 CPU 사용량 최적화
마운트 네임스페이스 캡슐화를 사용하여 kubelet 및 CRI-O 프로세스에 개인 네임스페이스를 제공하는 방식으로 OpenShift Container Platform 클러스터에서 CPU 사용량을 최적화할 수 있습니다. 이렇게 하면 기능 차이 없이 systemd에서 사용하는 클러스터 CPU 리소스가 줄어듭니다.
마운트 네임스페이스 캡슐화는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
7.4.1. 마운트 네임스페이스 캡슐화
마운트 네임스페이스는 다른 네임스페이스의 프로세스가 서로의 파일을 볼 수 없도록 마운트 지점을 분리하는 데 사용됩니다. 캡슐화는 Kubernetes 마운트 네임스페이스를 호스트 운영 체제에서 지속적으로 스캔하지 않는 대체 위치로 이동하는 프로세스입니다.
호스트 운영 체제는 systemd를 사용하여 모든 마운트 네임스페이스를 지속적으로 검사합니다. 표준 Linux 마운트와 Kubernetes가 작동하는 데 사용하는 수많은 마운트입니다. kubelet 및 CRI-O의 현재 구현은 모든 컨테이너 런타임 및 kubelet 마운트 지점에 최상위 네임스페이스를 사용합니다. 그러나 프라이빗 네임스페이스에서 이러한 컨테이너별 마운트 지점을 캡슐화하면 기능의 차이 없이 systemd 오버헤드가 줄어듭니다. CRI-O 및 kubelet 모두에 별도의 마운트 네임스페이스를 사용하면 systemd 또는 기타 호스트 운영 체제 상호 작용에서 컨테이너별 마운트를 캡슐화할 수 있습니다.
이제 모든 OpenShift Container Platform 관리자가 주요 CPU 최적화를 수행할 수 있는 이러한 기능을 사용할 수 있습니다. 캡슐화는 권한이 없는 사용자가 검사에서 안전한 위치에 Kubernetes별 마운트 지점을 저장하여 보안을 개선할 수도 있습니다.
다음 다이어그램에서는 캡슐화 전과 후에 Kubernetes 설치를 보여줍니다. 두 시나리오 모두 양방향, 호스트 간 컨테이너, none의 마운트 전파 설정이 있는 예제 컨테이너를 보여줍니다.

여기에서는 단일 마운트 네임스페이스를 공유하는 systemd, 호스트 운영 체제 프로세스, kubelet 및 컨테이너 런타임을 참조하십시오.
- systemd, 호스트 운영 체제 프로세스, kubelet 및 컨테이너 런타임은 각각 모든 마운트 지점에 대한 액세스 및 가시성을 제공합니다.
-
컨테이너 1은 양방향 마운트 전파로 구성되며 systemd 및 호스트 마운트, kubelet 및 CRI-O 마운트에 액세스할 수 있습니다.
/run/a와 같은 컨테이너 1에서 시작된 마운트는 systemd, 호스트 운영 체제 프로세스, kubelet, 컨테이너 런타임 및 host-to-container 또는 양방향 마운트 전파가 구성된 기타 컨테이너에 표시됩니다(컨테이너 2). -
호스트-컨테이너 마운트 전파로 구성된 컨테이너 2는 systemd 및 호스트 마운트, kubelet 및 CRI-O 마운트에 액세스할 수 있습니다.
/run/b와 같은 컨테이너 2에서 시작된 마운트는 다른 컨텍스트에 표시되지 않습니다. -
마운트 전파 없이 구성된 컨테이너 3에는 외부 마운트 지점을 확인할 수 없습니다.
/run/c와 같은 컨테이너 3에서 시작된 마운트는 다른 컨텍스트에 표시되지 않습니다.
다음 다이어그램에서는 캡슐화 후 시스템 상태를 보여줍니다.

- 기본 systemd 프로세스는 더 이상 Kubernetes별 마운트 지점의 불필요한 스캔에 집중되지 않습니다. systemd 관련 및 호스트 마운트 지점만 모니터링합니다.
- 호스트 운영 체제 프로세스는 systemd 및 호스트 마운트 지점에만 액세스할 수 있습니다.
- CRI-O 및 kubelet 모두에 별도의 마운트 네임스페이스를 사용하면 컨테이너 관련 모든 마운트가 systemd 또는 기타 호스트 운영 체제 상호 작용과 완전히 분리됩니다.
-
컨테이너 1의 동작은
/run/a와 같은 마운트가 더 이상 systemd 또는 호스트 운영 체제 프로세스에 표시되지 않는 점을 제외하고 변경되지 않습니다. host-to-container 또는 양방향 마운트 전파가 구성된 컨테이너(컨테이너 2)와 같이 kubelet, CRI-O 및 기타 컨테이너에 계속 표시됩니다. - 컨테이너 2 및 컨테이너 3의 동작은 변경되지 않습니다.
7.4.2. 마운트 네임스페이스 캡슐화 구성
클러스터가 리소스 오버헤드를 적게 실행하도록 마운트 네임스페이스 캡슐화를 구성할 수 있습니다.
마운트 네임스페이스 캡슐화는 기술 프리뷰 기능으로, 기본적으로 비활성화되어 있습니다. 이 기능을 사용하려면 기능을 수동으로 활성화해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
다음 YAML을 사용하여
mount_namespace_config.yaml이라는 파일을 생성합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 99-kubens-master spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kubens.service --- apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-kubens-worker spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kubens.service다음 명령을 실행하여 마운트 네임스페이스
MachineConfigCR을 적용합니다.$ oc apply -f mount_namespace_config.yaml
출력 예
machineconfig.machineconfiguration.openshift.io/99-kubens-master created machineconfig.machineconfiguration.openshift.io/99-kubens-worker created
MachineConfigCR을 클러스터에 적용하는 데 최대 30분이 걸릴 수 있습니다. 다음 명령을 실행하여MachineConfigCR의 상태를 확인할 수 있습니다.$ oc get mcp
출력 예
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-03d4bc4befb0f4ed3566a2c8f7636751 False True False 3 0 0 0 45m worker rendered-worker-10577f6ab0117ed1825f8af2ac687ddf False True False 3 1 1
다음 명령을 실행한 후 모든 컨트롤 플레인 및 작업자 노드에
MachineConfigCR이 성공적으로 적용될 때까지 기다립니다.$ oc wait --for=condition=Updated mcp --all --timeout=30m
출력 예
machineconfigpool.machineconfiguration.openshift.io/master condition met machineconfigpool.machineconfiguration.openshift.io/worker condition met
검증
클러스터 호스트의 캡슐화를 확인하려면 다음 명령을 실행합니다.
클러스터 호스트에 대한 디버그 쉘을 엽니다.
$ oc debug node/<node_name>
chroot세션을 엽니다.sh-4.4# chroot /host
systemd 마운트 네임스페이스를 확인합니다.
sh-4.4# readlink /proc/1/ns/mnt
출력 예
mnt:[4026531953]
kubelet 마운트 네임스페이스를 확인합니다.
sh-4.4# readlink /proc/$(pgrep kubelet)/ns/mnt
출력 예
mnt:[4026531840]
CRI-O 마운트 네임스페이스를 확인합니다.
sh-4.4# readlink /proc/$(pgrep crio)/ns/mnt
출력 예
mnt:[4026531840]
이러한 명령은 systemd, kubelet 및 컨테이너 런타임과 관련된 마운트 네임스페이스를 반환합니다. OpenShift Container Platform에서 컨테이너 런타임은 CRI-O입니다.
위의 예와 같이 systemd가 kubelet 및 CRI-O에 다른 마운트 네임스페이스에 있는 경우 Encapsulation이 적용됩니다. 세 개의 프로세스가 모두 동일한 마운트 네임스페이스에 있는 경우 캡슐화가 적용되지 않습니다.
7.4.3. 캡슐화된 네임스페이스 검사
RHCOS(Red Hat Enterprise Linux CoreOS)에서 사용 가능한 kubensenter 스크립트를 사용하여 디버깅 또는 감사 목적으로 클러스터 호스트 운영 체제의 Kubernetes별 마운트 지점을 검사할 수 있습니다.
클러스터 호스트에 대한 SSH 쉘 세션은 default 네임스페이스에 있습니다. SSH 쉘 프롬프트에서 Kubernetes별 마운트 지점을 검사하려면 kubensenter 스크립트를 root로 실행해야 합니다. kubensenter 스크립트는 마운트 캡슐화의 상태를 알고 있으며 캡슐화가 활성화되지 않은 경우에도 실행할 수 있습니다.
oc debug 원격 쉘 세션은 기본적으로 Kubernetes 네임스페이스 내에서 시작됩니다. oc debug 를 사용할 때 kubensenter 를 실행하여 마운트 지점을 검사할 필요가 없습니다.
캡슐화 기능이 활성화되지 않은 경우 kubensenter findmnt 및 findmnt 명령은 oc debug 세션 또는 SSH 쉘 프롬프트에서 실행되는지 여부와 관계없이 동일한 출력을 반환합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. - 클러스터 호스트에 대한 SSH 액세스를 구성했습니다.
절차
클러스터 호스트에 대한 원격 SSH 쉘을 엽니다. 예를 들면 다음과 같습니다.
$ ssh core@<node_name>
제공된
kubensenter스크립트를 root 사용자로 사용하여 명령을 실행합니다. Kubernetes 네임스페이스 내에서 단일 명령을 실행하려면 명령과kubensenter스크립트에 인수를 제공합니다. 예를 들어 Kubernetes 네임스페이스 내에서findmnt명령을 실행하려면 다음 명령을 실행합니다.[core@control-plane-1 ~]$ sudo kubensenter findmnt
출력 예
kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt TARGET SOURCE FSTYPE OPTIONS / /dev/sda4[/ostree/deploy/rhcos/deploy/32074f0e8e5ec453e56f5a8a7bc9347eaa4172349ceab9c22b709d9d71a3f4b0.0] | xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota shm tmpfs ...Kubernetes 네임스페이스 내에서 새 대화형 쉘을 시작하려면 인수 없이
kubensenter스크립트를 실행합니다.[core@control-plane-1 ~]$ sudo kubensenter
출력 예
kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt
7.4.4. 캡슐화된 네임스페이스에서 추가 서비스 실행
호스트 운영 체제에서 실행할 수 있는 기능을 사용하고 kubelet, CRI-O 또는 컨테이너 자체에서 생성한 마운트 지점을 확인할 수 있는 모니터링 툴은 컨테이너 마운트 네임스페이스를 입력하여 이러한 마운트 지점을 확인해야 합니다. OpenShift Container Platform과 함께 제공되는 kubensenter 스크립트는 Kubernetes 마운트 지점 내에서 다른 명령을 실행하고 기존 툴을 조정하는 데 사용할 수 있습니다.
kubensenter 스크립트는 마운트 캡슐화 기능 상태의 상태를 알고 있으며 캡슐화가 활성화되지 않은 경우에도 실행할 수 있습니다. 이 경우 스크립트는 기본 마운트 네임스페이스에서 제공된 명령을 실행합니다.
예를 들어 systemd 서비스가 새 Kubernetes 마운트 네임스페이스 내에서 실행해야 하는 경우 서비스 파일을 편집하고 kubensenter 와 함께 ExecStart= 명령줄을 사용합니다.
[Unit] Description=Example service [Service] ExecStart=/usr/bin/kubensenter /path/to/original/command arg1 arg2
7.4.5. 추가 리소스
8장. 베어 메탈 호스트 관리
베어 메탈 클러스터에 OpenShift Container Platform을 설치할 때 클러스터에 있는 베어 메탈 호스트에 대한 machine 및 machineset CR(사용자 정의 리소스)을 사용하여 베어 메탈 노드를 프로비저닝하고 관리할 수 있습니다.
8.1. 베어 메탈 호스트 및 노드 정보
RHCOS(Red Hat Enterprise Linux CoreOS) 베어 메탈 호스트를 클러스터에서 노드로 프로비저닝하려면 먼저 베어 메탈 호스트 하드웨어에 해당하는 MachineSet CR(사용자 정의 리소스) 오브젝트를 생성합니다. 베어 메탈 호스트 컴퓨팅 머신 세트는 구성과 관련된 인프라 구성 요소를 설명합니다. 이러한 컴퓨팅 머신 세트에 특정 Kubernetes 레이블을 적용한 다음 해당 머신에서만 실행되도록 인프라 구성 요소를 업데이트합니다.
machine CR은 metal3.io/autoscale-to-hosts 주석이 포함된 관련 MachineSet을 확장하면 자동으로 생성됩니다. OpenShift Container Platform은 Machine CR을 사용하여 MachineSet CR에 지정된 대로 호스트에 해당하는 베어 메탈 노드를 프로비저닝합니다.
8.2. 베어 메탈 호스트 유지관리
OpenShift Container Platform 웹 콘솔에서 클러스터의 베어 메탈 호스트의 세부 정보를 유지 관리할 수 있습니다. 컴퓨팅 → 베어 메탈 호스트로 이동하여 작업 드롭다운 메뉴에서 작업을 선택합니다. 여기에서 BMC 세부 정보, 호스트의 MAC 주소 부팅, 전원 관리 활성화 등의 항목을 관리할 수 있습니다. 네트워크 인터페이스의 세부 정보와 호스트에 대한 드라이브도 검토할 수 있습니다.
베어 메탈 호스트를 유지 관리 모드로 이동할 수 있습니다. 호스트를 유지 관리 모드로 이동할 때 스케줄러는 모든 관리 워크로드를 해당 베어 메탈 노드에서 이동합니다. 유지 관리 모드에서는 새 워크로드가 예약되지 않습니다.
웹 콘솔에서 베어 메탈 호스트를 프로비저닝 해제할 수 있습니다. 호스트 프로비저닝 해제는 다음 작업을 수행합니다.
-
cluster.k8s.io/delete-machine: true를 사용하여 베어 메탈 호스트 CR에 주석을 답니다. - 관련 컴퓨팅 머신 세트를 축소합니다.
먼저 데몬 세트와 관리되지 않는 정적 Pod를 다른 노드로 이동하지 않고 호스트의 전원을 끄면 서비스가 중단되고 데이터가 손실될 수 있습니다.
추가 리소스
8.2.1. 웹 콘솔을 사용하여 클러스터에 베어 메탈 호스트 추가
웹 콘솔의 클러스터에 베어 메탈 호스트를 추가할 수 있습니다.
사전 요구 사항
- 베어 메탈에 RHCOS 클러스터 설치
-
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
- 웹 콘솔에서 Compute → Bare Metal Hosts로 이동합니다.
- Add Host → New with Dialog를 선택합니다.
- 새 베어 메탈 호스트의 고유 이름을 지정합니다.
- Boot MAC address를 설정합니다.
- Baseboard Management Console (BMC) Address를 설정합니다.
- 호스트의 BMC(Baseboard Management Controller)에 대한 사용자 인증 정보를 입력합니다.
- 생성 후 호스트 전원을 켜도록선택하고 Create를 선택합니다.
- 사용 가능한 베어 메탈 호스트 수와 일치하도록 복제본 수를 확장합니다. Compute → MachineSets로 이동하고 Actions 드롭다운 메뉴에서 Edit Machine count을 선택하여 클러스터에서 머신 복제본 수를 늘립니다.
oc scale 명령 및 적절한 베어 메탈 컴퓨팅 머신 세트를 사용하여 베어 메탈 노드 수를 관리할 수도 있습니다.
8.2.2. 웹 콘솔에서 YAML을 사용하여 클러스터에 베어 메탈 호스트 추가
베어 메탈 호스트를 설명하는 YAML 파일을 사용하여 웹 콘솔의 클러스터에 베어 메탈 호스트를 추가할 수 있습니다.
사전 요구 사항
- 클러스터에 사용할 RHCOS 컴퓨팅 머신을 베어메탈 인프라에 설치합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. -
베어 메탈 호스트의
SecretCR을 생성합니다.
절차
- 웹 콘솔에서 Compute → Bare Metal Hosts로 이동합니다.
- Add Host → New from YAML을 선택합니다.
아래 YAML을 복사하고 붙여넣고 호스트의 세부 정보로 관련 필드를 수정합니다.
apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: <bare_metal_host_name> spec: online: true bmc: address: <bmc_address> credentialsName: <secret_credentials_name> 1 disableCertificateVerification: True 2 bootMACAddress: <host_boot_mac_address>- Create를 선택하여 YAML을 저장하고 새 베어 메탈 호스트를 생성합니다.
사용 가능한 베어 메탈 호스트 수와 일치하도록 복제본 수를 확장합니다. Compute → MachineSets로 이동하고 Actions 드롭다운 메뉴에서 Edit Machine count를 선택하여 클러스터의 머신 수를 늘립니다.
참고oc scale명령 및 적절한 베어 메탈 컴퓨팅 머신 세트를 사용하여 베어 메탈 노드 수를 관리할 수도 있습니다.
8.2.3. 사용 가능한 베어 메탈 호스트 수로 머신 자동 스케일링
사용 가능한 BareMetalHost 오브젝트 수와 일치하는 Machine 오브젝트 수를 자동으로 생성하려면 MachineSet 오브젝트에 metal3.io/autoscale-to-hosts 주석을 추가합니다.
사전 요구 사항
-
클러스터에서 사용할 RHCOS 베어 메탈 컴퓨팅 머신을 설치하고 해당
BareMetalHost오브젝트를 생성합니다. -
OpenShift Container Platform CLI (
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
metal3.io/autoscale-to-hosts주석을 추가하여 자동 스케일링을 구성할 컴퓨팅 머신 세트에 주석을 답니다. <machineset>를 컴퓨팅 머신 세트 이름으로 바꿉니다.$ oc annotate machineset <machineset> -n openshift-machine-api 'metal3.io/autoscale-to-hosts=<any_value>'
새로 확장된 머신이 시작될 때까지 기다립니다.
BareMetalHost 오브젝트를 사용하여 클러스터에 머신을 생성하고 레이블 또는 선택기가 BareMetalHost에서 변경되면 Machine 오브젝트가 생성된 MachineSet에 대해 BareMetalHost 오브젝트가 계속 계산됩니다.
8.2.4. provisioner 노드에서 베어 메탈 호스트 제거
특정 상황에서는 프로비저너 노드에서 베어 메탈 호스트를 일시적으로 삭제할 수 있습니다. 예를 들어 OpenShift Container Platform 관리 콘솔을 사용하거나 Machine Config Pool 업데이트로 인해 베어 메탈 호스트 재부팅이 트리거되는 경우 OpenShift Container Platform은 통합된 Dell Remote Access Controller(iDrac)에 로그인하여 작업 대기열 삭제를 발행합니다.
사용 가능한 BareMetalHost 오브젝트 수와 일치하는 Machine 오브젝트 수를 관리하지 않으려면 baremetalhost.metal3.io/detached 주석을 MachineSet 오브젝트에 추가합니다.
이 주석은 Provisioned,ExternallyProvisioned 또는 Ready/Available 상태인 BareMetalHost 오브젝트에만 적용됩니다.
사전 요구 사항
-
클러스터에서 사용할 RHCOS 베어 메탈 컴퓨팅 머신을 설치하고 해당
BareMetalHost오브젝트를 생성합니다. -
OpenShift Container Platform CLI (
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
baremetalhost.metal3.io/detached주석을 추가하여 프로비저너 노드에서 삭제할 컴퓨팅 머신 세트에 주석을 답니다.$ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached'
새 머신이 시작될 때까지 기다립니다.
참고BareMetalHost오브젝트를 사용하여 클러스터에 머신을 생성하고 레이블 또는 선택기가BareMetalHost에서 변경되면Machine오브젝트가 생성된MachineSet에 대해BareMetalHost오브젝트가 계속 계산됩니다.프로비저닝 사용 사례에서 다음 명령을 사용하여 재부팅 후 주석을 제거합니다.
$ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached-'
9장. 대규모 페이지의 기능과 애플리케이션에서 대규모 페이지를 사용하는 방법
9.1. 대규모 페이지의 기능
메모리는 페이지라는 블록으로 관리됩니다. 대부분의 시스템에서 한 페이지는 4Ki입니다. 1Mi 메모리는 256페이지와 같고 1Gi 메모리는 256,000페이지에 해당합니다. CPU에는 하드웨어에서 이러한 페이지 목록을 관리하는 내장 메모리 관리 장치가 있습니다. TLB(Translation Lookaside Buffer)는 가상-물리적 페이지 매핑에 대한 소규모 하드웨어 캐시입니다. TLB에 하드웨어 명령어로 전달된 가상 주소가 있으면 매핑을 신속하게 확인할 수 있습니다. 가상 주소가 없으면 TLB 누락이 발생하고 시스템에서 소프트웨어 기반 주소 변환 속도가 느려져 성능 문제가 발생합니다. TLB 크기는 고정되어 있으므로 TLB 누락 가능성을 줄이는 유일한 방법은 페이지 크기를 늘리는 것입니다.
대규모 페이지는 4Ki보다 큰 메모리 페이지입니다. x86_64 아키텍처에서 일반적인 대규모 페이지 크기는 2Mi와 1Gi입니다. 다른 아키텍처에서는 크기가 달라집니다. 대규모 페이지를 사용하려면 애플리케이션이 인식할 수 있도록 코드를 작성해야 합니다. THP(투명한 대규모 페이지)에서는 애플리케이션 지식 없이 대규모 페이지 관리를 자동화하려고 하지만 한계가 있습니다. 특히 페이지 크기 2Mi로 제한됩니다. THP에서는 THP 조각 모음 작업으로 인해 메모리 사용률이 높아지거나 조각화가 발생하여 노드에서 성능이 저하될 수 있으며 이로 인해 메모리 페이지가 잠길 수 있습니다. 이러한 이유로 일부 애플리케이션은 THP 대신 사전 할당된 대규모 페이지를 사용하도록 설계(또는 권장)할 수 있습니다.
OpenShift Container Platform에서는 Pod의 애플리케이션이 사전 할당된 대규모 페이지를 할당하고 사용할 수 있습니다.
9.2. 앱에서 대규모 페이지를 사용하는 방법
노드에서 대규모 페이지 용량을 보고하려면 노드가 대규모 페이지를 사전 할당해야 합니다. 노드는 단일 크기의 대규모 페이지만 사전 할당할 수 있습니다.
대규모 페이지는 hugepages-<size> 리소스 이름으로 컨테이너 수준 리소스 요구사항에 따라 사용할 수 있습니다. 여기서 크기는 특정 노드에서 지원되는 정수 값이 사용된 가장 간단한 바이너리 표현입니다. 예를 들어 노드에서 2,048KiB 페이지 크기를 지원하는 경우 예약 가능한 리소스 hugepages-2Mi를 공개합니다. CPU 또는 메모리와 달리 대규모 페이지는 초과 커밋을 지원하지 않습니다.
apiVersion: v1
kind: Pod
metadata:
generateName: hugepages-volume-
spec:
containers:
- securityContext:
privileged: true
image: rhel7:latest
command:
- sleep
- inf
name: example
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
resources:
limits:
hugepages-2Mi: 100Mi 1
memory: "1Gi"
cpu: "1"
volumes:
- name: hugepage
emptyDir:
medium: HugePages- 1
hugepages의 메모리 양은 할당할 정확한 양으로 지정하십시오. 이 값을hugepages의 메모리 양과 페이지 크기를 곱한 값으로 지정하지 마십시오. 예를 들어 대규모 페이지 크기가 2MB이고 애플리케이션에 100MB의 대규모 페이지 지원 RAM을 사용하려면 50개의 대규모 페이지를 할당합니다. OpenShift Container Platform에서 해당 계산을 처리합니다. 위의 예에서와 같이100MB를 직접 지정할 수 있습니다.
특정 크기의 대규모 페이지 할당
일부 플랫폼에서는 여러 대규모 페이지 크기를 지원합니다. 특정 크기의 대규모 페이지를 할당하려면 대규모 페이지 부팅 명령 매개변수 앞에 대규모 페이지 크기 선택 매개변수 hugepagesz=<size>를 지정합니다. <size> 값은 바이트 단위로 지정해야 하며 스케일링 접미사 [kKmMgG]를 선택적으로 사용할 수 있습니다. 기본 대규모 페이지 크기는 default_hugepagesz=<size> 부팅 매개변수로 정의할 수 있습니다.
대규모 페이지 요구사항
- 대규모 페이지 요청은 제한과 같아야 합니다. 제한은 지정되었으나 요청은 지정되지 않은 경우 제한이 기본값입니다.
- 대규모 페이지는 Pod 범위에서 격리됩니다. 컨테이너 격리는 향후 반복에서 계획됩니다.
-
대규모 페이지에서 지원하는
EmptyDir볼륨은 Pod 요청보다 더 많은 대규모 페이지 메모리를 사용하면 안 됩니다. -
SHM_HUGETLB로shmget()를 통해 대규모 페이지를 사용하는 애플리케이션은 proc/sys/vm/hugetlb_shm_group과 일치하는 보조 그룹을 사용하여 실행되어야 합니다.
9.3. Downward API를 사용하여 Huge Page 리소스 사용
Downward API를 사용하여 컨테이너에서 사용하는 Huge Page 리소스에 대한 정보를 삽입할 수 있습니다.
리소스 할당을 환경 변수, 볼륨 플러그인 또는 둘 다로 삽입할 수 있습니다. 컨테이너에서 개발하고 실행하는 애플리케이션은 지정된 볼륨에서의 환경 변수 또는 파일을 읽고 사용할 수 있는 리소스를 확인할 수 있습니다.
프로세스
다음 예와 유사한
hugepages-volume-pod.yaml파일을 생성합니다.apiVersion: v1 kind: Pod metadata: generateName: hugepages-volume- labels: app: hugepages-example spec: containers: - securityContext: capabilities: add: [ "IPC_LOCK" ] image: rhel7:latest command: - sleep - inf name: example volumeMounts: - mountPath: /dev/hugepages name: hugepage - mountPath: /etc/podinfo name: podinfo resources: limits: hugepages-1Gi: 2Gi memory: "1Gi" cpu: "1" requests: hugepages-1Gi: 2Gi env: - name: REQUESTS_HUGEPAGES_1GI <.> valueFrom: resourceFieldRef: containerName: example resource: requests.hugepages-1Gi volumes: - name: hugepage emptyDir: medium: HugePages - name: podinfo downwardAPI: items: - path: "hugepages_1G_request" <.> resourceFieldRef: containerName: example resource: requests.hugepages-1Gi divisor: 1Gi<.>
requests.hugepages-1Gi에서 리소스 사용을 읽고 값을REQUESTS_HUGEPAGES_1GI환경 변수로 표시하도록 지정합니다. <.>는requests.hugepages-1Gi에서 리소스 사용을 읽고 값을 파일/etc/podinfo/hugepages_1G_request로 표시하도록 지정합니다.volume-pod.yaml파일에서 Pod를 생성합니다.$ oc create -f hugepages-volume-pod.yaml
검증
REQUESTS_HUGEPAGES_1GI환경 변수 값을 확인합니다.$ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \ -- env | grep REQUESTS_HUGEPAGES_1GI출력 예
REQUESTS_HUGEPAGES_1GI=2147483648
/etc/podinfo/hugepages_1G_request파일의 값을 확인합니다.$ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \ -- cat /etc/podinfo/hugepages_1G_request출력 예
2
9.4. 부팅 시 Huge Page 구성
노드는 OpenShift Container Platform 클러스터에서 사용되는 대규모 페이지를 사전 할당해야 합니다. 대규모 페이지 예약은 부팅 시 예약하는 방법과 런타임 시 예약하는 방법 두 가지가 있습니다. 부팅 시 예약은 메모리가 아직 많이 조각화되어 있지 않으므로 성공할 가능성이 높습니다. Node Tuning Operator는 현재 특정 노드에서 대규모 페이지에 대한 부팅 시 할당을 지원합니다.
프로세스
노드 재부팅을 최소화하려면 다음 단계를 순서대로 수행해야 합니다.
동일한 대규모 페이지 설정이 필요한 모든 노드에 하나의 레이블을 지정합니다.
$ oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp=
다음 콘텐츠로 파일을 생성하고 이름을
hugepages-tuned-boottime.yaml로 지정합니다.apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: hugepages 1 namespace: openshift-cluster-node-tuning-operator spec: profile: 2 - data: | [main] summary=Boot time configuration for hugepages include=openshift-node [bootloader] cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 3 name: openshift-node-hugepages recommend: - machineConfigLabels: 4 machineconfiguration.openshift.io/role: "worker-hp" priority: 30 profile: openshift-node-hugepages
Tuned
hugepages오브젝트를 생성합니다.$ oc create -f hugepages-tuned-boottime.yaml
다음 콘텐츠로 파일을 생성하고 이름을
hugepages-mcp.yaml로 지정합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-hp labels: worker-hp: "" spec: machineConfigSelector: matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,worker-hp]} nodeSelector: matchLabels: node-role.kubernetes.io/worker-hp: ""머신 구성 풀을 생성합니다.
$ oc create -f hugepages-mcp.yaml
조각화되지 않은 메모리가 충분한 경우 worker-hp 머신 구성 풀의 모든 노드에 50개의 2Mi 대규모 페이지가 할당되어 있어야 합니다.
$ oc get node <node_using_hugepages> -o jsonpath="{.status.allocatable.hugepages-2Mi}"
100MiTuneD 부트로더 플러그인은 현재 RHCOS(Red Hat Enterprise Linux CoreOS) 8.x 작업자 노드에서 지원됩니다. RHEL(Red Hat Enterprise Linux) 7.x 작업자 노드의 경우 TuneD 부트로더 플러그인이 현재 지원되지 않습니다.
9.5. 투명한 대규모 페이지 비활성화
THP(투명한 대규모 페이지)는 대규모 페이지를 생성, 관리 및 사용하는 대부분의 측면을 자동화합니다. THP는 대규모 페이지를 자동으로 관리하므로 모든 유형의 워크로드에 대해 항상 최적으로 처리되지는 않습니다. THP는 많은 애플리케이션이 자체적으로 대규모 페이지를 처리하므로 성능 저하를 유발할 수 있습니다. 따라서 THP를 비활성화하는 것이 좋습니다. 다음 단계에서는 NTO(Node Tuning Operator)를 사용하여 THP를 비활성화하는 방법을 설명합니다.
프로세스
다음 콘텐츠로 파일을 생성하고 이름을
thp-disable-tuned.yaml로 지정합니다.apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: thp-workers-profile namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom tuned profile for OpenShift to turn off THP on worker nodes include=openshift-node [vm] transparent_hugepages=never name: openshift-thp-never-worker recommend: - match: - label: node-role.kubernetes.io/worker priority: 25 profile: openshift-thp-never-workerTuned 오브젝트를 생성합니다.
$ oc create -f thp-disable-tuned.yaml
활성 프로필 목록을 확인합니다.
$ oc get profile -n openshift-cluster-node-tuning-operator
검증
노드 중 하나에 로그인하고 일반 THP 검사를 수행하여 노드가 프로필을 성공적으로 적용했는지 확인합니다.
$ cat /sys/kernel/mm/transparent_hugepage/enabled
출력 예
always madvise [never]
10장. 짧은 대기 시간 튜닝
10.1. 짧은 대기 시간 이해
Telco/5G 영역에서 Edge 컴퓨팅이 등장하여 대기 시간 및 정체 문제를 줄이고 애플리케이션 성능을 개선하는 데 핵심적인 역할을 하고 있습니다.
간단히 말해, 대기 시간이 데이터(패킷)가 발신자에서 수신자로 이동하고 수신자의 처리 후 발신자로 반환되는 속도를 결정합니다. 5G의 네트워크 성능 요구 사항을 충족하기 위해서는 대기 시간 지연이 가능한 가장 낮은 네트워크 아키텍처를 유지보수하는 것이 핵심입니다. 평균 대기 시간이 50 ms인 4G 기술에 비해 5G는 1ms 이하의 대기 시간 수에 도달하는 것을 목표로 합니다. 이렇게 대기 시간이 감소하면 무선 처리량이 10배 증가합니다.
Telco 공간에 배포된 많은 애플리케이션에서는 제로 패킷 손실이 가능한 짧은 대기 시간을 요구하고 있습니다. 제로 패킷 손실 튜닝은 네트워크 성능을 저하시키는 고유한 문제를 완화하는 데 도움이 됩니다. 자세한 내용은 RHOSP(Red Hat OpenStack Platform)에서 제로 패킷 손실 튜닝을 참조하십시오.
Edge 컴퓨팅 이니셔티브는 대기 시간을 줄이는 데에도 큰 역할을 합니다. 클라우드 엣지에 있고 사용자에게 더 가깝다고 생각해 보십시오. 이렇게 되면 멀리 있는 데이터 센터와 사용자 간 거리를 크게 줄여 애플리케이션 응답 시간과 성능 대기 시간이 단축됩니다.
관리자는 많은 엣지 사이트와 로컬 서비스를 중앙 집중식으로 관리하여 가능한 한 가장 낮은 관리 비용으로 모든 배포를 실행할 수 있어야 합니다. 또한, 실시간 짧은 대기 시간과 높은 성능을 실현할 수 있도록 클러스터의 특정 노드를 쉽게 배포하고 구성할 수 있어야 합니다. 대기 시간이 짧은 노드는 CNF(클라우드 네이티브 네트워크 기능) 및 DPDK(데이터 플레인 개발 키트)와 같은 애플리케이션에 유용합니다.
OpenShift Container Platform에서는 현재 실시간 실행과 짧은 대기 시간(약 20마이크로초 미만의 반응 시간)을 지원하기 위해 OpenShift Container Platform 클러스터의 소프트웨어를 튜닝하는 메커니즘을 제공합니다. 이 메커니즘에는 커널 및 OpenShift Container Platform 설정 값 튜닝, 커널 설치, 머신 재구성이 포함되어 있습니다. 하지만 이 방법을 사용하려면 4가지 Operator를 설정해야 하며 수동으로 수행할 경우 복잡하고 실수하기 쉬운 많은 구성을 수행해야 합니다.
OpenShift Container Platform에서는 Node Tuning Operator를 사용하여 OpenShift Container Platform 애플리케이션에 대해 짧은 대기 시간 성능을 실현하도록 자동 튜닝을 구현합니다. 클러스터 관리자는 이 성능 프로필 구성을 사용하여 보다 안정적인 방식으로 이러한 변경을 더욱 쉽게 수행할 수 있습니다. 관리자는 커널을 kernel-rt로 업데이트할지 여부를 지정하고, Pod 인프라 컨테이너를 포함하여 클러스터 및 운영 체제 하우스키핑 작업을 위해 CPU를 예약하고, 애플리케이션 컨테이너의 CPU를 분리하여 워크로드를 실행할 수 있습니다.
현재 cgroup v2에서는 CPU 부하 분산을 비활성화하지 않습니다. 따라서 cgroup v2가 활성화된 경우 성능 프로필에서 원하는 동작을 얻지 못할 수 있습니다. performace 프로필을 사용하는 경우 cgroup v2를 활성화하는 것은 권장되지 않습니다.
OpenShift Container Platform은 Node Tuning Operator에 대한 워크로드 팁도 지원하므로 다양한 업계 환경의 요구 사항을 충족하도록 PerformanceProfile 을 조정할 수 있습니다. 워크로드 힌트는 높은PowerConsumption(높은 전력 소비 비용의 경우 짧은 대기 시간)과 realTime (시간별 대기 시간에 제공되는 우선 순위)에 사용할 수 있습니다. 이러한 힌트에 대한 true/false 설정의 조합을 사용하여 애플리케이션별 워크로드 프로필 및 요구 사항을 처리할 수 있습니다.
워크로드 힌트는 업계별 설정으로 성능 저하를 단순화합니다. "하나 크기가 모두 적합" 접근 방식 대신 워크로드 힌트는 우선 순위를 지정하는 등의 사용 패턴을 실현할 수 있습니다.
- 짧은 대기 시간
- 실시간 기능
- 효율적인 전원 사용
이상적인 세계에서, 그 모든 것이 우선 순위가 될 것입니다 : 실제에서는, 일부는 다른 사람의 대가를 받습니다. Node Tuning Operator는 이제 워크로드 기대치를 인식하고 워크로드의 요구 사항을 보다 효과적으로 충족할 수 있습니다. 이제 클러스터 관리자가 워크로드가 떨어지는 사용 사례를 지정할 수 있습니다. Node Tuning Operator는 PerformanceProfile 을 사용하여 워크로드에 대한 성능 설정을 세부 조정합니다.
애플리케이션이 작동하는 환경은 동작에 영향을 미칩니다. 엄격한 대기 시간 요구 사항이 없는 일반적인 데이터 센터의 경우 일부 고성능 워크로드 Pod에 대해 CPU 파티셔닝을 활성화하는 최소 기본 튜닝만 필요합니다. 대기 시간이 더 높은 데이터 센터 및 워크로드의 경우 전력 소비를 최적화하기 위해 조치를 취합니다. 가장 복잡한 경우는 제조업 및 소프트웨어 정의 라디오와 같은 대기 시간에 민감한 장치에 가까운 클러스터입니다. 이 마지막 배포 클래스를 종종ECDHE edge라고 합니다. edge 배포의 경우, 지연 시간이 매우 낮으며 전력 관리를 통해 얻을 수 있습니다.
OpenShift Container Platform 버전 4.10 및 이전 버전에서 Performance Addon Operator는 짧은 대기 시간 성능을 달성하기 위해 자동 튜닝을 구현하는 데 사용되었습니다. 이제 이 기능이 Node Tuning Operator의 일부입니다.
10.1.1. 짧은 대기 시간과 실시간 애플리케이션의 하이퍼 스레딩 정보
하이퍼 스레딩은 물리 CPU 프로세서 코어가 두 개의 논리 코어로 작동하여 두 개의 독립 스레드를 동시에 실행할 수 있는 Intel 프로세서 기술입니다. 하이퍼 스레딩을 사용하면 병렬 처리가 효과적인 특정 워크로드 유형에 대한 시스템 처리량이 향상시킬 수 있습니다. 기본 OpenShift Container Platform 설정에서는 기본적으로 하이퍼 스레딩을 활성화하도록 설정해야합니다.
통신 애플리케이션의 경우 가능한 한 대기 시간을 최소화하도록 애플리케이션 인프라를 설계하는 것이 중요합니다. 하이퍼 스레딩은 성능을 저하시킬 수 있으며 대기 시간이 짧은 컴퓨팅 집약적 워크로드의 처리량에 부정적인 영향을 미칠 수 있습니다. 하이퍼 스레딩을 비활성화하면 예측 가능한 성능이 보장되고 이러한 워크로드의 처리 시간을 줄일 수 있습니다.
OpenShift Container Platform을 실행하는 하드웨어에 따라 하이퍼 스레딩 구현 및 구성이 다릅니다. 해당 하드웨어와 관련된 하이퍼 스레딩 구현에 대한 자세한 내용은 관련 호스트 하드웨어 튜닝 정보를 참조하십시오. 하이퍼 스레딩을 비활성화하면 클러스터 코어당 비용이 증가할 수 있습니다.
추가 리소스
10.2. 실시간 및 짧은 대기 시간 워크로드 프로비저닝
많은 업계와 조직에서 매우 높은 성능의 컴퓨팅을 필요로 하고 있으며 특히 금융 및 통신 업계에서는 짧고 예측 가능한 대기 시간이 요구될 수 있습니다. 고유한 요구 사항이 있는 이러한 업계의 경우 OpenShift Container Platform은 OpenShift Container Platform 애플리케이션에 대해 짧은 대기 시간 성능과 일관된 응답 시간을 실현할 수 있도록 자동 튜닝을 구현하는 Node Tuning Operator를 제공합니다.
클러스터 관리자는 이 성능 프로필 구성을 사용하여 보다 안정적인 방식으로 이러한 변경을 수행할 수 있습니다. 관리자는 커널을 kernel-rt(실시간)로 업데이트할지 여부를 지정하고, Pod 인프라 컨테이너를 포함한 클러스터 및 운영 체제 하우스키핑 작업을 위해 CPU를 예약하고, 애플리케이션 컨테이너의 CPU를 분리하여 워크로드를 실행하고 사용하지 않는 CPU를 비활성화하여 전력 소비를 줄일 수 있습니다.
보장된 CPU가 필요한 애플리케이션과 함께 실행 프로브를 사용하면 대기 시간이 급증할 수 있습니다. 네트워크 프로브 세트를 대안으로 올바르게 구성한 등 다른 프로브를 사용하는 것이 좋습니다.
이전 버전의 OpenShift Container Platform에서는 Performance Addon Operator를 사용하여 OpenShift 애플리케이션에 대한 대기 시간을 단축할 수 있도록 자동 튜닝을 구현했습니다. OpenShift Container Platform 4.11 이상에서는 이러한 기능이 Node Tuning Operator의 일부입니다.
10.2.1. 실시간에 대한 알려진 제한 사항
대부분의 배포에서는 3개의 컨트롤 플레인 노드와 3개의 작업자 노드가 있는 표준 클러스터를 사용하는 경우에만 kernel-rt가 지원됩니다. OpenShift Container Platform 배포 시 컴팩트 및 단일 노드에 대한 예외가 있습니다. 단일 노드에 설치하는 경우 단일 컨트롤 플레인 노드에서 kernel-rt가 지원됩니다.
실시간 모드를 완전히 활용하려면 상승된 권한으로 컨테이너를 실행해야 합니다. 권한 부여에 대한 자세한 내용은 컨테이너에 대한 기능 설정을 참조하십시오.
OpenShift Container Platform에서는 허용되는 기능을 제한하므로 SecurityContext를 생성해야 할 수도 있습니다.
RHCOS(Red Hat Enterprise Linux CoreOS) 시스템을 사용하는 베어 메탈 설치에서는 이러한 절차가 완전하게 지원됩니다.
적합한 성능 기대치를 설정한다는 것은 실시간 커널이 만능 해결책이 아니라는 것을 나타냅니다. 설정의 목표는 예측 가능한 응답 시간을 제공하는 일관되고 대기 시간이 짧은 결정성을 갖추는 것입니다. 실시간 커널에는 연관된 추가 커널 오버헤드가 있습니다. 이러한 오버헤드는 주로 별도로 예약된 스레드에서 하드웨어 중단을 처리하는 데서 발생합니다. 일부 워크로드에서 오버헤드가 증가하면 전반적으로 처리량 성능이 저하됩니다. 정확한 저하 수치는 워크로드에 따라 달라지며, 범위는 0%에서 30% 사이입니다. 하지만 이러한 저하는 결정성에 대한 대가입니다.
10.2.2. 실시간 기능이 있는 작업자 프로비저닝
- 선택사항: OpenShift Container Platform 클러스터에 노드를 추가합니다. 시스템 튜닝을 위한 BIOS 매개변수 설정을 참조하십시오.
-
oc명령을 사용하여 실시간 기능이 필요한 작업자 노드에 레이블worker-rt를 추가합니다. 실시간 노드에 사용할 새 머신 구성 풀을 생성합니다.
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-rt labels: machineconfiguration.openshift.io/role: worker-rt spec: machineConfigSelector: matchExpressions: - { key: machineconfiguration.openshift.io/role, operator: In, values: [worker, worker-rt], } paused: false nodeSelector: matchLabels: node-role.kubernetes.io/worker-rt: ""라벨이 worker-rt인 노드 그룹에 대해 머신 구성 풀
worker-rt가 생성됩니다.노드 역할 레이블을 사용하여 적절한 머신 구성 풀에 노드를 추가합니다.
참고실시간 워크로드로 구성된 노드를 결정해야 합니다. 클러스터의 모든 노드 또는 노드의 하위 집합을 구성할 수 있습니다. 모든 노드를 예상하는 Node Tuning Operator는 전용 머신 구성 풀의 일부입니다. 모든 노드를 사용하는 경우 Node Tuning Operator에서 작업자 노드 역할 레이블을 가리켜야 합니다. 서브 세트를 사용하는 경우 해당 노드를 새 머신 구성 풀로 그룹화해야 합니다.
-
적절한 하우스키핑 코어 세트와
realTimeKernel: enabled: true를 사용하여PerformanceProfile을 생성합니다. PerformanceProfile에서machineConfigPoolSelector를 설정해야 합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: example-performanceprofile spec: ... realTimeKernel: enabled: true nodeSelector: node-role.kubernetes.io/worker-rt: "" machineConfigPoolSelector: machineconfiguration.openshift.io/role: worker-rt레이블과 일치하는 머신 구성 풀이 있는지 검증합니다.
$ oc describe mcp/worker-rt
출력 예
Name: worker-rt Namespace: Labels: machineconfiguration.openshift.io/role=worker-rt
- OpenShift Container Platform에서 노드 구성을 시작합니다. 이 작업에서는 여러 번 재부팅이 수행될 수 있습니다. 노드가 설정될 때까지 기다리십시오. 사용하는 하드웨어에 따라 시간이 오래 걸릴 수 있으며 노드당 20분으로 예상됩니다.
- 모든 요소가 예상대로 작동하는지 검증하십시오.
10.2.3. 실시간 커널 설치 검증
다음 명령을 사용하여 실시간 커널이 설치되었는지 검증합니다.
$ oc get node -o wide
4.18.0-305.30.1.rt7.102.el8_4.x86_64 cri-o://1.26.0-99.rhaos4.10.gitc3131de.el8 문자열이 포함된 worker-rt 역할의 작업자를 확인합니다.
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME rt-worker-0.example.com Ready worker,worker-rt 5d17h v1.26.0 128.66.135.107 <none> Red Hat Enterprise Linux CoreOS 46.82.202008252340-0 (Ootpa) 4.18.0-305.30.1.rt7.102.el8_4.x86_64 cri-o://1.26.0-99.rhaos4.10.gitc3131de.el8 [...]
10.2.4. 실시간으로 작동하는 워크로드 생성
실시간 기능을 사용할 워크로드를 준비하려면 다음 절차를 사용하십시오.
절차
-
QoS 클래스가
Guaranteed인 Pod를 생성합니다. - 선택사항: DPDK에 대해 CPU 부하 분산을 비활성화합니다.
- 적절한 노드 선택기를 할당합니다.
애플리케이션을 작성하는 경우 애플리케이션 튜닝 및 배포에 설명된 일반 권장 사항을 따르십시오.
10.2.5. QoS 클래스가 Guaranteed인 Pod 생성
QoS 클래스가 Guaranteed로 지정된 Pod를 생성하는 경우 다음 사항에 유의하십시오.
- Pod의 모든 컨테이너에는 메모리 제한과 메모리 요청이 있어야 하며 동일해야 합니다.
- Pod의 모든 컨테이너에는 CPU 제한과 CPU 요청이 있어야 하며 동일해야 합니다.
다음 예에서는 컨테이너가 하나인 Pod의 구성 파일을 보여줍니다. 이 컨테이너에는 메모리 제한과 메모리 요청이 있으며 둘 다 200MiB입니다. 이 컨테이너에는 CPU 제한과 CPU 요청이 있으며 둘 다 CPU 1개입니다.
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr
image: <image-pull-spec>
resources:
limits:
memory: "200Mi"
cpu: "1"
requests:
memory: "200Mi"
cpu: "1"Pod를 생성합니다.
$ oc apply -f qos-pod.yaml --namespace=qos-example
Pod에 대한 자세한 정보를 봅니다.
$ oc get pod qos-demo --namespace=qos-example --output=yaml
출력 예
spec: containers: ... status: qosClass: Guaranteed참고컨테이너가 자체 메모리 제한은 지정하지만 메모리 요청은 지정하지 않으면 OpenShift Container Platform에서 제한과 일치하는 메모리 요청을 자동으로 할당합니다. 마찬가지로, 컨테이너가 자체 CPU 제한은 지정하지만 CPU 요청은 지정하지 않으면 OpenShift Container Platform에서 제한과 일치하는 CPU 요청을 자동으로 할당합니다.
10.2.6. 선택사항: DPDK에 대해 CPU 부하 분산 비활성화
CPU 부하 분산을 비활성화하거나 활성화하는 기능은 CRI-O 수준에서 구현됩니다. CRI-O 아래의 코드는 다음 요구사항이 충족되는 경우에만 CPU 부하 분산을 비활성화하거나 활성화합니다.
Pod는
performance-<profile-name>런타임 클래스를 사용해야 합니다. 다음과 같이 성능 프로필의 상태를 보고 적절한 이름을 가져올 수 있습니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile ... status: ... runtimeClass: performance-manual
현재 cgroup v2에서는 CPU 부하 분산을 비활성화하는 것은 지원되지 않습니다.
Node Tuning Operator는 관련 노드 아래에 고성능 런타임 처리기 구성 스니펫을 생성하고 클러스터 아래에 고성능 런타임 클래스를 생성해야 합니다. CPU 부하 분산 구성 기능을 활성화하는 것을 제외하고는 기본 런타임 처리기와 콘텐츠가 동일합니다.
Pod에 대해 CPU 부하 분산을 비활성화하려면 Pod 사양에 다음 필드가 포함되어야 합니다.
apiVersion: v1
kind: Pod
metadata:
...
annotations:
...
cpu-load-balancing.crio.io: "disable"
...
...
spec:
...
runtimeClassName: performance-<profile_name>
...CPU 관리자 static 정책이 활성화되어 있는 경우 전체 CPU를 사용하는 guaranteed QoS가 있는 Pod에 대해서만 CPU 부하 분산을 비활성화하십시오. 그렇지 않은 경우 CPU 부하 분산을 비활성화하면 클러스터에 있는 다른 컨테이너의 성능에 영향을 미칠 수 있습니다.
10.2.7. 적절한 노드 선택기 할당
노드에 Pod를 할당하는 기본 방법은 다음과 같이 성능 프로필에서 사용한 것과 동일한 노드 선택기를 사용하는 것입니다.
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
# ...
nodeSelector:
node-role.kubernetes.io/worker-rt: ""자세한 내용은 노드 선택기를 사용하여 특정 노드에 Pod 배치를 참조하십시오.
10.2.8. 실시간 기능이 있는 작업자에 대해 워크로드 예약
Node Tuning Operator가 짧은 대기 시간을 위해 구성한 머신 구성 풀에 연결된 노드와 일치하는 라벨 선택기를 사용합니다. 자세한 내용은 노드에 Pod 할당을 참조하십시오.
10.2.9. CPU를 오프라인으로 가져와 전력 소비 감소
일반적으로 통신 워크로드를 예측할 수 있습니다. 모든 CPU 리소스가 필요하지 않은 경우 Node Tuning Operator를 오프라인으로 사용하여 성능 프로필을 수동으로 업데이트하여 전원 소비를 줄일 수 있습니다.
사용하지 않는 CPU를 오프라인으로 사용하려면 다음 작업을 수행해야 합니다.
성능 프로필에서 오프라인 CPU를 설정하고 YAML 파일의 내용을 저장합니다.
오프라인 CPU가 있는 성능 프로필의 예
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - intel_idle.max_cstate=0 - idle=poll cpu: isolated: "2-23,26-47" reserved: "0,1,24,25" offlined: “48-59” 1 nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: single-numa-node realTimeKernel: enabled: true- 1
- 선택 사항:
오프라인필드의 CPU를 나열하여 지정된 CPU를 오프라인으로 수행할 수 있습니다.
다음 명령을 실행하여 업데이트된 프로필을 적용합니다.
$ oc apply -f my-performance-profile.yaml
10.2.10. 선택 사항: 절전 구성
높은 우선 순위 워크로드의 대기 시간 또는 처리량에 영향을 주지 않고 우선 순위가 높은 워크로드와 함께 배치되는 우선 순위가 낮은 노드에 대해 전력 절감을 활성화할 수 있습니다. 워크로드 자체를 수정하지 않고 절전을 수행할 수 있습니다.
이 기능은 Intel Ice Lake 및 이후 세대의 Intel CPU에서 지원됩니다. 프로세서의 기능은 높은 우선 순위 워크로드의 대기 시간 및 처리량에 영향을 미칠 수 있습니다.
절전 구성을 사용하여 노드를 구성하는 경우 Pod 수준에서 성능 구성으로 높은 우선 순위의 워크로드를 구성해야 합니다. 즉, 구성이 Pod에서 사용하는 모든 코어에 적용됩니다.
Pod 수준에서 P-states 및 C-states를 비활성화하면 높은 우선 순위의 워크로드를 구성하여 최상의 성능과 대기 시간을 단축할 수 있습니다.
표 10.1. 우선순위가 높은 워크로드를 위한 구성
| 주석 | 설명 |
|---|---|
annotations: cpu-c-states.crio.io: "disable" cpu-freq-governor.crio.io: "<governor>" |
C-states를 비활성화하고 CPU 스케일링에 대한 governor 유형을 지정하여 Pod에 가장 적합한 성능을 제공합니다. 높은 우선 순위 워크로드에 |
사전 요구 사항
- BIOS에서 C-states 및 OS 제어 P-states 활성화
절차
per-pod-power-management를true로 설정하여PerformanceProfile을 생성합니다.$ podman run --entrypoint performance-profile-creator -v \ /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13 \ --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true \ --split-reserved-cpus-across-numa=false --topology-manager-policy=single-numa-node \ --must-gather-dir-path /must-gather -power-consumption-mode=low-latency \ 1 --per-pod-power-management=true > my-performance-profile.yaml- 1
power-consumption-mode는per-pod-power-management가true로 설정된 경우default또는low-latency여야 합니다.
perPodPowerManagement가 있는PerformanceProfile의 예apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: [.....] workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: true기본
cpufreqgovernor를PerformanceProfileCR(사용자 정의 리소스)에서 추가 커널 인수로 설정합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: ... additionalKernelArgs: - cpufreq.default_governor=schedutil 1- 1
- 그러나
schedutilgovernor를 사용하는 것이 좋습니다. 그러나ondemand또는powersavegovernors와 같은 다른 governors를 사용할 수 있습니다.
TunedPerformancePatchCR에서 최대 CPU 빈도를 설정합니다.spec: profile: - data: | [sysfs] /sys/devices/system/cpu/intel_pstate/max_perf_pct = <x> 1- 1
max_perf_pct는cpufreq드라이버가 지원되는 최대 CPU 빈도의 백분율로 설정할 수 있는 최대 빈도를 제어합니다. 이 값은 모든 CPU에 적용됩니다./sys/devices/system/cpu0/cpufreq/cpuinfo_max_freq에서 지원되는 최대 빈도를 확인할 수 있습니다. 시작 지점으로 모든 CPU를 모든코어의 frequency에서 제한하는 백분율을 사용할 수 있습니다.모든 코어가모두 사용 중일 때 모든 코어가 실행되는 빈도입니다.
높은 우선 순위의 워크로드 Pod에 원하는 주석을 추가합니다. 주석은
기본설정을 재정의합니다.우선순위가 높은 워크로드 주석의 예
apiVersion: v1 kind: Pod metadata: ... annotations: ... cpu-c-states.crio.io: "disable" cpu-freq-governor.crio.io: "<governor>" ... ... spec: ... runtimeClassName: performance-<profile_name> ...- Pod를 다시 시작합니다.
추가 리소스
- 권장 펌웨어 구성에 대한 자세한 내용은 vDU 클러스터 호스트의 권장 펌웨어 구성을 참조하십시오.
10.2.11. 보장된 pod 분리 CPU의 장치 중단 처리 관리
Node Tuning Operator는 호스트 CPU를 Pod 인프라 컨테이너를 포함하여 클러스터 및 운영 체제 하우스키핑 작업을 위해 예약된 CPU와 워크로드를 실행하는 애플리케이션 컨테이너의 분리된 CPU로 나누어 호스트 CPU를 관리할 수 있습니다. 이를 통해 대기 시간이 짧은 워크로드의 CPU를 분리된 상태로 설정할 수 있습니다.
장치 중단은 보장된 pod가 실행 중인 CPU를 제외하고 CPU의 과부하를 방지하기 위해 모든 분리된 CPU와 예약된 CPU 간에 균형을 유지합니다. pod에 관련 주석이 설정되어 있으면 보장된 Pod CPU가 장치 인터럽트를 처리하지 못합니다.
새로운 성능 프로파일 필드 globallyDisableIrqLoadBalancing은 장치 중단을 처리할지 여부를 관리하는 데 사용할 수 있습니다. 특정 워크로드의 경우 예약된 CPU는 장치 인터럽트를 처리하기에 충분하지 않으며 이러한 이유로 장치 인터럽트는 분리된 CPU에서 전역적으로 비활성화되지 않습니다. 기본적으로 Node Tuning Operator는 분리된 CPU에서 장치 인터럽트를 비활성화하지 않습니다.
워크로드에 대한 대기 시간을 단축하기 위해 일부(전체) pod에는 장치 인터럽트를 처리하지 않기 위한 실행 중인 CPU가 필요합니다. pod 주석 irq-load-balancing.crio.io는 장치 인터럽트의 처리 여부를 정의하는 데 사용됩니다. 설정되어 있는 경우 CRI-O는 pod가 실행되는 경우에만 장치 인터럽트를 비활성화합니다.
10.2.11.1. CPU CFS 할당량 비활성화
보장된 개별 Pod의 CPU 제한을 줄이기 위해 cpu-quota.crio.io: "disable" 주석을 사용하여 Pod 사양을 생성합니다. 이 주석은 Pod 실행 시 CPU의 CFS(완전성 스케줄러) 할당량을 비활성화합니다. 다음 Pod 사양에는 이 주석이 포함되어 있습니다.
apiVersion: v1
kind: Pod
metadata:
annotations:
cpu-quota.crio.io: "disable"
spec:
runtimeClassName: performance-<profile_name>
...CPU 관리자 정적 정책이 활성화되고 전체 CPU를 사용하는 보장 QoS가 있는 Pod에 대해서만 CPU CFS 할당량을 비활성화합니다. 그렇지 않으면 CPU CFS 할당량을 비활성화하면 클러스터에 있는 다른 컨테이너의 성능에 영향을 미칠 수 있습니다.
10.2.11.2. Node Tuning Operator에서 글로벌 장치 인터럽트 처리 비활성화
분리된 CPU 세트에 대한 글로벌 장치 인터럽트를 비활성화하도록 Node Tuning Operator를 구성하려면 성능 프로필의 globallyDisableIrqLoadBalancing 필드를 true 로 설정합니다. true인 경우 충돌하는 Pod 주석이 무시됩니다. false인 경우 IRQ 로드는 모든 CPU에서 균형을 유지합니다.
성능 프로파일 스니펫에서는 이 설정을 보여줍니다.
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: globallyDisableIrqLoadBalancing: true ...
10.2.11.3. 개별 pod에 대한 인터럽트 처리 비활성화
개별 pod의 인터럽트 처리를 비활성화하려면 성능 프로필에서 globallyDisableIrqLoadBalancing이 false 로 설정되어 있는지 확인합니다. 그런 다음 Pod 사양에서 irq-load-balancing.crio.io Pod 주석을 비활성화 하십시오. 다음 Pod 사양에는 이 주석이 포함되어 있습니다.
apiVersion: performance.openshift.io/v2
kind: Pod
metadata:
annotations:
irq-load-balancing.crio.io: "disable"
spec:
runtimeClassName: performance-<profile_name>
...10.2.12. 장치 인터럽트 처리를 사용하기 위해 성능 프로파일을 업그레이드
Node Tuning Operator 성능 프로필 CRD(사용자 정의 리소스 정의)를 v1 또는 v1alpha1에서 v2로 업그레이드하는 경우 기존 프로필에서 globallyDisableIrqLoadBalancing 이 true 로 설정됩니다.
Isolated CPU 세트에 대해 IRQ 부하 분산을 비활성화할지 여부를 globallyDisableIrqLoadBalancing 토글합니다. 옵션이 true 로 설정되면 Isolated CPU 세트에 대해 IRQ 로드 밸런싱을 비활성화합니다. 옵션을 false 로 설정하면 IRQ가 모든 CPU에서 균형을 유지할 수 있습니다.
10.2.12.1. 지원되는 API 버전
Node Tuning Operator는 성능 프로필 apiVersion 필드의 v2,v1, v1alpha1 을 지원합니다. v1 및 v1alpha1 API는 동일합니다. v2 API에는 기본값인 false 값을 사용하여 선택적 부울 필드 loballyDisableIrqLoadBalancing이 포함됩니다.
10.2.12.1.1. Node Tuning Operator API를 v1alpha1에서 v1로 업그레이드
Node Tuning Operator API 버전을 v1alpha1에서 v1로 업그레이드하는 경우 "None" 변환 전략을 사용하여 v1alpha1 성능 프로파일이 즉시 변환되고 API 버전 v1을 사용하여 Node Tuning Operator에 제공됩니다.
10.2.12.1.2. Node Tuning Operator API를 v1alpha1 또는 v1에서 v2로 업그레이드
이전 Node Tuning Operator API 버전에서 업그레이드할 때 기존 v1 및 v1alpha1 성능 프로필은 true 값으로 globallyDisableIrqLoadBalancing 필드를 삽입하는 변환 Webhook를 사용하여 변환됩니다.
10.3. 성능 프로필을 사용하여 짧은 대기 시간을 실현하도록 노드 튜닝
성능 프로필을 사용하면 특정 머신 구성 풀에 속한 노드의 대기 시간 튜닝 측면을 제어할 수 있습니다. 설정을 지정하면 PerformanceProfile 오브젝트가 실제 노드 수준 튜닝을 수행하는 여러 오브젝트로 컴파일됩니다.
-
MachineConfig파일은 노드를 조작합니다. -
KubeletConfig파일은 토폴로지 관리자, CPU 관리자 및 OpenShift Container Platform 노드를 구성합니다. - Tuned 프로필은 Node Tuning Operator를 구성합니다.
성능 프로필을 사용하여 커널을 kernel-rt로 업데이트할지 여부를 지정하고, 대규모 페이지를 할당하고, CPU를 분할하여 하우스키핑 작업 수행 또는 워크로드 실행에 사용할 CPU를 분할할 수 있습니다.
PerformanceProfile 오브젝트를 수동으로 생성하거나 PPC(Performance Profile Creator)를 사용하여 성능 프로필을 생성할 수 있습니다. PPC에 대한 자세한 내용은 아래 추가 리소스를 참조하십시오.
성능 프로파일의 예
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: "4-15" 1 reserved: "0-3" 2 hugepages: defaultHugepagesSize: "1G" pages: - size: "1G" count: 16 node: 0 realTimeKernel: enabled: true 3 numa: 4 topologyPolicy: "best-effort" nodeSelector: node-role.kubernetes.io/worker-cnf: "" 5
- 1
- 이 필드를 사용하여 워크로드의 애플리케이션 컨테이너와 함께 사용할 특정 CPU를 분리합니다. 하이퍼 스레딩이 활성화된 경우 오류 없이 Pod를 실행할 수 있도록 분리된 CPU 수를 설정합니다.
- 2
- 이 필드를 사용하여 하우스키핑을 위해 인프라 컨테이너와 함께 사용할 특정 CPU를 예약합니다.
- 3
- 이 필드를 사용하여 노드에 실시간 커널을 설치합니다. 유효한 값은
true또는false입니다.true값을 설정하면 실시간 커널이 설치됩니다. - 4
- 이 필드를 사용하여 토폴로지 관리자 정책을 구성합니다. 유효한 값은
none(기본값),best-effort,restricted및single-numa-node입니다. 자세한 내용은 토폴로지 관리자 정책을 참조하십시오. - 5
- 이 필드를 사용하여 특정 노드에 성능 프로파일을 적용할 노드 선택기를 지정합니다.
추가 리소스
- 성능 프로필을 생성하기 위해 PPC(Performance Profile Creator)를 사용하는 방법에 대한 자세한 내용은 성능 프로필 생성을 참조하십시오.
10.3.1. 대규모 페이지 구성
노드는 OpenShift Container Platform 클러스터에서 사용되는 대규모 페이지를 사전 할당해야 합니다. Node Tuning Operator를 사용하여 특정 노드에 대규모 페이지를 할당합니다.
OpenShift Container Platform에서는 대규모 페이지를 생성하고 할당하는 방법을 제공합니다. Node Tuning Operator는 성능 프로필을 사용하여 더 쉽게 이 작업을 수행할 수 있는 방법을 제공합니다.
예를 들어 성능 프로필의 hugepages pages 섹션에서 size, count 및 node(선택사항)로 된 여러 블록을 지정할 수 있습니다.
hugepages:
defaultHugepagesSize: "1G"
pages:
- size: "1G"
count: 4
node: 0 1- 1
node는 대규모 페이지가 할당된 NUMA 노드입니다.node를 생략하면 페이지가 모든 NUMA 노드에 균등하게 분산됩니다.
관련 머신 구성 풀 상태에 업데이트가 완료된 것으로 나타날 때까지 기다립니다.
대규모 페이지를 할당하기 위해 수행해야 하는 구성 단계는 이것이 전부입니다.
검증
구성을 검증하려면 노드의
/proc/meminfo파일을 참조하십시오.$ oc debug node/ip-10-0-141-105.ec2.internal
# grep -i huge /proc/meminfo
출력 예
AnonHugePages: ###### ## ShmemHugePages: 0 kB HugePages_Total: 2 HugePages_Free: 2 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: #### ## Hugetlb: #### ##
oc describe를 사용하여 새 크기를 보고합니다.$ oc describe node worker-0.ocp4poc.example.com | grep -i huge
출력 예
hugepages-1g=true hugepages-###: ### hugepages-###: ###
10.3.2. 여러 대규모 페이지 크기 할당
동일한 컨테이너에서 다양한 크기의 대규모 페이지를 요청할 수 있습니다. 이 경우 다양한 대규모 페이지 크기 요구사항이 있는 컨테이너로 구성된 더 복잡한 Pod를 정의할 수 있습니다.
예를 들어 1G 및 2M 크기를 정의할 수 있으며 Node Tuning Operator는 다음과 같이 노드에서 크기를 둘 다 구성합니다.
spec:
hugepages:
defaultHugepagesSize: 1G
pages:
- count: 1024
node: 0
size: 2M
- count: 4
node: 1
size: 1G10.3.3. IRQ 동적 로드 밸런싱을 위한 노드 구성
IRQ 동적 로드 밸런싱의 클러스터 노드를 구성하여 어떤 코어가 장치 인터럽트 요청(IRQ)을 수신할 수 있는지 제어합니다.
사전 요구 사항
- 핵심 격리를 위해 모든 서버 하드웨어 구성 요소는 IRQ 선호도를 지원해야 합니다. 서버의 하드웨어 구성 요소가 IRQ 선호도를 지원하는지 확인하려면 서버의 하드웨어 사양을 확인하거나 하드웨어 제공 업체에 문의하십시오.
절차
- cluster-admin 역할의 사용자로 OpenShift Container Platform 클러스터에 로그인합니다.
-
performance.openshift.io/v2를 사용하도록 성능 프로파일의apiVersion을 설정합니다. -
globallyDisableIrqLoadBalancing필드를 삭제제거하거나false로 설정합니다. 적절한 분리 및 예약된 CPU를 설정합니다. 다음 스니펫에서는 두 개의 CPU를 예약하는 프로파일을 보여줍니다.
isolatedCPU 세트에서 실행되는 Pod에 대해 IRQ 로드 밸런싱이 활성화됩니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: dynamic-irq-profile spec: cpu: isolated: 2-5 reserved: 0-1 ...참고예약 및 분리된 CPU를 구성하면 Pod의 인프라 컨테이너는 예약된 CPU를 사용하고 애플리케이션 컨테이너는 분리된 CPU를 사용합니다.
전용 CPU를 사용하는 pod를 생성하고
irq-load-balancing.crio.io및cpu-quota.crio.io주석을disable로 설정합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: Pod metadata: name: dynamic-irq-pod annotations: irq-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" spec: containers: - name: dynamic-irq-pod image: "registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13" command: ["sleep", "10h"] resources: requests: cpu: 2 memory: "200M" limits: cpu: 2 memory: "200M" nodeSelector: node-role.kubernetes.io/worker-cnf: "" runtimeClassName: performance-dynamic-irq-profile ...-
performance-<profile_name> 형식으로 pod
runtimeClassName을 입력합니다. 여기서<profile_name>은PerformanceProfileYAML의name입니다 (예:performance- dynamic-irq-profile). - 노드 선택기를 cnf-worker 을 대상으로 설정합니다.
Pod가 올바르게 실행되고 있는지 확인합니다. 상태가
running이어야 하며 올바른 cnf-worker 노드를 설정해야 합니다.$ oc get pod -o wide
예상 출력
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dynamic-irq-pod 1/1 Running 0 5h33m <ip-address> <node-name> <none> <none>
IRQ 동적 로드 밸런싱을 위해 구성된 Pod가 실행되는 CPU를 가져옵니다.
$ oc exec -it dynamic-irq-pod -- /bin/bash -c "grep Cpus_allowed_list /proc/self/status | awk '{print $2}'"예상 출력
Cpus_allowed_list: 2-3
노드 구성이 올바르게 적용되었는지 확인합니다. 노드에 로그인하여 구성을 확인합니다.
$ oc debug node/<node-name>
예상 출력
Starting pod/<node-name>-debug ... To use host binaries, run `chroot /host` Pod IP: <ip-address> If you don't see a command prompt, try pressing enter. sh-4.4#
노드 파일 시스템을 사용할 수 있는지 확인합니다.
sh-4.4# chroot /host
예상 출력
sh-4.4#
기본 시스템 CPU 선호도 마스크에
dynamic-irq-podCPU (예: CPU 2 및 3)가 포함되지 않도록 합니다.$ cat /proc/irq/default_smp_affinity
출력 예
33
IRQ가
dynamic-irq-podCPU에서 실행되도록 구성되어 있지 않은지 확인합니다.find /proc/irq/ -name smp_affinity_list -exec sh -c 'i="$1"; mask=$(cat $i); file=$(echo $i); echo $file: $mask' _ {} \;출력 예
/proc/irq/0/smp_affinity_list: 0-5 /proc/irq/1/smp_affinity_list: 5 /proc/irq/2/smp_affinity_list: 0-5 /proc/irq/3/smp_affinity_list: 0-5 /proc/irq/4/smp_affinity_list: 0 /proc/irq/5/smp_affinity_list: 0-5 /proc/irq/6/smp_affinity_list: 0-5 /proc/irq/7/smp_affinity_list: 0-5 /proc/irq/8/smp_affinity_list: 4 /proc/irq/9/smp_affinity_list: 4 /proc/irq/10/smp_affinity_list: 0-5 /proc/irq/11/smp_affinity_list: 0 /proc/irq/12/smp_affinity_list: 1 /proc/irq/13/smp_affinity_list: 0-5 /proc/irq/14/smp_affinity_list: 1 /proc/irq/15/smp_affinity_list: 0 /proc/irq/24/smp_affinity_list: 1 /proc/irq/25/smp_affinity_list: 1 /proc/irq/26/smp_affinity_list: 1 /proc/irq/27/smp_affinity_list: 5 /proc/irq/28/smp_affinity_list: 1 /proc/irq/29/smp_affinity_list: 0 /proc/irq/30/smp_affinity_list: 0-5
10.3.4. IRQ 선호도 설정 지원 정보
일부 IRQ 컨트롤러는 IRQ 선호도 설정을 지원하지 않으며 항상 모든 온라인 CPU를 IRQ 마스크로 노출합니다. 이러한 IRQ 컨트롤러는 CPU 0에서 효과적으로 실행됩니다.
다음은 Red Hat이 IRQ 선호도 설정을 지원하지 않는 드라이버 및 하드웨어의 예입니다. 목록은 절대적인 것이 아닙니다:
-
megaraid_sas와 같은 일부 RAID 컨트롤러 드라이버 - 많은 NVMe(Non-volatile memory express) 드라이버
- LOM(Migain on 마더보드) 네트워크 컨트롤러의 일부 LAN
-
드라이버는
managed_irqs를 사용합니다.
IRQ 선호도 설정을 지원하지 않는 이유는 프로세서 유형, IRQ 컨트롤러 또는 마더보드의 회로 연결과 같은 요소와 연관될 수 있습니다.
IRQ의 효과적인 유사성이 분리된 CPU로 설정된 경우 IRQ 선호도 설정을 지원하지 않는 일부 하드웨어 또는 드라이버의 신호일 수 있습니다. 효과적인 유사성을 찾으려면 호스트에 로그인하고 다음 명령을 실행합니다.
$ find /proc/irq/ -name effective_affinity -exec sh -c 'i="$1"; mask=$(cat $i); file=$(echo $i); echo $file: $mask' _ {} \;출력 예
/proc/irq/0/effective_affinity: 1 /proc/irq/1/effective_affinity: 8 /proc/irq/2/effective_affinity: 0 /proc/irq/3/effective_affinity: 1 /proc/irq/4/effective_affinity: 2 /proc/irq/5/effective_affinity: 1 /proc/irq/6/effective_affinity: 1 /proc/irq/7/effective_affinity: 1 /proc/irq/8/effective_affinity: 1 /proc/irq/9/effective_affinity: 2 /proc/irq/10/effective_affinity: 1 /proc/irq/11/effective_affinity: 1 /proc/irq/12/effective_affinity: 4 /proc/irq/13/effective_affinity: 1 /proc/irq/14/effective_affinity: 1 /proc/irq/15/effective_affinity: 1 /proc/irq/24/effective_affinity: 2 /proc/irq/25/effective_affinity: 4 /proc/irq/26/effective_affinity: 2 /proc/irq/27/effective_affinity: 1 /proc/irq/28/effective_affinity: 8 /proc/irq/29/effective_affinity: 4 /proc/irq/30/effective_affinity: 4 /proc/irq/31/effective_affinity: 8 /proc/irq/32/effective_affinity: 8 /proc/irq/33/effective_affinity: 1 /proc/irq/34/effective_affinity: 2
일부 드라이버는 Managed_irqs 를 사용합니다. 여기서 선호도는 커널에서 내부적으로 관리되고 사용자 공간은 선호도를 변경할 수 없습니다. 경우에 따라 이러한 IRQ가 분리된 CPU에 할당될 수 있습니다. managed_irqs 에 대한 자세한 내용은 분리된 CPU를 대상으로하더라도 관리되는 인터럽트의 유사성 을 참조하십시오.
10.3.5. 클러스터의 하이퍼 스레딩 구성
OpenShift Container Platform 클러스터의 하이퍼 스레딩을 구성하려면 성능 프로파일의 CPU 스레드를 예약 또는 분리된 CPU 풀에 구성된 동일한 코어로 설정합니다.
성능 프로파일을 구성하고 호스트의 하이퍼 스레딩 구성을 변경하는 경우 PerformanceProfile YAML의 CPU isolated 및 reserved 필드를 새 구성과 일치하도록 업데이트해야 합니다.
이전에 활성화된 호스트 하이퍼 스레딩 구성을 비활성화하면 PerformanceProfile YAML에 나열된 CPU 코어 ID가 올바르지 않을 수 있습니다. 이렇게 잘못된 구성으로 인해 나열된 CPU를 더 이상 찾을 수 없으므로 노드를 사용할 수 없게 될 가능성이 있습니다.
사전 요구 사항
-
cluster-admin역할을 가진 사용자로 클러스터에 액세스합니다. - OpenShift CLI(oc)를 설치합니다.
절차
구성할 호스트의 모든 CPU에서 실행중인 스레드를 확인합니다.
클러스터에 로그인하고 다음 명령을 실행하여 호스트 CPU에서 실행중인 스레드를 볼 수 있습니다.
$ lscpu --all --extended
출력 예
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 4800.0000 400.0000 1 0 0 1 1:1:1:0 yes 4800.0000 400.0000 2 0 0 2 2:2:2:0 yes 4800.0000 400.0000 3 0 0 3 3:3:3:0 yes 4800.0000 400.0000 4 0 0 0 0:0:0:0 yes 4800.0000 400.0000 5 0 0 1 1:1:1:0 yes 4800.0000 400.0000 6 0 0 2 2:2:2:0 yes 4800.0000 400.0000 7 0 0 3 3:3:3:0 yes 4800.0000 400.0000
이 예에서는 4개의 물리적 CPU 코어에서 실행 중인 논리 CPU 코어가 8개 있습니다. CPU0 및 CPU4는 물리적 Core0에서 실행되고 CPU1 및 CPU5는 물리적 Core 1에서 실행되고 있습니다.
또는 특정 물리적 CPU 코어(다음 예에서는
cpu0)에 설정된 스레드를 보려면 명령 프롬프트를 열고 다음을 실행합니다.$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
출력 예
0-4
PerformanceProfileYAML에서 분리 및 예약된 CPU를 적용합니다. 예를 들어 논리 코어 CPU0 및 CPU4를분리된용으로 설정하고 논리 코어 CPU1을 CPU3로, CPU5를예약된CPU7로 설정할 수 있습니다. 예약 및 분리된 CPU를 구성하면 Pod의 인프라 컨테이너는 예약된 CPU를 사용하고 애플리케이션 컨테이너는 분리된 CPU를 사용합니다.... cpu: isolated: 0,4 reserved: 1-3,5-7 ...참고예약된 분리된 CPU 풀은 겹치지 않아야 하며, 함께 작업자 노드의 사용 가능한 모든 코어에 걸쳐 있어야 합니다.
하이퍼 스레딩은 대부분의 Intel 프로세서에서 기본적으로 활성화되어 있습니다. 하이퍼 스레딩을 활성화하면 특정 코어에서 처리되는 모든 스레드를 동일한 코어에서 분리하거나 처리해야 합니다.
10.3.5.1. 지연 시간이 짧은 애플리케이션의 하이퍼 스레딩 비활성화
지연 시간이 짧은 프로세스를 위해 클러스터를 구성할 때 클러스터를 배포하기 전에 하이퍼 스레딩을 비활성화할지 여부를 고려하십시오. 하이퍼 스레딩을 비활성화하려면 다음을 수행합니다.
- 하드웨어 및 토폴로지에 적합한 성능 프로필을 생성합니다.
nosmt를 추가 커널 인수로 설정합니다. 다음 성능 프로파일 예에서는 이 설정에 대해 설명합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: example-performanceprofile spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - idle=poll - intel_idle.max_cstate=0 - nosmt cpu: isolated: 2-3 reserved: 0-1 hugepages: defaultHugepagesSize: 1G pages: - count: 2 node: 0 size: 1G nodeSelector: node-role.kubernetes.io/performance: '' realTimeKernel: enabled: true참고예약 및 분리된 CPU를 구성하면 Pod의 인프라 컨테이너는 예약된 CPU를 사용하고 애플리케이션 컨테이너는 분리된 CPU를 사용합니다.
10.3.6. 워크로드 팁 이해
다음 표에서는 대기 시간에 전력 소비 및 실시간 설정이 미치는 영향에 대해 설명합니다.
다음 워크로드 힌트를 수동으로 구성할 수 있습니다. Performance Profile Creator를 사용하여 워크로드 힌트를 사용할 수도 있습니다. 성능 프로필에 대한 자세한 내용은 "성능 프로필 생성" 섹션을 참조하십시오. 워크로드 힌트가 수동으로 구성되고 realTime 워크로드 힌트가 명시적으로 설정되지 않은 경우 기본값은 true 입니다.
| Performance Profile Creator 설정 | 힌트 | 환경 | 설명 |
|---|---|---|---|
| Default |
workloadHints: highPowerConsumption: false realTime: false | 대기 시간 요구 사항이 없는 높은 처리량 클러스터 | CPU 파티셔닝을 통해서만 성능을 얻을 수 있습니다. |
| low-latency |
workloadHints: highPowerConsumption: false realTime: true | 지역 데이터 센터 | 에너지 절감과 대기 시간이 짧은 경우 모두 전원 관리, 대기 시간 및 처리량 간의 절충이 필요합니다. |
| Ultra-low-latency |
workloadHints: highPowerConsumption: true realTime: true | 엣지 클러스터, 대기 시간이 중요한 워크로드 | 전력 소비가 증가하면서 절대 대기 시간과 최대 결정성에 최적화되어 있습니다. |
| 포드별 전원 관리 |
workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: true | 심각하거나 중요하지 않은 워크로드 | Pod당 전원 관리를 허용합니다. |
추가 리소스
- PPC(Performance Profile Creator)를 사용하여 성능 프로필을 생성하는 방법에 대한 자세한 내용은 성능 프로필 생성을 참조하십시오.
10.3.7. 워크로드 팁 수동 구성
절차
-
"사용 가능한 워크로드 힌트"의 표에 설명된 대로 환경 하드웨어 및 토폴로지에 적합한
PerformanceProfile을 생성합니다. 예상되는 워크로드와 일치하도록 프로필을 조정합니다. 이 예제에서는 가능한 가장 짧은 대기 시간을 튜닝합니다. highPowerConsumption및realTime워크로드 힌트를 추가합니다. 여기서 둘 다true로 설정됩니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: workload-hints spec: ... workloadHints: highPowerConsumption: true 1 realTime: true 2
성능 프로파일에서 realTime 워크로드 힌트 플래그가 true 로 설정된 경우 고정 CPU가 있는 보장된 모든 Pod에 cpu-quota.crio.io: disable 주석을 추가합니다. 이 주석은 Pod 내에서 프로세스 성능이 저하되지 않도록 하는 데 필요합니다. realTime 워크로드 힌트가 명시적으로 설정되지 않은 경우 기본값은 true 입니다.
추가 리소스
- 보장된 개별 Pod의 CPU 제한 감소에 대한 자세한 내용은 CPU CFS 할당량 비활성화를 참조하십시오.
10.3.8. 인프라 및 애플리케이션 컨테이너의 CPU 제한
일반 하우스키핑 및 워크로드 작업은 대기 시간에 민감한 프로세스에 영향을 줄 수 있는 방식으로 CPU를 사용합니다. 기본적으로 컨테이너 런타임은 모든 온라인 CPU를 사용하여 모든 컨테이너를 함께 실행하므로 컨텍스트 스위치 및 대기 시간이 급증할 수 있습니다. CPU를 분할하면 불필요한 프로세스가 서로 분리하여 대기 시간에 민감한 프로세스를 방해하지 않습니다. 다음 표에서는 Node Tuning Operator를 사용하여 노드를 조정한 후 CPU에서 프로세스가 실행되는 방법을 설명합니다.
표 10.2. 프로세스의 CPU 할당
| 프로세스 유형 | 세부 정보 |
|---|---|
|
| 대기 시간이 짧은 워크로드가 실행되는 경우를 제외하고 모든 CPU에서 실행됩니다. |
| 인프라 Pod | 대기 시간이 짧은 워크로드가 실행되는 경우를 제외하고 모든 CPU에서 실행됩니다. |
| 인터럽트 | 예약된 CPU로 리디렉션 (OpenShift Container Platform 4.7 이상에서 선택 사항) |
| 커널 프로세스 | 예약된 CPU에 고정 |
| 대기 시간에 민감한 워크로드 Pod | 분리된 풀의 특정 전용 CPU 세트에 고정 |
| OS 프로세스/시스템 서비스 | 예약된 CPU에 고정 |
모든 QoS 프로세스 유형, Burstable,BestEffort 또는 Guaranteed 의 Pod에 대해 노드에 있는 코어의 할당 가능 용량은 격리된 풀의 용량과 동일합니다. 예약된 풀의 용량은 클러스터 및 운영 체제 하우스키핑 작업에서 사용할 노드의 총 코어 용량에서 제거됩니다.
예시 1
노드에는 100개의 코어 용량이 있습니다. 클러스터 관리자는 성능 프로필을 사용하여 50개의 코어를 분리된 풀에 할당하고 예약된 풀에 50개의 코어를 할당합니다. 클러스터 관리자는 QoS Guaranteed Pod 및 BestEffort 또는 Burstable Pod에 25개의 코어를 할당합니다. 이는 분리된 풀의 용량과 일치합니다.
예시 2
노드에는 100개의 코어 용량이 있습니다. 클러스터 관리자는 성능 프로필을 사용하여 50개의 코어를 분리된 풀에 할당하고 예약된 풀에 50개의 코어를 할당합니다. 클러스터 관리자는 QoS Guaranteed Pod 및 BestEffort 또는 Burstable Pod의 코어 1개에 50개의 코어를 할당합니다. 이는 분리된 풀의 용량을 하나의 코어로 초과합니다. CPU 용량이 충분하지 않아 Pod 예약이 실패합니다.
사용할 정확한 파티션 패턴은 하드웨어, 워크로드 특성 및 예상되는 시스템 로드와 같은 여러 요인에 따라 다릅니다. 일부 샘플 사용 사례는 다음과 같습니다.
- 대기 시간에 민감한 워크로드가 NIC(네트워크 인터페이스 컨트롤러)와 같은 특정 하드웨어를 사용하는 경우 분리된 풀의 CPU가 이 하드웨어에 최대한 가까운지 확인합니다. 최소한 동일한 NUMA(Non-Uniform Memory Access) 노드에 워크로드를 배치해야 합니다.
- 예약된 풀은 모든 인터럽트를 처리하는 데 사용됩니다. 시스템 네트워킹에 따라 들어오는 모든 패킷 인터럽트를 처리할 수 있도록 크기가 충분한 예약 풀을 할당합니다. 4.13 이상 버전에서 워크로드는 선택적으로 중요로 레이블이 지정될 수 있습니다.
예약 및 분리된 파티션에 사용해야 하는 특정 CPU에 대한 결정에는 자세한 분석 및 측정이 필요합니다. 장치 및 메모리의 NUMA 선호도와 같은 요인이 역할을 합니다. 선택 사항은 워크로드 아키텍처 및 특정 사용 사례에 따라 다릅니다.
예약된 분리된 CPU 풀은 겹치지 않아야 하며, 함께 작업자 노드의 사용 가능한 모든 코어에 걸쳐 있어야 합니다.
하우스키핑 작업과 워크로드가 서로 방해하지 않도록 하려면 성능 프로필의 spec 섹션에 두 개의 CPU 그룹을 지정합니다.
-
isolated- 애플리케이션 컨테이너 워크로드의 CPU를 지정합니다. 이러한 CPU는 대기 시간이 가장 짧습니다. 이 그룹의 프로세스에는 중단이 발생하지 않으므로 예를 들어 프로세스가 훨씬 더 높은 DPDK 제로 패킷 손실 대역폭에 도달할 수 있습니다. -
reserved- 클러스터 및 운영 체제 하우스키핑 작업의 CPU를 지정합니다.예약된그룹의 스레드는 종종 사용 중입니다.예약된그룹에서 대기 시간에 민감한 애플리케이션을 실행하지 마십시오. 대기 시간에 민감한 애플리케이션은격리된그룹에서 실행됩니다.
프로세스
- 환경 하드웨어 및 토폴로지에 적합한 성능 프로필을 생성합니다.
인프라 및 애플리케이션 컨테이너에 대해
reserved및isolated하려는 CPU와 함께 예약 및 격리된 매개변수를 추가합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: infra-cpus spec: cpu: reserved: "0-4,9" 1 isolated: "5-8" 2 nodeSelector: 3 node-role.kubernetes.io/worker: ""
10.4. Node Tuning Operator를 사용하여 NIC 큐 감소
Node Tuning Operator를 사용하면 성능 프로필을 구성하여 각 네트워크 장치에 대한 NIC(네트워크 인터페이스 컨트롤러) 대기열 수를 조정할 수 있습니다. 장치 네트워크 대기열을 사용하면 서로 다른 물리적 대기열 간에 패킷을 배포할 수 있으며 각 대기열은 패킷 처리를 위해 별도의 스레드를 가져옵니다.
실시간 또는 짧은 대기 시간 시스템에서 분리된 CPU에 고정된 불필요한 인터럽트 요청 라인(IRQ)을 예약 또는 하우스키핑 CPU로 이동해야 합니다.
시스템이 필요한 애플리케이션 배포에서 OpenShift Container Platform 네트워킹 또는 DPDK(Data Plane Development Kit) 워크로드와의 혼합 배포에서 우수한 처리량을 달성하려면 여러 대기열이 필요하며 NIC 큐 수는 조정되거나 변경되지 않아야 합니다. 예를 들어 대기 시간을 단축하려면 DPDK 기반 워크로드의 NIC 대기열 수를 예약 또는 하우스키핑 CPU 수만큼 줄여야 합니다.
각 CPU에 대해 기본적으로 너무 많은 대기열이 생성되며 낮은 대기 시간을 위해 튜닝할 때 하우스키핑 CPU에 대한 인터럽트 테이블에 맞지 않습니다. 큐 수를 줄이면 적절한 튜닝이 가능합니다. 큐 수가 적을수록 IRQ 테이블에 맞는 인터럽트 수가 적다는 것을 의미합니다.
이전 버전의 OpenShift Container Platform에서 Performance Addon Operator는 애플리케이션에 대한 짧은 대기 시간 성능 튜닝을 제공합니다. OpenShift Container Platform 4.11 이상에서는 이 기능은 Node Tuning Operator의 일부입니다.
10.4.1. 성능 프로파일을 사용하여 NIC 큐 조정
성능 프로파일을 사용하면 각 네트워크 장치의 대기열 수를 조정할 수 있습니다.
지원되는 네트워크 장치는 다음과 같습니다.
- 비가상 네트워크 장치
- 멀티 큐(채널)를 지원하는 네트워크 장치
지원되지 않는 네트워크 장치는 다음과 같습니다.
- Pure Software 네트워크 인터페이스
- 블록 장치
- Intel DPDK 가상 기능
사전 요구 사항
-
cluster-admin역할을 가진 사용자로 클러스터에 액세스합니다. -
OpenShift CLI(
oc)를 설치합니다.
프로세스
-
cluster-admin권한이 있는 사용자로 Node Tuning Operator를 실행하는 OpenShift Container Platform 클러스터에 로그인합니다. - 하드웨어 및 토폴로지에 적합한 성능 프로파일을 만들고 적용합니다. 프로파일 생성에 대한 지침은 "성능 프로파일 생성" 섹션을 참조하십시오.
생성된 성능 프로파일을 편집합니다.
$ oc edit -f <your_profile_name>.yaml
spec필드를net오브젝트로 채웁니다. 오브젝트 목록에는 다음 두 개의 필드가 포함될 수 있습니다.-
userLevelNetworking은 부울 플래그로 지정된 필수 필드입니다.userLevelNetworking이true인 경우 지원되는 모든 장치에 대해 대기열 수가 예약된 CPU 수로 설정됩니다. 기본값은false입니다. devices는 예약된 CPU 수로 큐를 설정할 장치 목록을 지정하는 선택적 필드입니다. 장치 목록이 비어 있으면 구성이 모든 네트워크 장치에 적용됩니다. 구성은 다음과 같습니다.interfacename: 이 필드는 인터페이스 이름을 지정하고, 양수 또는 음수일 수 있는 쉘 스타일 와일드카드를 지원합니다.-
와일드카드 구문의 예는 다음과 같습니다.
<string> .* -
음수 규칙 앞에는 느낌표가 붙습니다. 제외된 목록이 아닌 모든 장치에 넷 큐 변경 사항을 적용하려면
!<device>를 사용합니다(예:!eno1).
-
와일드카드 구문의 예는 다음과 같습니다.
-
vendorID: 접두사가0x인 16비트 16진수로 표시되는 네트워크 장치 공급업체 ID입니다. deviceID:0x접두사가 있는 16비트 16진수로 표시되는 네트워크 장치 ID(모델)입니다.참고deviceID가 지정되어 있는 경우vendorID도 정의해야 합니다. 장치 항목interfaceName,vendorID,vendorID및deviceID의 쌍에 지정된 모든 장치 식별자와 일치하는 장치는 네트워크 장치로 간주됩니다. 그러면 이 네트워크 장치의 네트워크 대기열 수가 예약된 CPU 수로 설정됩니다.두 개 이상의 장치가 지정되면 네트워크 대기열 수가 해당 장치 중 하나와 일치하는 모든 네트워크 장치로 설정됩니다.
-
다음 예제 성능 프로필을 사용하여 대기열 수를 모든 장치에 예약된 CPU 수로 설정합니다.
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,54-103 reserved: 0-2,52-54 net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/worker-cnf: ""다음 예제 성능 프로필을 사용하여 정의된 장치 식별자와 일치하는 모든 장치에 대해 대기열 수를 예약된 CPU 수로 설정합니다.
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,54-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: “eth0” - interfaceName: “eth1” - vendorID: “0x1af4” - deviceID: “0x1000” nodeSelector: node-role.kubernetes.io/worker-cnf: ""다음 예제 성능 프로필을 사용하여 인터페이스 이름
eth로 시작하는 모든 장치에 대해 대기열 수를 예약된 CPU 수로 설정합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,54-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: “eth*” nodeSelector: node-role.kubernetes.io/worker-cnf: ""이 예제 성능 프로필을 사용하여 이름이
eno1이외의 인터페이스가 있는 모든 장치에 대해 대기열 수를 예약된 CPU 수로 설정합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,54-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: “!eno1” nodeSelector: node-role.kubernetes.io/worker-cnf: ""인터페이스 이름
eth0,0x1af4의vendorID및0x1000의deviceID는 모든 장치에 대해 대기열 수를 예약된 CPU 수로 설정합니다. 성능 프로파일 예는 다음과 같습니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,54-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: “eth0” - vendorID: “0x1af4” - deviceID: “0x1000” nodeSelector: node-role.kubernetes.io/worker-cnf: ""업데이트된 성능 프로필을 적용합니다.
$ oc apply -f <your_profile_name>.yaml
추가 리소스
10.4.2. 대기열 상태 확인
이 섹션에서는 다양한 성능 프로필과 변경 사항이 적용되었는지 확인하는 방법에 대한 여러 예시가 있습니다.
예시 1
이 예에서 네트워크 대기열 수는 지원되는 모든 장치에 대해 예약된 CPU 수(2)로 설정됩니다.
성능 프로필의 관련 섹션은 다음과 같습니다.
apiVersion: performance.openshift.io/v2
metadata:
name: performance
spec:
kind: PerformanceProfile
spec:
cpu:
reserved: 0-1 #total = 2
isolated: 2-8
net:
userLevelNetworking: true
# ...다음 명령을 사용하여 장치와 연결된 대기열의 상태를 표시합니다.
참고성능 프로필이 적용된 노드에서 이 명령을 실행합니다.
$ ethtool -l <device>
프로필을 적용하기 전에 대기열 상태를 확인합니다.
$ ethtool -l ens4
출력 예
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 4
프로필이 적용된 후 대기열 상태를 확인합니다.
$ ethtool -l ens4
출력 예
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 결합된 채널은 지원되는 모든 장치에 대해 예약된 CPU의 총 수가 2임을 보여줍니다. 이는 성능 프로필에 구성된 항목과 일치합니다.
예시 2
이 예에서 네트워크 대기열 수는 특정 vendorID가 있는 지원되는 모든 네트워크 장치에 대해 예약된 CPU 수(2)로 설정됩니다.
성능 프로필의 관련 섹션은 다음과 같습니다.
apiVersion: performance.openshift.io/v2
metadata:
name: performance
spec:
kind: PerformanceProfile
spec:
cpu:
reserved: 0-1 #total = 2
isolated: 2-8
net:
userLevelNetworking: true
devices:
- vendorID = 0x1af4
# ...다음 명령을 사용하여 장치와 연결된 대기열의 상태를 표시합니다.
참고성능 프로필이 적용된 노드에서 이 명령을 실행합니다.
$ ethtool -l <device>
프로필이 적용된 후 대기열 상태를 확인합니다.
$ ethtool -l ens4
출력 예
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
vendorID=0x1af4를 사용하는 지원되는 모든 장치에 대해 예약된 CPU의 총 수는 2입니다. 예를 들어vendorID=0x1af4가 있는 다른 네트워크 장치ens2가 별도로 존재하는 경우 총 네트워크 대기열 수는 2입니다. 이는 성능 프로필에 구성된 항목과 일치합니다.
예시 3
이 예에서 네트워크 대기열 수는 정의된 장치 식별자와 일치하는 지원되는 모든 네트워크 장치에 대해 예약된 CPU 수(2)로 설정됩니다.
udevadm info는 장치에 대한 자세한 보고서를 제공합니다. 이 예에서 장치는 다음과 같습니다.
# udevadm info -p /sys/class/net/ens4 ... E: ID_MODEL_ID=0x1000 E: ID_VENDOR_ID=0x1af4 E: INTERFACE=ens4 ...
# udevadm info -p /sys/class/net/eth0 ... E: ID_MODEL_ID=0x1002 E: ID_VENDOR_ID=0x1001 E: INTERFACE=eth0 ...
interfaceName이eth0인 장치 및 다음 성능 프로필이 있는vendorID=0x1af4가 있는 모든 장치에 대해 네트워크 대기열을 2로 설정합니다.apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true devices: - interfaceName = eth0 - vendorID = 0x1af4 ...프로필이 적용된 후 대기열 상태를 확인합니다.
$ ethtool -l ens4
출력 예
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1- 1
vendorID=0x1af4를 사용하는 지원되는 모든 장치에 대해 예약된 CPU의 총 개수가 2로 설정됩니다. 예를 들어vendorID=0x1af4가 있는 다른 네트워크 장치ens2가 있는 경우 총 네트워크 대기열도 2로 설정됩니다. 마찬가지로interfaceName이eth0인 장치에는 총 네트워크 대기열이 2로 설정됩니다.
10.4.3. NIC 대기열 조정과 관련된 로깅
할당된 장치를 자세히 설명하는 로그 메시지는 각 Tuned 데몬 로그에 기록됩니다. /var/log/tuned/tuned.log 파일에 다음 메시지가 기록될 수 있습니다.
성공적으로 할당된 장치를 자세히 설명하는
INFO메시지가 기록됩니다.INFO tuned.plugins.base: instance net_test (net): assigning devices ens1, ens2, ens3
장치를 할당할 수 없는 경우
WARNING메시지가 기록됩니다.WARNING tuned.plugins.base: instance net_test: no matching devices available
10.5. 짧은 대기 시간 CNF 튜닝 상태 디버깅
PerformanceProfile CR(사용자 정의 리소스)에는 튜닝 상태를 보고하고 대기 시간 성능 저하 문제를 디버깅하기 위한 상태 필드가 있습니다. 이러한 필드는 상태를 보고하여 Operator 조정 기능의 상태에 대해 설명합니다.
일반적으로 성능 프로필에 연결된 머신 구성 풀의 상태가 성능 저하 상태이면 PerformanceProfile이 성능 저하 상태가 되는 문제가 발생할 수 있습니다. 이 경우 머신 구성 풀에서 실패 메시지를 발행합니다.
Node Tuning Operator에는 performanceProfile.spec.status.Conditions 상태 필드가 포함되어 있습니다.
Status:
Conditions:
Last Heartbeat Time: 2020-06-02T10:01:24Z
Last Transition Time: 2020-06-02T10:01:24Z
Status: True
Type: Available
Last Heartbeat Time: 2020-06-02T10:01:24Z
Last Transition Time: 2020-06-02T10:01:24Z
Status: True
Type: Upgradeable
Last Heartbeat Time: 2020-06-02T10:01:24Z
Last Transition Time: 2020-06-02T10:01:24Z
Status: False
Type: Progressing
Last Heartbeat Time: 2020-06-02T10:01:24Z
Last Transition Time: 2020-06-02T10:01:24Z
Status: False
Type: Degraded
Status 필드에는 성능 프로필의 상태를 나타내는 Type 값을 지정하는 Conditions가 포함되어 있습니다.
Available- 모든 머신 구성 및 Tuned 프로필이 성공적으로 생성되었으며 구성 요소에서 처리해야 하는 클러스터에 사용할 수 있습니다(NTO, MCO, Kubelet).
Upgradeable- Operator에서 유지보수하는 리소스가 업그레이드하기에 안전한 상태인지를 나타냅니다.
Progressing- 성능 프로필의 배포 프로세스가 시작되었음을 나타냅니다.
Degraded다음과 같은 경우 오류를 표시합니다.
- 성능 프로필 검증에 실패했습니다.
- 모든 관련 구성 요소 생성이 성공적으로 완료되지 않았습니다.
이러한 각 유형에는 다음 필드가 포함되어 있습니다.
상태-
특정 유형의 상태(
true또는false)입니다. Timestamp- 트랜잭션 타임스탬프입니다.
Reason string- 머신에서 읽을 수 있는 이유입니다.
Message string- 상태 및 오류 세부 정보(있는 경우)를 설명하는 사람이 읽을 수 있는 이유입니다.
10.5.1. 머신 구성 풀
성능 프로필 및 생성된 제품은 연관 MCP(머신 구성 풀)에 따라 노드에 적용됩니다. MCP에는 성능 프로필로 생성된 머신 구성 적용 진행 상황에 대한 중요한 정보가 포함되어 있으며 커널 인수, kube 구성, 대규모 페이지 할당 및 rt-kernel 배포가 포함됩니다. Performance Profile 컨트롤러는 MCP의 변경 사항을 모니터링하고 그에 따라 성능 프로필 상태를 업데이트합니다.
MCP가 성능 프로필 상태로 값을 반환하는 유일한 상태는 MCP가 Degraded인 경우이며, 이 경우에는 performaceProfile.status.condition.Degraded = true가 됩니다.
예
다음은 생성된 연관 머신 구성 풀(worker-cnf)이 있는 성능 프로필의 예입니다.
연관 머신 구성 풀이 성능 저하 상태입니다.
# oc get mcp
출력 예
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-2ee57a93fa6c9181b546ca46e1571d2d True False False 3 3 3 0 2d21h worker rendered-worker-d6b2bdc07d9f5a59a6b68950acf25e5f True False False 2 2 2 0 2d21h worker-cnf rendered-worker-cnf-6c838641b8a08fff08dbd8b02fb63f7c False True True 2 1 1 1 2d20h
MCP의
describe섹션은 이유를 보여줍니다.# oc describe mcp worker-cnf
출력 예
Message: Node node-worker-cnf is reporting: "prepping update: machineconfig.machineconfiguration.openshift.io \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not found" Reason: 1 nodes are reporting degraded status on syncdegraded = true로 표시된 성능 프로필status필드 아래에도 성능 저하 상태가 표시되어야 합니다.# oc describe performanceprofiles performance
출력 예
Message: Machine config pool worker-cnf Degraded Reason: 1 nodes are reporting degraded status on sync. Machine config pool worker-cnf Degraded Message: Node yquinn-q8s5v-w-b-z5lqn.c.openshift-gce-devel.internal is reporting: "prepping update: machineconfig.machineconfiguration.openshift.io \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not found". Reason: MCPDegraded Status: True Type: Degraded
10.6. Red Hat 지원을 받기 위한 짧은 대기 시간 튜닝 디버깅 데이터 수집
지원 사례를 여는 경우 클러스터에 대한 디버깅 정보를 Red Hat 지원에 제공하면 도움이 됩니다.
must-gather 툴을 사용하면 노드 튜닝과 NUMA 토폴로지, 짧은 대기 시간 설정으로 인한 문제를 디버깅하는 데 필요한 다른 정보를 비롯하여 OpenShift Container Platform 클러스터에 대한 진단 정보를 수집할 수 있습니다.
즉각 지원을 받을 수 있도록 OpenShift Container Platform 및 짧은 대기 시간 튜닝 둘 다에 대한 진단 정보를 제공하십시오.
10.6.1. must-gather 툴 정보
oc adm must-gather CLI 명령은 다음과 같이 문제를 디버깅하는 데 필요할 가능성이 높은 클러스터 정보를 수집합니다.
- 리소스 정의
- 감사 로그
- 서비스 로그
--image 인수를 포함하여 명령을 실행하는 경우 이미지를 하나 이상 지정할 수 있습니다. 이미지를 지정하면 툴에서 해당 기능 또는 제품과 관련된 데이터를 수집합니다. oc adm must-gather를 실행하면 클러스터에 새 Pod가 생성됩니다. 해당 Pod에 대한 데이터가 수집되어 must-gather.local로 시작하는 새 디렉터리에 저장됩니다. 이 디렉터리는 현재 작업 디렉터리에 생성됩니다.
10.6.2. 짧은 대기 시간 튜닝 데이터 수집 정보
oc adm must-gather CLI 명령을 사용하여 다음과 같은 짧은 대기 시간 튜닝과 연관된 기능 및 오브젝트를 포함한 클러스터 정보를 수집합니다.
- Node Tuning Operator 네임스페이스 및 하위 오브젝트입니다.
-
MachineConfigPool및 연관MachineConfig오브젝트. - Node Tuning Operator 및 연관 Tuned 오브젝트.
- Linux Kernel 명령줄 옵션.
- CPU 및 NUMA 토폴로지.
- 기본 PCI 장치 정보 및 NUMA 위치.
must-gather 로 디버깅 정보를 수집하려면 Performance Addon Operator must-gather 이미지를 지정해야 합니다.
--image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.13.
이전 버전의 OpenShift Container Platform에서 Performance Addon Operator는 애플리케이션에 대한 짧은 대기 시간 성능 튜닝을 제공합니다. OpenShift Container Platform 4.11 이상에서는 이 기능은 Node Tuning Operator의 일부입니다. 그러나 must-gather 명령을 실행할 때 performance-addon-operator-must-gather 이미지를 계속 사용해야 합니다.
10.6.3. 특정 기능에 대한 데이터 수집
oc adm must-gather CLI 명령을 --image 또는 --image-stream 인수와 함께 사용하여 특정 기능에 대한 디버깅 정보를 수집할 수 있습니다. must-gather 툴은 여러 이미지를 지원하므로 단일 명령을 실행하여 둘 이상의 기능에 대한 데이터를 수집할 수 있습니다.
특정 기능 데이터 외에도 기본 must-gather 데이터를 수집하려면 --image-stream=openshift/must-gather 인수를 추가하십시오.
이전 버전의 OpenShift Container Platform에서 Performance Addon Operator는 애플리케이션에 대한 짧은 대기 시간 성능 튜닝을 제공합니다. OpenShift Container Platform 4.11에서 이러한 함수는 Node Tuning Operator의 일부입니다. 그러나 must-gather 명령을 실행할 때 performance-addon-operator-must-gather 이미지를 계속 사용해야 합니다.
사전 요구 사항
-
cluster-admin역할을 가진 사용자로 클러스터에 액세스합니다. - OpenShift Container Platform CLI(oc)가 설치되어 있어야 합니다.
절차
-
must-gather데이터를 저장하려는 디렉터리로 이동합니다. --image또는--image-stream인수를 하나 이상 사용하여oc adm must-gather명령을 실행합니다. 예를 들어 다음 명령은 기본 클러스터 데이터와 Node Tuning Operator 관련 정보를 모두 수집합니다.$ oc adm must-gather \ --image-stream=openshift/must-gather \ 1 --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.13 2
작업 디렉터리에 생성된
must-gather디렉터리의 압축 파일을 생성합니다. 예를 들어 Linux 운영 체제를 사용하는 컴퓨터에서 다음 명령을 실행합니다.$ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1- 1
must-gather-local.5421342344627712289/를 실제 디렉터리 이름으로 바꿉니다.
- Red Hat Customer Portal에서 해당 지원 사례에 압축 파일을 첨부합니다.
추가 리소스
- MachineConfig 및 KubeletConfig에 대한 자세한 내용은 노드 관리를 참조하십시오.
- Node Tuning Operator에 대한 자세한 내용은 Node Tuning Operator 사용을 참조하십시오.
- PerformanceProfile에 대한 자세한 내용은 대규모 페이지 구성을 참조하십시오.
- 컨테이너에서 대규모 페이지를 사용하는 방법에 대한 자세한 내용은 앱에서 대규모 페이지를 사용하는 방법을 참조하십시오.
11장. 플랫폼 검증을 위해 대기 시간 테스트 수행
CNF(클라우드 네이티브 네트워크 기능) 테스트 이미지를 사용하여 CNF 워크로드 실행에 필요한 모든 구성 요소가 설치된 CNF 지원 OpenShift Container Platform 클러스터에서 대기 시간 테스트를 실행할 수 있습니다. 대기 시간 테스트를 실행하여 워크로드에 대한 노드 튜닝을 검증합니다.
cnf-tests 컨테이너 이미지는 registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 에서 사용할 수 있습니다.
cnf-tests 이미지에는 현재 Red Hat에서 지원하지 않는 여러 테스트도 포함되어 있습니다. Red Hat에서 대기 시간 테스트만 지원합니다.
11.1. 대기 시간 테스트 실행을 위한 사전 요구 사항
대기 시간 테스트를 실행하려면 클러스터가 다음 요구 사항을 충족해야 합니다.
- Node Tuning Operator를 사용하여 성능 프로필을 구성했습니다.
- 클러스터에 필요한 모든 CNF 구성을 적용했습니다.
-
클러스터에 기존
MachineConfigPoolCR이 적용되어 있습니다. 기본 작업자 풀은worker-cnf입니다.
추가 리소스
- 클러스터 성능 프로필을 생성하는 방법에 대한 자세한 내용은 실시간 기능을 사용하여 작업자 프로비저닝 을 참조하십시오.
11.2. 대기 시간 테스트의 검색 모드 정보
검색 모드를 사용하여 구성을 변경하지 않고 클러스터의 기능을 검증합니다. 기존 환경 구성이 테스트에 사용됩니다. 테스트에서는 필요한 구성 항목을 찾고 해당 항목을 사용하여 테스트를 실행할 수 있습니다. 특정 테스트를 실행하는 데 필요한 리소스를 찾을 수 없는 경우에는 테스트를 건너뛰고 사용자에게 적절한 메시지를 제공합니다. 테스트 완료 후 사전 구성한 구성 항목을 정리하지 않으며, 테스트 환경을 다른 테스트 실행에 즉시 사용할 수 있습니다.
대기 시간 테스트를 실행하는 경우 항상 -e DISCOVERY_MODE=true 로 테스트를 실행하고 -ginkgo.focus 를 적절한 대기 시간 테스트로 설정합니다. 검색 모드에서 대기 시간 테스트를 실행하지 않으면 테스트 실행에 의해 기존 라이브 클러스터 성능 프로필 구성이 수정됩니다.
테스트 중 사용되는 노드 제한
NODES_SELECTOR 환경 변수(예: -e NODES_SELECTOR=node-role.kubernetes.io/worker-cnf )를 지정하여 테스트가 실행되는 노드를 제한할 수 있습니다. 테스트에서 생성된 리소스는 라벨이 일치하는 노드로 제한됩니다.
기본 작업자 풀을 재정의하려면 -e ROLE_WORKER_CNF=<custom_worker_pool > 변수를 적절한 레이블을 지정하는 명령에 전달합니다.
11.3. 대기 시간 측정
cnf-tests 이미지는 세 가지 툴을 사용하여 시스템의 대기 시간을 측정합니다.
-
hwlatdetect -
cyclictest -
oslat
각 툴에는 특정 용도가 있습니다. 도구를 사용하여 안정적인 테스트 결과를 얻을 수 있습니다.
- hwlatdetect
-
베어 메탈 하드웨어에서 수행할 수 있는 기준을 측정합니다. 다음 대기 시간 테스트를 진행하기 전에
hwlatdetect에서 보고한 대기 시간이 운영 체제 튜닝을 통해 하드웨어 대기 시간 급증을 수정할 수 없기 때문에 필요한 임계값을 충족하는지 확인합니다. - cyclictest
-
hwlatdetect가 검증을 통과한 후 실시간 커널 스케줄러 대기 시간을 확인합니다.cyclictest툴은 반복된 타이머를 예약하고 원하는 트리거 시간과 실제 트리거 시간 간의 차이를 측정합니다. 차이점은 인터럽트 또는 프로세스 우선 순위로 인한 튜닝의 기본 문제를 확인할 수 있습니다. 툴은 실시간 커널에서 실행되어야 합니다. - oslat
- CPU 집약적 DPDK 애플리케이션과 유사하게 작동하며 CPU 사용량이 많은 데이터 처리를 시뮬레이션하는 사용 중인 루프에 대한 모든 중단 및 중단을 측정합니다.
테스트에서는 다음과 같은 환경 변수를 도입합니다.
표 11.1. 대기 시간 테스트 환경 변수
| 환경 변수 | 설명 |
|---|---|
|
| 테스트 실행을 시작한 후 시간(초)을 지정합니다. 변수를 사용하여 CPU 관리자가 조정되는 루프를 허용하여 기본 CPU 풀을 업데이트할 수 있습니다. 기본값은 0입니다. |
|
| 대기 시간 테스트를 실행하는 Pod에서 사용하는 CPU 수를 지정합니다. 변수를 설정하지 않으면 기본 구성에 분리된 모든 CPU가 포함됩니다. |
|
| 대기 시간 테스트를 실행해야 하는 시간(초)을 지정합니다. 기본값은 300초입니다. |
|
|
워크로드 및 운영 체제에 대해 허용되는 최대 하드웨어 대기 시간(마이크로초)을 지정합니다. |
|
|
|
|
|
|
|
| microseconds에서 허용되는 최대 대기 시간을 지정하는 통합 변수입니다. 사용 가능한 모든 대기 시간 툴에 적용됩니다. |
|
|
테스트 실행 여부를 나타내는 부울 매개변수입니다. |
대기 시간 툴과 관련된 변수가 통합 변수보다 우선합니다. 예를 들어 OSLAT_MAXIMUM_LATENCY 가 30 마이크로초로 설정되고 MAXIMUM_LATENCY 가 10 마이크로초로 설정된 경우 oslat 테스트가 최대 허용 가능한 대기 시간 30마이크로 실행됩니다.
11.4. 대기 시간 테스트 실행
클러스터 대기 시간 테스트를 실행하여 CNF(클라우드 네이티브 네트워크 기능) 워크로드에 대한 노드 튜닝을 검증합니다.
항상 DISCOVERY_MODE=true 세트를 사용하여 대기 시간 테스트를 실행합니다. 그렇지 않은 경우 테스트 모음에서 실행 중인 클러스터 구성을 변경합니다.
podman 명령을 루트가 아닌 사용자 또는 권한이 없는 사용자로 실행하는 경우 권한 거부 오류로 인해 마운트 경로가 실패할 수 있습니다. podman 명령이 작동하도록 하려면 :Z 를 볼륨 생성에 추가합니다(예: -v $(pwd)/:/kubeconfig:Z ). 이렇게 하면 podman 에서 적절한 SELinux 레이블을 다시 지정할 수 있습니다.
절차
kubeconfig파일이 포함된 디렉터리에서 쉘 프롬프트를 엽니다.테스트 이미지에 현재 디렉터리에
kubeconfig파일 및 볼륨을 통해 마운트된 관련$KUBECONFIG환경 변수를 제공합니다. 이를 통해 실행 중인 컨테이너에서 컨테이너 내부에서kubeconfig파일을 사용할 수 있습니다.다음 명령을 입력하여 대기 시간 테스트를 실행합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
-
선택 사항: Append
-ginkgo.dryRun을 사용하여 시험 실행 모드에서 대기 시간 테스트를 실행합니다. 이 명령은 테스트 실행을 확인하는 데 유용합니다. -
선택 사항: Append
-ginkgo.v를 사용하여 향상된 동사를 사용하여 테스트를 실행합니다. 선택 사항: 특정 성능 프로필에 대해 대기 시간 테스트를 실행하려면 다음 명령을 실행하여 적절한 값을 대체합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e FEATURES=performance -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ -e PERF_TEST_PROFILE=<performance_profile> registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.focus="[performance]\ Latency\ Test"
다음과 같습니다.
- <performance_profile>
- 는 대기 시간 테스트를 실행할 성능 프로필의 이름입니다.
중요유효한 대기 시간 테스트 결과의 경우 최소 12 시간 동안 테스트를 실행합니다.
11.4.1. hwlatdetect 실행
hwlatdetect 툴은 RHEL(Red Hat Enterprise Linux) 8.x의 일반 서브스크립션과 함께 rt-kernel 패키지에서 사용할 수 있습니다.
항상 DISCOVERY_MODE=true 세트를 사용하여 대기 시간 테스트를 실행합니다. 그렇지 않은 경우 테스트 모음에서 실행 중인 클러스터 구성을 변경합니다.
podman 명령을 루트가 아닌 사용자 또는 권한이 없는 사용자로 실행하는 경우 권한 거부 오류로 인해 마운트 경로가 실패할 수 있습니다. podman 명령이 작동하도록 하려면 :Z 를 볼륨 생성에 추가합니다(예: -v $(pwd)/:/kubeconfig:Z ). 이렇게 하면 podman 에서 적절한 SELinux 레이블을 다시 지정할 수 있습니다.
사전 요구 사항
- 클러스터에 실시간 커널이 설치되어 있습니다.
-
고객 포털 인증 정보를 사용하여
registry.redhat.io에 로그인했습니다.
절차
hwlatdetect테스트를 실행하려면 다음 명령을 실행하여 변수 값을 적절하게 대체합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="hwlatdetect"
hwlatdetect테스트는 10분(600초) 동안 실행됩니다. 최대 관찰 대기 시간이MAXIMUM_LATENCY(20 ECDHEs)보다 작으면 테스트가 성공적으로 실행됩니다.결과가 대기 시간 임계값을 초과하면 테스트가 실패합니다.
중요유효한 결과의 경우 테스트는 최소 12시간 동안 실행되어야 합니다.
실패 출력 예
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=hwlatdetect I0908 15:25:20.023712 27 request.go:601] Waited for 1.046586367s due to client-side throttling, not priority and fairness, request: GET:https://api.hlxcl6.lab.eng.tlv2.redhat.com:6443/apis/imageregistry.operator.openshift.io/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662650718 Will run 1 of 194 specs [...] • Failure [283.574 seconds] [performance] Latency Test /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62 with the hwlatdetect image /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:228 should succeed [It] /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:236 Log file created at: 2022/09/08 15:25:27 Running on machine: hwlatdetect-b6n4n Binary: Built with gc go1.17.12 for linux/amd64 Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg I0908 15:25:27.160620 1 node.go:39] Environment information: /proc/cmdline: BOOT_IMAGE=(hd1,gpt3)/ostree/rhcos-c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/vmlinuz-4.18.0-372.19.1.el8_6.x86_64 random.trust_cpu=on console=tty0 console=ttyS0,115200n8 ignition.platform.id=metal ostree=/ostree/boot.1/rhcos/c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/0 ip=dhcp root=UUID=5f80c283-f6e6-4a27-9b47-a287157483b2 rw rootflags=prjquota boot=UUID=773bf59a-bafd-48fc-9a87-f62252d739d3 skew_tick=1 nohz=on rcu_nocbs=0-3 tuned.non_isolcpus=0000ffff,ffffffff,fffffff0 systemd.cpu_affinity=4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 intel_iommu=on iommu=pt isolcpus=managed_irq,0-3 nohz_full=0-3 tsc=nowatchdog nosoftlockup nmi_watchdog=0 mce=off skew_tick=1 rcutree.kthread_prio=11 + + I0908 15:25:27.160830 1 node.go:46] Environment information: kernel version 4.18.0-372.19.1.el8_6.x86_64 I0908 15:25:27.160857 1 main.go:50] running the hwlatdetect command with arguments [/usr/bin/hwlatdetect --threshold 1 --hardlimit 1 --duration 100 --window 10000000us --width 950000us] F0908 15:27:10.603523 1 main.go:53] failed to run hwlatdetect command; out: hwlatdetect: test duration 100 seconds detector: tracer parameters: Latency threshold: 1us 1 Sample window: 10000000us Sample width: 950000us Non-sampling period: 9050000us Output File: None Starting test test finished Max Latency: 326us 2 Samples recorded: 5 Samples exceeding threshold: 5 ts: 1662650739.017274507, inner:6, outer:6 ts: 1662650749.257272414, inner:14, outer:326 ts: 1662650779.977272835, inner:314, outer:12 ts: 1662650800.457272384, inner:3, outer:9 ts: 1662650810.697273520, inner:3, outer:2 [...] JUnit report was created: /junit.xml/cnftests-junit.xml Summarizing 1 Failure: [Fail] [performance] Latency Test with the hwlatdetect image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:476 Ran 1 of 194 Specs in 365.797 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (366.08s) FAIL
hwlatdetect 테스트 결과의 예
다음 유형의 결과를 캡처할 수 있습니다.
- 테스트 전체에서 수행된 변경 사항에 대한 영향을 만들기 위해 각 실행 후 수집된 대략적인 결과.
- 최상의 결과 및 구성 설정을 사용하여 대략적인 테스트 집합을 결합합니다.
좋은 결과 예
hwlatdetect: test duration 3600 seconds detector: tracer parameters: Latency threshold: 10us Sample window: 1000000us Sample width: 950000us Non-sampling period: 50000us Output File: None Starting test test finished Max Latency: Below threshold Samples recorded: 0
hwlatdetect 도구는 샘플이 지정된 임계값을 초과하는 경우에만 출력을 제공합니다.
잘못된 결과 예
hwlatdetect: test duration 3600 seconds detector: tracer parameters:Latency threshold: 10usSample window: 1000000us Sample width: 950000usNon-sampling period: 50000usOutput File: None Starting tests:1610542421.275784439, inner:78, outer:81 ts: 1610542444.330561619, inner:27, outer:28 ts: 1610542445.332549975, inner:39, outer:38 ts: 1610542541.568546097, inner:47, outer:32 ts: 1610542590.681548531, inner:13, outer:17 ts: 1610543033.818801482, inner:29, outer:30 ts: 1610543080.938801990, inner:90, outer:76 ts: 1610543129.065549639, inner:28, outer:39 ts: 1610543474.859552115, inner:28, outer:35 ts: 1610543523.973856571, inner:52, outer:49 ts: 1610543572.089799738, inner:27, outer:30 ts: 1610543573.091550771, inner:34, outer:28 ts: 1610543574.093555202, inner:116, outer:63
hwlatdetect 의 출력은 여러 샘플이 임계값을 초과함을 보여줍니다. 그러나 동일한 출력은 다음 요인에 따라 다른 결과를 나타낼 수 있습니다.
- 테스트 기간
- CPU 코어 수
- 호스트 펌웨어 설정
다음 대기 시간 테스트를 진행하기 전에 hwlatdetect 에서 보고하는 대기 시간이 필요한 임계값을 충족하는지 확인합니다. 하드웨어에서 도입된 대기 시간을 수정하려면 시스템 벤더 지원에 문의해야 할 수 있습니다.
모든 대기 시간 급증이 하드웨어와 관련이 있는 것은 아닙니다. 호스트 펌웨어를 튜닝하여 워크로드 요구 사항을 충족해야 합니다. 자세한 내용은 시스템 튜닝의 펌웨어 매개변수 설정을 참조하십시오.
11.4.2. cyclictest 실행
cyclictest 툴은 지정된 CPU에서 실시간 커널 스케줄러 대기 시간을 측정합니다.
항상 DISCOVERY_MODE=true 세트를 사용하여 대기 시간 테스트를 실행합니다. 그렇지 않은 경우 테스트 모음에서 실행 중인 클러스터 구성을 변경합니다.
podman 명령을 루트가 아닌 사용자 또는 권한이 없는 사용자로 실행하는 경우 권한 거부 오류로 인해 마운트 경로가 실패할 수 있습니다. podman 명령이 작동하도록 하려면 :Z 를 볼륨 생성에 추가합니다(예: -v $(pwd)/:/kubeconfig:Z ). 이렇게 하면 podman 에서 적절한 SELinux 레이블을 다시 지정할 수 있습니다.
사전 요구 사항
-
고객 포털 인증 정보를 사용하여
registry.redhat.io에 로그인했습니다. - 클러스터에 실시간 커널이 설치되어 있습니다.
- Node Tuning Operator를 사용하여 클러스터 성능 프로필을 적용했습니다.
절차
cyclictest를 수행하려면 다음 명령을 실행하여 변수 값을 적절하게 대체합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="cyclictest"
명령은
cyclictest툴을 10분(600초) 동안 실행합니다. 최대 관찰 대기 시간이MAXIMUM_LATENCY보다 작으면 테스트가 성공적으로 실행됩니다(이 예제에서는 20 ECDHE). 20 ECDHE 이상의 대기 시간 급증은 일반적으로 telco RAN 워크로드에는 허용되지 않습니다.결과가 대기 시간 임계값을 초과하면 테스트가 실패합니다.
중요유효한 결과의 경우 테스트는 최소 12시간 동안 실행되어야 합니다.
실패 출력 예
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=cyclictest I0908 13:01:59.193776 27 request.go:601] Waited for 1.046228824s due to client-side throttling, not priority and fairness, request: GET:https://api.compute-1.example.com:6443/apis/packages.operators.coreos.com/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662642118 Will run 1 of 194 specs [...] Summarizing 1 Failure: [Fail] [performance] Latency Test with the cyclictest image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:220 Ran 1 of 194 Specs in 161.151 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (161.48s) FAIL
cyclictest 결과 예
동일한 출력은 다른 워크로드에 대해 다른 결과를 나타낼 수 있습니다. 예를 들어 최대 18ECDHE의 급증은 4G DU 워크로드에는 허용되지만 5G DU 워크로드에서는 사용할 수 없습니다.
좋은 결과 예
running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m # Histogram 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000001 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000002 579506 535967 418614 573648 532870 529897 489306 558076 582350 585188 583793 223781 532480 569130 472250 576043 More histogram entries ... # Total: 000600000 000600000 000600000 000599999 000599999 000599999 000599998 000599998 000599998 000599997 000599997 000599996 000599996 000599995 000599995 000599995 # Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Max Latencies: 00005 00005 00004 00005 00004 00004 00005 00005 00006 00005 00004 00005 00004 00004 00005 00004 # Histogram Overflows: 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 # Histogram Overflow at cycle number: # Thread 0: # Thread 1: # Thread 2: # Thread 3: # Thread 4: # Thread 5: # Thread 6: # Thread 7: # Thread 8: # Thread 9: # Thread 10: # Thread 11: # Thread 12: # Thread 13: # Thread 14: # Thread 15:
잘못된 결과 예
running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m # Histogram 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000001 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000002 564632 579686 354911 563036 492543 521983 515884 378266 592621 463547 482764 591976 590409 588145 589556 353518 More histogram entries ... # Total: 000599999 000599999 000599999 000599997 000599997 000599998 000599998 000599997 000599997 000599996 000599995 000599996 000599995 000599995 000599995 000599993 # Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Max Latencies: 00493 00387 00271 00619 00541 00513 00009 00389 00252 00215 00539 00498 00363 00204 00068 00520 # Histogram Overflows: 00001 00001 00001 00002 00002 00001 00000 00001 00001 00001 00002 00001 00001 00001 00001 00002 # Histogram Overflow at cycle number: # Thread 0: 155922 # Thread 1: 110064 # Thread 2: 110064 # Thread 3: 110063 155921 # Thread 4: 110063 155921 # Thread 5: 155920 # Thread 6: # Thread 7: 110062 # Thread 8: 110062 # Thread 9: 155919 # Thread 10: 110061 155919 # Thread 11: 155918 # Thread 12: 155918 # Thread 13: 110060 # Thread 14: 110060 # Thread 15: 110059 155917
11.4.3. oslat 실행
oslat 테스트는 CPU 집약적 DPDK 애플리케이션을 시뮬레이션하고 모든 중단 및 중단을 측정하여 클러스터가 CPU의 과도한 데이터 처리를 처리하는 방법을 테스트합니다.
항상 DISCOVERY_MODE=true 세트를 사용하여 대기 시간 테스트를 실행합니다. 그렇지 않은 경우 테스트 모음에서 실행 중인 클러스터 구성을 변경합니다.
podman 명령을 루트가 아닌 사용자 또는 권한이 없는 사용자로 실행하는 경우 권한 거부 오류로 인해 마운트 경로가 실패할 수 있습니다. podman 명령이 작동하도록 하려면 :Z 를 볼륨 생성에 추가합니다(예: -v $(pwd)/:/kubeconfig:Z ). 이렇게 하면 podman 에서 적절한 SELinux 레이블을 다시 지정할 수 있습니다.
사전 요구 사항
-
고객 포털 인증 정보를 사용하여
registry.redhat.io에 로그인했습니다. - Node Tuning Operator를 사용하여 클러스터 성능 프로필을 적용했습니다.
절차
oslat테스트를 수행하려면 다음 명령을 실행하여 변수 값을 적절하게 대체합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="oslat"
LATENCY_TEST_CPUS는oslat명령으로 테스트할 CPU 목록을 지정합니다.이 명령은 OS
lat툴을 10분(600초) 동안 실행합니다. 최대 관찰 대기 시간이MAXIMUM_LATENCY(20 ECDHEs)보다 작으면 테스트가 성공적으로 실행됩니다.결과가 대기 시간 임계값을 초과하면 테스트가 실패합니다.
중요유효한 결과의 경우 테스트는 최소 12시간 동안 실행되어야 합니다.
실패 출력 예
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=oslat I0908 12:51:55.999393 27 request.go:601] Waited for 1.044848101s due to client-side throttling, not priority and fairness, request: GET:https://compute-1.example.com:6443/apis/machineconfiguration.openshift.io/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662641514 Will run 1 of 194 specs [...] • Failure [77.833 seconds] [performance] Latency Test /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62 with the oslat image /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:128 should succeed [It] /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:153 The current latency 304 is bigger than the expected one 1 : 1 [...] Summarizing 1 Failure: [Fail] [performance] Latency Test with the oslat image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:177 Ran 1 of 194 Specs in 161.091 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (161.42s) FAIL- 1
- 이 예에서 측정된 대기 시간은 최대 허용된 값 외부에 있습니다.
11.5. 대기 시간 테스트 실패 보고서 생성
다음 절차에 따라 JUnit 대기 시간 테스트 출력 및 테스트 실패 보고서를 생성합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
--report매개변수를 보고서가 덤프되는 경로와 함께 전달하여 문제 해결을 위한 클러스터 상태 및 리소스에 대한 정보가 포함된 테스트 실패 보고서를 생성합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/reportdest:<report_folder_path> \ -e KUBECONFIG=/kubeconfig/kubeconfig -e DISCOVERY_MODE=true -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh --report <report_folder_path> \ -ginkgo.focus="\[performance\]\ Latency\ Test"
다음과 같습니다.
- <report_folder_path>
- 보고서가 생성된 폴더의 경로입니다.
11.6. JUnit 대기 시간 테스트 보고서 생성
다음 절차에 따라 JUnit 대기 시간 테스트 출력 및 테스트 실패 보고서를 생성합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
보고서가 덤프되는 경로와 함께
--junit매개변수를 전달하여 JUnit 호환 XML 보고서를 생성합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/junitdest:<junit_folder_path> \ -e KUBECONFIG=/kubeconfig/kubeconfig -e DISCOVERY_MODE=true -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh --junit <junit_folder_path> \ -ginkgo.focus="\[performance\]\ Latency\ Test"
다음과 같습니다.
- <junit_folder_path>
- junit 보고서가 생성되는 폴더의 경로입니다.
11.7. 단일 노드 OpenShift 클러스터에서 대기 시간 테스트 실행
단일 노드 OpenShift 클러스터에서 대기 시간 테스트를 실행할 수 있습니다.
항상 DISCOVERY_MODE=true 세트를 사용하여 대기 시간 테스트를 실행합니다. 그렇지 않은 경우 테스트 모음에서 실행 중인 클러스터 구성을 변경합니다.
podman 명령을 루트가 아닌 사용자 또는 권한이 없는 사용자로 실행하는 경우 권한 거부 오류로 인해 마운트 경로가 실패할 수 있습니다. podman 명령이 작동하도록 하려면 :Z 를 볼륨 생성에 추가합니다(예: -v $(pwd)/:/kubeconfig:Z ). 이렇게 하면 podman 에서 적절한 SELinux 레이블을 다시 지정할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
단일 노드 OpenShift 클러스터에서 대기 시간 테스트를 실행하려면 다음 명령을 실행합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=master \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
참고master가 노드가 속하는 유일한 시스템 풀이므로
ROLE_WORKER_CNF=master가 필요합니다. 대기 시간 테스트에 필요한MachineConfigPool을 설정하는 방법에 대한 자세한 내용은 "지시간 테스트 실행을 위한 전제 조건"을 참조하십시오.테스트 모음을 실행한 후에는 모든 무위 리소스가 정리됩니다.
11.8. 연결이 끊긴 클러스터에서 대기 시간 테스트 실행
CNF 테스트 이미지는 연결이 끊긴 클러스터에서 외부 레지스트리에 연결할 수 없는 테스트를 실행할 수 있습니다. 여기에는 두 단계가 필요합니다.
-
cnf-tests이미지를 사용자 연결 해제된 레지스트리에 미러링합니다. - 사용자 연결 해제된 레지스트리의 이미지를 사용하도록 테스트에 지시합니다.
클러스터에서 액세스할 수 있는 사용자 정의 레지스트리로 이미지 미러링
이미지에 미러 실행 파일이 제공되어 oc 에서 테스트 이미지를 로컬 레지스트리에 미러링하는 데 필요한 입력을 제공합니다.
클러스터에 액세스할 수 있는 임시 머신에서 다음 명령을 실행합니다. registry.redhat.io:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ /usr/bin/mirror -registry <disconnected_registry> | oc image mirror -f -
다음과 같습니다.
- <disconnected_registry>
-
구성한 연결이 끊긴 미러 레지스트리(예:
my.local.registry:5000/)입니다.
cnf-tests이미지를 연결이 끊긴 레지스트리에 미러링한 경우 테스트를 실행할 때 이미지를 가져오는 데 사용되는 원래 레지스트리를 재정의해야 합니다. 예를 들면 다음과 같습니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY="<disconnected_registry>" \ -e CNF_TESTS_IMAGE="cnf-tests-rhel8:v4.13" \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
사용자 정의 레지스트리의 이미지를 사용하도록 테스트 구성
CNF_TESTS_IMAGE 및 IMAGE_REGISTRY 변수를 사용하여 사용자 정의 테스트 이미지 및 이미지 레지스트리를 사용하여 대기 시간 테스트를 실행할 수 있습니다.
사용자 정의 테스트 이미지 및 이미지 레지스트리를 사용하도록 대기 시간 테스트를 구성하려면 다음 명령을 실행합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e IMAGE_REGISTRY="<custom_image_registry>" \ -e CNF_TESTS_IMAGE="<custom_cnf-tests_image>" \ -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 /usr/bin/test-run.sh
다음과 같습니다.
- <custom_image_registry>
-
사용자 정의 이미지 레지스트리(예:
custom.registry:5000/)입니다. - <custom_cnf-tests_image>
-
사용자 지정 cnf-tests 이미지입니다(예:
custom-cnf-tests-image:latest).
클러스터 OpenShift 이미지 레지스트리로 이미지 미러링
OpenShift Container Platform은 클러스터에서 표준 워크로드로 실행되는 내장 컨테이너 이미지 레지스트리를 제공합니다.
절차
경로를 통해 레지스트리를 공개하여 레지스트리에 대한 외부 액세스 권한을 얻습니다.
$ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge다음 명령을 실행하여 레지스트리 끝점을 가져옵니다.
$ REGISTRY=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')이미지를 공개하는 데 사용할 네임스페이스를 생성합니다.
$ oc create ns cnftests
테스트에 사용되는 모든 네임스페이스에서 이미지 스트림을 사용할 수 있도록 설정합니다. 테스트 네임스페이스가
cnf-tests이미지 스트림에서 이미지를 가져올 수 있도록 하는 데 필요합니다. 다음 명령을 실행합니다.$ oc policy add-role-to-user system:image-puller system:serviceaccount:cnf-features-testing:default --namespace=cnftests
$ oc policy add-role-to-user system:image-puller system:serviceaccount:performance-addon-operators-testing:default --namespace=cnftests
다음 명령을 실행하여 Docker 보안 이름 및 인증 토큰을 검색합니다.
$ SECRET=$(oc -n cnftests get secret | grep builder-docker | awk {'print $1'}$ TOKEN=$(oc -n cnftests get secret $SECRET -o jsonpath="{.data['\.dockercfg']}" | base64 --decode | jq '.["image-registry.openshift-image-registry.svc:5000"].auth')dockerauth.json파일을 생성합니다. 예를 들면 다음과 같습니다.$ echo "{\"auths\": { \"$REGISTRY\": { \"auth\": $TOKEN } }}" > dockerauth.json이미지 미러링을 수행합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:4.13 \ /usr/bin/mirror -registry $REGISTRY/cnftests | oc image mirror --insecure=true \ -a=$(pwd)/dockerauth.json -f -
테스트를 실행합니다.
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY=image-registry.openshift-image-registry.svc:5000/cnftests \ cnf-tests-local:latest /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
다른 테스트 이미지 세트 미러링
선택적으로 대기 시간 테스트를 위해 미러링된 기본 업스트림 이미지를 변경할 수 있습니다.
절차
mirror명령은 기본적으로 업스트림 이미지를 미러링합니다. 다음 형식의 파일을 이미지에 전달하여 재정의할 수 있습니다.[ { "registry": "public.registry.io:5000", "image": "imageforcnftests:4.13" } ]파일을
mirror명령에 전달합니다. 예를 들어images.json으로 로컬로 저장합니다. 다음 명령을 사용하면 로컬 경로가 컨테이너 내/kubeconfig에 마운트되어 mirror 명령에 전달될 수 있습니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 /usr/bin/mirror \ --registry "my.local.registry:5000/" --images "/kubeconfig/images.json" \ | oc image mirror -f -
11.9. cnf-tests 컨테이너로 오류 문제 해결
대기 시간 테스트를 실행하려면 cnf-tests 컨테이너 내에서 클러스터에 액세스할 수 있어야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
다음 명령을 실행하여
cnf-tests컨테이너 내부에서 클러스터에 액세스할 수 있는지 확인합니다.$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.13 \ oc get nodes
이 명령이 작동하지 않으면 DNS, MTU 크기 또는 방화벽 액세스와 관련된 오류가 발생할 수 있습니다.
12장. 작업자 대기 시간 프로필을 사용하여 대기 시간이 긴 환경에서 클러스터 안정성 개선
모든 노드는 기본적으로 10초마다 OpenShift Container Platform 클러스터의 Kubernetes Controller Manager Operator(kube 컨트롤러)로 하트비트를 보냅니다. 클러스터에서 노드의 하트비트를 수신하지 않는 경우 OpenShift Container Platform은 여러 기본 메커니즘을 사용하여 응답합니다.
예를 들어 Kubernetes Controller Manager Operator가 구성된 기간이 지난 후 노드와의 연결이 끊어지면 다음과 같습니다.
-
컨트롤 플레인의 노드 컨트롤러에서 노드 상태를
Unhealthy로 업데이트하고 노드Ready조건을Unknown으로 표시합니다. - 스케줄러는 이에 대한 응답으로 해당 노드에 대한 Pod 예약을 중지합니다.
-
온프레미스 노드 컨트롤러는
NoExecute효과가 있는node.kubernetes.io/unreachable테인트를 노드에 추가하고 기본적으로 5분 후에 노드에 Pod를 제거합니다.
이 동작으로 인해 특히 네트워크 엣지에 노드가 있는 경우 특히 네트워크가 대기 시간이 되는 경우 문제가 발생할 수 있습니다. 경우에 따라 Kubernetes Controller Manager Operator가 네트워크 대기 시간으로 인해 정상 노드에서 업데이트를 수신하지 못할 수 있습니다. 그런 다음 Kubernetes Controller Manager Operator는 노드가 정상인 경우에도 노드에서 Pod를 제거합니다. 이 문제를 방지하려면 작업자 대기 시간 프로필을 사용하여 kubelet 및 Kubernetes Controller Manager Operator가 조치를 수행하기 전에 상태 업데이트를 대기하는 빈도를 조정할 수 있습니다. 이러한 조정을 통해 컨트롤 플레인과 작업자 노드 간의 네트워크 대기 시간이 최적이 아닌 경우 클러스터가 올바르게 실행되도록 할 수 있습니다.
이러한 작업자 대기 시간 프로필은 최상의 값을 수동으로 결정할 필요 없이 클러스터의 반응 문제를 제어할 수 있도록 신중하게 조정된 값으로 미리 정의된 세 가지 매개변수 집합입니다.
클러스터를 설치하거나 클러스터 네트워크에서 대기 시간이 늘어남에 따라 작업자 대기 시간을 구성할 수 있습니다.
12.1. 작업자 대기 시간 프로필 이해
작업자 대기 시간 프로필은 node-status-update-frequency,node-monitor-grace-period,default-not-ready-toleration-seconds 매개변수에 대한 여러 신중하게 조정된 값 세트입니다. 이러한 매개변수를 사용하면 최상의 값을 수동으로 결정할 필요 없이 대기 시간 문제에 대한 클러스터의 대응을 제어할 수 있습니다.
모든 작업자 대기 시간 프로필은 다음 매개변수를 구성합니다.
-
node-status-update-frequency. kubelet이 Kubernetes Controller Manager Operator로 상태를 업데이트하는 시간(초)을 지정합니다. -
node-monitor-grace-period. 노드 비정상적으로 표시하고node.kubernetes.io/not-ready또는node.kubernetes.io/unreachable테인트를 노드에 추가하기 전에 Kubernetes Controller Manager Operator가 kubelet에서 업데이트를 대기하는 시간(초)을 지정합니다. -
default-not-ready-toleration-secondsKubernetes Controller Manager Operator가 해당 노드에서 Pod를 제거하기 전에 대기하는 노드 비정상적으로 표시된 후 시간(초)을 지정합니다. -
default-unreachable-toleration-secondsKubernetes Controller Manager Operator가 해당 노드에서 Pod를 제거하기 전에 대기할 수 없는 노드에 연결할 수 없는 후 시간(초)을 지정합니다.
node-monitor-grace-period 매개변수를 수동으로 수정하는 것은 지원되지 않습니다.
다음 Operator는 작업자 대기 시간 프로필에 대한 변경 사항을 모니터링하고 그에 따라 응답합니다.
-
MCO(Machine Config Operator)는 작업자 노드에서
node-status-update-frequency매개변수를 업데이트합니다. -
Kubernetes Controller Manager Operator는 컨트롤 플레인 노드에서
node-monitor-grace-period매개변수를 업데이트합니다. -
Kubernetes API Server Operator는 컨트롤 계획 노드에서
default-not-ready-toleration-seconds및default-unreachable-toleration-seconds매개변수를 업데이트합니다.
대부분의 경우 기본 구성이 작동하지만 OpenShift Container Platform은 네트워크에 일반적인 것보다 대기 시간이 더 많은 상황에 대해 두 개의 다른 작업자 대기 시간 프로필을 제공합니다. 3개의 작업자 대기 시간 프로파일이 다음 섹션에 설명되어 있습니다.
- 기본 작업자 대기 시간 프로필
Default프로필을 사용하면 각 kubelet에서 10초마다 Kubelet Controller Manager Operator(kube 컨트롤러)에 노드 상태를 보고합니다. Kubelet Controller Manager Operator는 kubelet에서 5초마다 상태를 확인합니다.Kubernetes Controller Manager Operator는 노드의 비정상을 고려하기 전에 상태 업데이트를 40초 동안 기다립니다.
node.kubernetes.io/not-ready또는node.kubernetes.io/unreachable테인트로 노드를 표시하고 해당 노드의 Pod를 제거합니다. 해당 노드의 Pod에NoExecute허용 오차가 있는 경우 Pod가 300초 내에 제거됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.프로필 구성 요소 매개변수 현재의 Default
kubelet
node-status-update-frequency10s
kubelet Controller Manager
node-monitor-grace-period40s
Kubernetes API 서버
default-not-ready-toleration-seconds300s
Kubernetes API 서버
default-unreachable-toleration-seconds300s
- 중간 수준의 작업자 대기 시간 프로필
네트워크 대기 시간이 보통보다 약간 높은 경우
MediumUpdateAverageReaction프로필을 사용합니다.MediumUpdateAverageReaction프로필을 사용하면 kubelet 업데이트 빈도를 20초로 줄이고 Kubernetes Controller Manager Operator에서 해당 업데이트를 2분으로 대기하는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes Controller Manager Operator는 노드 비정상적으로 간주될 때까지 2분 동안 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 MediumUpdateAverageReaction
kubelet
node-status-update-frequency20s
kubelet Controller Manager
node-monitor-grace-period2m
Kubernetes API 서버
default-not-ready-toleration-seconds60s
Kubernetes API 서버
default-unreachable-toleration-seconds60s
- 짧은 작업자 대기 시간 프로필
네트워크 대기 시간이 매우 높은 경우
LowUpdateSlowReaction프로필을 사용합니다.LowUpdateSlowReaction프로필을 사용하면 kubelet 업데이트 빈도를 1분으로 줄이고 Kubernetes Controller Manager Operator에서 해당 업데이트를 5분으로 대기하는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes Controller Manager Operator는 노드 비정상적으로 간주하기 위해 5분 정도 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 LowUpdateSlowReaction
kubelet
node-status-update-frequency1m
kubelet Controller Manager
node-monitor-grace-period5m
Kubernetes API 서버
default-not-ready-toleration-seconds60s
Kubernetes API 서버
default-unreachable-toleration-seconds60s
12.2. 작업자 대기 시간 프로필 사용
네트워크 대기 시간을 처리하기 위해 작업자 대기 시간 프로필을 구현하려면 node.config 오브젝트를 편집하여 프로필 이름을 추가합니다. 대기 시간이 증가하거나 감소하면 언제든지 프로필을 변경할 수 있습니다.
한 번에 하나의 작업자 대기 시간 프로필을 이동해야 합니다. 예를 들어 Default 프로필에서 LowUpdateSlowReaction 작업자 대기 시간 프로필로 직접 이동할 수 없습니다. 기본 작업자 대기 시간 프로필에서 먼저 MediumUpdateAverageReaction 프로필로 이동한 다음 LowUpdateSlowReaction 으로 이동해야 합니다. 마찬가지로 기본 프로필로 돌아갈 때 low 프로필에서 먼저 중간 프로필로 이동한 다음 기본값으로 이동해야 합니다.
OpenShift Container Platform 클러스터를 설치할 때 작업자 대기 시간 프로필을 구성할 수도 있습니다.
절차
기본 작업자 대기 시간 프로필에서 이동하려면 다음을 수행합니다.
중간 작업자 대기 시간 프로필로 이동합니다.
node.config오브젝트를 편집합니다.$ oc edit nodes.config/cluster
spec.workerLatencyProfile: mediumUpdateAverageReaction을 추가합니다.node.config오브젝트의 예apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: MediumUpdateAverageReaction 1 # ...- 1
- 중간 작업자 대기 시간 정책을 지정합니다.
변경 사항이 적용됨에 따라 각 작업자 노드의 스케줄링이 비활성화됩니다.
선택 사항: 짧은 작업자 대기 시간 프로필로 이동합니다.
node.config오브젝트를 편집합니다.$ oc edit nodes.config/cluster
spec.workerLatencyProfile값을LowUpdateSlowReaction으로 변경합니다.node.config오브젝트의 예apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: LowUpdateSlowReaction 1 # ...- 1
- 짧은 작업자 대기 시간 정책을 사용하도록 지정합니다.
변경 사항이 적용됨에 따라 각 작업자 노드의 스케줄링이 비활성화됩니다.
검증
모든 노드가
Ready상태로 돌아가면 다음 명령을 사용하여 Kubernetes Controller Manager에서 적용되었는지 확인할 수 있습니다.$ oc get KubeControllerManager -o yaml | grep -i workerlatency -A 5 -B 5
출력 예
# ... - lastTransitionTime: "2022-07-11T19:47:10Z" reason: ProfileUpdated status: "False" type: WorkerLatencyProfileProgressing - lastTransitionTime: "2022-07-11T19:47:10Z" 1 message: all static pod revision(s) have updated latency profile reason: ProfileUpdated status: "True" type: WorkerLatencyProfileComplete - lastTransitionTime: "2022-07-11T19:20:11Z" reason: AsExpected status: "False" type: WorkerLatencyProfileDegraded - lastTransitionTime: "2022-07-11T19:20:36Z" status: "False" # ...- 1
- 프로필이 적용되고 활성화되도록 지정합니다.
낮음 프로필을 중간으로 변경하거나 중간을 낮게 변경하려면 node.config 오브젝트를 편집하고 spec.workerLatencyProfile 매개변수를 적절한 값으로 설정합니다.
13장. 토폴로지 Aware Lifecycle Manager for 클러스터 업데이트
Topology Aware Lifecycle Manager (TALM)를 사용하여 여러 클러스터의 소프트웨어 라이프사이클을 관리할 수 있습니다. TALM은 RHACM(Red Hat Advanced Cluster Management) 정책을 사용하여 대상 클러스터에서 변경 사항을 수행합니다.
13.1. 토폴로지 Aware Lifecycle Manager 구성 정보
Topology Aware Lifecycle Manager (TALM)는 하나 이상의 OpenShift Container Platform 클러스터에 대한 RHACM(Red Hat Advanced Cluster Management) 정책 배포를 관리합니다. 대규모 클러스터에서 TALM을 사용하면 제한된 일괄 처리로 클러스터에 정책을 단계적으로 롤아웃할 수 있습니다. 이를 통해 업데이트 시 가능한 서비스 중단을 최소화할 수 있습니다. TALM을 사용하면 다음 작업을 제어할 수 있습니다.
- 업데이트의 시간
- RHACM 관리 클러스터 수
- 정책을 적용할 관리 클러스터의 하위 세트
- 클러스터의 업데이트 순서
- 클러스터에 수정된 정책 세트
- 클러스터에 수정된 정책 순서
- 카나리아 클러스터 할당
단일 노드 OpenShift의 경우 토폴로지 Aware Lifecycle Manager(TALM)는 다음 기능을 제공합니다.
- 업그레이드하기 전에 배포 백업 생성
- 대역폭이 제한된 클러스터의 이미지 사전 캐싱
TALM은 y-streams 및 z-streams에서 OpenShift Container Platform y-stream 및 z-stream 업데이트의 오케스트레이션과 2일차 작업을 지원합니다.
13.2. 토폴로지 Aware Lifecycle Manager와 함께 사용되는 관리형 정책 정보
TALM(토폴로지 라이프사이클 관리자)에서는 클러스터 업데이트에 RHACM 정책을 사용합니다.
TALM은 remediationAction 필드가 알리 도록 설정된 정책 CR의 롤아웃을 관리하는 데 사용할 수 있습니다. 지원되는 사용 사례는 다음과 같습니다.
- 정책 CR 수동 사용자 생성
-
PolicyGenTemplateCRD(사용자 정의 리소스 정의)에서 자동으로 생성된 정책
수동 승인으로 Operator 서브스크립션을 업데이트하는 정책의 경우 TALM은 업데이트된 Operator 설치를 승인하는 추가 기능을 제공합니다.
관리 정책에 대한 자세한 내용은 RHACM 설명서의 정책 개요 를 참조하십시오.
PolicyGenTemplate CRD에 대한 자세한 내용은 "PolicyGenTemplate Resource를 사용하여 관리 클러스터 구성"의 "PolicyGenTemplate CRD 정보" 섹션을 참조하십시오.
13.3. 웹 콘솔을 사용하여 토폴로지 Aware Lifecycle Manager 설치
OpenShift Container Platform 웹 콘솔을 사용하여 토폴로지 Aware Lifecycle Manager를 설치할 수 있습니다.
사전 요구 사항
- RHACM Operator의 최신 버전을 설치합니다.
- 연결이 끊긴 regitry로 hub 클러스터를 설정합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
- OpenShift Container Platform 웹 콘솔에서 Operator → OperatorHub로 이동합니다.
- 사용 가능한 Operator 목록에서 Topology Aware Lifecycle Manager 를 검색한 다음 설치를 클릭합니다.
- 기본 설치 모드 ["All namespaces on the cluster (default)"] 및 Installed Namespace ("openshift-operators")를 계속 선택하여 Operator가 올바르게 설치되었는지 확인합니다.
- 설치를 클릭합니다.
검증
설치에 성공했는지 확인하려면 다음을 수행하십시오.
- Operator → 설치된 Operator 페이지로 이동합니다.
-
Operator가
All Namespaces네임스페이스에 설치되어 있고 해당 상태는Succeeded인지 확인합니다.
Operator가 성공적으로 설치되지 않은 경우 다음을 수행하십시오.
-
Operator → 설치된 Operator 페이지로 이동하여
Status열에 오류 또는 실패가 있는지 점검합니다. -
워크로드 → Pod 페이지로 이동하여 문제를 보고하는
cluster-group-upgrades-controller-managerPod의 모든 컨테이너에서 로그를 확인합니다.
13.4. CLI를 사용하여 토폴로지 Aware Lifecycle Manager 설치
OpenShift CLI(oc)를 사용하여 TALM(토폴로지 Aware Lifecycle Manager)을 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. - RHACM Operator의 최신 버전을 설치합니다.
- 연결이 끊긴 레지스트리를 사용하여 hub 클러스터를 설정합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
서브스크립션CR을 생성합니다.SubscriptionCR을 정의하고 YAML 파일을 저장합니다(예:talm-subscription.yaml).apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-topology-aware-lifecycle-manager-subscription namespace: openshift-operators spec: channel: "stable" name: topology-aware-lifecycle-manager source: redhat-operators sourceNamespace: openshift-marketplace
다음 명령을 실행하여
SubscriptionCR을 생성합니다.$ oc create -f talm-subscription.yaml
검증
CSV 리소스를 검사하여 설치에 성공했는지 확인합니다.
$ oc get csv -n openshift-operators
출력 예
NAME DISPLAY VERSION REPLACES PHASE topology-aware-lifecycle-manager.4.13.x Topology Aware Lifecycle Manager 4.13.x Succeeded
TALM이 실행 중인지 확인합니다.
$ oc get deploy -n openshift-operators
출력 예
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE openshift-operators cluster-group-upgrades-controller-manager 1/1 1 1 14s
13.5. ClusterGroupUpgrade CR 정보
Topology Aware Lifecycle Manager(TALM)는 클러스터 그룹에 대한 ClusterGroupUpgrade CR에서 수정 계획을 빌드합니다. ClusterGroupUpgrade CR에서 다음 사양을 정의할 수 있습니다.
- 그룹의 클러스터
-
ClusterGroupUpgradeCR 차단 - 적용 가능한 정책 목록
- 동시 업데이트 수
- 적용 가능한 카나리아 업데이트
- 업데이트 전과 후에 수행할 작업
- 업데이트 타이밍
ClusterGroupUpgrade CR의 enable 필드를 사용하여 업데이트 시작 시간을 제어할 수 있습니다. 예를 들어 예약된 유지 관리 기간이 4시간이면 enable 필드를 false 로 설정하여 ClusterGroupUpgrade CR을 준비할 수 있습니다.
spec.remediationStrategy.timeout 설정을 다음과 같이 구성하여 타임아웃을 설정할 수 있습니다.
spec
remediationStrategy:
maxConcurrency: 1
timeout: 240
batchTimeoutAction 을 사용하여 클러스터에 대한 업데이트가 실패하는 경우 발생하는 상황을 확인할 수 있습니다. 오류가 발생한 클러스터를 계속 건너뛰고 다른 클러스터를 계속 업그레이드하거나 모든 클러스터에 대한 정책 수정을 중지하도록 중단할 수 있습니다. 제한 시간이 경과하면 TALM은 클러스터에 대한 추가 업데이트가 발생하지 않도록 모든 적용 정책을 제거합니다.
변경 사항을 적용하려면 enabled 필드를 true 로 설정합니다.
자세한 내용은 "관리된 클러스터에 업데이트 정책 적용" 섹션을 참조하십시오.
TALM은 지정된 클러스터에 대한 정책 수정을 통해 작동하므로 ClusterGroupUpgrade CR은 여러 조건에 대해 true 또는 false 상태를 보고할 수 있습니다.
TALM이 클러스터 업데이트를 완료하면 동일한 ClusterGroupUpgrade CR에서 클러스터에서 다시 업데이트되지 않습니다. 다음과 같은 경우 새 ClusterGroupUpgrade CR을 생성해야 합니다.
- 클러스터를 다시 업데이트해야 하는 경우
-
클러스터가 업데이트 후
정보정책과 일치하지 않는 것으로 변경되는 경우
13.5.1. 클러스터 선택
TALM은 수정 계획을 빌드하고 다음 필드에 따라 클러스터를 선택합니다.
-
clusterLabelSelector필드는 업데이트하려는 클러스터의 레이블을 지정합니다.k8s.io/apimachinery/pkg/apis/meta/v1의 표준 라벨 선택기 목록으로 구성됩니다. 목록의 각 선택기는 레이블 값 쌍 또는 레이블 표현식을 사용합니다. 각 선택기의 일치는clusterSelector필드 및 cluster 필드의 일치 항목과 함께 최종클러스터목록에 추가됩니다. -
cluster필드는 업데이트할 클러스터 목록을 지정합니다. -
canaries필드는 카나리아 업데이트의 클러스터를 지정합니다. -
maxConcurrency필드는 일괄 처리에서 업데이트할 클러스터 수를 지정합니다. -
actions필드는 업데이트 프로세스를 시작할 때 TALM이 수행할 때 TALM이 수행하는 작업을활성화하고각 클러스터에 대한 정책 수정을 완료할 때 TALM이 수행하는후작업을 지정합니다.
clusterLabelSelector , clusterSelector 필드를 함께 사용하여 결합된 클러스터 목록을 생성할 수 있습니다.
수정 계획은 canaries 필드에 나열된 클러스터로 시작됩니다. 각 카나리아 클러스터는 단일 클러스터 배치를 형성합니다.
enabled 필드 를 false로 설정된 샘플 ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
creationTimestamp: '2022-11-18T16:27:15Z'
finalizers:
- ran.openshift.io/cleanup-finalizer
generation: 1
name: talm-cgu
namespace: talm-namespace
resourceVersion: '40451823'
uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
actions:
afterCompletion: 1
addClusterLabels:
upgrade-done: ""
deleteClusterLabels:
upgrade-running: ""
deleteObjects: true
beforeEnable: 2
addClusterLabels:
upgrade-running: ""
backup: false
clusters: 3
- spoke1
enable: false 4
managedPolicies: 5
- talm-policy
preCaching: false
remediationStrategy: 6
canaries: 7
- spoke1
maxConcurrency: 2 8
timeout: 240
clusterLabelSelectors: 9
- matchExpressions:
- key: label1
operator: In
values:
- value1a
- value1b
batchTimeoutAction: 10
status: 11
computedMaxConcurrency: 2
conditions:
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: All selected clusters are valid
reason: ClusterSelectionCompleted
status: 'True'
type: ClustersSelected 12
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: Completed validation
reason: ValidationCompleted
status: 'True'
type: Validated 13
- lastTransitionTime: '2022-11-18T16:37:16Z'
message: Not enabled
reason: NotEnabled
status: 'False'
type: Progressing
managedPoliciesForUpgrade:
- name: talm-policy
namespace: talm-namespace
managedPoliciesNs:
talm-policy: talm-namespace
remediationPlan:
- - spoke1
- - spoke2
- spoke3
status:
- 1
- 각 클러스터에 대한 정책 수정을 완료할 때 TALM이 수행하는 작업을 지정합니다.
- 2
- 업데이트 프로세스를 시작할 때 TALM이 수행하는 작업을 지정합니다.
- 3
- 업데이트할 클러스터 목록을 정의합니다.
- 4
enable필드는false로 설정됩니다.- 5
- 수정할 사용자 정의 정책 세트를 나열합니다.
- 6
- 클러스터 업데이트의 세부 사항을 정의합니다.
- 7
- 카나리아 업데이트의 클러스터를 정의합니다.
- 8
- 일괄 처리의 최대 동시 업데이트 수를 정의합니다. 수정 일괄 처리 횟수는 카나리아 클러스터 수와
maxConcurrency값으로 구분된 카나리아 클러스터를 제외한 클러스터 수입니다. 모든 관리 정책을 이미 준수하는 클러스터는 수정 계획에서 제외됩니다. - 9
- 클러스터 선택을 위한 매개변수를 표시합니다.
- 10
- 일괄 처리 시간이 초과될 때 발생하는 작업을 제어합니다. 가능한 값은
중단되거나계속됩니다. 지정하지 않는 경우 기본값은continue입니다. - 11
- 업데이트 상태에 대한 정보를 표시합니다.
- 12
ClustersSelected조건은 선택한 모든 클러스터가 유효하다는 것을 보여줍니다.- 13
Validated조건은 선택한 모든 클러스터의 유효성을 검사합니다.
카나리아 클러스터를 업데이트하는 동안 오류가 발생하면 업데이트 프로세스가 중지됩니다.
수정 계획을 성공적으로 생성하면 enable 필드를 true 로 설정하고 TALM이 지정된 관리 정책을 사용하여 비준수 클러스터를 업데이트하기 시작할 수 있습니다.
ClusterGroupUpgrade CR의 enable 필드가 false 로 설정된 경우에만 spec 필드를 변경할 수 있습니다.
13.5.2. 검증
TALM은 지정된 모든 관리 정책이 사용 가능하고 올바르며 Validated 조건을 사용하여 다음과 같이 상태 및 이유를 보고합니다.
true검증이 완료되었습니다.
false정책이 누락되거나 유효하지 않거나 잘못된 플랫폼 이미지가 지정되어 있습니다.
13.5.3. 사전 캐싱
클러스터는 컨테이너 이미지 레지스트리에 액세스하기 위해 대역폭이 제한될 수 있으므로 업데이트가 완료되기 전에 시간 초과가 발생할 수 있습니다. 단일 노드 OpenShift 클러스터에서는 사전 캐싱을 사용하여 이러한 문제를 방지할 수 있습니다. preCaching 필드가 true 로 설정된 ClusterGroupUpgrade CR을 생성할 때 컨테이너 이미지 사전 캐싱이 시작됩니다. TALM은 사용 가능한 디스크 공간을 예상 OpenShift Container Platform 이미지 크기와 비교하여 충분한 공간이 있는지 확인합니다. 클러스터에 공간이 충분하지 않은 경우 TALM은 해당 클러스터에 대한 사전 캐싱을 취소하고 이에 대한 정책을 수정하지 않습니다.
TALM은 PrecacheSpecValid 조건을 사용하여 다음과 같이 상태 정보를 보고합니다.
true사전 캐싱 사양이 유효하고 일관되게 유지됩니다.
false사전 캐싱 사양이 불완전합니다.
TALM은 PrecachingSucceeded 조건을 사용하여 다음과 같이 상태 정보를 보고합니다.
trueTALM은 사전 캐싱 프로세스를 발표했습니다. 클러스터에 대한 사전 캐싱이 실패하면 해당 클러스터에 대한 업데이트가 실패하지만 다른 모든 클러스터를 진행합니다. 클러스터에 대한 사전 캐싱이 실패한 경우 메시지가 표시됩니다.
false하나 이상의 클러스터에 대한 사전 캐싱이 여전히 진행 중이거나 모든 클러스터에서 실패했습니다.
자세한 내용은 "컨테이너 이미지 사전 캐시 기능 사용" 섹션을 참조하십시오.
13.5.4. 백업 생성
단일 노드 OpenShift의 경우 TALM은 업데이트하기 전에 배포 백업을 생성할 수 있습니다. 업데이트에 실패하면 애플리케이션을 다시 프로비저닝하지 않고도 이전 버전을 복구하고 클러스터를 작동 상태로 복원할 수 있습니다. 백업 기능을 사용하려면 먼저 backup 필드가 true 로 설정된 ClusterGroupUpgrade CR을 생성합니다. 백업 내용이 최신 상태인지 확인하기 위해 ClusterGroupUpgrade CR의 enable 필드를 true 로 설정할 때까지 백업이 수행되지 않습니다.
TALM은 BackupSucceeded 조건을 사용하여 다음과 같이 상태 및 이유를 보고합니다.
true모든 클러스터에 대한 백업이 완료되었거나 백업 실행이 완료되지만 하나 이상의 클러스터에는 실패했습니다. 클러스터에 대한 백업이 실패하면 해당 클러스터에 대한 업데이트가 실패하지만 다른 모든 클러스터를 진행합니다.
false하나 이상의 클러스터에 대한 백업이 여전히 진행 중이거나 모든 클러스터에 대해 실패했습니다.
자세한 내용은 "업그레이드 전에 클러스터 리소스의 백업 생성" 섹션을 참조하십시오.
13.5.5. 클러스터 업데이트
TALM은 수정 계획에 따라 정책을 적용합니다. 후속 배치에 대한 정책을 강제 적용하는 것은 현재 배치의 모든 클러스터가 관리되는 모든 정책을 준수하는 후 즉시 시작됩니다. 일괄 처리가 시간 초과되면 TALM은 다음 일괄 처리로 이동합니다. 일괄 처리의 시간 초과 값은 spec.timeout 필드로, 수정 계획의 배치 수로 나눈 값입니다.
TALM은 Progressing 조건을 사용하여 다음과 같이 상태 및 이유를 보고합니다.
trueTALM은 비준수 정책을 수정하고 있습니다.
false업데이트가 진행되지 않았습니다. 가능한 이유는 다음과 같습니다.
- 모든 클러스터는 모든 관리 정책을 준수합니다.
- 정책 수정이 너무 오래 걸리는 경우 업데이트 시간이 초과되었습니다.
- 시스템에서 차단 CR이 누락되었거나 아직 완료되지 않았습니다.
-
ClusterGroupUpgradeCR이 활성화되지 않습니다. - 백업이 아직 진행 중입니다.
관리형 정책은 ClusterGroupUpgrade CR의 managedPolicies 필드에 나열된 순서에 적용됩니다. 하나의 관리형 정책은 한 번에 지정된 클러스터에 적용됩니다. 클러스터가 현재 정책을 준수하면 다음 관리 정책이 적용됩니다.
진행 상태의 샘플 ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
creationTimestamp: '2022-11-18T16:27:15Z'
finalizers:
- ran.openshift.io/cleanup-finalizer
generation: 1
name: talm-cgu
namespace: talm-namespace
resourceVersion: '40451823'
uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
actions:
afterCompletion:
deleteObjects: true
beforeEnable: {}
backup: false
clusters:
- spoke1
enable: true
managedPolicies:
- talm-policy
preCaching: true
remediationStrategy:
canaries:
- spoke1
maxConcurrency: 2
timeout: 240
clusterLabelSelectors:
- matchExpressions:
- key: label1
operator: In
values:
- value1a
- value1b
batchTimeoutAction:
status:
clusters:
- name: spoke1
state: complete
computedMaxConcurrency: 2
conditions:
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: All selected clusters are valid
reason: ClusterSelectionCompleted
status: 'True'
type: ClustersSelected
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: Completed validation
reason: ValidationCompleted
status: 'True'
type: Validated
- lastTransitionTime: '2022-11-18T16:37:16Z'
message: Remediating non-compliant policies
reason: InProgress
status: 'True'
type: Progressing 1
managedPoliciesForUpgrade:
- name: talm-policy
namespace: talm-namespace
managedPoliciesNs:
talm-policy: talm-namespace
remediationPlan:
- - spoke1
- - spoke2
- spoke3
status:
currentBatch: 2
currentBatchRemediationProgress:
spoke2:
state: Completed
spoke3:
policyIndex: 0
state: InProgress
currentBatchStartedAt: '2022-11-18T16:27:16Z'
startedAt: '2022-11-18T16:27:15Z'
- 1
진행필드는 TALM이 정책을 수정하는 과정에 있음을 보여줍니다.
13.5.6. 업데이트 상태
TALM은 Succeeded 조건을 사용하여 다음과 같이 상태 및 이유를 보고합니다.
true모든 클러스터는 지정된 관리 정책을 준수합니다.
false업데이트 적용에 사용할 수 있는 클러스터가 없거나 다음과 같은 이유 중 하나로 인해 정책 수정이 너무 오래 걸리기 때문에 정책 수정이 실패했습니다.
- 현재 일괄 처리에는 카나리아 업데이트가 포함되어 있으며 일괄 처리의 클러스터가 배치 제한 시간 내의 모든 관리 정책을 준수하지는 않습니다.
-
클러스터는
remediationStrategy필드에 지정된타임아웃값 내의 관리 정책을 준수하지 않았습니다.
Succeeded 상태의 샘플 ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
name: cgu-upgrade-complete
namespace: default
spec:
clusters:
- spoke1
- spoke4
enable: true
managedPolicies:
- policy1-common-cluster-version-policy
- policy2-common-pao-sub-policy
remediationStrategy:
maxConcurrency: 1
timeout: 240
status: 1
clusters:
- name: spoke1
state: complete
- name: spoke4
state: complete
conditions:
- message: All selected clusters are valid
reason: ClusterSelectionCompleted
status: "True"
type: ClustersSelected
- message: Completed validation
reason: ValidationCompleted
status: "True"
type: Validated
- message: All clusters are compliant with all the managed policies
reason: Completed
status: "False"
type: Progressing 2
- message: All clusters are compliant with all the managed policies
reason: Completed
status: "True"
type: Succeeded 3
managedPoliciesForUpgrade:
- name: policy1-common-cluster-version-policy
namespace: default
- name: policy2-common-pao-sub-policy
namespace: default
remediationPlan:
- - spoke1
- - spoke4
status:
completedAt: '2022-11-18T16:27:16Z'
startedAt: '2022-11-18T16:27:15Z'
시간 초과 상태의 샘플 ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
creationTimestamp: '2022-11-18T16:27:15Z'
finalizers:
- ran.openshift.io/cleanup-finalizer
generation: 1
name: talm-cgu
namespace: talm-namespace
resourceVersion: '40451823'
uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
spec:
actions:
afterCompletion:
deleteObjects: true
beforeEnable: {}
backup: false
clusters:
- spoke1
- spoke2
enable: true
managedPolicies:
- talm-policy
preCaching: false
remediationStrategy:
maxConcurrency: 2
timeout: 240
status:
clusters:
- name: spoke1
state: complete
- currentPolicy: 1
name: talm-policy
status: NonCompliant
name: spoke2
state: timedout
computedMaxConcurrency: 2
conditions:
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: All selected clusters are valid
reason: ClusterSelectionCompleted
status: 'True'
type: ClustersSelected
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: Completed validation
reason: ValidationCompleted
status: 'True'
type: Validated
- lastTransitionTime: '2022-11-18T16:37:16Z'
message: Policy remediation took too long
reason: TimedOut
status: 'False'
type: Progressing
- lastTransitionTime: '2022-11-18T16:37:16Z'
message: Policy remediation took too long
reason: TimedOut
status: 'False'
type: Succeeded 2
managedPoliciesForUpgrade:
- name: talm-policy
namespace: talm-namespace
managedPoliciesNs:
talm-policy: talm-namespace
remediationPlan:
- - spoke1
- spoke2
status:
startedAt: '2022-11-18T16:27:15Z'
completedAt: '2022-11-18T20:27:15Z'
13.5.7. ClusterGroupUpgrade CR 차단
여러 ClusterGroupUpgrade CR을 생성하고 애플리케이션 순서를 제어할 수 있습니다.
예를 들어 CR A의 시작을 차단하는 ClusterGroupUpgrade ClusterGroupUpgrade CR C를 생성하는 경우 ClusterGroupUpgrade CR A의 상태가 UpgradeComplete 가 될 때까지 시작할 수 없습니다.
하나의 ClusterGroupUpgrade CR에는 여러 개의 차단 CR이 있을 수 있습니다. 이 경우 현재 CR의 업그레이드가 시작되기 전에 모든 차단 CR을 완료해야 합니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- 하나 이상의 관리 클러스터를 프로비저닝합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - hub 클러스터에 RHACM 정책을 생성합니다.
절차
ClusterGroupUpgradeCR의 콘텐츠를cgu-a.yaml,cgu-b.yaml,cgu-c.yaml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-a namespace: default spec: blockingCRs: 1 - name: cgu-c namespace: default clusters: - spoke1 - spoke2 - spoke3 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy remediationStrategy: canaries: - spoke1 maxConcurrency: 2 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default placementBindings: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy placementRules: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy remediationPlan: - - spoke1 - - spoke2- 1
- 차단 CR을 정의합니다.
cgu-a업데이트는cgu-c가 완료될 때까지 시작할 수 없습니다.
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-b namespace: default spec: blockingCRs: 1 - name: cgu-a namespace: default clusters: - spoke4 - spoke5 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy placementRules: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy remediationPlan: - - spoke4 - - spoke5 status: {}- 1
cgu-b업데이트는cgu-a가 완료될 때까지 시작할 수 없습니다.
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-c namespace: default spec: 1 clusters: - spoke6 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy managedPoliciesCompliantBeforeUpgrade: - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy placementRules: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy remediationPlan: - - spoke6 status: {}- 1
cgu-c업데이트는 차단 CR이 없습니다.enable필드가true로 설정된 경우 TALM이cgu-c업데이트를 시작합니다.
각 관련 CR에 대해 다음 명령을 실행하여
ClusterGroupUpgradeCR을 생성합니다.$ oc apply -f <name>.yaml
관련 각 CR에 대해 다음 명령을 실행하여 업데이트 프로세스를 시작합니다.
$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/<name> \ --type merge -p '{"spec":{"enable":true}}'다음 예제에서는
enable필드가true로 설정된ClusterGroupUpgradeCR을 보여줍니다.cgu-a차단 CR의 예apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-a namespace: default spec: blockingCRs: - name: cgu-c namespace: default clusters: - spoke1 - spoke2 - spoke3 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy remediationStrategy: canaries: - spoke1 maxConcurrency: 2 timeout: 240 status: conditions: - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet completed: [cgu-c]' 1 reason: UpgradeCannotStart status: "False" type: Ready copiedPolicies: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default placementBindings: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy placementRules: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy remediationPlan: - - spoke1 - - spoke2 status: {}- 1
- 차단 CR 목록을 표시합니다.
CR을 차단하는
cgu-b의 예apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-b namespace: default spec: blockingCRs: - name: cgu-a namespace: default clusters: - spoke4 - spoke5 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet completed: [cgu-a]' 1 reason: UpgradeCannotStart status: "False" type: Ready copiedPolicies: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy placementRules: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy remediationPlan: - - spoke4 - - spoke5 status: {}- 1
- 차단 CR 목록을 표시합니다.
CR을 차단하는
cgu-c의 예apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-c namespace: default spec: clusters: - spoke6 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR has upgrade policies that are still non compliant 1 reason: UpgradeNotCompleted status: "False" type: Ready copiedPolicies: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy managedPoliciesCompliantBeforeUpgrade: - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy placementRules: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy remediationPlan: - - spoke6 status: currentBatch: 1 remediationPlanForBatch: spoke6: 0- 1
cgu-c업데이트는 차단 CR이 없습니다.
13.6. 관리형 클러스터에서 정책 업데이트
TALM(토폴로지 라이프사이클 관리자)은 ClusterGroupUpgrade CR에 지정된 클러스터에 대한 정보 정책을 조정합니다. TALM은 관리되는 RHACM 정책 사본을 시행 하여 정보 정책을 해결합니다. 복사된 각 정책에는 자체 RHACM 배치 규칙과 RHACM 배치 바인딩이 있습니다.
하나씩 TALM은 현재 배치의 각 클러스터를 적용 가능한 관리 정책에 해당하는 배치 규칙에 추가합니다. 클러스터가 이미 정책을 준수하는 경우 TALM은 호환 클러스터에 해당 정책을 적용하는 것을 건너뜁니다. 그런 다음 TALM은 비호환 클러스터에 다음 정책을 적용하기 위해 계속 이동합니다. TALM이 일괄 처리에서 업데이트를 완료하면 복사된 정책과 연결된 배치 규칙에서 모든 클러스터가 제거됩니다. 그런 다음 다음 배치의 업데이트가 시작됩니다.
스포크 클러스터에서 RHACM에 호환 상태를 보고하지 않는 경우 hub 클러스터에 대한 관리 정책에 TALM에 필요한 상태 정보가 누락될 수 있습니다. TALM에서는 다음과 같은 방법으로 이러한 경우를 처리합니다.
-
정책의
status.compliant필드가 없는 경우 TALM은 정책을 무시하고 로그 항목을 추가합니다. 그런 다음 TALM은 정책의status.status필드를 계속 확인합니다. -
정책의
status.status가 누락된 경우 TALM에서 오류를 생성합니다. -
정책의
status.status필드에 클러스터의 규정 준수 상태가 없는 경우 TALM은 해당 클러스터를 해당 정책과 준수하지 않는 것으로 간주합니다.
ClusterGroupUpgrade CR의 batchTimeoutAction 은 클러스터에 대한 업그레이드가 실패하는 경우 발생하는 상황을 결정합니다. 오류가 발생한 클러스터를 계속 건너뛰고 다른 클러스터를 계속 업그레이드하거나 모든 클러스터에 대한 정책 수정을 중지하려면 중단 을 지정할 수 있습니다. 제한 시간이 경과하면 TALM은 클러스터에 대한 추가 업데이트가 발생하지 않도록 모든 적용 정책을 제거합니다.
RHACM 정책에 대한 자세한 내용은 정책 개요 를 참조하십시오.
추가 리소스
PolicyGenTemplate CRD에 대한 자세한 내용은 PolicyGenTemplate CRD 정보를 참조하십시오.
13.6.1. 관리 클러스터에 업데이트 정책 적용
정책을 적용하여 관리 클러스터를 업데이트할 수 있습니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- 하나 이상의 관리 클러스터를 프로비저닝합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - hub 클러스터에 RHACM 정책을 생성합니다.
절차
ClusterGroupUpgradeCR의 콘텐츠를cgu-1.yaml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-1 namespace: default spec: managedPolicies: 1 - policy1-common-cluster-version-policy - policy2-common-nto-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy enable: false clusters: 2 - spoke1 - spoke2 - spoke5 - spoke6 remediationStrategy: maxConcurrency: 2 3 timeout: 240 4 batchTimeoutAction: 5
다음 명령을 실행하여
ClusterGroupUpgradeCR을 생성합니다.$ oc create -f cgu-1.yaml
다음 명령을 실행하여 hub 클러스터에서
ClusterGroupUpgradeCR이 생성되었는지 확인합니다.$ oc get cgu --all-namespaces
출력 예
NAMESPACE NAME AGE STATE DETAILS default cgu-1 8m55 NotEnabled Not Enabled
다음 명령을 실행하여 업데이트 상태를 확인합니다.
$ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq출력 예
{ "computedMaxConcurrency": 2, "conditions": [ { "lastTransitionTime": "2022-02-25T15:34:07Z", "message": "Not enabled", 1 "reason": "NotEnabled", "status": "False", "type": "Progressing" } ], "copiedPolicies": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "managedPoliciesContent": { "policy1-common-cluster-version-policy": "null", "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]", "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]", "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]" }, "managedPoliciesForUpgrade": [ { "name": "policy1-common-cluster-version-policy", "namespace": "default" }, { "name": "policy2-common-nto-sub-policy", "namespace": "default" }, { "name": "policy3-common-ptp-sub-policy", "namespace": "default" }, { "name": "policy4-common-sriov-sub-policy", "namespace": "default" } ], "managedPoliciesNs": { "policy1-common-cluster-version-policy": "default", "policy2-common-nto-sub-policy": "default", "policy3-common-ptp-sub-policy": "default", "policy4-common-sriov-sub-policy": "default" }, "placementBindings": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "placementRules": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "precaching": { "spec": {} }, "remediationPlan": [ [ "spoke1", "spoke2" ], [ "spoke5", "spoke6" ] ], "status": {} }- 1
ClusterGroupUpgradeCR의spec.enable필드가false로 설정됩니다.
다음 명령을 실행하여 정책 상태를 확인합니다.
$ oc get policies -A
출력 예
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default cgu-policy1-common-cluster-version-policy enforce 17m 1 default cgu-policy2-common-nto-sub-policy enforce 17m default cgu-policy3-common-ptp-sub-policy enforce 17m default cgu-policy4-common-sriov-sub-policy enforce 17m default policy1-common-cluster-version-policy inform NonCompliant 15h default policy2-common-nto-sub-policy inform NonCompliant 15h default policy3-common-ptp-sub-policy inform NonCompliant 18m default policy4-common-sriov-sub-policy inform NonCompliant 18m- 1
- 현재 클러스터에 적용되는 정책의
spec.remediationAction필드가적용되도록 설정되어 있습니다.ClusterGroupUpgradeCR의정보 정보모드의 관리형 정책은 업데이트 중에정보모드를 유지합니다.
다음 명령을 실행하여
spec.enable필드의 값을true로 변경합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-1 \ --patch '{"spec":{"enable":true}}' --type=merge
검증
다음 명령을 실행하여 업데이트 상태를 다시 확인합니다.
$ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq출력 예
{ "computedMaxConcurrency": 2, "conditions": [ 1 { "lastTransitionTime": "2022-02-25T15:33:07Z", "message": "All selected clusters are valid", "reason": "ClusterSelectionCompleted", "status": "True", "type": "ClustersSelected", "lastTransitionTime": "2022-02-25T15:33:07Z", "message": "Completed validation", "reason": "ValidationCompleted", "status": "True", "type": "Validated", "lastTransitionTime": "2022-02-25T15:34:07Z", "message": "Remediating non-compliant policies", "reason": "InProgress", "status": "True", "type": "Progressing" } ], "copiedPolicies": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "managedPoliciesContent": { "policy1-common-cluster-version-policy": "null", "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]", "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]", "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]" }, "managedPoliciesForUpgrade": [ { "name": "policy1-common-cluster-version-policy", "namespace": "default" }, { "name": "policy2-common-nto-sub-policy", "namespace": "default" }, { "name": "policy3-common-ptp-sub-policy", "namespace": "default" }, { "name": "policy4-common-sriov-sub-policy", "namespace": "default" } ], "managedPoliciesNs": { "policy1-common-cluster-version-policy": "default", "policy2-common-nto-sub-policy": "default", "policy3-common-ptp-sub-policy": "default", "policy4-common-sriov-sub-policy": "default" }, "placementBindings": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "placementRules": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "precaching": { "spec": {} }, "remediationPlan": [ [ "spoke1", "spoke2" ], [ "spoke5", "spoke6" ] ], "status": { "currentBatch": 1, "currentBatchStartedAt": "2022-02-25T15:54:16Z", "remediationPlanForBatch": { "spoke1": 0, "spoke2": 1 }, "startedAt": "2022-02-25T15:54:16Z" } }- 1
- 현재 일괄 처리의 업데이트 진행 상황을 반영합니다. 이 명령을 다시 실행하여 진행 상황에 대한 업데이트된 정보를 받습니다.
정책에 Operator 서브스크립션이 포함된 경우 단일 노드 클러스터에서 직접 설치 진행 상황을 확인할 수 있습니다.
다음 명령을 실행하여 설치 진행 상황을 확인할 단일 노드 클러스터의
KUBECONFIG파일을 내보냅니다.$ export KUBECONFIG=<cluster_kubeconfig_absolute_path>
단일 노드 클러스터에 있는 모든 서브스크립션을 확인하고 다음 명령을 실행하여
ClusterGroupUpgradeCR을 통해 설치하려는 정책에서 해당 서브스크립션을 찾습니다.$ oc get subs -A | grep -i <subscription_name>
cluster-logging정책의 출력 예NAMESPACE NAME PACKAGE SOURCE CHANNEL openshift-logging cluster-logging cluster-logging redhat-operators stable
관리 정책 중 하나에
ClusterVersionCR이 포함된 경우 스포크 클러스터에 대해 다음 명령을 실행하여 현재 배치에서 플랫폼 업데이트의 상태를 확인합니다.$ oc get clusterversion
출력 예
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS version 4.9.5 True True 43s Working towards 4.9.7: 71 of 735 done (9% complete)
다음 명령을 실행하여 Operator 서브스크립션을 확인합니다.
$ oc get subs -n <operator-namespace> <operator-subscription> -ojsonpath="{.status}"다음 명령을 실행하여 원하는 서브스크립션과 연결된 단일 노드 클러스터에 설치 계획이 있는지 확인합니다.
$ oc get installplan -n <subscription_namespace>
cluster-loggingOperator의 출력 예NAMESPACE NAME CSV APPROVAL APPROVED openshift-logging install-6khtw cluster-logging.5.3.3-4 Manual true 1- 1
- 설치 계획의
Approval필드가Manual로 설정되고 TALM에서 설치 계획을 승인한 후승인필드가false에서true로 변경됩니다.
참고TALM이 서브스크립션이 포함된 정책을 수정하면 해당 서브스크립션에 연결된 모든 설치 계획을 자동으로 승인합니다. Operator를 최신 알려진 버전으로 가져오기 위해 여러 설치 계획이 필요한 경우 TALM에서 여러 설치 계획을 승인하고 하나 이상의 중간 버전을 통해 업그레이드하여 최종 버전으로 가져올 수 있습니다.
다음 명령을 실행하여
ClusterGroupUpgrade가 설치하는 정책의 Operator의 클러스터 서비스 버전이Succeeded단계에 도달했는지 확인합니다.$ oc get csv -n <operator_namespace>
OpenShift Logging Operator의 출력 예
NAME DISPLAY VERSION REPLACES PHASE cluster-logging.5.4.2 Red Hat OpenShift Logging 5.4.2 Succeeded
13.7. 업그레이드하기 전에 클러스터 리소스의 백업 생성
단일 노드 OpenShift의 경우 TALM(토폴로지 라이프사이클 관리자)는 업그레이드하기 전에 배포 백업을 생성할 수 있습니다. 업그레이드에 실패하면 애플리케이션을 재프로비저닝하지 않고도 이전 버전을 복구하고 클러스터를 작동 상태로 복원할 수 있습니다.
백업 기능을 사용하려면 먼저 backup 필드가 true 로 설정된 ClusterGroupUpgrade CR을 생성합니다. 백업 내용이 최신 상태인지 확인하기 위해 ClusterGroupUpgrade CR의 enable 필드를 true 로 설정할 때까지 백업이 수행되지 않습니다.
TALM은 BackupSucceeded 조건을 사용하여 다음과 같이 상태 및 이유를 보고합니다.
true모든 클러스터에 대한 백업이 완료되었거나 백업 실행이 완료되지만 하나 이상의 클러스터에는 실패했습니다. 클러스터에 대한 백업이 실패하면 해당 클러스터가 업데이트되지 않습니다.
false하나 이상의 클러스터에 대한 백업이 여전히 진행 중이거나 모든 클러스터에 대해 실패했습니다. 스포크 클러스터에서 실행되는 백업 프로세스는 다음과 같은 상태를 가질 수 있습니다.
PreparingToStart첫 번째 조정 통과가 진행 중입니다. TALM은 실패한 업그레이드 시도에서 생성된 모든 설명된 백업 네임스페이스 및 허브 뷰 리소스를 삭제합니다.
Starting백업 사전 요구 사항 및 백업 작업이 생성됩니다.
활성 상태백업이 진행 중입니다.
Succeed백업이 성공했습니다.
BackupTimeout아티팩트 백업이 부분적으로 수행됩니다.
복구할 수 없는Error백업이 0이 아닌 종료 코드로 종료되었습니다.
클러스터 백업에 실패하고 BackupTimeout 또는 UnrecoverableError 상태를 입력하면 클러스터 업데이트가 해당 클러스터를 진행하지 않습니다. 다른 클러스터에 대한 업데이트는 영향을 받지 않으며 계속됩니다.
13.7.1. 백업을 사용하여 ClusterGroupUpgrade CR 생성
단일 노드 OpenShift 클러스터에서 업그레이드하기 전에 배포 백업을 생성할 수 있습니다. 업그레이드에 실패하면 Topology Aware Lifecycle Manager (TALM)에서 생성한 upgrade-recovery.sh 스크립트를 사용하여 시스템을 사전 업그레이드 상태로 되돌릴 수 있습니다. 백업은 다음 항목으로 구성됩니다.
- 클러스터 백업
-
etcd및 정적 포드 매니페스트의 스냅샷입니다. - 콘텐츠 백업
-
폴더 백업(예:
/etc,/usr/local,/var/lib/kubelet) - 변경된 파일 백업
-
변경된
machine-config에서 관리하는 모든 파일 - Deployment
-
고정된
ostree배포. - 이미지 (선택 사항)
- 사용 중인 모든 컨테이너 이미지입니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- 하나 이상의 관리 클러스터를 프로비저닝합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - RHACM(Red Hat Advanced Cluster Management)을 설치합니다.
복구 파티션을 만드는 것이 좋습니다. 다음은 50GB의 복구 파티션에 대한 SiteConfig CR(사용자 정의 리소스)의 예입니다.
nodes:
- hostName: "snonode.sno-worker-0.e2e.bos.redhat.com"
role: "master"
rootDeviceHints:
hctl: "0:2:0:0"
deviceName: /dev/sda
........
........
#Disk /dev/sda: 893.3 GiB, 959119884288 bytes, 1873281024 sectors
diskPartition:
- device: /dev/sda
partitions:
- mount_point: /var/recovery
size: 51200
start: 800000절차
backup을 사용하여ClusterGroupUpgradeCR의 콘텐츠를 저장하고clustergroupupgrades-group-du.yaml파일에서true로 설정된 필드를활성화합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: du-upgrade-4918 namespace: ztp-group-du-sno spec: preCaching: true backup: true clusters: - cnfdb1 - cnfdb2 enable: true managedPolicies: - du-upgrade-platform-upgrade remediationStrategy: maxConcurrency: 2 timeout: 240업데이트를 시작하려면 다음 명령을 실행하여
ClusterGroupUpgradeCR을 적용합니다.$ oc apply -f clustergroupupgrades-group-du.yaml
검증
다음 명령을 실행하여 hub 클러스터에서 업그레이드 상태를 확인합니다.
$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'출력 예
{ "backup": { "clusters": [ "cnfdb2", "cnfdb1" ], "status": { "cnfdb1": "Succeeded", "cnfdb2": "Failed" 1 } }, "computedMaxConcurrency": 1, "conditions": [ { "lastTransitionTime": "2022-04-05T10:37:19Z", "message": "Backup failed for 1 cluster", 2 "reason": "PartiallyDone", 3 "status": "True", 4 "type": "Succeeded" } ], "precaching": { "spec": {} }, "status": {}
13.7.2. 업그레이드 실패 후 클러스터 복구
클러스터 업그레이드가 실패하면 클러스터에 수동으로 로그인하고 백업을 사용하여 클러스터를 사전 업그레이드 상태로 되돌릴 수 있습니다. 두 단계가 있습니다.
- rollback
- 시도한 업그레이드에 플랫폼 OS 배포로 변경 사항이 포함된 경우 복구 스크립트를 실행하기 전에 이전 버전으로 롤백해야 합니다.
롤백은 TALM 및 단일 노드 OpenShift에서의 업그레이드에만 적용됩니다. 이 프로세스는 다른 업그레이드 유형의 롤백에는 적용되지 않습니다.
- 복구
- 복구 시 컨테이너가 종료되고 백업 파티션의 파일을 사용하여 컨테이너를 다시 시작하고 클러스터를 복원합니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- 하나 이상의 관리 클러스터를 프로비저닝합니다.
- RHACM(Red Hat Advanced Cluster Management)을 설치합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - 백업용으로 구성된 업그레이드를 실행합니다.
절차
다음 명령을 실행하여 이전에 생성한
ClusterGroupUpgrade사용자 정의 리소스(CR)를 삭제합니다.$ oc delete cgu/du-upgrade-4918 -n ztp-group-du-sno
- 복구하려는 클러스터에 로그인합니다.
다음 명령을 실행하여 플랫폼 OS 배포의 상태를 확인합니다.
$ ostree admin status
출력 예
[root@lab-test-spoke2-node-0 core]# ostree admin status * rhcos c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9.0 Version: 49.84.202202230006-0 Pinned: yes 1 origin refspec: c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9- 1
- 현재 배포가 고정되어 있습니다. 플랫폼 OS 배포 롤백은 필요하지 않습니다.
[root@lab-test-spoke2-node-0 core]# ostree admin status * rhcos f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa.0 Version: 410.84.202204050541-0 origin refspec: f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa rhcos ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca.0 (rollback) 1 Version: 410.84.202203290245-0 Pinned: yes 2 origin refspec: ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca플랫폼 OS 배포의 롤백을 트리거하려면 다음 명령을 실행합니다.
$ rpm-ostree rollback -r
복구의 첫 번째 단계는 컨테이너를 종료하고 백업 파티션에서 대상 디렉터리로 파일을 복원합니다. 복구를 시작하려면 다음 명령을 실행합니다.
$ /var/recovery/upgrade-recovery.sh
메시지가 표시되면 다음 명령을 실행하여 클러스터를 재부팅합니다.
$ systemctl reboot
재부팅 후 다음 명령을 실행하여 복구를 다시 시작합니다.
$ /var/recovery/upgrade-recovery.sh --resume
복구 유틸리티가 실패하면 --restart 옵션을 사용하여 다시 시도할 수 있습니다.
$ /var/recovery/upgrade-recovery.sh --restart
검증
복구 상태를 확인하려면 다음 명령을 실행합니다.
$ oc get clusterversion,nodes,clusteroperator
출력 예
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS clusterversion.config.openshift.io/version 4.9.23 True False 86d Cluster version is 4.9.23 1 NAME STATUS ROLES AGE VERSION node/lab-test-spoke1-node-0 Ready master,worker 86d v1.22.3+b93fd35 2 NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE clusteroperator.config.openshift.io/authentication 4.9.23 True False False 2d7h 3 clusteroperator.config.openshift.io/baremetal 4.9.23 True False False 86d ..............
13.8. 컨테이너 이미지 사전 캐시 기능 사용
단일 노드 OpenShift 클러스터에 컨테이너 이미지 레지스트리에 액세스하기 위해 대역폭이 제한되어 업데이트가 완료되기 전에 타임아웃이 발생할 수 있습니다.
업데이트 시간은 TALM에 의해 설정되지 않습니다. 수동 애플리케이션 또는 외부 자동화를 통해 업데이트 시작 시 ClusterGroupUpgrade CR을 적용할 수 있습니다.
ClusterGroupUpgrade CR에서 preCaching 필드가 true 로 설정된 경우 컨테이너 이미지 사전 캐싱이 시작됩니다.
TALM은 PrecacheSpecValid 조건을 사용하여 다음과 같이 상태 정보를 보고합니다.
true사전 캐싱 사양이 유효하고 일관되게 유지됩니다.
false사전 캐싱 사양이 불완전합니다.
TALM은 PrecachingSucceeded 조건을 사용하여 다음과 같이 상태 정보를 보고합니다.
trueTALM은 사전 캐싱 프로세스를 발표했습니다. 클러스터에 대한 사전 캐싱이 실패하면 해당 클러스터에 대한 업데이트가 실패하지만 다른 모든 클러스터를 진행합니다. 클러스터에 대한 사전 캐싱이 실패한 경우 메시지가 표시됩니다.
false하나 이상의 클러스터에 대한 사전 캐싱이 여전히 진행 중이거나 모든 클러스터에서 실패했습니다.
성공적인 사전 캐싱 프로세스를 마친 후 정책 수정을 시작할 수 있습니다. enable 필드가 true 로 설정된 경우 수정 작업이 시작됩니다. 클러스터에 사전 캐싱 오류가 있는 경우 해당 클러스터에 대한 업그레이드가 실패합니다. 업그레이드 프로세스는 사전 캐시가 성공한 다른 모든 클러스터에서 계속됩니다.
사전 캐싱 프로세스는 다음 상태에 있을 수 있습니다.
NotStarted이는 초기 상태 모든 클러스터는
ClusterGroupUpgradeCR의 첫 번째 조정 전달 시 자동으로 할당됩니다. 이 상태에서 TALM은 이전의 불완전한 업데이트에서 남아 있는 설명된 클러스터의 사전 캐싱 네임스페이스 및 허브 뷰 리소스를 삭제합니다. 그런 다음 TALM은 스포크 사전 캐싱 네임스페이스에 대한 새로운ManagedClusterView리소스를 생성하여PrecachePreparing상태에서 삭제를 확인합니다.PreparingToStart이전 불완전한 업데이트에서 나머지 리소스를 정리하는 작업이 진행 중입니다.
Starting사전 캐싱 작업 사전 요구 사항 및 작업이 생성됩니다.
활성 상태작업은 "Active" 상태입니다.
Succeedpre-cache 작업이 성공했습니다.
PrecacheTimeout아티팩트 사전 캐싱은 부분적으로 수행됩니다.
복구할 수 없는Error작업이 0이 아닌 종료 코드로 종료됩니다.
13.8.1. 컨테이너 이미지 사전 캐시 필터 사용
사전 캐시 기능은 일반적으로 클러스터에 필요한 것보다 더 많은 이미지를 다운로드합니다. 클러스터에 다운로드한 사전 캐시 이미지를 제어할 수 있습니다. 이렇게 하면 다운로드 시간이 줄어들고 대역폭 및 스토리지를 절약할 수 있습니다.
다음 명령을 사용하여 다운로드할 모든 이미지 목록을 볼 수 있습니다.
$ oc adm release info <ocp-version>
다음 ConfigMap 예제에서는 excludePrecachePatterns 필드를 사용하여 이미지를 제외하는 방법을 보여줍니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-group-upgrade-overrides
data:
excludePrecachePatterns: |
azure 1
aws
vsphere
alibaba- 1
- TALM은 여기에 나열된 패턴을 포함하는 이름의 모든 이미지를 제외합니다.
13.8.2. 사전 캐싱을 사용하여 ClusterGroupUpgrade CR 생성
단일 노드 OpenShift의 경우 사전 캐시 기능을 사용하면 업데이트가 시작되기 전에 필요한 컨테이너 이미지가 spoke 클러스터에 있을 수 있습니다.
사전 캐싱의 경우 TALM은 ClusterGroupUpgrade CR의 spec.remediationStrategy.timeout 값을 사용합니다. 사전 캐싱 작업이 완료될 때까지 충분한 시간을 허용하는 시간 초과 값을 설정해야 합니다. 사전 캐싱이 완료된 후 ClusterGroupUpgrade CR을 활성화하면 업데이트에 적합한 기간으로 시간 초과 값을 변경할 수 있습니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- 하나 이상의 관리 클러스터를 프로비저닝합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
clustergroupupgrades-group-du.yaml파일에서preCaching필드가true로 설정된 상태에서ClusterGroupUpgradeCR의 콘텐츠를 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: du-upgrade-4918 namespace: ztp-group-du-sno spec: preCaching: true 1 clusters: - cnfdb1 - cnfdb2 enable: false managedPolicies: - du-upgrade-platform-upgrade remediationStrategy: maxConcurrency: 2 timeout: 240- 1
preCaching필드는 업데이트를 시작하기 전에 TALM이 컨테이너 이미지를 가져올 수 있도록true로 설정됩니다.
사전 캐싱을 시작하려면 다음 명령을 실행하여
ClusterGroupUpgradeCR을 적용합니다.$ oc apply -f clustergroupupgrades-group-du.yaml
검증
다음 명령을 실행하여 hub 클러스터에
ClusterGroupUpgradeCR이 있는지 확인합니다.$ oc get cgu -A
출력 예
NAMESPACE NAME AGE STATE DETAILS ztp-group-du-sno du-upgrade-4918 10s InProgress Precaching is required and not done 1- 1
- CR이 생성됩니다.
다음 명령을 실행하여 사전 캐싱 작업의 상태를 확인합니다.
$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'출력 예
{ "conditions": [ { "lastTransitionTime": "2022-01-27T19:07:24Z", "message": "Precaching is required and not done", "reason": "InProgress", "status": "False", "type": "PrecachingSucceeded" }, { "lastTransitionTime": "2022-01-27T19:07:34Z", "message": "Pre-caching spec is valid and consistent", "reason": "PrecacheSpecIsWellFormed", "status": "True", "type": "PrecacheSpecValid" } ], "precaching": { "clusters": [ "cnfdb1" 1 "cnfdb2" ], "spec": { "platformImage": "image.example.io"}, "status": { "cnfdb1": "Active" "cnfdb2": "Succeeded"} } }- 1
- 확인된 클러스터 목록을 표시합니다.
spoke 클러스터에서 다음 명령을 실행하여 사전 캐싱 작업의 상태를 확인합니다.
$ oc get jobs,pods -n openshift-talo-pre-cache
출력 예
NAME COMPLETIONS DURATION AGE job.batch/pre-cache 0/1 3m10s 3m10s NAME READY STATUS RESTARTS AGE pod/pre-cache--1-9bmlr 1/1 Running 0 3m10s
다음 명령을 실행하여
ClusterGroupUpgradeCR의 상태를 확인합니다.$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'출력 예
"conditions": [ { "lastTransitionTime": "2022-01-27T19:30:41Z", "message": "The ClusterGroupUpgrade CR has all clusters compliant with all the managed policies", "reason": "UpgradeCompleted", "status": "True", "type": "Ready" }, { "lastTransitionTime": "2022-01-27T19:28:57Z", "message": "Precaching is completed", "reason": "PrecachingCompleted", "status": "True", "type": "PrecachingSucceeded" 1 }- 1
- 사전 캐시 작업이 완료되었습니다.
13.9. 토폴로지 Aware Lifecycle Manager 문제 해결
TALM(토폴로지 라이프사이클 관리자)은 RHACM 정책을 수정하는 OpenShift Container Platform Operator입니다. 문제가 발생하면 oc adm must-gather 명령을 사용하여 세부 정보 및 로그를 수집하고 문제를 디버깅하는 단계를 수행하십시오.
관련 항목에 대한 자세한 내용은 다음 설명서를 참조하십시오.
- Red Hat Advanced Cluster Management for Kubernetes 2.4 지원 매트릭스
- Red Hat Advanced Cluster Management Troubleshooting
- "Troubleshooting Operator 문제" 섹션
13.9.1. 일반 문제 해결
다음 질문을 검토하여 문제의 원인을 확인할 수 있습니다.
적용 중인 구성이 지원됩니까?
- RHACM 및 OpenShift Container Platform 버전이 호환됩니까?
- TALM 및 RHACM 버전은 호환됩니까?
다음 중 문제를 일으키는 구성 요소는 무엇입니까?
ClusterGroupUpgrade 구성이 작동하는지 확인하려면 다음을 수행합니다.
-
spec.enable필드를false로 설정하여ClusterGroupUpgradeCR을 생성합니다. - 상태가 업데이트될 때까지 기다린 후 문제 해결 질문을 진행합니다.
-
모든 항목이 예상대로 표시되면
ClusterGroupUpgradeCR에서spec.enable필드를true로 설정합니다.
ClusterUpgradeGroup CR에서 spec.enable 필드를 true 로 설정한 후 업데이트 절차가 시작되고 CR의 spec 필드를 더 이상 편집할 수 없습니다.
13.9.2. ClusterUpgradeGroup CR을 수정할 수 없음
- 문제
-
업데이트를 활성화한 후에는
ClusterUpgradeGroupCR을 편집할 수 없습니다. - 해결
다음 단계를 수행하여 절차를 다시 시작하십시오.
다음 명령을 실행하여 이전
ClusterGroupUpgradeCR을 제거합니다.$ oc delete cgu -n <ClusterGroupUpgradeCR_namespace> <ClusterGroupUpgradeCR_name>
관리형 클러스터 및 정책의 기존 문제를 확인하고 수정합니다.
- 모든 클러스터가 관리되고 사용 가능한지 확인합니다.
-
모든 정책이 존재하고
spec.remediationAction필드를inform로 설정해야 합니다.
올바른 구성을 사용하여 새
ClusterGroupUpgradeCR을 생성합니다.$ oc apply -f <ClusterGroupUpgradeCR_YAML>
13.9.3. 관리형 정책
시스템에서 관리되는 정책 확인
- 문제
- 시스템에 올바른 관리 정책이 있는지 확인하려고 합니다.
- 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.spec.managedPolicies}'출력 예
["group-du-sno-validator-du-validator-policy", "policy2-common-nto-sub-policy", "policy3-common-ptp-sub-policy"]
수정 모드 확인
- 문제
-
관리 정책을 사양에
알리도록remediationAction필드가 설정되어 있는지 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get policies --all-namespaces
출력 예
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default policy1-common-cluster-version-policy inform NonCompliant 5d21h default policy2-common-nto-sub-policy inform Compliant 5d21h default policy3-common-ptp-sub-policy inform NonCompliant 5d21h default policy4-common-sriov-sub-policy inform NonCompliant 5d21h
정책 준수 상태 확인
- 문제
- 정책의 규정 준수 상태를 확인하려고 합니다.
- 해결
다음 명령을 실행합니다.
$ oc get policies --all-namespaces
출력 예
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default policy1-common-cluster-version-policy inform NonCompliant 5d21h default policy2-common-nto-sub-policy inform Compliant 5d21h default policy3-common-ptp-sub-policy inform NonCompliant 5d21h default policy4-common-sriov-sub-policy inform NonCompliant 5d21h
13.9.4. 클러스터
관리형 클러스터가 있는지 확인
- 문제
-
ClusterGroupUpgradeCR의 클러스터가 관리 클러스터인지 확인해야 합니다. - 해결
다음 명령을 실행합니다.
$ oc get managedclusters
출력 예
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE local-cluster true https://api.hub.example.com:6443 True Unknown 13d spoke1 true https://api.spoke1.example.com:6443 True True 13d spoke3 true https://api.spoke3.example.com:6443 True True 27h
또는 TALM 관리자 로그를 확인합니다.
다음 명령을 실행하여 TALM 관리자의 이름을 가져옵니다.
$ oc get pod -n openshift-operators
출력 예
NAME READY STATUS RESTARTS AGE cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp 2/2 Running 0 45m
다음 명령을 실행하여 TALM 관리자 로그를 확인합니다.
$ oc logs -n openshift-operators \ cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
출력 예
ERROR controller-runtime.manager.controller.clustergroupupgrade Reconciler error {"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1 sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem- 1
- 오류 메시지는 클러스터가 관리 클러스터가 아님을 나타냅니다.
관리형 클러스터를 사용할 수 있는지 확인
- 문제
-
ClusterGroupUpgradeCR에 지정된 관리형 클러스터를 사용할 수 있는지 확인해야 합니다. - 해결
다음 명령을 실행합니다.
$ oc get managedclusters
출력 예
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE local-cluster true https://api.hub.testlab.com:6443 True Unknown 13d spoke1 true https://api.spoke1.testlab.com:6443 True True 13d 1 spoke3 true https://api.spoke3.testlab.com:6443 True True 27h 2
clusterLabelSelector 확인
- 문제
-
ClusterGroupUpgradeCR에 지정된clusterLabelSelector필드가 관리형 클러스터 중 하나 이상과 일치하는지 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get managedcluster --selector=upgrade=true 1- 1
- 업데이트하려는 클러스터의 레이블은
upgrade:true입니다.
출력 예
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE spoke1 true https://api.spoke1.testlab.com:6443 True True 13d spoke3 true https://api.spoke3.testlab.com:6443 True True 27h
카나리아 클러스터가 있는지 확인
- 문제
카나리아 클러스터가 클러스터 목록에 있는지 확인하려고 합니다.
ClusterGroupUpgradeCR의 예spec: remediationStrategy: canaries: - spoke3 maxConcurrency: 2 timeout: 240 clusterLabelSelectors: - matchLabels: upgrade: true- 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.spec.clusters}'출력 예
["spoke1", "spoke3"]
다음 명령을 실행하여
clusterLabelSelector라벨과 일치하는 클러스터 목록에 카나리아 클러스터가 있는지 확인합니다.$ oc get managedcluster --selector=upgrade=true
출력 예
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE spoke1 true https://api.spoke1.testlab.com:6443 True True 13d spoke3 true https://api.spoke3.testlab.com:6443 True True 27h
클러스터는 spec.clusters 에 존재할 수 있으며 spec.clusterLabelSelector 레이블과도 일치할 수 있습니다.
스포크 클러스터에서 사전 캐싱 상태 확인
spoke 클러스터에서 다음 명령을 실행하여 사전 캐싱의 상태를 확인합니다.
$ oc get jobs,pods -n openshift-talo-pre-cache
13.9.5. 수정 전략
ClusterGroupUpgrade CR에 remediationStrategy가 있는지 확인
- 문제
-
remediationStrategy가ClusterGroupUpgradeCR에 있는지 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy}'출력 예
{"maxConcurrency":2, "timeout":240}
ClusterGroupUpgrade CR에 maxConcurrency가 지정되어 있는지 확인
- 문제
-
maxConcurrency가ClusterGroupUpgradeCR에 지정되어 있는지 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy.maxConcurrency}'출력 예
2
13.9.6. 토폴로지 인식 라이프 사이클 관리자
ClusterGroupUpgrade CR에서 조건 메시지 및 상태 확인
- 문제
-
ClusterGroupUpgradeCR에서status.conditions필드의 값을 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.status.conditions}'출력 예
{"lastTransitionTime":"2022-02-17T22:25:28Z", "message":"Missing managed policies:[policyList]", "reason":"NotAllManagedPoliciesExist", "status":"False", "type":"Validated"}
해당 복사 정책 확인
- 문제
-
status.managedPoliciesForUpgrade의 모든 정책이status.copiedPolicies.copiedPolicies에 해당 정책이 있는지 확인하려면 다음을 수행하십시오. - 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -oyaml
출력 예
status: … copiedPolicies: - lab-upgrade-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy3-common-ptp-sub-policy namespace: default
status.remediationPlan이 계산되었는지 확인
- 문제
-
status.remediationPlan이 계산되었는지 확인하려고 합니다. - 해결
다음 명령을 실행합니다.
$ oc get cgu lab-upgrade -ojsonpath='{.status.remediationPlan}'출력 예
[["spoke2", "spoke3"]]
TALM 관리자 컨테이너의 오류
- 문제
- TALM의 manager 컨테이너의 로그를 확인하려고 합니다.
- 해결
다음 명령을 실행합니다.
$ oc logs -n openshift-operators \ cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
출력 예
ERROR controller-runtime.manager.controller.clustergroupupgrade Reconciler error {"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1 sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem- 1
- 오류를 표시합니다.
ClusterGroupUpgrade CR이 완료된 후 클러스터는 일부 정책을 준수하지 않습니다.
- 문제
TALM이 모든 클러스터에 대해 수정이 필요한지 여부를 결정하는 데 사용하는 정책 준수 상태입니다. 다음과 같은 이유로 인해 발생할 수 있습니다.
- CGU는 정책을 만들거나 업데이트한 후 너무 빨리 실행되었습니다.
-
정책을 수정하면
ClusterGroupUpgradeCR의 후속 정책 준수에 영향을 미칩니다.
- 해결
-
동일한 사양으로 새
ClusterGroupUpdateCR을 생성하고 적용합니다.
GitOps ZTP 워크플로우의 자동 생성 ClusterGroupUpgrade CR에는 관리 정책이 없습니다.
- 문제
-
클러스터가
Ready가 될 때 관리형 클러스터에 대한 정책이 없는 경우 정책이 없는ClusterGroupUpgradeCR이 자동으로 생성됩니다.ClusterGroupUpgradeCR이 완료되면 관리 클러스터에ztp-done으로 레이블이 지정됩니다.PolicyGenTemplateCR이SiteConfig리소스가 내보낸 후 필요한 시간 내에 Git 리포지토리로 푸시되지 않으면 클러스터가Ready상태가 되면 대상 클러스터에 정책을 사용할 수 없습니다. - 해결
-
적용하려는 정책이 hub 클러스터에서 사용 가능한지 확인한 다음 필요한 정책을 사용하여
ClusterGroupUpgradeCR을 만듭니다.
ClusterGroupUpgrade CR을 수동으로 생성하거나 자동 생성을 다시 트리거할 수 있습니다. ClusterGroupUpgrade CR의 자동 생성을 트리거하려면 클러스터에서 ztp-done 레이블을 제거하고 zip-install 네임스페이스에서 이전에 생성된 빈 ClusterGroupUpgrade CR을 삭제합니다.
사전 캐싱 실패
- 문제
다음 이유 중 하나로 인해 사전 캐싱이 실패할 수 있습니다.
- 노드에 여유 공간이 충분하지 않습니다.
- 연결이 끊긴 환경의 경우 사전 캐시 이미지가 올바르게 미러링되지 않았습니다.
- Pod를 생성할 때 문제가 발생했습니다.
- 해결
공간이 부족하여 사전 캐싱이 실패했는지 확인하려면 노드에서 사전 캐싱 Pod의 로그를 확인합니다.
다음 명령을 사용하여 Pod 이름을 찾습니다.
$ oc get pods -n openshift-talo-pre-cache
다음 명령을 사용하여 로그에서 오류가 충분하지 않은 공간과 관련이 있는지 확인합니다.
$ oc logs -n openshift-talo-pre-cache <pod name>
로그가 없는 경우 다음 명령을 사용하여 Pod 상태를 확인합니다.
$ oc describe pod -n openshift-talo-pre-cache <pod name>
Pod가 없는 경우 작업 상태를 확인하여 다음 명령을 사용하여 Pod를 생성할 수 없는 이유를 확인합니다.
$ oc describe job -n openshift-talo-pre-cache pre-cache
추가 리소스
- 문제 해결에 대한 자세한 내용은 OpenShift Container Platform 문제 해결을 참조하십시오.
- ZTP 워크플로에서 토폴로지 Aware Lifecycle Manager를 사용하는 방법에 대한 자세한 내용은 토폴로지 Aware Lifecycle Manager를 사용하여 관리되는 정책 업데이트를 참조하십시오.
-
PolicyGenTemplateCRD에 대한 자세한 내용은 PolicyGenTemplate CRD정보를 참조하십시오.
14장. 성능 프로파일 작성
Performance Profile Creator(PPC)와 이를 사용하여 성능 프로필을 만드는 방법을 설명합니다.
현재 cgroup v2에서는 CPU 부하 분산을 비활성화하지 않습니다. 따라서 cgroup v2가 활성화된 경우 성능 프로필에서 원하는 동작을 얻지 못할 수 있습니다. performace 프로필을 사용하는 경우 cgroup v2를 활성화하는 것은 권장되지 않습니다.
14.1. 성능 프로파일 작성툴 정보
PPC(Performance Profile Creator)는 성능 프로필을 생성하는 데 사용되는 Node Tuning Operator와 함께 제공되는 명령줄 툴입니다. 이 툴은 클러스터의 must-gather 데이터와 여러 사용자가 제공하는 프로필 인수를 사용합니다. PPC는 하드웨어 및 토폴로지에 적합한 성능 프로필을 생성합니다.
툴은 다음 방법 중 하나로 실행됩니다.
-
podman호출 - 래퍼 스크립트 호출
14.1.1. must-gather 명령을 사용하여 클러스터에 대한 데이터 수집
PPC(Performance Profile creator) 툴에는 must-gather 데이터가 필요합니다. 클러스터 관리자는 must-gather 명령을 실행하여 클러스터에 대한 정보를 캡처합니다.
이전 버전의 OpenShift Container Platform에서 Performance Addon Operator는 애플리케이션에 대한 짧은 대기 시간 성능 튜닝을 제공합니다. OpenShift Container Platform 4.11 이상에서는 이 기능은 Node Tuning Operator의 일부입니다. 그러나 must-gather 명령을 실행할 때 performance-addon-operator-must-gather 이미지를 계속 사용해야 합니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
Performance Addon Operator에 대한 액세스는 이미지를
수집해야 합니다. -
OpenShift CLI(
oc)가 설치되어 있습니다.
절차
선택 사항: 레이블과 일치하는 머신 구성 풀이 있는지 확인합니다.
$ oc describe mcp/worker-rt
출력 예
Name: worker-rt Namespace: Labels: machineconfiguration.openshift.io/role=worker-rt
일치하는 라벨이 없는 경우 MCP 이름과 일치하는 MCP(Machine config pool)의 라벨을 추가합니다.
$ oc label mcp <mcp_name> <mcp_name>=""
-
must-gather데이터를 저장하려는 디렉터리로 이동합니다. 클러스터에서
must-gather를 실행합니다.$ oc adm must-gather --image=<PAO_must_gather_image> --dest-dir=<dir>
참고must-gather명령은performance-addon-operator-must-gather이미지를 사용하여 실행해야 합니다. 출력을 선택적으로 압축할 수 있습니다. Performance Profile Creator 래퍼 스크립트를 실행하는 경우 압축 출력이 필요합니다.예제
$ oc adm must-gather --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.13 --dest-dir=<path_to_must-gather>/must-gather
must-gather디렉터리에서 압축 파일을 만듭니다.$ tar cvaf must-gather.tar.gz must-gather/
14.1.2. podman을 사용하여 Performance Profile Creator 실행
클러스터 관리자는 podman 및 Performance Profile Creator를 실행하여 성능 프로필을 만들 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 클러스터가 베어 메탈 하드웨어에 설치되어 있어야 합니다.
-
podman및 OpenShift CLI(oc)가 설치된 노드가 있습니다. - Node Tuning Operator 이미지에 액세스합니다.
절차
머신 구성 풀을 확인합니다.
$ oc get mcp
출력 예
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-acd1358917e9f98cbdb599aea622d78b True False False 3 3 3 0 22h worker-cnf rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826 False True False 2 1 1 0 22h
Podman을 사용하여
registry.redhat.io에 인증합니다.$ podman login registry.redhat.io
Username: <username> Password: <password>
선택 사항: PPC 툴에 대한 도움말을 표시합니다.
$ podman run --rm --entrypoint performance-profile-creator registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13 -h
출력 예
A tool that automates creation of Performance Profiles Usage: performance-profile-creator [flags] Flags: --disable-ht Disable Hyperthreading -h, --help help for performance-profile-creator --info string Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log") --mcp-name string MCP name corresponding to the target machines (required) --must-gather-dir-path string Must gather directory path (default "must-gather") --offlined-cpu-count int Number of offlined CPUs --power-consumption-mode string The power consumption mode. [Valid values: default, low-latency, ultra-low-latency] (default "default") --profile-name string Name of the performance profile to be created (default "performance") --reserved-cpu-count int Number of reserved CPUs (required) --rt-kernel Enable Real Time Kernel (required) --split-reserved-cpus-across-numa Split the Reserved CPUs across NUMA nodes --topology-manager-policy string Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted") --user-level-networking Run with User level Networking(DPDK) enabled검색 모드에서 Performance Profile Creator 툴을 실행합니다.
참고검색 모드는
must-gather의 출력을 사용하여 클러스터를 검사합니다. 생성된 출력에는 다음에 대한 정보가 포함됩니다.- 할당된 CPU ID로 NUMA 셀 파티셔닝
- 하이퍼스레딩 활성화 여부
이 정보를 사용하여 Performance Profile Creator 툴에 제공된 일부 인수에 대해 적절한 값을 설정할 수 있습니다.
$ podman run --entrypoint performance-profile-creator -v <path_to_must-gather>/must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13 --info log --must-gather-dir-path /must-gather
참고이 명령은 Performance Profile Creator 툴을
podman의 새 진입점으로 사용합니다. 호스트의must-gather데이터를 컨테이너 이미지에 매핑하고 필요한 사용자 제공 프로필 인수를 호출하여my-performance-profile.yaml파일을 생성합니다.-v옵션은 다음 중 하나로 설정할 수 있습니다.-
must-gather출력 디렉터리 -
must-gather압축 해제된 tarball이 포함된 기존 디렉터리
info옵션에는 출력 형식을 지정하는 값이 필요합니다. 가능한 값은 log 및 JSON입니다. JSON 형식은 디버깅을 위해 예약되어 있습니다.podman을 실행합니다.$ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13 --mcp-name=worker-cnf --reserved-cpu-count=4 --rt-kernel=true --split-reserved-cpus-across-numa=false --must-gather-dir-path /must-gather --power-consumption-mode=ultra-low-latency --offlined-cpu-count=6 > my-performance-profile.yaml
참고Performance Profile Creator 인수는 Performance Profile Creator 인수 테이블에 표시됩니다. 다음 인수가 필요합니다.
-
reserved-cpu-count -
mcp-name -
rt-kernel
이 예제의
mcp-name인수는oc get mcp명령의 출력에 따라worker-cnf로 설정됩니다. single-node OpenShift의 경우--mcp-name=master를 사용합니다.-
생성된 YAML 파일을 검토합니다.
$ cat my-performance-profile.yaml
출력 예
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: 2-39,48-79 offlined: 42-47 reserved: 0-1,40-41 machineConfigPoolSelector: machineconfiguration.openshift.io/role: worker-cnf nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true workloadHints: highPowerConsumption: true realTime: true생성된 프로필을 적용합니다.
$ oc apply -f my-performance-profile.yaml
14.1.2.1. podman을 실행하여 성능 프로파일을 만드는 방법
다음 예제에서는 podman을 실행하여 NUMA 노드 간에 분할될 예약된 20개의 CPU가 있는 성능 프로필을 생성하는 방법을 보여줍니다.
노드 하드웨어 구성:
- 80 CPU
- 하이퍼 스레딩 활성화
- 두 개의 NUMA 노드
- 짝수 번호의 CPU는 NUMA 노드 0에서 실행되고 홀수 번호의 CPU는 NUMA 노드 1에서 실행
podman을 실행하여 성능 프로필을 생성합니다.
$ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13 --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true --split-reserved-cpus-across-numa=true --must-gather-dir-path /must-gather > my-performance-profile.yaml
생성된 프로필은 다음 YAML에 설명되어 있습니다.
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
name: performance
spec:
cpu:
isolated: 10-39,50-79
reserved: 0-9,40-49
nodeSelector:
node-role.kubernetes.io/worker-cnf: ""
numa:
topologyPolicy: restricted
realTimeKernel:
enabled: true이 경우 NUMA 노드 0에 CPU 10개가 예약되고 NUMA 노드 1에 CPU 10개가 예약됩니다.
14.1.3. Performance Profile Creator 래퍼 스크립트 실행
성능 프로필 래퍼 스크립트는 PPC(Performance Profile Creator) 툴의 실행을 간소화합니다. podman 실행과 관련된 복잡성을 숨기고 매핑 디렉터리를 지정하면 성능 프로필을 만들 수 있습니다.
사전 요구 사항
- Node Tuning Operator 이미지에 액세스합니다.
-
must-gathertarball에 액세스합니다.
절차
예를 들어 다음과 같이
run-perf-profile-creator.sh라는 이름의 파일을 로컬 시스템에 생성합니다$ vi run-perf-profile-creator.sh
다음 코드를 파일에 붙여넣습니다.
#!/bin/bash readonly CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-podman} readonly CURRENT_SCRIPT=$(basename "$0") readonly CMD="${CONTAINER_RUNTIME} run --entrypoint performance-profile-creator" readonly IMG_EXISTS_CMD="${CONTAINER_RUNTIME} image exists" readonly IMG_PULL_CMD="${CONTAINER_RUNTIME} image pull" readonly MUST_GATHER_VOL="/must-gather" NTO_IMG="registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.13" MG_TARBALL="" DATA_DIR="" usage() { print "Wrapper usage:" print " ${CURRENT_SCRIPT} [-h] [-p image][-t path] -- [performance-profile-creator flags]" print "" print "Options:" print " -h help for ${CURRENT_SCRIPT}" print " -p Node Tuning Operator image" print " -t path to a must-gather tarball" ${IMG_EXISTS_CMD} "${NTO_IMG}" && ${CMD} "${NTO_IMG}" -h } function cleanup { [ -d "${DATA_DIR}" ] && rm -rf "${DATA_DIR}" } trap cleanup EXIT exit_error() { print "error: $*" usage exit 1 } print() { echo "$*" >&2 } check_requirements() { ${IMG_EXISTS_CMD} "${NTO_IMG}" || ${IMG_PULL_CMD} "${NTO_IMG}" || \ exit_error "Node Tuning Operator image not found" [ -n "${MG_TARBALL}" ] || exit_error "Must-gather tarball file path is mandatory" [ -f "${MG_TARBALL}" ] || exit_error "Must-gather tarball file not found" DATA_DIR=$(mktemp -d -t "${CURRENT_SCRIPT}XXXX") || exit_error "Cannot create the data directory" tar -zxf "${MG_TARBALL}" --directory "${DATA_DIR}" || exit_error "Cannot decompress the must-gather tarball" chmod a+rx "${DATA_DIR}" return 0 } main() { while getopts ':hp:t:' OPT; do case "${OPT}" in h) usage exit 0 ;; p) NTO_IMG="${OPTARG}" ;; t) MG_TARBALL="${OPTARG}" ;; ?) exit_error "invalid argument: ${OPTARG}" ;; esac done shift $((OPTIND - 1)) check_requirements || exit 1 ${CMD} -v "${DATA_DIR}:${MUST_GATHER_VOL}:z" "${NTO_IMG}" "$@" --must-gather-dir-path "${MUST_GATHER_VOL}" echo "" 1>&2 } main "$@"이 스크립트에 모든 사용자에 대한 실행 권한을 추가합니다.
$ chmod a+x run-perf-profile-creator.sh
선택 사항:
run-perf-profile-creator.sh명령 사용을 표시합니다.$ ./run-perf-profile-creator.sh -h
예상 출력
Wrapper usage: run-perf-profile-creator.sh [-h] [-p image][-t path] -- [performance-profile-creator flags] Options: -h help for run-perf-profile-creator.sh -p Node Tuning Operator image 1 -t path to a must-gather tarball 2 A tool that automates creation of Performance Profiles Usage: performance-profile-creator [flags] Flags: --disable-ht Disable Hyperthreading -h, --help help for performance-profile-creator --info string Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log") --mcp-name string MCP name corresponding to the target machines (required) --must-gather-dir-path string Must gather directory path (default "must-gather") --offlined-cpu-count int Number of offlined CPUs --power-consumption-mode string The power consumption mode. [Valid values: default, low-latency, ultra-low-latency] (default "default") --profile-name string Name of the performance profile to be created (default "performance") --reserved-cpu-count int Number of reserved CPUs (required) --rt-kernel Enable Real Time Kernel (required) --split-reserved-cpus-across-numa Split the Reserved CPUs across NUMA nodes --topology-manager-policy string Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted") --user-level-networking Run with User level Networking(DPDK) enabled
참고두 가지 유형의 인수가 있습니다.
-
래퍼 인수 즉
-h,-p및-t - PPC 인수
-
래퍼 인수 즉
검색 모드에서 performance profile creator 툴을 실행합니다.
참고검색 모드는
must-gather의 출력을 사용하여 클러스터를 검사합니다. 생성된 출력에는 다음에 대한 정보가 포함됩니다.- 할당된 CPU ID로 NUMA 셀 파티션을 분할
- 하이퍼스레딩 활성화 여부
이 정보를 사용하여 Performance Profile Creator 툴에 제공된 일부 인수에 대해 적절한 값을 설정할 수 있습니다.
$ ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --info=log
참고info옵션에는 출력 형식을 지정하는 값이 필요합니다. 가능한 값은 log 및 JSON입니다. JSON 형식은 디버깅을 위해 예약되어 있습니다.머신 구성 풀을 확인합니다.
$ oc get mcp
출력 예
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-acd1358917e9f98cbdb599aea622d78b True False False 3 3 3 0 22h worker-cnf rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826 False True False 2 1 1 0 22h
성능 프로파일을 생성합니다.
$ ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --mcp-name=worker-cnf --reserved-cpu-count=2 --rt-kernel=true > my-performance-profile.yaml
참고Performance Profile Creator 인수는 Performance Profile Creator 인수 테이블에 표시됩니다. 다음 인수가 필요합니다.
-
reserved-cpu-count -
mcp-name -
rt-kernel
이 예제의
mcp-name인수는oc get mcp명령의 출력에 따라worker-cnf로 설정됩니다. single-node OpenShift의 경우--mcp-name=master를 사용합니다.-
생성된 YAML 파일을 검토합니다.
$ cat my-performance-profile.yaml
출력 예
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: 1-39,41-79 reserved: 0,40 nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: restricted realTimeKernel: enabled: false생성된 프로필을 적용합니다.
참고프로필을 적용하기 전에 Node Tuning Operator를 설치합니다.
$ oc apply -f my-performance-profile.yaml
14.1.4. Performance Profile Creator 인수
표 14.1. Performance Profile Creator 인수
| 인수 | 설명 |
|---|---|
|
| 하이퍼스레딩을 비활성화합니다.
가능한 값:
기본값: 주의
이 인수가 |
|
|
이는 클러스터 정보를 캡처하며 검색 모드에서만 사용됩니다. 검색 모드에서는 가능한 값은 다음과 같습니다.
기본값: |
|
|
대상 머신에 해당하는 MCP 이름 (예: |
|
| 디렉터리 경로를 수집해야 합니다. 이 매개 변수는 필수입니다.
사용자가 래퍼 스크립트 |
|
| 오프라인 CPU 수입니다. 참고 이 값은 0보다 큰 자연수여야 합니다. 논리 프로세서가 충분하지 않으면 오류 메시지가 기록됩니다. 메시지는 다음과 같습니다. Error: failed to compute the reserved and isolated CPUs: please ensure that reserved-cpu-count plus offlined-cpu-count should be in the range [0,1] Error: failed to compute the reserved and isolated CPUs: please specify the offlined CPU count in the range [0,1] |
|
| 전력 소비 모드입니다. 가능한 값은 다음과 같습니다.
기본값: |
|
|
Pod별 전원 관리를 활성화합니다.
가능한 값:
기본값: |
|
|
생성할 성능 프로파일의 이름입니다. 기본값: |
|
| 예약된 CPU 수입니다. 이 매개 변수는 필수입니다. 참고 이것은 자연수여야 합니다. 0 값은 허용되지 않습니다. |
|
| 실시간 커널을 활성화합니다. 이 매개 변수는 필수입니다.
가능한 값: |
|
| NUMA 노드에서 예약된 CPU를 분할합니다.
가능한 값:
기본값: |
|
| 생성할 성능 프로필의 Kubelet Topology Manager 정책입니다. 가능한 값은 다음과 같습니다.
기본값: |
|
| DPDK(사용자 수준 네트워킹)가 활성화된 상태에서 실행합니다.
가능한 값:
기본값: |
14.2. 참조 성능 프로필
14.2.1. OpenStack에서 OVS-DPDK를 사용하는 클러스터의 성능 프로필 템플릿
RHOSP(Red Hat OpenStack Platform)에서 OVS-DPDK(Data Plane Development Kit)를 사용하여 Open vSwitch를 사용하는 클러스터의 머신 성능을 최대화하려면 성능 프로필을 사용할 수 있습니다.
다음 성능 프로필 템플릿을 사용하여 배포에 사용할 프로필을 생성할 수 있습니다.
OVS-DPDK를 사용하는 클러스터의 성능 프로필 템플릿
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
name: cnf-performanceprofile
spec:
additionalKernelArgs:
- nmi_watchdog=0
- audit=0
- mce=off
- processor.max_cstate=1
- idle=poll
- intel_idle.max_cstate=0
- default_hugepagesz=1GB
- hugepagesz=1G
- intel_iommu=on
cpu:
isolated: <CPU_ISOLATED>
reserved: <CPU_RESERVED>
hugepages:
defaultHugepagesSize: 1G
pages:
- count: <HUGEPAGES_COUNT>
node: 0
size: 1G
nodeSelector:
node-role.kubernetes.io/worker: ''
realTimeKernel:
enabled: false
globallyDisableIrqLoadBalancing: true
CPU_ISOLATED,CPU_RESERVED, HUGEPAGES_COUNT 키에 대한 구성에 적합한 값을 삽입합니다.
성능 프로필을 생성하고 사용하는 방법에 대한 자세한 내용은 OpenShift Container Platform 설명서의 "성확성 및 성능" 섹션의 "성능 프로필 생성" 페이지를 참조하십시오.
14.3. 추가 리소스
-
must-gather툴에 대한 자세한 내용은 클러스터에 대한 데이터 수집을 참조하십시오.
15장. 워크로드 파티셔닝
워크로드 파티션은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
리소스가 제한된 환경에서는 워크로드 파티셔닝을 사용하여 OpenShift Container Platform 서비스, 클러스터 관리 워크로드 및 인프라 Pod를 분리하여 예약된 CPU 세트에서 실행할 수 있습니다.
클러스터 관리에 필요한 예약된 CPU의 최소 수는 4개의 CPU HT(Hyper-Threads)입니다. 워크로드 파티셔닝을 사용하면 클러스터 관리 Pod 세트와 클러스터 관리 워크로드 파티션에 포함하기 위한 일반적인 애드온 Operator 세트에 주석을 답니다. 이러한 Pod는 일반적으로 최소 크기 CPU 구성 내에서 작동합니다. 최소 클러스터 관리 Pod 세트 이외의 추가 Operator 또는 워크로드에 추가 CPU를 워크로드 파티션에 추가해야 합니다.
워크로드 파티셔닝은 표준 Kubernetes 스케줄링 기능을 사용하여 사용자 워크로드를 플랫폼 워크로드에서 격리합니다.
워크로드 파티셔닝에는 다음 변경이 필요합니다.
install-config.yaml파일에서 추가 필드cpu>-<ingMode를추가합니다.apiVersion: v1 baseDomain: devcluster.openshift.com cpuPartitioningMode: AllNodes 1 compute: - architecture: amd64 hyperthreading: Enabled name: worker platform: {} replicas: 3 controlPlane: architecture: amd64 hyperthreading: Enabled name: master platform: {} replicas: 3- 1
- 설치 시 CPU 파티셔닝을 위한 클러스터를 설정합니다. 기본값은
None입니다.
참고워크로드 파티션은 클러스터 설치 중에만 활성화할 수 있습니다. 설치 후 워크로드 파티셔닝을 비활성화할 수 없습니다.
성능 프로필에서
분리및예약된CPU를 지정합니다.apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: openshift-node-workload-partitioning-worker spec: cpu: isolated: 0,1 1 reserved: "2-3" 2 machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/worker: "" nodeSelector: node-role.kubernetes.io/worker: ""
워크로드 파티셔닝에서는 플랫폼 Pod에 대한 확장된 management.workload.openshift.io/cores 리소스 유형이 도입되었습니다. kubelet은 해당 리소스 내의 풀에 할당된 Pod의 리소스 및 CPU 요청을 알립니다. 워크로드 파티셔닝이 활성화되면 management.workload.openshift.io/cores 리소스를 사용하면 스케줄러에서 기본 cpuset 뿐만 아니라 호스트의 cpushares 용량에 따라 Pod를 올바르게 할당할 수 있습니다.
추가 리소스
- 단일 노드 OpenShift 클러스터에 권장되는 워크로드 파티션 구성은 워크로드 파티셔닝 을 참조하십시오.
16장. Node Observability Operator를 사용하여 CRI-O 및 Kubelet 프로파일링 데이터 요청
Node Observability Operator는 작업자 노드의 CRI-O 및 Kubelet 프로파일링 데이터를 수집하고 저장합니다. 프로파일링 데이터를 쿼리하여 CRI-O 및 Kubelet 성능 추세를 분석하고 성능 관련 문제를 디버깅할 수 있습니다.
Node Observability Operator는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
16.1. Node Observability Operator의 워크플로
다음 워크플로에서는 Node Observability Operator를 사용하여 프로파일링 데이터를 쿼리하는 방법을 간략하게 설명합니다.
- OpenShift Container Platform 클러스터에 Node Observability Operator를 설치합니다.
- NodeObservability 사용자 정의 리소스를 생성하여 선택한 작업자 노드에서 CRI-O 프로파일링을 활성화합니다.
- 프로파일링 쿼리를 실행하여 프로파일링 데이터를 생성합니다.
16.2. Node Observability Operator 설치
Node Observability Operator는 기본적으로 OpenShift Container Platform에 설치되지 않습니다. OpenShift Container Platform CLI 또는 웹 콘솔을 사용하여 Node Observability Operator를 설치할 수 있습니다.
16.2.1. CLI를 사용하여 Node Observability Operator 설치
OpenShift CLI(oc)를 사용하여 Node Observability Operator를 설치할 수 있습니다.
사전 요구 사항
- OpenShift CLI(oc)가 설치되어 있습니다.
-
cluster-admin권한이 있는 클러스터에 액세스할 수 있습니다.
절차
다음 명령을 실행하여 Node Observability Operator를 사용할 수 있는지 확인합니다.
$ oc get packagemanifests -n openshift-marketplace node-observability-operator
출력 예
NAME CATALOG AGE node-observability-operator Red Hat Operators 9h
다음 명령을 실행하여
node-observability-operator네임스페이스를 생성합니다.$ oc new-project node-observability-operator
OperatorGroup오브젝트 YAML 파일을 생성합니다.cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: node-observability-operator namespace: node-observability-operator spec: targetNamespaces: [] EOF
Subscription오브젝트 YAML 파일을 생성하여 Operator에 네임스페이스를 등록합니다.cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: node-observability-operator namespace: node-observability-operator spec: channel: alpha name: node-observability-operator source: redhat-operators sourceNamespace: openshift-marketplace EOF
검증
다음 명령을 실행하여 설치 계획 이름을 확인합니다.
$ oc -n node-observability-operator get sub node-observability-operator -o yaml | yq '.status.installplan.name'
출력 예
install-dt54w
다음 명령을 실행하여 설치 계획 상태를 확인합니다.
$ oc -n node-observability-operator get ip <install_plan_name> -o yaml | yq '.status.phase'
<install_plan_name>은 이전 명령의 출력에서 얻은 설치 계획 이름입니다.출력 예
COMPLETE
Node Observability Operator가 실행 중인지 확인합니다.
$ oc get deploy -n node-observability-operator
출력 예
NAME READY UP-TO-DATE AVAILABLE AGE node-observability-operator-controller-manager 1/1 1 1 40h
16.2.2. 웹 콘솔을 사용하여 Node Observability Operator 설치
OpenShift Container Platform 웹 콘솔에서 Node Observability Operator를 설치할 수 있습니다.
사전 요구 사항
-
cluster-admin권한이 있는 클러스터에 액세스할 수 있습니다. - OpenShift Container Platform 웹 콘솔에 액세스할 수 있습니다.
절차
- OpenShift Container Platform 웹 콘솔에 로그인합니다.
- 관리자 탐색 패널에서 Operator → OperatorHub 를 확장합니다.
- All items 필드에 Node Observability Operator 를 입력하고 Node Observability Operator 타일을 선택합니다.
- 설치를 클릭합니다.
Operator 설치 페이지에서 다음 설정을 구성합니다.
- 업데이트 채널 영역에서 알파 를 클릭합니다.
- 설치 모드 영역에서 클러스터의 특정 네임스페이스를 클릭합니다.
- Installed Namespace 목록에서 목록에서 node-observability-operator 를 선택합니다.
- 업데이트 승인 영역에서 자동 을 선택합니다.
- 설치를 클릭합니다.
검증
- 관리자 탐색 패널에서 Operator → 설치된 Operator 를 확장합니다.
- Node Observability Operator가 Operator 목록에 나열되어 있는지 확인합니다.
16.3. 노드 Observability 사용자 정의 리소스 생성
프로파일링 쿼리를 실행하기 전에 NodeObservability CR(사용자 정의 리소스)을 생성하고 실행해야 합니다. NodeObservability CR을 실행하면 필요한 머신 구성 및 머신 구성 풀 CR을 생성하여 nodeSelector 와 일치하는 작업자 노드에서 CRI-O 프로파일링을 활성화합니다.
작업자 노드에서 CRI-O 프로파일링이 활성화되지 않으면 NodeObservabilityMachineConfig 리소스가 생성됩니다. NodeObservability CR에 지정된 nodeSelector 와 일치하는 작업자 노드가 다시 시작됩니다. 이 작업을 완료하는 데 10분 이상 걸릴 수 있습니다.
kubelet 프로파일은 기본적으로 활성화되어 있습니다.
노드의 CRI-O unix 소켓은 에이전트 Pod에 마운트되므로 에이전트가 CRI-O와 통신하여 pprof 요청을 실행할 수 있습니다. 마찬가지로 kubelet-serving-ca 인증서 체인은 에이전트 Pod에 마운트되어 에이전트와 노드의 kubelet 끝점 간 보안 통신을 허용합니다.
사전 요구 사항
- Node Observability Operator가 설치되어 있습니다.
- OpenShift CLI(oc)가 설치되어 있습니다.
-
cluster-admin권한이 있는 클러스터에 액세스할 수 있습니다.
절차
다음 명령을 실행하여 OpenShift Container Platform CLI에 로그인합니다.
$ oc login -u kubeadmin https://<HOSTNAME>:6443
다음 명령을 실행하여
node-observability-operator네임스페이스로 다시 전환합니다.$ oc project node-observability-operator
다음 텍스트가 포함된
nodeobservability.yaml이라는 CR 파일을 생성합니다.apiVersion: nodeobservability.olm.openshift.io/v1alpha2 kind: NodeObservability metadata: name: cluster 1 spec: nodeSelector: kubernetes.io/hostname: <node_hostname> 2 type: crio-kubeletNodeObservabilityCR을 실행합니다.oc apply -f nodeobservability.yaml
출력 예
nodeobservability.olm.openshift.io/cluster created
다음 명령을 실행하여
NodeObservabilityCR의 상태를 검토합니다.$ oc get nob/cluster -o yaml | yq '.status.conditions'
출력 예
conditions: conditions: - lastTransitionTime: "2022-07-05T07:33:54Z" message: 'DaemonSet node-observability-ds ready: true NodeObservabilityMachineConfig ready: true' reason: Ready status: "True" type: ReadyNodeObservabilityCR 실행이Ready이고 상태가True인 경우 완료됩니다.
16.4. 프로파일링 쿼리 실행
프로파일링 쿼리를 실행하려면 NodeObservabilityRun 리소스를 생성해야 합니다. 프로파일링 쿼리는 30초 동안 CRI-O 및 Kubelet 프로파일링 데이터를 가져오는 차단 작업입니다. 프로파일링 쿼리가 완료되면 컨테이너 파일 시스템 /run/node-observability 디렉터리 내에서 프로파일링 데이터를 검색해야 합니다. 데이터의 수명은 emptyDir 볼륨을 통해 에이전트 Pod에 바인딩되므로 에이전트 Pod가 running 상태인 동안 프로파일링 데이터에 액세스할 수 있습니다.
언제든지 프로파일링 쿼리 하나만 요청할 수 있습니다.
사전 요구 사항
- Node Observability Operator가 설치되어 있습니다.
-
NodeObservabilityCR(사용자 정의 리소스)을 생성했습니다. -
cluster-admin권한이 있는 클러스터에 액세스할 수 있습니다.
절차
다음 텍스트가 포함된
nodeobservabilityrun.yaml이라는NodeObservabilityRun리소스 파일을 생성합니다.apiVersion: nodeobservability.olm.openshift.io/v1alpha2 kind: NodeObservabilityRun metadata: name: nodeobservabilityrun spec: nodeObservabilityRef: name: clusterNodeObservabilityRun리소스를 실행하여 프로파일링 쿼리를 트리거합니다.$ oc apply -f nodeobservabilityrun.yaml
다음 명령을 실행하여
NodeObservabilityRun의 상태를 검토합니다.$ oc get nodeobservabilityrun nodeobservabilityrun -o yaml | yq '.status.conditions'
출력 예
conditions: - lastTransitionTime: "2022-07-07T14:57:34Z" message: Ready to start profiling reason: Ready status: "True" type: Ready - lastTransitionTime: "2022-07-07T14:58:10Z" message: Profiling query done reason: Finished status: "True" type: Finished
상태가
True이고 type이Finished이면 프로파일링 쿼리가 완료됩니다.다음 bash 스크립트를 실행하여 컨테이너의
/run/node-observability경로에서 프로파일링 데이터를 검색합니다.for a in $(oc get nodeobservabilityrun nodeobservabilityrun -o yaml | yq .status.agents[].name); do echo "agent ${a}" mkdir -p "/tmp/${a}" for p in $(oc exec "${a}" -c node-observability-agent -- bash -c "ls /run/node-observability/*.pprof"); do f="$(basename ${p})" echo "copying ${f} to /tmp/${a}/${f}" oc exec "${a}" -c node-observability-agent -- cat "${p}" > "/tmp/${a}/${f}" done done
17장. 네트워크 엣지의 클러스터
17.1. 네트워크 엣지의 문제
엣지 컴퓨팅은 지리적으로 교체된 위치에서 많은 사이트를 관리할 때 복잡한 문제를 초래합니다. GitOps Zero ScanSetting Provisioning (ZTP)을 사용하여 네트워크의 맨 에지에서 사이트를 프로비저닝하고 관리합니다.
17.1.1. 네트워크 엣지의 문제 해결
현재 서비스 제공업체는 네트워크 엣지에 인프라를 배포하려고 합니다. 여기에는 중요한 문제가 있습니다.
- 여러 엣지 사이트의 배포를 병렬로 처리하려면 어떻게 해야 합니까?
- 연결이 끊긴 환경에서 사이트를 배포해야 하는 경우 어떻게 됩니까?
- 대규모 클러스터의 라이프사이클을 어떻게 관리합니까?
GTP(ZTP) 및 GitOps 는 베어 메탈 장치에 대한 선언적 사이트 정의 및 구성으로 대규모로 원격 에지 사이트를 프로비저닝할 수 있도록 하여 이러한 문제를 해결합니다. 템플릿 또는 오버레이 구성에서는 CNF 워크로드에 필요한 OpenShift Container Platform 기능을 설치합니다. 설치 및 업그레이드의 전체 라이프사이클은 GitOps ZTP 파이프라인을 통해 처리됩니다.
GitOps ZTP는 인프라 배포에 GitOps를 사용합니다. GitOps에서는 Git 리포지토리에 저장된 선언적 YAML 파일 및 기타 정의된 패턴을 사용합니다. RHACM(Red Hat Advanced Cluster Management)은 Git 리포지토리를 사용하여 인프라 배포를 구동합니다.
GitOps는 추적 기능, RBAC(역할 기반 액세스 제어) 및 각 사이트의 원하는 상태에 대해 단일 정보 소스를 제공합니다. 확장성 문제는 웹 후크를 통해 Git 수행 및 이벤트 기반 작업에 의해 해결됩니다.
GitOps ZTP 파이프라인에서 에지 노드에 제공하는 선언적 사이트 정의 및 구성 CR(사용자 정의 리소스)을 생성하여 GitOps ZTP 워크플로를 시작합니다.
다음 다이어그램은 GitOps ZTP가 원거리 프레임워크 내에서 작동하는 방법을 보여줍니다.

17.1.2. GitOps ZTP를 사용하여 멀리 있는 엣지 네트워크에서 클러스터 프로비저닝
RHACM(Red Hat Advanced Cluster Management)은 단일 허브 클러스터가 많은 스포크 클러스터를 관리하는 허브 및 스포크 아키텍처의 클러스터를 관리합니다. RHACM을 실행하는 Hub 클러스터가 GitOps ZTP(ZTP) 및 RHACM을 설치할 때 배포되는 지원 서비스를 사용하여 관리 클러스터를 프로비저닝하고 배포합니다.
지원 서비스는 단일 노드 클러스터, 3 노드 클러스터 또는 베어 메탈에서 실행되는 표준 클러스터에서 OpenShift Container Platform 프로비저닝을 처리합니다.
GitOps ZTP를 사용하여 OpenShift Container Platform으로 베어 메탈 호스트를 프로비저닝 및 유지 관리하는 방법에 대한 고급 개요는 다음과 같습니다.
- RHACM을 실행하는 허브 클러스터는 OpenShift Container Platform 릴리스 이미지를 미러링하는 OpenShift 이미지 레지스트리를 관리합니다. RHACM은 OpenShift 이미지 레지스트리를 사용하여 관리 클러스터를 프로비저닝합니다.
- Git 리포지토리에 버전이 지정된 YAML 형식 인벤토리 파일에서 베어 메탈 호스트를 관리합니다.
- 호스트를 관리형 클러스터로 프로비저닝할 준비가 되어 있고 RHACM 및 지원 서비스를 사용하여 사이트에 베어 메탈 호스트를 설치할 수 있습니다.
클러스터 설치 및 배포는 초기 설치 단계 및 후속 구성 단계를 포함하는 2단계 프로세스입니다. 다음 다이어그램은 이 워크플로를 보여줍니다.

17.1.3. siteConfig 리소스 및 RHACM을 사용하여 관리형 클러스터 설치
GTP(SITOP Zero ScanSetting Provisioning)는 Git 리포지토리의 SiteConfig 사용자 정의 리소스(CR)를 사용하여 OpenShift Container Platform 클러스터를 설치하는 프로세스를 관리합니다. site Config CR에는 설치에 필요한 클러스터별 매개변수가 포함되어 있습니다. 사용자 정의 추가 매니페스트를 포함하여 설치 중에 선택한 구성 CR을 적용하는 옵션이 있습니다.
GitOps ZTP 플러그인은 SiteConfig CR을 처리하여 hub 클러스터에서 CR 컬렉션을 생성합니다. 이로 인해 RHACM(Red Hat Advanced Cluster Management)의 지원 서비스가 트리거되어 베어 메탈 호스트에 OpenShift Container Platform을 설치합니다. hub 클러스터의 이러한 CR에서 설치 상태 및 오류 메시지를 확인할 수 있습니다.
단일 클러스터를 수동으로 프로비저닝하거나 GitOps ZTP를 사용하여 일괄적으로 프로비저닝할 수 있습니다.
- 단일 클러스터 프로비저닝
-
클러스터에 대한 단일
SiteConfigCR 및 관련 설치 및 구성 CR을 생성하고 이를 hub 클러스터에 적용하여 클러스터 프로비저닝을 시작합니다. 이는 대규모에 배포하기 전에 CR을 테스트하는 좋은 방법입니다. - 여러 클러스터 프로비저닝
-
Git 리포지토리에서 site
Config 및 관련 CR을 정의하여 최대 400개로 관리되는 클러스터를 설치합니다. ArgoCD는 siteConfigCR을 사용하여 사이트를 배포합니다. RHACM 정책 생성기는 매니페스트를 생성하여 hub 클러스터에 적용합니다. 이렇게 하면 클러스터 프로비저닝 프로세스가 시작됩니다.
17.1.4. 정책 및 PolicyGenTemplate 리소스를 사용하여 관리형 클러스터 구성
GTP(Exhress ZeroForwarded Provisioning)는 RHACM(Advanced Cluster Management)을 사용하여 구성 적용에 정책 기반 거버넌스 접근 방식을 사용하여 클러스터를 구성합니다.
정책 생성기 또는 PolicyGen 은 간결한 템플릿에서 RHACM 정책을 생성할 수 있는 GitOps Operator의 플러그인입니다. 이 툴은 여러 CR을 단일 정책으로 결합할 수 있으며, 함대에 있는 클러스터의 다양한 하위 집합에 적용되는 여러 정책을 생성할 수 있습니다.
확장성 및 클러스터 전체에서 구성 관리의 복잡성을 줄이기 위해 가능한 한 공통성으로 구성 CR을 사용하십시오.
- 가능한 경우 전체 공통 정책을 사용하여 구성 CR을 적용합니다.
- 다음 기본 설정은 그룹 정책에서 가능한 한 많은 나머지 구성을 관리할 클러스터의 논리 그룹을 생성하는 것입니다.
- 구성이 개별 사이트에 고유한 경우 hub 클러스터에서 RHACM 템플릿 정보를 사용하여 사이트별 데이터를 공통 또는 그룹 정책에 삽입합니다. 또는 사이트에 개별 사이트 정책을 적용합니다.
다음 다이어그램에서는 클러스터 배포의 구성 단계에서 정책 생성기가 GitOps 및 RHACM과 상호 작용하는 방법을 보여줍니다.

대규모 클러스터의 경우 일반적으로 클러스터 구성에 높은 수준의 일관성이 있어야 합니다.
다음 권장 정책 구조는 구성 CR을 결합하여 몇 가지 목표를 달성합니다.
- 공통 구성을 한 번 설명하고 함대에 적용합니다.
- 유지 관리 및 관리되는 정책의 수를 최소화합니다.
- 클러스터 변형을 위한 공통 구성의 유연성을 지원합니다.
표 17.1. 권장 PolicyGenTemplate 정책 카테고리
| 정책 카테고리 | 설명 |
|---|---|
| Common |
공통 카테고리에 존재하는 정책은 함의 모든 클러스터에 적용됩니다. Common |
| 그룹 |
그룹 카테고리에 존재하는 정책이 함의 클러스터 그룹에 적용됩니다. 그룹 |
| 사이트 | sites 카테고리에 존재하는 정책은 특정 클러스터 사이트에 적용됩니다. 모든 클러스터는 자체 특정 정책을 유지할 수 있습니다. |
추가 리소스
-
ztp-site-generate컨테이너 이미지에서 참조 siteConfig및PolicyGenTemplateCR을 추출하는 방법에 대한 자세한 내용은 ZTP Git 리포지토리 준비를 참조하십시오.
17.2. ZTP용 hub 클러스터 준비
연결이 끊긴 환경에서 RHACM을 사용하려면 필요한 Operator 이미지가 포함된 OpenShift Container Platform 릴리스 이미지 및 OLM(Operator Lifecycle Manager) 카탈로그를 미러링하는 미러 레지스트리를 생성합니다. OLM은 클러스터에서 Operator 및 해당 종속 항목을 관리, 설치 및 업그레이드합니다. 연결이 끊긴 미러 호스트를 사용하여 베어 메탈 호스트를 프로비저닝하는 데 사용되는 RHCOS ISO 및 RootFS 디스크 이미지를 제공할 수도 있습니다.
17.2.1. telco RAN 4.13 검증 솔루션 소프트웨어 버전
Red Hat Telco radio Access Network (RAN) 버전 4.13 솔루션은 다음 Red Hat 소프트웨어 제품을 사용하여 검증되었습니다.
표 17.2. telco RAN 4.13 검증 솔루션 소프트웨어
| 제품 | 소프트웨어 버전 |
|---|---|
| Hub 클러스터 OpenShift Container Platform 버전 | 4.13 |
| GitOps ZTP plugin | 4.11, 4.12 또는 4.13 |
| Red Hat Advanced Cluster Management (RHACM) | 2.7 |
| Red Hat OpenShift GitOps | 1.6 |
| 토폴로지 Aware Lifecycle Manager (TALM) | 4.11, 4.12 또는 4.13 |
17.2.2. 연결이 끊긴 환경에서 GitOps ZTP 설치
연결이 끊긴 환경의 허브 클러스터에서 RHACM (RHACM), Red Hat OpenShift GitOps 및 Topology Aware Lifecycle Manager (TALM)를 사용하여 여러 관리 클러스터의 배포를 관리합니다.
사전 요구 사항
-
OpenShift Container Platform CLI(
oc)를 설치했습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. 클러스터에서 사용할 연결이 끊긴 미러 레지스트리를 구성했습니다.
참고생성한 연결이 끊긴 미러 레지스트리에는 허브 클러스터에서 실행되는 TALM 버전과 일치하는 TALM 백업 버전 및 사전 캐시 이미지가 포함되어야 합니다. 스포크 클러스터는 연결이 끊긴 미러 레지스트리에서 이러한 이미지를 해결할 수 있어야 합니다.
절차
- hub 클러스터에 RHACM을 설치합니다. 연결이 끊긴 환경에서 RHACM 설치를 참조하십시오.
- hub 클러스터에 GitOps 및 TALM을 설치합니다.
17.2.3. 연결이 끊긴 미러 호스트에 RHCOS ISO 및 RootFS 이미지 추가
RHACM(Red Hat Advanced Cluster Management)을 사용하여 연결이 끊긴 환경에서 클러스터를 설치하기 전에 먼저 사용할 RHCOS(Red Hat Enterprise Linux CoreOS) 이미지를 호스팅해야 합니다. 연결이 끊긴 미러를 사용하여 RHCOS 이미지를 호스팅합니다.
사전 요구 사항
- 네트워크에서 RHCOS 이미지 리소스를 호스팅하도록 HTTP 서버를 배포하고 구성합니다. 사용자 컴퓨터에서 HTTP 서버에 액세스할 수 있어야 하며 사용자가 생성한 시스템에서 HTTP 서버에 액세스할 수 있어야 합니다.
RHCOS 이미지는 OpenShift Container Platform 릴리스에 따라 변경되지 않을 수 있습니다. 설치하는 버전과 같거나 그 이하의 버전 중 가장 높은 버전의 이미지를 다운로드해야 합니다. 사용 가능한 경우 OpenShift Container Platform 버전과 일치하는 이미지 버전을 사용합니다. 호스트에 RHCOS를 설치하려면 ISO 및 RootFS 이미지가 필요합니다. 이 설치 유형에서는 RHCOS QCOW2 이미지가 지원되지 않습니다.
절차
- 미러 호스트에 로그인합니다.
mirror.openshift.com 에서 RHCOS ISO 및 RootFS 이미지를 가져옵니다. 예를 들면 다음과 같습니다.
필요한 이미지 이름 및 OpenShift Container Platform 버전을 환경 변수로 내보냅니다.
$ export ISO_IMAGE_NAME=<iso_image_name> 1$ export ROOTFS_IMAGE_NAME=<rootfs_image_name> 1$ export OCP_VERSION=<ocp_version> 1필요한 이미지를 다운로드합니다.
$ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.13/${OCP_VERSION}/${ISO_IMAGE_NAME} -O /var/www/html/${ISO_IMAGE_NAME}$ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.13/${OCP_VERSION}/${ROOTFS_IMAGE_NAME} -O /var/www/html/${ROOTFS_IMAGE_NAME}
검증 단계
다운로드되고 있고 연결이 끊긴 미러 호스트에서 이미지가 제공되는지 확인합니다. 예를 들면 다음과 같습니다.
$ wget http://$(hostname)/${ISO_IMAGE_NAME}출력 예
Saving to: rhcos-4.13.1-x86_64-live.x86_64.iso rhcos-4.13.1-x86_64-live.x86_64.iso- 11%[====> ] 10.01M 4.71MB/s
추가 리소스
17.2.4. hub 클러스터에서 지원 서비스 활성화 및 AgentServiceConfig 업데이트
RHACM(Red Hat Advanced Cluster Management)은 지원 서비스를 사용하여 OpenShift Container Platform 클러스터를 배포합니다. 지원 서비스는 CIM( Central Infrastructure Management)을 사용하여 MultiClusterHub Operator를 활성화하면 자동으로 배포됩니다. hub 클러스터에서 CIM을 활성화하면 미러 레지스트리 HTTP 서버에서 호스팅되는 ISO 및 RootFS 이미지에 대한 참조로 AgentServiceConfig CR(사용자 정의 리소스)을 업데이트해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - hub 클러스터에서 지원 서비스를 활성화했습니다. 자세한 내용은 중앙 인프라 관리 서비스 활성화를 참조하십시오.
절차
다음 명령을 실행하여
AgentServiceConfigCR을 업데이트합니다.$ oc edit AgentServiceConfig
CR의
items.spec.osImages필드에 다음 항목을 추가합니다.- cpuArchitecture: x86_64 openshiftVersion: "4.13" rootFSUrl: https://<host>/<path>/rhcos-live-rootfs.x86_64.img url: https://<mirror-registry>/<path>/rhcos-live.x86_64.iso다음과 같습니다.
- <host>
- 대상 미러 레지스트리 HTTP 서버의 FQDN(정규화된 도메인 이름)입니다.
- <path>
- 대상 미러 레지스트리의 이미지 경로입니다.
편집기를 저장하고 종료하여 변경 사항을 적용합니다.
17.2.5. 연결이 끊긴 미러 레지스트리를 사용하도록 hub 클러스터 구성
연결이 끊긴 환경에 연결이 끊긴 미러 레지스트리를 사용하도록 hub 클러스터를 구성할 수 있습니다.
사전 요구 사항
- RHACM(Red Hat Advanced Cluster Management) 2.8이 설치된 연결이 끊긴 허브 클러스터 설치가 있어야 합니다.
-
HTTP 서버에
rootfs및iso이미지를 호스팅했습니다.
HTTP 서버에 대해 TLS를 활성화하는 경우 루트 인증서가 클라이언트가 신뢰하는 기관에서 서명한지 확인하고 OpenShift Container Platform 허브와 관리형 클러스터와 HTTP 서버 간의 신뢰할 수 있는 인증서 체인을 확인해야 합니다. 신뢰할 수 없는 인증서로 구성된 서버를 사용하면 이미지가 이미지 생성 서비스에 다운로드되지 않습니다. 신뢰할 수 없는 HTTPS 서버 사용은 지원되지 않습니다.
절차
미러 레지스트리 구성이 포함된
ConfigMap을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: assisted-installer-config-map namespace: "<infrastructure_operator_namespace>" 1 labels: app: assisted-service data: ca-bundle.crt: | 2 -----BEGIN CERTIFICATE----- <certificate_contents> -----END CERTIFICATE----- registries.conf: | 3 unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] prefix = "" location = "quay.io/example-repository" 4 mirror-by-digest-only = true [[registry.mirror]] location = "mirror1.registry.corp.com:5000/example-repository" 5
- 1
ConfigMap네임스페이스는 Infrastructure Operator의 네임스페이스와 동일해야 합니다.- 2
- 미러 레지스트리를 생성할 때 사용되는 미러 레지스트리의 인증서입니다.
- 3
- 미러 레지스트리의 구성 파일입니다. 미러 레지스트리 구성은 검색 이미지의
/etc/containers/registries.conf파일에 미러 정보를 추가합니다. 미러 정보는 정보가 설치 프로그램에 전달될 때install-config.yaml파일의imageContentSources섹션에 저장됩니다. hub 클러스터에서 실행되는 지원 서비스 Pod는 구성된 미러 레지스트리에서 컨테이너 이미지를 가져옵니다. - 4
- 미러 레지스트리의 URL입니다. 미러 레지스트리를 구성할 때
oc adm release mirror명령을 실행하여imageContentSources섹션의 URL을 사용해야 합니다. 자세한 내용은 OpenShift Container Platform 이미지 저장소 미러링 섹션을 참조하십시오. - 5
registries.conf파일에 정의된 레지스트리는 레지스트리가 아닌 리포지터리로 범위를 지정해야 합니다. 이 예에서quay.io/example-repository및mirror1.registry.corp.com:5000/example-repository리포지토리의 범위는example-repository리포지토리로 지정됩니다.
그러면 다음과 같이
AgentServiceConfig사용자 지정 리소스에서mirrorRegistryRef가 업데이트됩니다.출력 예
apiVersion: agent-install.openshift.io/v1beta1 kind: AgentServiceConfig metadata: name: agent spec: databaseStorage: volumeName: <db_pv_name> accessModes: - ReadWriteOnce resources: requests: storage: <db_storage_size> filesystemStorage: volumeName: <fs_pv_name> accessModes: - ReadWriteOnce resources: requests: storage: <fs_storage_size> mirrorRegistryRef: name: 'assisted-installer-mirror-config' osImages: - openshiftVersion: <ocp_version> url: <iso_url> 1- 1
- HTTPD 서버의 URL과 일치해야 합니다.
클러스터 설치 중에 유효한 NTP 서버가 필요합니다. 적절한 NTP 서버를 사용할 수 있으며, 연결이 끊긴 네트워크를 통해 설치된 클러스터에서 연결할 수 있는지 확인합니다.
17.2.6. 인증되지 않은 레지스트리를 사용하도록 hub 클러스터 구성
인증되지 않은 레지스트리를 사용하도록 hub 클러스터를 구성할 수 있습니다. 인증되지 않은 레지스트리는 이미지에 액세스하여 다운로드하는 데 인증이 필요하지 않습니다.
사전 요구 사항
- hub 클러스터를 설치 및 구성하고 hub 클러스터에 RHACM(Red Hat Advanced Cluster Management)을 설치했습니다.
- OpenShift Container Platform CLI(oc)가 설치되어 있습니다.
-
cluster-admin권한이 있는 사용자로 로그인했습니다. - hub 클러스터에서 사용할 인증되지 않은 레지스트리를 구성했습니다.
절차
다음 명령을 실행하여
AgentServiceConfigCR(사용자 정의 리소스)을 업데이트합니다.$ oc edit AgentServiceConfig agent
CR에
unauthenticatedRegistries필드를 추가합니다.apiVersion: agent-install.openshift.io/v1beta1 kind: AgentServiceConfig metadata: name: agent spec: unauthenticatedRegistries: - example.registry.com - example.registry2.com ...
인증되지 않은 레지스트리는
AgentServiceConfig리소스의spec.unauthenticatedRegistries에 나열됩니다. 이 목록의 레지스트리는 설명된 클러스터 설치에 사용된 풀 시크릿에 항목이 필요하지 않습니다.assisted-service는 설치에 사용되는 모든 이미지 레지스트리에 대한 인증 정보가 포함되어 있는지 확인하여 풀 시크릿을 검증합니다.
미러 레지스트리는 무시 목록에 자동으로 추가되며 spec.unauthenticatedRegistries 에서 추가할 필요가 없습니다. ConfigMap 에서 PUBLIC_CONTAINER_REGISTRIES 환경 변수를 지정하면 기본값이 지정된 값으로 재정의됩니다. PUBLIC_CONTAINER_REGISTRIES 기본값은 quay.io 및 registry.svc.ci.openshift.org 입니다.
검증
다음 명령을 실행하여 hub 클러스터에서 새로 추가된 레지스트리에 액세스할 수 있는지 확인합니다.
hub 클러스터에 대한 디버그 쉘 프롬프트를 엽니다.
$ oc debug node/<node_name>
다음 명령을 실행하여 인증되지 않은 레지스트리에 대한 액세스를 테스트합니다.
sh-4.4# podman login -u kubeadmin -p $(oc whoami -t) <unauthenticated_registry>
다음과 같습니다.
- <unauthenticated_registry>
-
새 레지스트리(예:
unauthenticated-image-registry.openshift-image-registry.svc:5000)입니다.
출력 예
Login Succeeded!
17.2.7. ArgoCD로 hub 클러스터 구성
GitOps Zero ScanSetting Provisioning (ZTP)을 사용하여 각 사이트에 필요한 설치 및 정책 CR(사용자 정의 리소스)을 생성하는 ArgoCD 애플리케이션 세트로 hub 클러스터를 구성할 수 있습니다.
RHACM(Red Hat Advanced Cluster Management)은 site Config CR을 사용하여 ArgoCD의 1일 차 관리 클러스터 설치 CR을 생성합니다. 각 ArgoCD 애플리케이션은 최대 300개의 site Config CR을 관리할 수 있습니다.
사전 요구 사항
- RHACM(Red Hat Advanced Cluster Management) 및 Red Hat OpenShift GitOps가 설치된 OpenShift Container Platform 허브 클러스터가 있어야 합니다.
-
" GitOps ZTP 사이트 구성 리포지토리 준비" 섹션에 설명된 대로 GitOps ZTP 플러그인 컨테이너에서 참조 배포를 추출했습니다. 참조 배포를 추출하면 다음 절차에서 참조되는
out/argocd/deployment디렉터리가 생성됩니다.
절차
ArgoCD 파이프라인 구성을 준비합니다.
- 예제 디렉터리와 유사한 디렉터리 구조를 사용하여 Git 리포지토리를 생성합니다. 자세한 내용은 " GitOps ZTP 사이트 구성 리포지토리 준비"를 참조하십시오.
ArgoCD UI를 사용하여 리포지토리에 대한 액세스를 구성합니다. 설정에서 다음을 구성합니다.
-
리포지토리 - 연결 정보를 추가합니다. URL은
.git(예:https://repo.example.com/repo.git및 credentials)으로 끝나야 합니다. - certificates - 필요한 경우 리포지토리의 공용 인증서를 추가합니다.
-
리포지토리 - 연결 정보를 추가합니다. URL은
Git 리포지토리를 기반으로 두 개의 ArgoCD 애플리케이션
out/argocd/deployment/clusters-app.yaml및out/argocd/deployment/policies-app.yaml을 수정합니다.-
Git 리포지토리를 가리키도록 URL을 업데이트합니다. URL은
.git로 끝납니다(예:https://repo.example.com/repo.git). -
targetRevision은 모니터링할 Git 리포지토리 분기를 나타냅니다. -
path는 각각 siteConfig 및PolicyGenTemplateCR의 경로를 지정합니다.
-
Git 리포지토리를 가리키도록 URL을 업데이트합니다. URL은
GitOps ZTP 플러그인을 설치하려면 이전에
out/argocd/deployment/디렉터리에 추출된 패치 파일을 사용하여 hub 클러스터의 ArgoCD 인스턴스를 패치해야 합니다. 다음 명령을 실행합니다.$ oc patch argocd openshift-gitops \ -n openshift-gitops --type=merge \ --patch-file out/argocd/deployment/argocd-openshift-gitops-patch.json
다음 명령을 사용하여 hub 클러스터에 파이프라인 구성을 적용합니다.
$ oc apply -k out/argocd/deployment
17.2.8. GitOps ZTP 사이트 구성 리포지토리 준비
GitOps ZeroForwarded Provisioning (ZTP) 파이프라인을 사용하려면 먼저 Git 리포지토리를 준비하여 사이트 구성 데이터를 호스팅해야 합니다.
사전 요구 사항
- 필요한 설치 및 정책 CR(사용자 정의 리소스)을 생성하기 위해 hub 클러스터 GitOps 애플리케이션을 구성했습니다.
- GitOps ZTP를 사용하여 관리 클러스터를 배포했습니다.
절차
-
site
Config 및별도의 경로를 사용하여 디렉터리 구조를 생성합니다.PolicyGenTemplateCR에 대한 다음 명령을 사용하여
ztp-site-generate컨테이너 이미지에서argocd디렉터리를 내보냅니다.$ podman pull registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13
$ mkdir -p ./out
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13 extract /home/ztp --tar | tar x -C ./out
out디렉터리에 다음 하위 디렉터리가 포함되어 있는지 확인합니다.-
out/extra-manifest에는 siteConfig가 추가 매니페스트configMap을 생성하는 데 사용하는 소스 CR 파일이 포함되어 있습니다. -
out/source-crs에는PolicyGenTemplate에서 RHACM(Red Hat Advanced Cluster Management) 정책을 생성하는 데 사용하는 소스 CR 파일이 포함되어 있습니다. -
out/argocd/deployment에는 이 절차의 다음 단계에서 사용할 hub 클러스터에 적용할 패치 및 YAML 파일이 포함되어 있습니다. -
out/argocd/example에는 권장 구성을 나타내는 siteConfig및PolicyGenTemplate파일의 예제가 포함되어 있습니다.
-
out/argocd/example 아래의 디렉터리 구조는 Git 리포지토리의 구조와 콘텐츠에 대한 참조 역할을 합니다. 예제에는 단일 노드, 3 노드 및 표준 클러스터에 대한 site Config 및 PolicyGenTemplate 참조 CR이 포함되어 있습니다. 사용하지 않는 클러스터 유형에 대한 참조를 제거합니다. 다음 예제에서는 단일 노드 클러스터의 네트워크에 대한 CR 세트를 설명합니다.
example
├── policygentemplates
│ ├── common-ranGen.yaml
│ ├── example-sno-site.yaml
│ ├── group-du-sno-ranGen.yaml
│ ├── group-du-sno-validator-ranGen.yaml
│ ├── kustomization.yaml
│ └── ns.yaml
└── siteconfig
├── example-sno.yaml
├── KlusterletAddonConfigOverride.yaml
└── kustomization.yaml
site Config 및 PolicyGenTemplate CR을 별도의 디렉터리에 보관합니다. site Config 및 PolicyGenTemplate 디렉터리에 모두 해당 디렉토리에 파일을 명시적으로 포함하는 kustomization.yaml 파일을 포함해야 합니다.
이 디렉터리 구조와 kustomization.yaml 파일을 커밋하고 Git 리포지토리로 내보내야 합니다. Git으로의 초기 내보내기에는 kustomization.yaml 파일이 포함되어야 합니다. site Config (example-sno.yaml) 및 PolicyGenTemplate (common-ranGen.yaml,group-du-sno*.yaml, example-sno-site.yaml) 파일을 생략하고 나중에 사이트를 배포할 때 필요에 따라 푸시할 수 있습니다.
KlusterletAddonConfigOverride.yaml 파일은 해당 파일에 대한 참조가 커밋되어 Git에 푸시되는 하나 이상의 site Config CR에서만 필요합니다. 이 사용 방법에 대한 예는 example-sno.yaml 을 참조하십시오.
17.3. RHACM 및 siteConfig 리소스를 사용하여 관리형 클러스터 설치
지원 서비스 및 core-reduction 기술이 활성화된 GitOps 플러그인 정책 생성기를 사용하여 RHACM(Red Hat Advanced Cluster Management)을 사용하여 OpenShift Container Platform 클러스터를 스케일링하여 프로비저닝할 수 있습니다. GitOps Zero ScanSetting Provisioning (ZTP) 파이프라인은 클러스터 설치를 수행합니다. GitOps ZTP는 연결이 끊긴 환경에서 사용할 수 있습니다.
17.3.1. GitOps ZTP 및 토폴로지 Aware Lifecycle Manager
GTP(HITOP) provisioning(ZTP)은 Git에 저장된 매니페스트에서 설치 및 구성 CR을 생성합니다. 이러한 아티팩트는 RHACM(Red Hat Advanced Cluster Management), 지원 서비스 및 TALM( Topology Aware Lifecycle Manager)이 CR을 사용하여 관리되는 클러스터를 설치 및 구성하는 중앙 집중식 허브 클러스터에 적용됩니다. GitOps ZTP 파이프라인의 구성 단계는 TALM을 사용하여 클러스터에 대한 구성 CR의 애플리케이션을 오케스트레이션합니다. GitOps ZTP와 TALM 사이에 몇 가지 주요 통합 지점이 있습니다.
- 정책 정보
-
기본적으로 GitOps ZTP는 정보 수정 작업으로 모든 정책을
생성합니다. 이러한 정책을 통해 RHACM은 정책과 관련된 클러스터의 컴플라이언스 상태를 보고하지만 원하는 구성은 적용하지 않습니다. GitOps ZTP 프로세스 중에 OpenShift 설치 후 생성된정보 정책을 통한TALM 단계는 대상 관리 클러스터에 적용합니다. 이는 관리 클러스터에 구성을 적용합니다. 클러스터 라이프사이클의 GitOps ZTP 단계 외부에서 이러한 변경 사항을 영향을 받는 관리형 클러스터로 즉시 롤아웃할 위험없이 정책을 변경할 수 있습니다. TALM을 사용하여 시간 및 수정된 클러스터 세트를 제어할 수 있습니다. - ClusterGroupUpgrade CR 자동 생성
새로 배포된 클러스터의 초기 구성을 자동화하기 위해 TALM은 hub 클러스터에서 모든
ManagedClusterCR의 상태를 모니터링합니다. 새로 생성된ManagedClusterCR을 포함하여ztp-done레이블이 적용되지 않은ManagedClusterCR을 사용하면 TALM이 다음과 같은 특성을 가진ClusterGroupUpgradeCR을 자동으로 생성합니다.-
ClusterGroupUpgradeCR이ztp-install네임스페이스에서 생성되고 활성화됩니다. -
ClusterGroupUpgradeCR은ManagedClusterCR과 이름이 동일합니다. -
클러스터 선택기에는 해당
ManagedClusterCR과 연결된 클러스터만 포함됩니다. -
관리형 정책 세트에는
ClusterGroupUpgrade를 생성할 때 RHACM이 클러스터에 바인딩한 모든 정책이 포함됩니다. - 사전 캐싱이 비활성화되어 있습니다.
- 타임아웃은 4시간(240분)으로 설정합니다.
활성화된
ClusterGroupUpgrade를 자동으로 생성하면 사용자 개입 없이 클러스터의 초기 제로트 배포가 진행됩니다. 또한ztp-done레이블이 없는ManagedCluster에 대한ClusterGroupUpgradeCR 자동 생성을 사용하면 클러스터의ClusterGroupUpgradeCR을 간단히 삭제하여 실패한 GitOps ZTP 설치를 다시 시작할 수 있습니다.-
- disappears
PolicyGenTemplateCR에서 생성된 각 정책에는ztp-deploy-ECDHE 주석이 포함되어있습니다. 이 주석은 해당 정책에 포함된 각 CR의 동일한 주석을 기반으로 합니다. 분리 주석은 자동 생성된ClusterGroupUpgradeCR에서 정책을 정렬하는 데 사용됩니다. parse 주석은 자동 생성된ClusterGroupUpgradeCR 이외의 용도로 사용되지 않습니다.참고동일한 정책에 있는 모든 CR은
ztp-deploy-ECDHE 주석에 대해 동일한 설정을 가져야 합니다. 각 CR에 대한 이 주석의 기본값은PolicyGenTemplate에서 재정의할 수 있습니다. 소스 CR의 parse 주석은 정책 파도 주석을 결정하고 설정하는 데 사용됩니다. 이 주석은 런타임 시 생성된 정책에 포함된 빌드 CR마다 제거됩니다.TALM은 파기 주석에 의해 지정된 순서대로 구성 정책을 적용합니다. TALM은 다음 정책으로 이동하기 전에 각 정책을 준수할 때까지 기다립니다. 각 CR에 대한 파도 주석이 클러스터에 적용되는 CR의 사전 요구 사항을 고려해야 합니다. 예를 들어 Operator의 구성을 사용하여 Operator 앞에 설치하거나 동시에 설치해야 합니다. 마찬가지로 Operator의
CatalogSource를 Operator 서브스크립션 앞에 또는 동시에 설치해야 합니다. 각 CR의 기본 전달 값은 이러한 사전 요구 사항을 고려합니다.여러 CR과 정책이 동일한 중단 번호를 공유할 수 있습니다. 정책을 줄이면 배포 속도가 빨라지고 CPU 사용량이 줄어들 수 있습니다. 많은 CR을 상대적으로 소수의 파도로 그룹화하는 것이 가장 좋습니다.
각 소스 CR의 기본 중단 값을 확인하려면 ztp-site-generate 컨테이너 이미지에서 추출된 out/source-crs 디렉터리에 대해 다음 명령을 실행합니다.
$ grep -r "ztp-deploy-wave" out/source-crs
- 단계 라벨
ClusterGroupUpgradeCR이 자동으로 생성되고 GitOps ZTP 프로세스의 시작 및 끝에 라벨이 있는ManagedClusterCR에 주석을 달 수 있는 지시문이 포함되어 있습니다.GitOps ZTP 구성 후 설치가 시작되면
ManagedCluster에ztp-running라벨이 적용됩니다. 모든 정책이 클러스터에 수정되고 완전히 호환되면 TALM이ztp-running레이블을 제거하고ztp-done라벨을 적용합니다.informDuValidator정책을 사용하는 배포의 경우 클러스터가 애플리케이션 배포를 완전히 준비할 때ztp-done레이블이 적용됩니다. 여기에는 모든 조정 및 GitOps ZTP 적용된 구성 CR의 결과가 포함됩니다.ztp-done레이블은 TALM의 자동ClusterGroupUpgradeCR 생성에 영향을 미칩니다. 클러스터의 초기 GitOps ZTP 설치 후 이 레이블을 조작하지 마십시오.- 연결된 CR
-
자동으로 생성된
ClusterGroupUpgradeCR에는 소유자 참조가 파생된ManagedCluster로 설정됩니다. 이 참조를 통해ManagedClusterCR을 삭제하면 지원되는 리소스와 함께ClusterGroupUpgrade인스턴스가 삭제됩니다.
17.3.2. GitOps ZTP를 사용하여 관리형 클러스터 배포 개요
RHACM(Red Hat Advanced Cluster Management)은 GitOps ZeroForwarded Provisioning (ZTP)을 사용하여 단일 노드 OpenShift Container Platform 클러스터, 3 노드 클러스터 및 표준 클러스터를 배포합니다. Git 리포지토리에서 사이트 구성 데이터를 OpenShift Container Platform CR(사용자 정의 리소스)으로 관리합니다. GitOps ZTP는 한 번 개발 시 선언적 GitOps 접근 방식을 사용하고, 어디에서나 모델을 배포하여 관리 클러스터를 배포합니다.
클러스터 배포에는 다음이 포함됩니다.
- 빈 서버에 호스트 운영 체제(RHCOS) 설치
- OpenShift Container Platform 배포
- 클러스터 정책 및 사이트 서브스크립션 생성
- 서버 운영 체제에 필요한 네트워크 구성
- 프로필 Operator 배포 및 성능 프로필, PTP 및 SR-IOV와 같은 필요한 소프트웨어 관련 구성 수행
관리되는 사이트 설치 프로세스 개요
hub 클러스터에서 관리 사이트 CR(사용자 정의 리소스)을 적용하면 다음 작업이 자동으로 수행됩니다.
- 검색 이미지 ISO 파일이 생성되어 대상 호스트에서 부팅됩니다.
- ISO 파일이 대상 호스트에서 성공적으로 부팅되면 호스트 하드웨어 정보를 RHACM에 보고합니다.
- 모든 호스트가 발견되면 OpenShift Container Platform이 설치됩니다.
-
OpenShift Container Platform 설치가 완료되면 허브에서
klusterlet서비스를 대상 클러스터에 설치합니다. - 요청된 애드온 서비스가 대상 클러스터에 설치되어 있습니다.
hub 클러스터에서 관리 클러스터의 에이전트 CR이 생성되면 검색 이미지 ISO 프로세스가 완료됩니다.
대상 베어 메탈 호스트는 vDU 애플리케이션 워크로드에 대한 권장 단일 노드 OpenShift 클러스터 구성에 나열된 네트워킹, 펌웨어 및 하드웨어 요구 사항을 충족해야 합니다.
17.3.3. 관리형 베어 메탈 호스트 시크릿 생성
관리 베어 메탈 호스트에 필요한 Secret CR(사용자 정의 리소스)을 hub 클러스터에 추가합니다. BMC(Baseboard Management Controller)에 액세스하려면 GTP(Baseboard Management Controller) 파이프라인과 지원 설치 관리자 서비스에 대한 시크릿이 레지스트리에서 클러스터 설치 이미지를 가져오는 데 필요한 secret이 필요합니다.
보안은 이름으로 site Config CR 에서 참조됩니다. 네임스페이스는 site Config 네임스페이스와 일치해야 합니다.
절차
OpenShift 및 모든 애드온 클러스터 Operator를 설치하는 데 필요한 BMC(Host Baseboard Management Controller) 및 풀 시크릿(pull secret)의 인증 정보가 포함된 YAML 시크릿 파일을 생성합니다.
다음 YAML을
example-sno-secret.yaml파일로 저장합니다.apiVersion: v1 kind: Secret metadata: name: example-sno-bmc-secret namespace: example-sno 1 data: 2 password: <base64_password> username: <base64_username> type: Opaque --- apiVersion: v1 kind: Secret metadata: name: pull-secret namespace: example-sno 3 data: .dockerconfigjson: <pull_secret> 4 type: kubernetes.io/dockerconfigjson
-
클러스터를 설치하는 데 사용하는
kustomization.yaml파일에 상대 경로를example-sno-secret.yaml에 추가합니다.
17.3.4. GitOps ZTP를 사용하여 설치를 위한 Discovery ISO 커널 인수 구성
GitOps Zero 10.0.0.1 Provisioning (ZTP) 워크플로우는 관리 베어 메탈 호스트에서 OpenShift Container Platform 설치 프로세스의 일부로 Discovery ISO를 사용합니다. InfraEnv 리소스를 편집하여 Discovery ISO에 대한 커널 인수를 지정할 수 있습니다. 이는 특정 환경 요구 사항이 있는 클러스터 설치에 유용합니다. 예를 들어 Discovery ISO의 rd.net.timeout.carrier 커널 인수를 구성하여 클러스터의 정적 네트워킹을 용이하게 하거나 설치 중에 루트 파일 시스템을 다운로드하기 전에 DHCP 주소를 수신합니다.
OpenShift Container Platform 4.13에서는 커널 인수만 추가할 수 있습니다. 커널 인수를 교체하거나 삭제할 수 없습니다.
사전 요구 사항
- OpenShift CLI(oc)가 설치되어 있습니다.
- cluster-admin 권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
InfraEnvCR을 생성하고spec.kernelArguments사양을 편집하여 커널 인수를 구성합니다.다음 YAML을
InfraEnv-example.yaml파일에 저장합니다.참고이 예제의
InfraEnvCR은SiteConfigCR의 값에 따라 채워진{{ .Cluster.ClusterName }}과 같은 템플릿 구문을 사용합니다.SiteConfigCR은 배포 중에 이러한 템플릿의 값을 자동으로 채웁니다. 템플릿을 수동으로 편집하지 마십시오.apiVersion: agent-install.openshift.io/v1beta1 kind: InfraEnv metadata: annotations: argocd.argoproj.io/sync-wave: "1" name: "{{ .Cluster.ClusterName }}" namespace: "{{ .Cluster.ClusterName }}" spec: clusterRef: name: "{{ .Cluster.ClusterName }}" namespace: "{{ .Cluster.ClusterName }}" kernelArguments: - operation: append 1 value: audit=0 2 - operation: append value: trace=1 sshAuthorizedKey: "{{ .Site.SshPublicKey }}" proxy: "{{ .Cluster.ProxySettings }}" pullSecretRef: name: "{{ .Site.PullSecretRef.Name }}" ignitionConfigOverride: "{{ .Cluster.IgnitionConfigOverride }}" nmStateConfigLabelSelector: matchLabels: nmstate-label: "{{ .Cluster.ClusterName }}" additionalNTPSources: "{{ .Cluster.AdditionalNTPSources }}"
InfraEnv-example.yamlCR을 Git 리포지토리의 동일한 위치에 커밋하고 변경 사항을 푸시합니다.다음 예제는 샘플 Git 리포지토리 구조를 보여줍니다.~/example-ztp/install └── site-install ├── siteconfig-example.yaml ├── InfraEnv-example.yaml ...Git 리포지토리의
InfraEnv-example.yamlCR을 참조하도록SiteConfigCR에서spec.clusters.crTemplates사양을 편집합니다.clusters: crTemplates: InfraEnv: "InfraEnv-example.yaml"SiteConfigCR을 커밋하고 푸시하여 클러스터를 배포할 준비가 되면 빌드 파이프라인은 Git 리포지토리에서 사용자 지정InfraEnv-exampleCR을 사용하여 사용자 지정 커널 인수를 포함하여 인프라 환경을 구성합니다.
검증
커널 인수가 적용되었는지 확인하려면 Discovery 이미지가 OpenShift Container Platform을 설치할 준비가 되었는지 확인한 후 설치 프로세스를 시작하기 전에 대상 호스트에 SSH를 실행할 수 있습니다. 이 시점에서 /proc/cmdline 파일에서 Discovery ISO에 대한 커널 인수를 볼 수 있습니다.
대상 호스트로 SSH 세션을 시작합니다.
$ ssh -i /path/to/privatekey core@<host_name>
다음 명령을 사용하여 시스템의 커널 인수를 확인합니다.
$ cat /proc/cmdline
17.3.5. SiteConfig 및 GitOps ZTP를 사용하여 관리형 클러스터 배포
다음 절차에 따라 SiteConfig CR(사용자 정의 리소스) 및 관련 파일을 생성하고 GitOps ZeroForwarded Provisioning(ZTP) 클러스터 배포를 시작합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 필요한 설치 및 정책 CR을 생성하기 위해 hub 클러스터를 구성했습니다.
사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성하셨습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 ArgoCD 애플리케이션의 소스 리포지토리로 구성해야 합니다. 자세한 내용은 "GITOP ZTP 사이트 구성 리포지토리 준비"를 참조하십시오.
참고소스 리포지토리를 생성할 때
ztp-site-generate컨테이너에서 추출한argocd/deployment/argocd-openshift-gitops-patch.jsonpatch-file을 사용하여 ArgoCD 애플리케이션을 패치해야 합니다. " ArgoCD를 사용하여 hub 클러스터 구성"을 참조하십시오.관리 클러스터를 프로비저닝할 준비를 하려면 각 베어 메탈 호스트에 대해 다음이 필요합니다.
- 네트워크 연결
- 네트워크에는 DNS가 필요합니다. hub 클러스터에서 관리 클러스터 호스트에 연결할 수 있어야 합니다. hub 클러스터와 관리 클러스터 호스트 간에 계층 3 연결이 있는지 확인합니다.
- BMC(Baseboard Management Controller) 세부 정보
-
GitOps ZTP는 BMC 사용자 이름 및 암호 세부 정보를 사용하여 클러스터 설치 중에 BMC에 연결합니다. GitOps ZTP 플러그인은 사이트 Git 리포지토리의 site
ConfigCR을 기반으로 hub 클러스터에서ManagedClusterCR을 관리합니다. 각 호스트에 대해 개별BMCSecretCR을 수동으로 생성합니다.
절차
hub 클러스터에서 필요한 관리 클러스터 시크릿을 생성합니다. 이러한 리소스는 클러스터 이름과 일치하는 이름이 있는 네임스페이스에 있어야 합니다. 예를 들어
out/argocd/example/siteconfig/example-sno.yaml에서 클러스터 이름과 네임스페이스는example-sno입니다.다음 명령을 실행하여 클러스터 네임스페이스를 내보냅니다.
$ export CLUSTERNS=example-sno
네임스페이스를 생성합니다.
$ oc create namespace $CLUSTERNS
관리형 클러스터의 pull secret 및 BMC
SecretCR을 생성합니다. 풀 시크릿에는 OpenShift Container Platform 및 모든 필수 Operator를 설치하는 데 필요한 모든 인증 정보가 포함되어야 합니다. 자세한 내용은 "관리된 베어 메탈 호스트 시크릿 생성"을 참조하십시오.참고보안은 이름으로 site
ConfigCR(사용자 정의 리소스)에서 참조합니다. 네임스페이스는 siteConfig 네임스페이스와일치해야 합니다.Git 리포지토리의 로컬 복제본에 클러스터용 site
ConfigCR을 생성합니다.out/argocd/example/siteconfig/폴더에 있는 CR에 대한 적절한 예를 선택합니다. 폴더에는 단일 노드, 3 노드 및 표준 클러스터의 예제 파일이 포함되어 있습니다.-
example-sno.yaml -
example-3node.yaml -
example-standard.yaml
-
원하는 클러스터 유형과 일치하도록 예제 파일의 클러스터 및 호스트 세부 정보를 변경합니다. 예를 들면 다음과 같습니다.
단일 노드 OpenShift 클러스터 siteConfig CR의 예
apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "<site_name>" namespace: "<site_name>" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" 1 clusterImageSetNameRef: "openshift-4.13" 2 sshPublicKey: "ssh-rsa AAAA..." 3 clusters: - clusterName: "<site_name>" networkType: "OVNKubernetes" clusterLabels: 4 common: true group-du-sno: "" sites : "<site_name>" clusterNetwork: - cidr: 1001:1::/48 hostPrefix: 64 machineNetwork: - cidr: 1111:2222:3333:4444::/64 serviceNetwork: - 1001:2::/112 additionalNTPSources: - 1111:2222:3333:4444::2 #crTemplates: # KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5 nodes: - hostName: "example-node.example.com" 6 role: "master" bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7 bmcCredentialsName: name: "bmh-secret" 8 bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" 9 rootDeviceHints: 10 wwn: "0x11111000000asd123" cpuset: "0-1,52-53" 11 nodeNetwork: 12 interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up ipv4: enabled: false ipv6: 13 enabled: true address: - ip: 1111:2222:3333:4444::aaaa:1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254- 1
- site
Config CR과 동일한 네임스페이스를 사용하여을 생성합니다.assisted-deployment-pull-secretCR - 2
clusterImageSetNameRef는 hub 클러스터에서 사용 가능한 이미지 세트를 정의합니다. hub 클러스터에서 지원되는 버전 목록을 보려면oc get clusterimagesets를 실행합니다.- 3
- 클러스터에 액세스하는 데 사용되는 SSH 공개 키를 구성합니다.
- 4
- 클러스터 레이블은 사용자가 정의한
PolicyGenTemplateCR의bindingRules필드에 대응해야 합니다. 예를 들어policygentemplates/common-ranGen.yaml은common: trueset,policygentemplates/group-du-sno-ranGen.yaml이group-du-sno: ""가 설정된 모든 클러스터에 적용됩니다. - 5
- 선택 사항:
KlusterletAddonConfig아래에 있는 CR 사양을 사용하여 클러스터에 대해 생성된 기본KlusterletAddonConfig를 덮어씁니다. - 6
- 단일 노드 배포의 경우 단일 호스트를 정의합니다. 3-노드 배포의 경우 3개의 호스트를 정의합니다. 표준 배포의 경우
master와 role으로 정의된 두 개 이상의 호스트인worker를 사용하여 세 개의 호스트를 정의합니다. - 7
- 호스트에 액세스하는 데 사용하는 BMC 주소입니다. 모든 클러스터 유형에 적용됩니다. GitOps ZTP는 Redfish 또는 IPMI 프로토콜을 사용하여 iPXE 및 가상 미디어 부팅을 지원합니다. iPXE 부팅을 사용하려면 RHACM 2.8 이상을 사용해야 합니다. BMC 주소 지정에 대한 자세한 내용은 추가 리소스 섹션을 참조하십시오.
- 8
- 호스트 BMC 자격 증명을 사용하여 별도로 생성하는
bmh-secretCR의 이름입니다.bmh-secretCR을 생성할 때 호스트를 프로비저닝하는 siteConfig CR과 동일한 네임스페이스를 사용합니다. - 9
- 호스트의 부팅 모드를 구성합니다. 기본값은
UEFI입니다.UEFISecureBoot를 사용하여 호스트에서 보안 부팅을 활성화합니다. - 10
- 배포 장치를 지정합니다. 재부팅 후에도 안정적인 식별자가 권장됩니다(예
: <disk_wwn> 또는). 안정적인 식별자의 자세한 목록은 About root device hints 섹션을 참조하십시오.deviceName: /dev/disk/by-path/<device_path> - 11
cpuset는 워크로드 파티셔닝을 위해 클러스터PerformanceProfileCRspec.cpu.reserved필드에 설정된 값과 일치해야 합니다.- 12
- 노드의 네트워크 설정을 지정합니다.
- 13
- 호스트의 IPv6 주소를 구성합니다. 고정 IP 주소가 있는 단일 노드 OpenShift 클러스터의 경우 노드별 API 및 Ingress IP가 동일해야 합니다.
-
out/argocd/extra-manifest에서 기본 extra-manifestMachineConfigCR 세트를 검사할 수 있습니다. 설치 시 클러스터에 자동으로 적용됩니다. 선택 사항: 프로비저닝된 클러스터에 추가 설치 시간 매니페스트를 프로비저닝하려면 Git 리포지토리에 디렉터리를 생성합니다(예:
sno-extra-manifest/), 사용자 정의 매니페스트 CR을 이 디렉터리에 추가합니다. siteConfig.yaml이extraManifestPath필드의 이 디렉터리를 참조하는 경우 이 참조 디렉터리의 모든 CR이 기본 추가 매니페스트 세트에 추가됩니다.crun OCI 컨테이너 런타임 활성화최적의 클러스터 성능을 위해 단일 노드 OpenShift, 추가 작업자 노드 3 노드, 3 노드 OpenShift 및 표준 클러스터가 있는 단일 노드 OpenShift의 마스터 및 작업자 노드에 대해 crun을 활성화합니다.
클러스터를 재부팅할 필요가 없도록 추가 day-0 install-time 매니페스트로
ContainerRuntimeConfigCR에서 crun을 활성화합니다.enable-crun-master.yaml및enable-crun-worker.yamlCR 파일은ztp-site-generate컨테이너에서 추출할 수 있는out/source-crs/optional-extra-manifest/폴더에 있습니다. 자세한 내용은 " GitOps ZTP 파이프라인에서 추가 설치 매니페스트 사용자 정의"를 참조하십시오.
-
out/argocd/example/siteconfig/에 표시된 예제와 유사하게kustomization.yamlgenerators섹션의 kustomization.yaml 파일에 siteConfigCR을 추가합니다. Git 리포지토리
에서 siteConfigCR 및 관련kustomization.yaml변경 사항을 커밋하고 변경 사항을 내보냅니다.ArgoCD 파이프라인은 변경 사항을 감지하고 관리형 클러스터 배포를 시작합니다.
17.3.6. 관리형 클러스터 설치 진행 상황 모니터링
ArgoCD 파이프라인은 siteConfig CR을 사용하여 클러스터 구성 CR을 생성하고 hub 클러스터와 동기화합니다. ArgoCD 대시보드에서 동기화 진행 상황을 모니터링할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
동기화가 완료되면 일반적으로 설치는 다음과 같이 진행됩니다.
Assisted Service Operator는 클러스터에 OpenShift Container Platform을 설치합니다. RHACM 대시보드 또는 명령줄에서 다음 명령을 실행하여 클러스터 설치 진행 상황을 모니터링할 수 있습니다.
클러스터 이름을 내보냅니다.
$ export CLUSTER=<clusterName>
관리 클러스터의
AgentClusterInstallCR을 쿼리합니다.$ oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Completed")]}' | jq클러스터의 설치 이벤트를 가져옵니다.
$ curl -sk $(oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.debugInfo.eventsURL}') | jq '.[-2,-1]'
17.3.7. 설치 CR을 검증하여 GitOps ZTP 문제 해결
ArgoCD 파이프라인은 site Config 및 PolicyGenTemplate 사용자 정의 리소스(CR)를 사용하여 클러스터 구성 CR 및 RHACM(Red Hat Advanced Cluster Management) 정책을 생성합니다. 다음 단계를 사용하여 이 프로세스 중에 발생할 수 있는 문제를 해결합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
다음 명령을 사용하여 설치 CR이 생성되었는지 확인합니다.
$ oc get AgentClusterInstall -n <cluster_name>
반환된 오브젝트가 없는 경우 다음 단계를 사용하여 site
Config파일에서 설치 CR로의 ArgoCD 파이프라인 흐름 문제를 해결합니다.hub 클러스터에서 site
ConfigCR을 사용하여ManagedClusterCR이 생성되었는지 확인합니다.$ oc get managedcluster
ManagedCluster가 누락된 경우클러스터애플리케이션이 Git 리포지토리에서 hub 클러스터와 파일을 동기화하지 못하는지 확인합니다.$ oc describe -n openshift-gitops application clusters
Status.Conditions필드가 있는지 확인하여 관리형 클러스터의 오류 로그를 확인합니다. 예를 들어, siteConfigCR에서extraManifestPath:에 유효하지 않은 값을 설정하면 다음 오류가 발생합니다.Status: Conditions: Last Transition Time: 2021-11-26T17:21:39Z Message: rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/siteconfigs/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not create extra-manifest ranSite1.extra-manifest3 stat extra-manifest3: no such file or directory 2021/11/26 17:21:40 Error: could not build the entire SiteConfig defined by /tmp/kust-plugin-config-913473579: stat extra-manifest3: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-913473579; exit status 1: exit status 1 Type: ComparisonErrorStatus.Sync필드를 확인합니다. 로그 오류가 있는 경우Status.Sync필드에Unknown오류가 표시될 수 있습니다.Status: Sync: Compared To: Destination: Namespace: clusters-sub Server: https://kubernetes.default.svc Source: Path: sites-config Repo URL: https://git.com/ran-sites/siteconfigs/.git Target Revision: master Status: Unknown
17.3.8. GitOps ZTP 파이프라인에서 관리형 클러스터 사이트 제거
관리 사이트 및 관련 설치 및 구성 정책 CR은 GitOps Zero CloudEvent Provisioning (ZTP) 파이프라인에서 제거할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
precedure
kustomization.yaml파일에서 관련 siteConfig 및및 관련 CR을 제거합니다.PolicyGenTemplate파일을 제거하여 사이트GitOps ZTP 파이프라인을 다시 실행하면 생성된 CR이 제거됩니다.
-
선택 사항: 사이트를 영구적으로 제거하려면 Git 리포지토리에서 site
Config및 사이트별PolicyGenTemplate파일도 제거해야 합니다. -
선택 사항: 사이트를 임시로 제거하려면 예를 들어 사이트를 재배포할 때 사이트별
PolicyGenTemplateCR을 Git 리포지토리에 남겨 둘 수 있습니다.
Git 리포지토리에서 site Config 파일을 제거한 후 해당 클러스터가 분리 프로세스에 있는 경우 hub 클러스터에서 RHACM(Red Hat Advanced Cluster Management)을 확인하고 분리된 클러스터를 정리하는 방법에 대한 정보를 확인합니다.
추가 리소스
- 클러스터 제거에 대한 자세한 내용은 관리에서 클러스터 제거를 참조하십시오.
17.3.9. GitOps ZTP 파이프라인에서 더 이상 사용되지 않는 콘텐츠 제거
PolicyGenTemplate 구성을 변경하면 정책과 같이 더 이상 사용되지 않는 정책이 생성되는 경우 다음 절차를 사용하여 더 이상 사용되지 않는 정책을 제거합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
-
Git 리포지토리에서 영향을 받는
PolicyGenTemplate파일을 제거하고 원격 리포지토리로 커밋하고 내보냅니다. - 변경 사항이 애플리케이션을 통해 동기화되고 영향을 받는 정책이 hub 클러스터에서 제거될 때까지 기다립니다.
업데이트된
PolicyGenTemplate파일을 Git 리포지토리에 다시 추가한 다음, 원격 리포지토리를 커밋하고 내보냅니다.참고Git 리포지토리에서 GitOps ZeroForwarded Provisioning (ZTP) 정책을 제거하고 hub 클러스터에서도 제거해도 관리 클러스터의 구성에 영향을 미치지 않습니다. 해당 정책에서 관리하는 정책 및 CR은 관리형 클러스터에서 유지됩니다.
선택 사항: 더 이상 사용되지 않는 정책을 생성하는
PolicyGenTemplateCR을 변경한 후 허브 클러스터에서 이러한 정책을 수동으로 제거할 수 있습니다. Governance 탭을 사용하거나 다음 명령을 실행하여 RHACM 콘솔에서 정책을 삭제할 수 있습니다.$ oc delete policy -n <namespace> <policy_name>
17.3.10. GitOps ZTP 파이프라인 삭제
ArgoCD 파이프라인 및 생성된 모든 GitOps Zero CloudEvent Provisioning (ZTP) 아티팩트를 제거할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
- hub 클러스터의 RHACM(Red Hat Advanced Cluster Management)에서 모든 클러스터를 분리합니다.
다음 명령을 사용하여
배포디렉터리에서kustomization.yaml파일을 삭제합니다.$ oc delete -k out/argocd/deployment
- 변경 사항을 커밋하고 사이트 리포지토리로 내보냅니다.
17.4. 정책 및 PolicyGenTemplate 리소스를 사용하여 관리형 클러스터 구성
적용된 정책 CR(사용자 정의 리소스)은 프로비저닝하는 관리형 클러스터를 구성합니다. RHACM(Red Hat Advanced Cluster Management)에서 PolicyGenTemplate CR을 사용하여 적용된 정책 CR을 생성하는 방법을 사용자 지정할 수 있습니다.
17.4.1. PolicyGenTemplate CRD 정보
PolicyGenTemplate CRD(사용자 정의 리소스 정의)는 PolicyGen 정책 생성기에 클러스터 구성에 포함할 CR(사용자 정의 리소스), CR을 생성된 정책에 결합하는 방법, 오버레이 콘텐츠를 사용하여 업데이트해야 하는 항목을 지시합니다.
다음 예제에서는 ztp-site-generate 참조 컨테이너에서 추출된 PolicyGenTemplate CR(common-du-ranGen.yaml)을 보여줍니다. common-du-ranGen.yaml 파일은 RHACM(Red Hat Advanced Cluster Management) 정책을 정의합니다. 정책은 CR에서 policyName 의 각 고유한 값에 대해 구성 CR 컬렉션을 관리합니다. common-du-ranGen.yaml 은 단일 배치 바인딩과 바인딩 규칙을 생성하여 bindingRules 섹션에 나열된 레이블을 기반으로 정책을 클러스터에 바인딩합니다.
PolicyGenTemplate CR - common-du-ranGen.yaml
---
apiVersion: ran.openshift.io/v1
kind: PolicyGenTemplate
metadata:
name: "common"
namespace: "ztp-common"
spec:
bindingRules:
common: "true" 1
sourceFiles: 2
- fileName: SriovSubscription.yaml
policyName: "subscriptions-policy"
- fileName: SriovSubscriptionNS.yaml
policyName: "subscriptions-policy"
- fileName: SriovSubscriptionOperGroup.yaml
policyName: "subscriptions-policy"
- fileName: SriovOperatorStatus.yaml
policyName: "subscriptions-policy"
- fileName: PtpSubscription.yaml
policyName: "subscriptions-policy"
- fileName: PtpSubscriptionNS.yaml
policyName: "subscriptions-policy"
- fileName: PtpSubscriptionOperGroup.yaml
policyName: "subscriptions-policy"
- fileName: PtpOperatorStatus.yaml
policyName: "subscriptions-policy"
- fileName: ClusterLogNS.yaml
policyName: "subscriptions-policy"
- fileName: ClusterLogOperGroup.yaml
policyName: "subscriptions-policy"
- fileName: ClusterLogSubscription.yaml
policyName: "subscriptions-policy"
- fileName: ClusterLogOperatorStatus.yaml
policyName: "subscriptions-policy"
- fileName: StorageNS.yaml
policyName: "subscriptions-policy"
- fileName: StorageOperGroup.yaml
policyName: "subscriptions-policy"
- fileName: StorageSubscription.yaml
policyName: "subscriptions-policy"
- fileName: StorageOperatorStatus.yaml
policyName: "subscriptions-policy"
- fileName: ReduceMonitoringFootprint.yaml
policyName: "config-policy"
- fileName: OperatorHub.yaml 3
policyName: "config-policy"
- fileName: DefaultCatsrc.yaml 4
policyName: "config-policy" 5
metadata:
name: redhat-operators
spec:
displayName: disconnected-redhat-operators
image: registry.example.com:5000/disconnected-redhat-operators/disconnected-redhat-operator-index:v4.9
- fileName: DisconnectedICSP.yaml
policyName: "config-policy"
spec:
repositoryDigestMirrors:
- mirrors:
- registry.example.com:5000
source: registry.redhat.io
- 1
Common: "true"는 이 레이블이 있는 모든 클러스터에 정책을 적용합니다.- 2
sourceFiles에 나열된 파일은 설치된 클러스터에 대한 Operator 정책을 생성합니다.- 3
OperatorHub.yaml은 연결이 끊긴 레지스트리에 대한 OperatorHub를 구성합니다.- 4
DefaultCatsrc.yaml은 연결이 끊긴 레지스트리의 카탈로그 소스를 구성합니다.- 5
PolicyName: "config-policy"는 Operator 서브스크립션을 구성합니다.OperatorHubCR은 기본값을 비활성화하고 이 CR은redhat-operators를 연결이 끊긴 레지스트리를 가리키는CatalogSourceCR로 대체합니다.
PolicyGenTemplate CR은 포함된 여러 CR로 구성할 수 있습니다. hub 클러스터에 다음 예제 CR을 적용하여 단일 CR을 포함하는 정책을 생성합니다.
apiVersion: ran.openshift.io/v1
kind: PolicyGenTemplate
metadata:
name: "group-du-sno"
namespace: "ztp-group"
spec:
bindingRules:
group-du-sno: ""
mcp: "master"
sourceFiles:
- fileName: PtpConfigSlave.yaml
policyName: "config-policy"
metadata:
name: "du-ptp-slave"
spec:
profile:
- name: "slave"
interface: "ens5f0"
ptp4lOpts: "-2 -s --summary_interval -4"
phc2sysOpts: "-a -r -n 24"
소스 파일 PtpConfigSlave.yaml 을 예로 사용하여 파일은 PtpConfig CR을 정의합니다. PtpConfigSlave 예제에 대해 생성된 정책의 이름은 group-du-sno-config-policy 입니다. 생성된 group-du-sno-config-policy 에 정의된 PtpConfig CR의 이름은 du-ptp-slave 입니다. PtpConfigSlave.yaml 에 정의된 사양 은 소스 파일에 정의된 다른 사양 항목과 함께 du-ptp-slave 아래에 배치됩니다.
다음 예제에서는 group-du-sno-config-policy CR을 보여줍니다.
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
name: group-du-ptp-config-policy
namespace: groups-sub
annotations:
policy.open-cluster-management.io/categories: CM Configuration Management
policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
policy.open-cluster-management.io/standards: NIST SP 800-53
spec:
remediationAction: inform
disabled: false
policy-templates:
- objectDefinition:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: group-du-ptp-config-policy-config
spec:
remediationAction: inform
severity: low
namespaceselector:
exclude:
- kube-*
include:
- '*'
object-templates:
- complianceType: musthave
objectDefinition:
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: du-ptp-slave
namespace: openshift-ptp
spec:
recommend:
- match:
- nodeLabel: node-role.kubernetes.io/worker-du
priority: 4
profile: slave
profile:
- interface: ens5f0
name: slave
phc2sysOpts: -a -r -n 24
ptp4lConf: |
[global]
#
# Default Data Set
#
twoStepFlag 1
slaveOnly 0
priority1 128
priority2 128
domainNumber 24
.....17.4.2. PolicyGenTemplate CR을 사용자 정의할 때 권장 사항
사이트 구성 PolicyGenTemplate 사용자 정의 리소스(CR)를 사용자 정의할 때 다음 모범 사례를 고려하십시오.
-
필요한 경우 몇 가지 정책을 사용하십시오. 정책을 더 적게 사용하려면 리소스를 줄일 수 있습니다. 각 추가 정책은 hub 클러스터 및 배포된 관리형 클러스터에 대한 오버헤드를 생성합니다. CR은
PolicyGenTemplateCR의policyName필드를 기반으로 정책과 결합됩니다.policyName에 대해 동일한 값을 가진 동일한PolicyGenTemplate의 CR은 단일 정책에서 관리됩니다. -
연결이 끊긴 환경에서는 모든 Operator가 포함된 단일 인덱스로 레지스트리를 구성하여 모든 Operator에 대해 단일 카탈로그 소스를 사용합니다. 관리 클러스터의 추가
CatalogSourceCR마다 CPU 사용량이 증가합니다. -
MachineConfigCR은 설치 중에 적용되도록 siteConfig CR에extraManifests로 포함되어야 합니다. 이렇게 하면 클러스터가 애플리케이션을 배포할 준비가 될 때까지 전반적인 시간이 단축될 수 있습니다. -
PolicyGenTemplates는 channel 필드를 재정의하여 원하는 버전을 명시적으로 식별해야 합니다. 이렇게 하면 업그레이드 중에 소스 CR이 변경되면 생성된 서브스크립션이 업데이트되지 않습니다.
추가 리소스
- RHACM을 사용하여 클러스터 스케일링에 대한 권장 사항은 성능 및 확장성을 참조하십시오.
hub 클러스터에서 많은 수의 통화 클러스터를 관리할 때 리소스 사용량을 줄이기 위한 정책 수를 최소화합니다.
여러 구성 CR을 단일 또는 제한된 정책으로 그룹화하는 것이 hub 클러스터에 대한 전체 정책 수를 줄이는 한 가지 방법입니다. 사이트 구성 관리 정책의 공통, 그룹 및 사이트 계층을 사용하는 경우 사이트별 구성을 단일 정책으로 결합하는 것이 특히 중요합니다.
17.4.3. RAN 배포를 위한 PolicyGenTemplate CR
PGT( PolicyGenTemplate ) 사용자 정의 리소스(CR)를 사용하여 GitOps ZTP(ZTP) 파이프라인을 사용하여 클러스터에 적용된 구성을 사용자 지정합니다. PGT CR을 사용하면 클러스터에서 구성 CR 세트를 관리하기 위해 하나 이상의 정책을 생성할 수 있습니다. PGT는 관리형 CR 세트를 식별하고, 이를 정책으로 번들하고, 해당 CR을 기반으로 정책을 빌드하며, 라벨 바인딩 규칙을 사용하여 정책을 클러스터와 연결합니다.
GitOps ZTP 컨테이너에서 얻은 참조 구성은 클러스터가 RAN(Radio Access Network) 분산 장치(DU) 애플리케이션의 일반적인 성능 및 리소스 사용률 제약 조건을 지원할 수 있도록 중요한 기능 및 노드 튜닝 설정 세트를 제공하도록 설계되었습니다. 기본 구성의 변경 또는 누락은 기능 가용성, 성능 및 리소스 사용률에 영향을 미칠 수 있습니다. 참조 PolicyGenTemplate CR을 기반으로 사용하여 특정 사이트 요구 사항에 맞게 구성 파일의 계층을 생성합니다.
RAN DU 클러스터 구성에 대해 정의된 기준의 PolicyGenTemplate CR은 GitOps ZTP ztp-site-generate 컨테이너에서 추출할 수 있습니다. 자세한 내용은 " GitOps ZTP 사이트 구성 리포지토리 준비"를 참조하십시오.
PolicyGenTemplate CR은 ./out/argocd/example/policygentemplates 폴더에 있습니다. 참조 아키텍처에는 공통, 그룹 및 사이트별 구성 CR이 있습니다. 각 PolicyGenTemplate CR은 ./out/source-crs 폴더에 있는 다른 CR을 나타냅니다.
아래에는 RAN 클러스터 구성과 관련된 PolicyGenTemplate CR에 대해 설명합니다. 변형은 단일 노드, 3 노드 컴팩트 및 표준 클러스터 구성의 차이를 설명하기 위해 PolicyGenTemplate CR 그룹에 제공됩니다. 마찬가지로 단일 노드 클러스터 및 다중 노드(영향 또는 표준) 클러스터에 사이트별 구성 변형이 제공됩니다. 배포와 관련된 그룹 및 사이트별 구성 변형을 사용합니다.
표 17.3. RAN 배포를 위한 PolicyGenTemplate CR
| PolicyGenTemplate CR | 설명 |
|---|---|
|
| 다중 노드 클러스터에 적용할 CR 세트가 포함되어 있습니다. 이러한 CR은 RAN 설치에 일반적인 SR-IOV 기능을 구성합니다. |
|
| 단일 노드 OpenShift 클러스터에 적용되는 CR 세트가 포함되어 있습니다. 이러한 CR은 RAN 설치에 일반적인 SR-IOV 기능을 구성합니다. |
|
| 모든 클러스터에 적용되는 공통 RAN CR 세트를 포함합니다. 이러한 CR은 RAN 및 기본 클러스터 튜닝에 일반적인 클러스터 기능을 제공하는 일련의 Operator를 구독합니다. |
|
| 3-노드 클러스터에 대한 RAN 정책만 포함합니다. |
|
| 단일 노드 클러스터에 대한 RAN 정책만 포함합니다. |
|
| 표준 세 개의 컨트롤 플레인 클러스터에 대한 RAN 정책을 포함합니다. |
|
|
3-노드 클러스터에 필요한 다양한 정책을 생성하는 데 사용되는 |
|
|
|
|
|
|
추가 리소스
17.4.4. PolicyGenTemplate CR을 사용하여 관리형 클러스터 사용자 정의
다음 절차에 따라 GitOps ZTP(ZTP) 파이프라인을 사용하여 프로비저닝하는 관리 클러스터에 적용되는 정책을 사용자 지정할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 필요한 설치 및 정책 CR을 생성하기 위해 hub 클러스터를 구성했습니다.
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성하셨습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
절차
사이트별 구성 CR에 대한
PolicyGenTemplateCR을 생성합니다.-
out/argocd/example/policygentemplates폴더(예:example-sno-site.yaml또는example-multinode-site.yaml)에서 CR에 대한 적절한 예를 선택합니다. 예제 파일의
바인딩Rules필드를 siteConfigCR에 포함된 사이트별 레이블과 일치하도록 변경합니다. 예제 siteConfig 파일에서 사이트별 레이블은sites: example-sno입니다.참고PolicyGenTemplatebindingRules필드에 정의된 레이블이 관련 관리 클러스터 siteConfigCR에 정의된 라벨과 일치하는지 확인합니다.- 예제 파일의 내용을 원하는 구성과 일치하도록 변경합니다.
-
선택 사항: 전체 클러스터에 적용되는 공통 구성 CR에 대해
PolicyGenTemplateCR을 생성합니다.-
out/argocd/example/policygentemplates폴더에 있는 CR에 대한 적절한 예를 선택합니다(예:common-ranGen.yaml). - 예제 파일의 내용을 원하는 구성과 일치하도록 변경합니다.
-
선택 사항: 플롯의 특정 클러스터 그룹에 적용되는 모든 그룹 구성 CR에 대해
PolicyGenTemplateCR을 생성합니다.overlaid 사양 파일의 콘텐츠가 원하는 최종 상태와 일치하는지 확인합니다. out/source-crs 디렉터리에는 PolicyGenTemplate 템플릿에서 포함 및 덮어쓸 수 있는 source-crs의 전체 목록이 포함되어 있습니다.
참고클러스터의 특정 요구 사항에 따라 클러스터 유형당 단일 그룹 정책이 필요할 수 있습니다. 특히 예제 그룹 정책에는 동일한 하드웨어 구성으로 구성된 클러스터 세트에서만 공유할 수 있는 단일 PerformancePolicy.yaml 파일이 있습니다.
-
out/argocd/example/policygentemplates폴더(예:group-du-sno-ranGen.yaml)에서 CR에 대한 적절한 예를 선택합니다. - 예제 파일의 내용을 원하는 구성과 일치하도록 변경합니다.
-
-
선택 사항: 배포된 클러스터의 GitOps ZTP 설치 및 구성이 완료되면 알림 정책
PolicyGenTemplateCR을 생성합니다. 자세한 내용은 "Create a validator inform policy"를 참조하십시오. 예제
out/argocd/example/policygentemplates/ns.yaml파일과 유사한 YAML 파일에 모든 정책 네임스페이스를 정의합니다.중요PolicyGenTemplateCR을 사용하여 동일한 파일에NamespaceCR을 포함하지 마십시오.-
out/argocd/example/policygentemplates/에 표시된 예제와 유사한 generators 섹션의 kustomization.yaml 파일에kustomization.yamlPolicyGenTemplateCR 및NamespaceCR을 추가합니다. Git 리포지토리에
PolicyGenTemplateCR,네임 스페이스CR 및 관련kustomization.yaml파일을 커밋하고 변경 사항을 내보냅니다.ArgoCD 파이프라인은 변경 사항을 감지하고 관리형 클러스터 배포를 시작합니다. 변경 사항을 site
ConfigCR 및PolicyGenTemplateCR에 동시에 푸시할 수 있습니다.
17.4.5. 관리형 클러스터 정책 배포 진행 상황 모니터링
ArgoCD 파이프라인은 Git에서 PolicyGenTemplate CR을 사용하여 RHACM 정책을 생성한 다음 hub 클러스터에 동기화합니다. 지원 서비스가 관리형 클러스터에 OpenShift Container Platform을 설치한 후 관리형 클러스터 정책 동기화의 진행 상황을 모니터링할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
TALM(토폴로지 라이프사이클 관리자)은 클러스터에 바인딩된 구성 정책을 적용합니다.
클러스터 설치가 완료되고 클러스터가
Ready상태가 되면 이 클러스터에 해당하는ClusterGroupUpgradeCR이 되며,ran.openshift.io/ztp-deploy-ECDHE 주석에의해 정의된 정렬된 정책 목록이 TALM에 의해 자동으로 생성됩니다. 클러스터 정책은ClusterGroupUpgradeCR에 나열된 순서대로 적용됩니다.다음 명령을 사용하여 구성 정책 조정의 상위 수준 진행 상황을 모니터링할 수 있습니다.
$ export CLUSTER=<clusterName>
$ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[-1:]}' | jq출력 예
{ "lastTransitionTime": "2022-11-09T07:28:09Z", "message": "Remediating non-compliant policies", "reason": "InProgress", "status": "True", "type": "Progressing" }RHACM 대시보드 또는 명령줄을 사용하여 자세한 클러스터 정책 준수 상태를 모니터링할 수 있습니다.
oc를 사용하여 정책 준수를 확인하려면 다음 명령을 실행합니다.$ oc get policies -n $CLUSTER
출력 예
NAME REMEDIATION ACTION COMPLIANCE STATE AGE ztp-common.common-config-policy inform Compliant 3h42m ztp-common.common-subscriptions-policy inform NonCompliant 3h42m ztp-group.group-du-sno-config-policy inform NonCompliant 3h42m ztp-group.group-du-sno-validator-du-policy inform NonCompliant 3h42m ztp-install.example1-common-config-policy-pjz9s enforce Compliant 167m ztp-install.example1-common-subscriptions-policy-zzd9k enforce NonCompliant 164m ztp-site.example1-config-policy inform NonCompliant 3h42m ztp-site.example1-perf-policy inform NonCompliant 3h42m
RHACM 웹 콘솔에서 정책 상태를 확인하려면 다음 작업을 수행합니다.
- 관리 → 정책 찾기를 클릭합니다.
- 클러스터 정책을 클릭하여 상태를 확인합니다.
모든 클러스터 정책이 호환되면 GitOps ZTP 설치 및 클러스터에 대한 구성이 완료됩니다. ztp-done 레이블이 클러스터에 추가되었습니다.
참조 구성에서 준수되는 최종 정책은 *-du-validator-policy 정책에 정의된 정책입니다. 이 정책은 클러스터를 준수할 때 모든 클러스터 구성, Operator 설치 및 Operator 설정이 완료되었는지 확인합니다.
17.4.6. 구성 정책 CR 생성 검증
정책 사용자 정의 리소스(CR)는 이들이 생성되는 PolicyGenTemplate 과 동일한 네임스페이스에 생성됩니다. 다음 명령을 사용하여 표시된 대로 동일한 문제 해결 흐름은 ztp-common,ztp-group 또는 ztp-site 기반 여부에 관계없이 PolicyGenTemplate 에서 생성된 모든 정책 CR에 적용됩니다.
$ export NS=<namespace>
$ oc get policy -n $NS
예상되는 정책 래핑된 CR 세트가 표시되어야 합니다.
정책이 동기화에 실패한 경우 다음 문제 해결 단계를 사용하십시오.
절차
정책에 대한 자세한 정보를 표시하려면 다음 명령을 실행합니다.
$ oc describe -n openshift-gitops application policies
오류 로그를 표시하려면
Status: Conditions:를 확인합니다. 예를 들어 잘못된sourceFileECDHEfileName을 설정하면 아래와 같은 오류가 생성됩니다.Status: Conditions: Last Transition Time: 2021-11-26T17:21:39Z Message: rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/policies/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not find test.yaml under source-crs/: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-52463179; exit status 1: exit status 1 Type: ComparisonErrorStatus: Sync:.Status: Conditions:에 로그 오류가 있는 경우Status: Sync:showUnknown또는Error:를 표시합니다.Status: Sync: Compared To: Destination: Namespace: policies-sub Server: https://kubernetes.default.svc Source: Path: policies Repo URL: https://git.com/ran-sites/policies/.git Target Revision: master Status: ErrorRHACM(Red Hat Advanced Cluster Management)에서 정책이
ManagedCluster오브젝트에 적용되는 것을 인식하면 정책 CR 오브젝트가 클러스터 네임스페이스에 적용됩니다. 정책이 클러스터 네임스페이스에 복사되었는지 확인합니다.$ oc get policy -n $CLUSTER
출력 예:
NAME REMEDIATION ACTION COMPLIANCE STATE AGE ztp-common.common-config-policy inform Compliant 13d ztp-common.common-subscriptions-policy inform Compliant 13d ztp-group.group-du-sno-config-policy inform Compliant 13d Ztp-group.group-du-sno-validator-du-policy inform Compliant 13d ztp-site.example-sno-config-policy inform Compliant 13d
RHACM은 적용 가능한 모든 정책을 클러스터 네임스페이스에 복사합니다. 복사된 정책 이름에는 <policy
GenTemplate.Namespace>.<policyGenTemplate.Name>-<policyName> 포멧이 있습니다.클러스터 네임스페이스에 복사되지 않은 정책에 대한 배치 규칙을 확인합니다. 해당 정책에 대한
PlacementRule의matchSelector는ManagedCluster오브젝트의 라벨과 일치해야 합니다.$ oc get placementrule -n $NS
다음 명령을 사용하여 누락된 정책, 공통, 그룹 또는 사이트에 적합한
PlacementRule이름을 기록해 둡니다.$ oc get placementrule -n $NS <placementRuleName> -o yaml
- status-decisions에는 클러스터 이름이 포함되어야 합니다.
-
사양에 있는
matchSelector의 키-값 쌍은 관리 클러스터의 라벨과 일치해야 합니다.
다음 명령을 사용하여
ManagedCluster오브젝트의 라벨을 확인합니다.$ oc get ManagedCluster $CLUSTER -o jsonpath='{.metadata.labels}' | jq다음 명령을 사용하여 호환되는 정책을 확인하십시오.
$ oc get policy -n $CLUSTER
Namespace,OperatorGroup,Subscription정책이 준수하지만 Operator 구성 정책이 일치하지 않으면 Operator가 관리 클러스터에 설치되지 않은 것입니다. 이로 인해 CRD가 아직 스포크에 적용되지 않기 때문에 Operator 구성 정책이 적용되지 않습니다.
17.4.7. 정책 조정 다시 시작
예를 들어 ClusterGroupUpgrade CR(사용자 정의 리소스)이 시간 초과된 경우 예기치 않은 규정 준수 문제가 발생하면 정책 조정을 다시 시작할 수 있습니다.
절차
관리형 클러스터가
Ready가 되면 Topology Aware Lifecycle Manager의ztp-install네임스페이스에ClusterGroupUpgradeCR이 생성됩니다.$ export CLUSTER=<clusterName>
$ oc get clustergroupupgrades -n ztp-install $CLUSTER
예기치 않은 문제가 있고 정책이 구성된 시간 내에 불만이 발생하지 않는 경우 (기본값은 4 시간)
ClusterGroupUpgradeCR의 상태에UpgradeTimedOut이 표시됩니다.$ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'UpgradeTimedOut상태의ClusterGroupUpgradeCR은 매시간마다 정책 조정을 자동으로 다시 시작합니다. 정책을 변경한 경우 기존ClusterGroupUpgradeCR을 삭제하여 즉시 재시도를 시작할 수 있습니다. 이렇게 하면 정책을 즉시 조정하기 시작하는 새ClusterGroupUpgradeCR의 자동 생성이 트리거됩니다.$ oc delete clustergroupupgrades -n ztp-install $CLUSTER
ClusterGroupUpgrade CR이 UpgradeCompleted 상태로 완료되고 관리 클러스터에 ztp-done 레이블이 적용된 경우 PolicyGenTemplate 을 사용하여 추가 구성을 변경할 수 있습니다. 기존 ClusterGroupUpgrade CR을 삭제하면 TALM이 새 CR이 생성되지 않습니다.
이 시점에서 GitOps ZTP는 클러스터와의 상호 작용을 완료하고 정책 수정을 위해 생성된 새로운 ClusterGroupUpgrade CR과 추가 상호 작용을 업데이트로 처리해야 합니다.
추가 리소스
-
자체
ClusterGroupUpgradeCR을 구성하기 위해 토폴로지 Aware Lifecycle Manager(TALM)를 사용하는 방법에 대한 자세한 내용은 ClusterGroupUpgrade CR 정보를 참조하십시오.
17.4.8. GitOps ZTP 설치에 대한 완료 표시
GTP(HITOP Zero CloudEvent Provisioning)는 클러스터에 대한 GitOps ZTP 설치 상태를 확인하는 프로세스를 단순화합니다. GitOps ZTP 상태는 클러스터 설치, 클러스터 구성 및 GitOps ZTP의 세 단계로 이동합니다.
- 클러스터 설치 단계
-
클러스터 설치 단계는
ManagedClusterCR의ManagedCluster join및ManagedClusterAvailable조건에 의해 표시됩니다.ManagedClusterCR에 이러한 조건이 없거나 조건이False로 설정된 경우 클러스터는 여전히 설치 단계에 있습니다. 설치에 대한 자세한 내용은AgentClusterInstall및ClusterDeploymentCR에서 확인할 수 있습니다. 자세한 내용은 "Troubleshooting GitOps ZTP"를 참조하십시오. - 클러스터 구성 단계
-
클러스터 구성 단계는
ztp-running라벨에 클러스터의ManagedClusterCR을 적용한 것으로 표시됩니다. - GitOps ZTP done
클러스터 설치 및 구성은 GitOps ZTP 완료 단계에서 완료됩니다. 이는
ztp-running레이블을 제거하고ManagedClusterCR에ztp-done레이블을 추가하여 표시됩니다.ztp-done레이블은 구성이 적용되고 기본 DU 구성이 클러스터 튜닝을 완료했음을 보여줍니다.GitOps ZTP done 상태로 전환은 RHACM(Red Hat Advanced Cluster Management) 검증기 정보 정책의 준수 상태에 조건에 해당합니다. 이 정책은 완료된 설치에 대한 기존 기준을 캡처하고 관리 클러스터의 GitOps ZTP 프로비저닝이 완료된 경우에만 규정 준수 상태로 이동하는지 검증합니다.
유효성 검사기 알림 정책은 클러스터의 구성이 완전히 적용되고 Operator가 초기화를 완료했는지 확인합니다. 정책은 다음을 검증합니다.
-
대상
MachineConfigPool에는 예상 항목이 포함되어 있으며 업데이트가 완료되었습니다. 모든 노드를 사용할 수 있으며 성능이 저하되지 않습니다. -
SR-IOV Operator는
syncStatus: Succeeded와 함께 하나 이상의SriovNetworkNodeState에 표시된 대로 초기화를 완료했습니다. - PTP Operator 데몬 세트가 있습니다.
-
대상
17.5. ZTP로 단일 노드 OpenShift 클러스터 수동 설치
RHACM(Red Hat Advanced Cluster Management) 및 지원 서비스를 사용하여 관리형 단일 노드 OpenShift 클러스터를 배포할 수 있습니다.
여러 개의 관리형 클러스터를 생성하는 경우 ZTP와 함께 far edge 사이트 배포에 설명된 site Config 방법을 사용합니다.
대상 베어 메탈 호스트는 vDU 애플리케이션 워크로드에 대한 권장 클러스터 구성에 나열된 네트워킹, 펌웨어 및 하드웨어 요구 사항을 충족해야 합니다.
17.5.1. 수동으로 GitOps ZTP 설치 및 구성 CR 생성
ztp-site-generate 컨테이너의 생성기 진입점을 사용하여 site Config 및 PolicyGenTemplate CR을 기반으로 클러스터의 사이트 설치 및 구성 CR(사용자 정의 리소스)을 생성합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
절차
다음 명령을 실행하여 출력 폴더를 생성합니다.
$ mkdir -p ./out
ztp-site-generate컨테이너 이미지에서argocd디렉터리를 내보냅니다.$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13 extract /home/ztp --tar | tar x -C ./out
./out디렉터리에는out/argocd/example/폴더에 참조PolicyGenTemplate및SiteConfigCR이 있습니다.출력 예
out └── argocd └── example ├── policygentemplates │ ├── common-ranGen.yaml │ ├── example-sno-site.yaml │ ├── group-du-sno-ranGen.yaml │ ├── group-du-sno-validator-ranGen.yaml │ ├── kustomization.yaml │ └── ns.yaml └── siteconfig ├── example-sno.yaml ├── KlusterletAddonConfigOverride.yaml └── kustomization.yaml사이트 설치 CR의 출력 폴더를 생성합니다.
$ mkdir -p ./site-install
설치하려는 클러스터 유형의
SiteConfigCR 예제를 수정합니다.example-sno.yaml을site-1-sno.yaml에 복사하고 CR을 수정하여 설치하려는 사이트 및 베어 메탈 호스트의 세부 정보와 일치하도록 수정합니다.단일 노드 OpenShift 클러스터 siteConfig CR의 예
apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "<site_name>" namespace: "<site_name>" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" 1 clusterImageSetNameRef: "openshift-4.13" 2 sshPublicKey: "ssh-rsa AAAA..." 3 clusters: - clusterName: "<site_name>" networkType: "OVNKubernetes" clusterLabels: 4 common: true group-du-sno: "" sites : "<site_name>" clusterNetwork: - cidr: 1001:1::/48 hostPrefix: 64 machineNetwork: - cidr: 1111:2222:3333:4444::/64 serviceNetwork: - 1001:2::/112 additionalNTPSources: - 1111:2222:3333:4444::2 #crTemplates: # KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5 nodes: - hostName: "example-node.example.com" 6 role: "master" bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7 bmcCredentialsName: name: "bmh-secret" 8 bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" 9 rootDeviceHints: 10 wwn: "0x11111000000asd123" cpuset: "0-1,52-53" 11 nodeNetwork: 12 interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up ipv4: enabled: false ipv6: 13 enabled: true address: - ip: 1111:2222:3333:4444::aaaa:1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254- 1
- site
Config CR과 동일한 네임스페이스를 사용하여을 생성합니다.assisted-deployment-pull-secretCR - 2
clusterImageSetNameRef는 hub 클러스터에서 사용 가능한 이미지 세트를 정의합니다. hub 클러스터에서 지원되는 버전 목록을 보려면oc get clusterimagesets를 실행합니다.- 3
- 클러스터에 액세스하는 데 사용되는 SSH 공개 키를 구성합니다.
- 4
- 클러스터 레이블은 사용자가 정의한
PolicyGenTemplateCR의bindingRules필드에 대응해야 합니다. 예를 들어policygentemplates/common-ranGen.yaml은common: trueset,policygentemplates/group-du-sno-ranGen.yaml이group-du-sno: ""가 설정된 모든 클러스터에 적용됩니다. - 5
- 선택 사항:
KlusterletAddonConfig아래에 있는 CR 사양을 사용하여 클러스터에 대해 생성된 기본KlusterletAddonConfig를 덮어씁니다. - 6
- 단일 노드 배포의 경우 단일 호스트를 정의합니다. 3-노드 배포의 경우 3개의 호스트를 정의합니다. 표준 배포의 경우
master와 role으로 정의된 두 개 이상의 호스트인worker를 사용하여 세 개의 호스트를 정의합니다. - 7
- 호스트에 액세스하는 데 사용하는 BMC 주소입니다. 모든 클러스터 유형에 적용됩니다. GitOps ZTP는 Redfish 또는 IPMI 프로토콜을 사용하여 iPXE 및 가상 미디어 부팅을 지원합니다. iPXE 부팅을 사용하려면 RHACM 2.8 이상을 사용해야 합니다. BMC 주소 지정에 대한 자세한 내용은 추가 리소스 섹션을 참조하십시오.
- 8
- 호스트 BMC 자격 증명을 사용하여 별도로 생성하는
bmh-secretCR의 이름입니다.bmh-secretCR을 생성할 때 호스트를 프로비저닝하는 siteConfig CR과 동일한 네임스페이스를 사용합니다. - 9
- 호스트의 부팅 모드를 구성합니다. 기본값은
UEFI입니다.UEFISecureBoot를 사용하여 호스트에서 보안 부팅을 활성화합니다. - 10
- 배포 장치를 지정합니다. 재부팅 후에도 안정적인 식별자가 권장됩니다(예
: <disk_wwn> 또는). 안정적인 식별자의 자세한 목록은 About root device hints 섹션을 참조하십시오.deviceName: /dev/disk/by-path/<device_path> - 11
cpuset는 워크로드 파티셔닝을 위해 클러스터PerformanceProfileCRspec.cpu.reserved필드에 설정된 값과 일치해야 합니다.- 12
- 노드의 네트워크 설정을 지정합니다.
- 13
- 호스트의 IPv6 주소를 구성합니다. 고정 IP 주소가 있는 단일 노드 OpenShift 클러스터의 경우 노드별 API 및 Ingress IP가 동일해야 합니다.
다음 명령을 실행하여 수정된 site
ConfigCRsite-1-sno.yaml을 처리하여 day-0 설치 CR을 생성합니다.$ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-install:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13.1 generator install site-1-sno.yaml /output
출력 예
site-install └── site-1-sno ├── site-1_agentclusterinstall_example-sno.yaml ├── site-1-sno_baremetalhost_example-node1.example.com.yaml ├── site-1-sno_clusterdeployment_example-sno.yaml ├── site-1-sno_configmap_example-sno.yaml ├── site-1-sno_infraenv_example-sno.yaml ├── site-1-sno_klusterletaddonconfig_example-sno.yaml ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml ├── site-1-sno_managedcluster_example-sno.yaml ├── site-1-sno_namespace_example-sno.yaml └── site-1-sno_nmstateconfig_example-node1.example.com.yaml선택 사항:
-E옵션을 사용하여 참조 siteConfigCR을 처리하여 특정 클러스터 유형의 Day-0MachineConfig설치 CR만 생성합니다. 예를 들어 다음 명령을 실행합니다.MachineConfigCR의 출력 폴더를 생성합니다.$ mkdir -p ./site-machineconfig
MachineConfig설치 CR을 생성합니다.$ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-machineconfig:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13.1 generator install -E site-1-sno.yaml /output
출력 예
site-machineconfig └── site-1-sno ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml └── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml
이전 단계의 참조를 사용하여 Day-2
구성 CR을 생성하고 내보냅니다. 다음 명령을 실행합니다.2일 차 CR의 출력 폴더를 생성합니다.
$ mkdir -p ./ref
Day-2 구성 CR을 생성하고 내보냅니다.
$ podman run -it --rm -v `pwd`/out/argocd/example/policygentemplates:/resources:Z -v `pwd`/ref:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13.1 generator config -N . /output
이 명령은 단일 노드 OpenShift, 3 노드 클러스터 및
./ref폴더에 표준 클러스터에 대한 예제 그룹 및 사이트별PolicyGenTemplateCR을 생성합니다.출력 예
ref └── customResource ├── common ├── example-multinode-site ├── example-sno ├── group-du-3node ├── group-du-3node-validator │ └── Multiple-validatorCRs ├── group-du-sno ├── group-du-sno-validator ├── group-du-standard └── group-du-standard-validator └── Multiple-validatorCRs
- 생성된 CR을 클러스터를 설치하는 데 사용하는 CR의 기준으로 사용합니다. "단일 관리 클러스터 설치"에 설명된 대로 hub 클러스터에 설치 CR을 적용합니다. 클러스터 설치가 완료된 후 구성 CR을 클러스터에 적용할 수 있습니다.
추가 리소스
17.5.2. 관리형 베어 메탈 호스트 시크릿 생성
관리 베어 메탈 호스트에 필요한 Secret CR(사용자 정의 리소스)을 hub 클러스터에 추가합니다. BMC(Baseboard Management Controller)에 액세스하려면 GTP(Baseboard Management Controller) 파이프라인과 지원 설치 관리자 서비스에 대한 시크릿이 레지스트리에서 클러스터 설치 이미지를 가져오는 데 필요한 secret이 필요합니다.
보안은 이름으로 site Config CR 에서 참조됩니다. 네임스페이스는 site Config 네임스페이스와 일치해야 합니다.
절차
OpenShift 및 모든 애드온 클러스터 Operator를 설치하는 데 필요한 BMC(Host Baseboard Management Controller) 및 풀 시크릿(pull secret)의 인증 정보가 포함된 YAML 시크릿 파일을 생성합니다.
다음 YAML을
example-sno-secret.yaml파일로 저장합니다.apiVersion: v1 kind: Secret metadata: name: example-sno-bmc-secret namespace: example-sno 1 data: 2 password: <base64_password> username: <base64_username> type: Opaque --- apiVersion: v1 kind: Secret metadata: name: pull-secret namespace: example-sno 3 data: .dockerconfigjson: <pull_secret> 4 type: kubernetes.io/dockerconfigjson
-
클러스터를 설치하는 데 사용하는
kustomization.yaml파일에 상대 경로를example-sno-secret.yaml에 추가합니다.
17.5.3. GitOps ZTP를 사용하여 수동 설치를 위한 Discovery ISO 커널 인수 구성
GitOps Zero 10.0.0.1 Provisioning (ZTP) 워크플로우는 관리 베어 메탈 호스트에서 OpenShift Container Platform 설치 프로세스의 일부로 Discovery ISO를 사용합니다. InfraEnv 리소스를 편집하여 Discovery ISO에 대한 커널 인수를 지정할 수 있습니다. 이는 특정 환경 요구 사항이 있는 클러스터 설치에 유용합니다. 예를 들어 Discovery ISO의 rd.net.timeout.carrier 커널 인수를 구성하여 클러스터의 정적 네트워킹을 용이하게 하거나 설치 중에 루트 파일 시스템을 다운로드하기 전에 DHCP 주소를 수신합니다.
OpenShift Container Platform 4.13에서는 커널 인수만 추가할 수 있습니다. 커널 인수를 교체하거나 삭제할 수 없습니다.
사전 요구 사항
- OpenShift CLI(oc)가 설치되어 있습니다.
- cluster-admin 권한이 있는 사용자로 hub 클러스터에 로그인했습니다.
- 수동으로 설치 및 구성 CR(사용자 정의 리소스)이 생성되어 있습니다.
절차
-
InfraEnvCR에서spec.kernelArguments사양을 편집하여 커널 인수를 구성합니다.
apiVersion: agent-install.openshift.io/v1beta1
kind: InfraEnv
metadata:
name: <cluster_name>
namespace: <cluster_name>
spec:
kernelArguments:
- operation: append 1
value: audit=0 2
- operation: append
value: trace=1
clusterRef:
name: <cluster_name>
namespace: <cluster_name>
pullSecretRef:
name: pull-secret
SiteConfig CR은 day-0 설치 CR의 일부로 InfraEnv 리소스를 생성합니다.
검증
커널 인수가 적용되었는지 확인하려면 Discovery 이미지가 OpenShift Container Platform을 설치할 준비가 되었는지 확인한 후 설치 프로세스를 시작하기 전에 대상 호스트에 SSH를 실행할 수 있습니다. 이 시점에서 /proc/cmdline 파일에서 Discovery ISO에 대한 커널 인수를 볼 수 있습니다.
대상 호스트로 SSH 세션을 시작합니다.
$ ssh -i /path/to/privatekey core@<host_name>
다음 명령을 사용하여 시스템의 커널 인수를 확인합니다.
$ cat /proc/cmdline
17.5.4. 단일 관리형 클러스터 설치
지원 서비스 및 RHACM(Red Hat Advanced Cluster Management)을 사용하여 단일 관리 클러스터를 수동으로 배포할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. -
베이스 보드 관리 컨트롤러 (BMC)
Secret및 이미지 pull-secretSecret(CR)을 생성했습니다. 자세한 내용은 "관리된 베어 메탈 호스트 시크릿 생성"을 참조하십시오. - 대상 베어 메탈 호스트는 관리 클러스터의 네트워킹 및 하드웨어 요구 사항을 충족합니다.
절차
배포할 각 특정 클러스터 버전에 대한
ClusterImageSet을 생성합니다(예:clusterImageSet-4.13.yaml).ClusterImageSet의 형식은 다음과 같습니다.apiVersion: hive.openshift.io/v1 kind: ClusterImageSet metadata: name: openshift-4.13.0 1 spec: releaseImage: quay.io/openshift-release-dev/ocp-release:4.13.0-x86_64 2
clusterImageSetCR을 적용합니다.$ oc apply -f clusterImageSet-4.13.yaml
cluster-namespace.yaml파일에NamespaceCR을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: <cluster_name> 1 labels: name: <cluster_name> 2다음 명령을 실행하여
NamespaceCR을 적용합니다.$ oc apply -f cluster-namespace.yaml
ztp-site-generate컨테이너에서 추출하고 요구 사항을 충족하도록 사용자 정의된 생성된 day-0 CR을 적용합니다.$ oc apply -R ./site-install/site-sno-1
17.5.5. 관리형 클러스터 설치 상태 모니터링
클러스터 상태를 확인하여 클러스터 프로비저닝에 성공했는지 확인합니다.
사전 요구 사항
-
모든 사용자 정의 리소스가 구성 및 프로비저닝되고, 관리 클러스터의 허브에
에이전트사용자 정의 리소스가 생성됩니다.
절차
관리 클러스터의 상태를 확인합니다.
$ oc get managedcluster
true는 관리형 클러스터가 준비되었음을 나타냅니다.에이전트 상태를 확인합니다.
$ oc get agent -n <cluster_name>
describe명령을 사용하여 에이전트 상태에 대한 자세한 설명을 제공합니다. 알 수 있는 상태에는BackendError,InputError,ValidationsFailing,InstallationFailed,AgentIsConnected가 포함됩니다. 이러한 상태는 에이전트 및사용자 정의 리소스와 관련이 있습니다.AgentClusterInstall$ oc describe agent -n <cluster_name>
클러스터 프로비저닝 상태를 확인합니다.
$ oc get agentclusterinstall -n <cluster_name>
describe명령을 사용하여 클러스터 프로비저닝 상태에 대한 자세한 설명을 제공합니다.$ oc describe agentclusterinstall -n <cluster_name>
관리 클러스터의 애드온 서비스의 상태를 확인합니다.
$ oc get managedclusteraddon -n <cluster_name>
관리형 클러스터에 대한
kubeconfig파일의 인증 정보를 검색합니다.$ oc get secret -n <cluster_name> <cluster_name>-admin-kubeconfig -o jsonpath={.data.kubeconfig} | base64 -d > <directory>/<cluster_name>-kubeconfig
17.5.6. 관리형 클러스터 문제 해결
관리 클러스터에서 발생할 수 있는 설치 문제를 진단하려면 다음 절차를 사용하십시오.
절차
관리 클러스터의 상태를 확인합니다.
$ oc get managedcluster
출력 예
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE SNO-cluster true True True 2d19h
AVAILABLE열의 상태가True이면 관리 클러스터가 hub에 의해 관리됩니다.AVAILABLE열의 상태가Unknown인 경우 관리 클러스터가 hub에 의해 관리되지 않습니다. 자세한 정보를 얻으려면 계속 확인하려면 다음 단계를 사용하십시오.AgentClusterInstall설치 상태를 확인합니다.$ oc get clusterdeployment -n <cluster_name>
출력 예
NAME PLATFORM REGION CLUSTERTYPE INSTALLED INFRAID VERSION POWERSTATE AGE Sno0026 agent-baremetal false Initialized 2d14h
INSTALLED열의 상태가false인 경우 설치에 실패했습니다.설치에 실패한 경우 다음 명령을 입력하여
AgentClusterInstall리소스의 상태를 검토합니다.$ oc describe agentclusterinstall -n <cluster_name> <cluster_name>
오류를 해결하고 클러스터를 재설정합니다.
클러스터의 관리 클러스터 리소스를 제거합니다.
$ oc delete managedcluster <cluster_name>
클러스터의 네임스페이스를 제거합니다.
$ oc delete namespace <cluster_name>
이렇게 하면 이 클러스터에 대해 생성된 모든 네임스페이스 범위의 사용자 정의 리소스가 삭제됩니다. 진행하기 전에
ManagedClusterCR 삭제가 완료될 때까지 기다려야 합니다.- 관리 클러스터에 대한 사용자 정의 리소스를 다시 생성합니다.
17.5.7. RHACM 생성 클러스터 설치 CR 참조
RHACM(Red Hat Advanced Cluster Management)은 각 사이트에 대해 site Config CR을 사용하여 생성하는 특정 설치 사용자 정의 리소스(CR) 세트가 있는 단일 노드 클러스터, 3-노드 클러스터, 표준 클러스터 배포를 지원합니다.
모든 관리형 클러스터에는 고유한 네임스페이스가 있으며 ManagedCluster 및 ClusterImageSet 을 제외한 모든 설치 CR이 해당 네임스페이스에 있습니다. ManagedCluster 및 ClusterImageSet 은 네임스페이스 범위가 아닌 cluster-scoped입니다. 네임스페이스 및 CR 이름은 클러스터 이름과 일치합니다.
다음 표에는 구성하는 site Config CR을 사용하여 클러스터를 설치할 때 RHACM 지원 서비스에서 자동으로 적용하는 설치 CR이 나열되어 있습니다.
표 17.4. RHACM에서 생성한 클러스터 설치 CR
| CR | 설명 | 사용법 |
|---|---|---|
|
| 대상 베어 메탈 호스트의 BMC(Baseboard Management Controller)에 대한 연결 정보를 포함합니다. | BMC에 액세스하여 대상 서버에서 검색 이미지를 로드하고 시작합니다. GitOps ZTP(ZTP)는 Redfish 또는 IPMI 프로토콜을 사용하여 iPXE 및 가상 미디어 부팅을 지원합니다. iPXE 부팅을 사용하려면 RHACM 2.8 이상을 사용해야 합니다. |
|
| 대상 베어 메탈 호스트에 OpenShift Container Platform을 설치하는 데 필요한 정보를 포함합니다. |
|
|
|
네트워킹 및 컨트롤 플레인 노드 수와 같은 관리 클러스터 구성의 세부 정보를 지정합니다. 설치가 완료되면 클러스터 | 클러스터 설치 중에 관리되는 클러스터 구성 정보를 지정하고 상태를 제공합니다. |
|
|
사용할 |
|
|
|
| 관리형 클러스터의 Kube API 서버의 고정 IP 주소를 설정합니다. |
|
| 대상 베어 메탈 호스트에 대한 하드웨어 정보를 포함합니다. | 대상 시스템의 검색 이미지가 부팅될 때 허브에서 자동으로 생성됩니다. |
|
| 허브에서 클러스터를 관리하는 경우 가져와서 알아야 합니다. 이 Kubernetes 오브젝트는 해당 인터페이스를 제공합니다. | hub는 이 리소스를 사용하여 관리되는 클러스터의 상태를 관리하고 표시합니다. |
|
|
|
|
|
|
허브에 있는 |
리소스를 |
|
|
|
|
|
| 리포지토리 및 이미지 이름과 같은 OpenShift Container Platform 이미지 정보를 포함합니다. | OpenShift Container Platform 이미지를 제공하기 위해 리소스에 전달됩니다. |
17.6. vDU 애플리케이션 워크로드에 권장되는 단일 노드 OpenShift 클러스터 구성
다음 참조 정보를 사용하여 클러스터에서 vDU(가상 분산 단위) 애플리케이션을 배포하는 데 필요한 단일 노드 OpenShift 구성을 파악합니다. 구성에는 고성능 워크로드에 대한 클러스터 최적화, 워크로드 파티셔닝 활성화 및 설치 후 필요한 재부팅 수를 최소화할 수 있습니다.
추가 리소스
- 단일 클러스터를 직접 배포하려면 GitOps ZTP를 사용하여 단일 노드 OpenShift 클러스터 설치를 참조하십시오.
- GitOps ZeroForwarded Provisioning (ZTP)을 사용하여 클러스터를 배포하려면 GitOps ZTP로 멀리 있는 에지 사이트 배포를 참조하십시오.
17.6.1. OpenShift Container Platform에서 짧은 대기 시간 애플리케이션 실행
OpenShift Container Platform을 사용하면 다음과 같은 여러 기술 및 특수 하드웨어 장치를 사용하여 COTS(상용 장치) 하드웨어에서 실행되는 애플리케이션의 대기 시간을 단축할 수 있습니다.
- RHCOS용 실시간 커널
- 워크로드를 높은 수준의 프로세스 결정성으로 처리하도록 합니다.
- CPU 격리
- CPU 스케줄링 지연을 방지하고 CPU 용량을 일관되게 사용할 수 있도록 합니다.
- NUMA 인식 토폴로지 관리
- CPU 및 PCI 장치와 메모리 및 대규모 페이지를 조정하여 보장된 컨테이너 메모리 및 대규모 페이지를 NUMA(Non-Uniform Memory Access) 노드에 고정합니다. 모든 QoS(Quality of Service) 클래스에 대한 Pod 리소스는 동일한 NUMA 노드에 남아 있습니다. 이렇게 하면 대기 시간이 줄어들고 노드의 성능이 향상됩니다.
- 대규모 페이지 메모리 관리
- 대규모 페이지 크기를 사용하면 페이지 테이블에 액세스하는 데 필요한 시스템 리소스의 양을 줄임으로써 시스템 성능이 향상됩니다.
- PTP를 사용한 정밀 타이밍 동기화
- 하마이크로초 단위의 네트워크 노드 간 동기화를 허용합니다.
17.6.2. vDU 애플리케이션 워크로드에 대한 권장되는 클러스터 호스트 요구 사항
vDU 애플리케이션 워크로드를 실행하려면 OpenShift Container Platform 서비스 및 프로덕션 워크로드를 실행하기에 충분한 리소스가 있는 베어 메탈 호스트가 필요합니다.
표 17.5. 최소 리소스 요구사항
| 프로필 | vCPU | 메모리 | 스토리지 |
|---|---|---|---|
| 최소 | 4개에서 8개의 vCPU 코어 | 32GB RAM | 120GB |
SMT(동시 멀티 스레딩) 또는 Hyper-Threading이 활성화되지 않은 경우 하나의 vCPU는 하나의 물리적 코어와 동일합니다. 사용 가능한 경우 다음 공식을 사용하여 해당 비율을 계산합니다.
- (threads per core × cores) × sockets = vCPUs
가상 미디어를 사용하여 부팅할 때 서버에 BMC(Baseboard Management Controller)가 있어야 합니다.
17.6.3. 짧은 대기 시간과 고성능을 위해 호스트 펌웨어 구성
베어 메탈 호스트를 사용하려면 호스트를 프로비저닝하기 전에 펌웨어를 구성해야 합니다. 펌웨어 구성은 특정 하드웨어 및 설치 요구 사항에 따라 다릅니다.
절차
-
UEFI/BIOS 부팅 모드를
UEFI로 설정합니다. - 호스트 부팅 순서에서 먼저 하드 드라이브를 설정합니다.
하드웨어에 대한 특정 펌웨어 구성을 적용합니다. 다음 표에서는 Intel Xeon Skylake 또는 Intel Cascade Lake 서버에 대한 대표 펌웨어 구성을 설명합니다. 이는 IntelECDHERAN 4G 및 5G 베이스bandECDHEY 참조 설계를 기반으로 합니다.
중요정확한 펌웨어 구성은 특정 하드웨어 및 네트워크 요구 사항에 따라 다릅니다. 다음 샘플 구성은 전용입니다.
표 17.6. Intel Xeon Skylake 또는 Cascade Lake 서버의 펌웨어 구성 샘플
펌웨어 설정 설정 CPU 성능 및 성능 정책
성능
Uncore Frequency Scaling
disabled
성능 P-limit
disabled
Intel SpeedStep ® Tech
enabled
Intel Configurable TDP
enabled
구성 가능한 TDP 수준
수준 2
Intel®ECDHE Boost Technology
enabled
에너지 효율 (Efficient)
disabled
하드웨어 P-States
disabled
패키지 C-State
C0/C1 상태
C1E
disabled
프로세서 C6
disabled
호스트의 펌웨어에서 글로벌 SR-IOV 및 VT-d 설정을 활성화합니다. 이러한 설정은 베어 메탈 환경과 관련이 있습니다.
17.6.4. 관리형 클러스터 네트워크에 대한 연결 사전 요구 사항
GitOps Zero 10.0.0.1 Provisioning (ZTP) 파이프라인을 사용하여 관리 클러스터를 설치하고 프로비저닝하려면 먼저 관리 클러스터 호스트가 다음 네트워킹 사전 요구 사항을 충족해야 합니다.
- 허브 클러스터의 GitOps ZTP 컨테이너와 대상 베어 메탈 호스트의 BMC(Baseboard Management Controller) 간에 양방향 연결이 있어야 합니다.
관리 클러스터는 hub hostname 및
*.apps호스트 이름의 API 호스트 이름을 확인하고 도달할 수 있어야 합니다. 다음은 허브의 API 호스트 이름과*.apps호스트 이름의 예입니다.-
api.hub-cluster.internal.domain.com -
console-openshift-console.apps.hub-cluster.internal.domain.com
-
hub 클러스터는 관리형 클러스터의 API 및
*.apps호스트 이름을 확인하고 도달할 수 있어야 합니다. 다음은 관리형 클러스터의 API 호스트 이름과*.apps호스트 이름의 예입니다.-
api.sno-managed-cluster-1.internal.domain.com -
console-openshift-console.apps.sno-managed-cluster-1.internal.domain.com
-
17.6.5. GitOps ZTP를 사용한 단일 노드 OpenShift의 워크로드 파티셔닝
워크로드 파티셔닝에서는 예약된 수의 호스트 CPU에서 실행되도록 OpenShift Container Platform 서비스, 클러스터 관리 워크로드 및 인프라 Pod를 구성합니다.
GitOps Zero 10.0.0.1 Provisioning (ZTP)으로 워크로드 분할을 구성하려면 PolicyGenTemplate CR의 reserved 필드인 SiteConfig CR(사용자 정의 리소스) 및 reserved 필드를 사용하여 클러스터 관리 CPU 리소스를 지정합니다. GitOps ZTP 파이프라인은 이러한 값을 사용하여 단일 노드 OpenShift 클러스터를 구성하는 워크로드 파티셔닝 MachineConfig CR(CPU세트) 및 PerformanceProfile CR(reserved)의 필수 필드를 채웁니다.
최대 성능의 경우 예약 된 CPU 세트와 분리된 CPU 세트가 NUMA 영역의 CPU 코어를 공유하지 않는지 확인합니다.
-
워크로드 파티셔닝
MachineConfigCR은 OpenShift Container Platform 인프라 Pod를 정의된cpuset구성에 고정합니다. -
PerformanceProfileCR은 systemd 서비스를 예약된 CPU에 고정합니다.
PerformanceProfile CR에 지정된 reserved 필드의 값은 워크로드 파티셔닝 MachineConfig CR의 cpuset 필드와 일치해야 합니다.
추가 리소스
- 권장되는 단일 노드 OpenShift 워크로드 파티션 구성은 워크로드 파티셔닝 을 참조하십시오.
17.6.6. 권장되는 설치 시간 클러스터 구성
ZTP 파이프라인은 클러스터 설치 중에 다음 CR(사용자 정의 리소스)을 적용합니다. 이러한 구성 CR은 클러스터가 vDU 애플리케이션 실행에 필요한 기능 및 성능 요구 사항을 충족하는지 확인합니다.
클러스터 배포에 GitOps ZTP 플러그인 및 SiteConfig CR을 사용하는 경우 기본적으로 다음 MachineConfig CR이 포함됩니다.
site Config extraManifests 필터를 사용하여 기본적으로 포함된 CR을 변경합니다. 자세한 내용은 site Config CR을 사용한 고급 관리 클러스터 구성을 참조하십시오.
17.6.6.1. 워크로드 파티셔닝
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 워크로드 분할이 필요합니다. 이렇게 하면 플랫폼 서비스를 실행할 수 있는 코어가 제한되어 애플리케이션 페이로드의 CPU 코어를 극대화할 수 있습니다.
워크로드 파티션은 클러스터 설치 중에만 활성화할 수 있습니다. 설치 후 워크로드 파티셔닝을 비활성화할 수 없습니다. 그러나 성능 프로필에 정의된 cpu 값과 관련 MachineConfig 사용자 정의 리소스(CR)를 업데이트하여 워크로드 파티션을 재구성할 수 있습니다.
워크로드 파티셔닝을 가능하게 하는 base64로 인코딩된 CR에는 관리 워크로드가 제한된 CPU 세트가 포함됩니다.
crio.conf및kubelet.conf의 호스트별 값을 base64로 인코딩합니다. 클러스터 성능 프로필에 지정된 CPU 세트와 일치하도록 콘텐츠를 조정합니다. 클러스터 호스트의 코어 수와 일치해야 합니다.권장되는 워크로드 파티션 구성
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 02-master-workload-partitioning spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMSw1Mi01MyIgfQo= mode: 420 overwrite: true path: /etc/crio/crio.conf.d/01-workload-partitioning user: name: root - contents: source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTEsNTItNTMiCiAgfQp9Cg== mode: 420 overwrite: true path: /etc/kubernetes/openshift-workload-pinning user: name: root
클러스터 호스트에 구성하면
/etc/crio/crio.conf.d/01-workload-partitioning의 내용은 다음과 같아야 합니다.[crio.runtime.workloads.management] activation_annotation = "target.workload.openshift.io/management" annotation_prefix = "resources.workload.openshift.io" resources = { "cpushares" = 0, "cpuset" = "0-1,52-53" } 1- 1
cpuset값은 설치에 따라 다릅니다. Hyper-Threading이 활성화된 경우 각 코어에 대해 두 스레드를 모두 지정합니다.cpuset값은 성능 프로필의spec.cpu.reserved필드에 정의된 예약된 CPU와 일치해야 합니다.
클러스터에서 구성하면
/etc/kubernetes/openshift-workload-pinning의 내용은 다음과 같아야 합니다.{ "management": { "cpuset": "0-1,52-53" 1 } }- 1
cpuset는/etc/crio/crio.conf.d/01-workload-partitioning의cpuset값과 일치해야 합니다.
검증
애플리케이션과 클러스터 시스템 CPU 고정이 올바른지 확인합니다. 다음 명령을 실행합니다.
관리 클러스터에 대한 원격 쉘 연결을 엽니다.
$ oc debug node/example-sno-1
사용자 애플리케이션 CPU 고정이 올바른지 확인합니다.
sh-4.4# pgrep ovn | while read i; do taskset -cp $i; done
출력 예
pid 8481's current affinity list: 0-3 pid 8726's current affinity list: 0-3 pid 9088's current affinity list: 0-3 pid 9945's current affinity list: 0-3 pid 10387's current affinity list: 0-3 pid 12123's current affinity list: 0-3 pid 13313's current affinity list: 0-3
시스템 애플리케이션 CPU 고정이 올바른지 확인합니다.
sh-4.4# pgrep systemd | while read i; do taskset -cp $i; done
출력 예
pid 1's current affinity list: 0-3 pid 938's current affinity list: 0-3 pid 962's current affinity list: 0-3 pid 1197's current affinity list: 0-3
17.6.6.2. 플랫폼 관리 공간 감소
플랫폼의 전반적인 관리 풋프린트를 줄이기 위해 MachineConfig 사용자 정의 리소스 (CR)는 새 네임스페이스에 모든 Kubernetes별 마운트 지점을 호스트 운영 체제와 별도로 배치해야합니다. 다음 base64로 인코딩된 예제 MachineConfig CR은 이 구성을 보여줍니다.
권장되는 컨테이너 마운트 네임스페이스 구성
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: master
name: container-mount-namespace-and-kubelet-conf-master
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKCmRlYnVnKCkgewogIGVjaG8gJEAgPiYyCn0KCnVzYWdlKCkgewogIGVjaG8gVXNhZ2U6ICQoYmFzZW5hbWUgJDApIFVOSVQgW2VudmZpbGUgW3Zhcm5hbWVdXQogIGVjaG8KICBlY2hvIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBFeGVjU3RhcnQgc3RhbnphIGZyb20gdGhlIGdpdmVuIHN5c3RlbWQgdW5pdCBhbmQgcmV0dXJuIGl0IHRvIHN0ZG91dAogIGVjaG8KICBlY2hvICJJZiAnZW52ZmlsZScgaXMgcHJvdmlkZWQsIHB1dCBpdCBpbiB0aGVyZSBpbnN0ZWFkLCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCAndmFybmFtZSciCiAgZWNobyAiRGVmYXVsdCAndmFybmFtZScgaXMgRVhFQ1NUQVJUIGlmIG5vdCBzcGVjaWZpZWQiCiAgZXhpdCAxCn0KClVOSVQ9JDEKRU5WRklMRT0kMgpWQVJOQU1FPSQzCmlmIFtbIC16ICRVTklUIHx8ICRVTklUID09ICItLWhlbHAiIHx8ICRVTklUID09ICItaCIgXV07IHRoZW4KICB1c2FnZQpmaQpkZWJ1ZyAiRXh0cmFjdGluZyBFeGVjU3RhcnQgZnJvbSAkVU5JVCIKRklMRT0kKHN5c3RlbWN0bCBjYXQgJFVOSVQgfCBoZWFkIC1uIDEpCkZJTEU9JHtGSUxFI1wjIH0KaWYgW1sgISAtZiAkRklMRSBdXTsgdGhlbgogIGRlYnVnICJGYWlsZWQgdG8gZmluZCByb290IGZpbGUgZm9yIHVuaXQgJFVOSVQgKCRGSUxFKSIKICBleGl0CmZpCmRlYnVnICJTZXJ2aWNlIGRlZmluaXRpb24gaXMgaW4gJEZJTEUiCkVYRUNTVEFSVD0kKHNlZCAtbiAtZSAnL15FeGVjU3RhcnQ9LipcXCQvLC9bXlxcXSQvIHsgcy9eRXhlY1N0YXJ0PS8vOyBwIH0nIC1lICcvXkV4ZWNTdGFydD0uKlteXFxdJC8geyBzL15FeGVjU3RhcnQ9Ly87IHAgfScgJEZJTEUpCgppZiBbWyAkRU5WRklMRSBdXTsgdGhlbgogIFZBUk5BTUU9JHtWQVJOQU1FOi1FWEVDU1RBUlR9CiAgZWNobyAiJHtWQVJOQU1FfT0ke0VYRUNTVEFSVH0iID4gJEVOVkZJTEUKZWxzZQogIGVjaG8gJEVYRUNTVEFSVApmaQo=
mode: 493
path: /usr/local/bin/extractExecStart
- contents:
source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKbnNlbnRlciAtLW1vdW50PS9ydW4vY29udGFpbmVyLW1vdW50LW5hbWVzcGFjZS9tbnQgIiRAIgo=
mode: 493
path: /usr/local/bin/nsenterCmns
systemd:
units:
- contents: |
[Unit]
Description=Manages a mount namespace that both kubelet and crio can use to share their container-specific mounts
[Service]
Type=oneshot
RemainAfterExit=yes
RuntimeDirectory=container-mount-namespace
Environment=RUNTIME_DIRECTORY=%t/container-mount-namespace
Environment=BIND_POINT=%t/container-mount-namespace/mnt
ExecStartPre=bash -c "findmnt ${RUNTIME_DIRECTORY} || mount --make-unbindable --bind ${RUNTIME_DIRECTORY} ${RUNTIME_DIRECTORY}"
ExecStartPre=touch ${BIND_POINT}
ExecStart=unshare --mount=${BIND_POINT} --propagation slave mount --make-rshared /
ExecStop=umount -R ${RUNTIME_DIRECTORY}
enabled: true
name: container-mount-namespace.service
- dropins:
- contents: |
[Unit]
Wants=container-mount-namespace.service
After=container-mount-namespace.service
[Service]
ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART
EnvironmentFile=-/%t/%N-execstart.env
ExecStart=
ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \
${ORIG_EXECSTART}"
name: 90-container-mount-namespace.conf
name: crio.service
- dropins:
- contents: |
[Unit]
Wants=container-mount-namespace.service
After=container-mount-namespace.service
[Service]
ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART
EnvironmentFile=-/%t/%N-execstart.env
ExecStart=
ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \
${ORIG_EXECSTART} --housekeeping-interval=30s"
name: 90-container-mount-namespace.conf
- contents: |
[Service]
Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s"
Environment="OPENSHIFT_EVICTION_MONITORING_PERIOD_DURATION=30s"
name: 30-kubelet-interval-tuning.conf
name: kubelet.service
17.6.6.3. SCTP
SCTP(스트림 제어 전송 프로토콜)는 RAN 애플리케이션에서 사용되는 주요 프로토콜입니다. 이 MachineConfig 오브젝트는 이 프로토콜을 활성화하기 위해 SCTP 커널 모듈을 노드에 추가합니다.
권장되는 SCTP 구성
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: master
name: load-sctp-module
spec:
config:
ignition:
version: 2.2.0
storage:
files:
- contents:
source: data:,
verification: {}
filesystem: root
mode: 420
path: /etc/modprobe.d/sctp-blacklist.conf
- contents:
source: data:text/plain;charset=utf-8,sctp
filesystem: root
mode: 420
path: /etc/modules-load.d/sctp-load.conf
17.6.6.4. 컨테이너 시작 가속화
다음 MachineConfig CR은 시스템 시작 및 종료 중에 사용 가능한 모든 CPU 코어를 사용하도록 핵심 OpenShift 프로세스 및 컨테이너를 구성합니다. 따라서 초기 부팅 및 재부팅 중에 시스템 복구가 빨라집니다.
권장되는 가속화 컨테이너 시작 구성
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: master
name: 04-accelerated-container-startup-master
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKIwojIFRlbXBvcmFyaWx5IHJlc2V0IHRoZSBjb3JlIHN5c3RlbSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkgdG8gYmUgdW5yZXN0cmljdGVkIHRvIGFjY2VsZXJhdGUgc3RhcnR1cCBhbmQgc2h1dGRvd24KIwojIFRoZSBkZWZhdWx0cyBiZWxvdyBjYW4gYmUgb3ZlcnJpZGRlbiB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCiMKCiMgVGhlIGRlZmF1bHQgc2V0IG9mIGNyaXRpY2FsIHByb2Nlc3NlcyB3aG9zZSBhZmZpbml0eSBzaG91bGQgYmUgdGVtcG9yYXJpbHkgdW5ib3VuZDoKQ1JJVElDQUxfUFJPQ0VTU0VTPSR7Q1JJVElDQUxfUFJPQ0VTU0VTOi0ic3lzdGVtZCBvdnMgY3JpbyBrdWJlbGV0IE5ldHdvcmtNYW5hZ2VyIGNvbm1vbiBkYnVzIn0KCiMgRGVmYXVsdCB3YWl0IHRpbWUgaXMgNjAwcyA9IDEwbToKTUFYSU1VTV9XQUlUX1RJTUU9JHtNQVhJTVVNX1dBSVRfVElNRTotNjAwfQoKIyBEZWZhdWx0IHN0ZWFkeS1zdGF0ZSB0aHJlc2hvbGQgPSAyJQojIEFsbG93ZWQgdmFsdWVzOgojICA0ICAtIGFic29sdXRlIHBvZCBjb3VudCAoKy8tKQojICA0JSAtIHBlcmNlbnQgY2hhbmdlICgrLy0pCiMgIC0xIC0gZGlzYWJsZSB0aGUgc3RlYWR5LXN0YXRlIGNoZWNrClNURUFEWV9TVEFURV9USFJFU0hPTEQ9JHtTVEVBRFlfU1RBVEVfVEhSRVNIT0xEOi0yJX0KCiMgRGVmYXVsdCBzdGVhZHktc3RhdGUgd2luZG93ID0gNjBzCiMgSWYgdGhlIHJ1bm5pbmcgcG9kIGNvdW50IHN0YXlzIHdpdGhpbiB0aGUgZ2l2ZW4gdGhyZXNob2xkIGZvciB0aGlzIHRpbWUKIyBwZXJpb2QsIHJldHVybiBDUFUgdXRpbGl6YXRpb24gdG8gbm9ybWFsIGJlZm9yZSB0aGUgbWF4aW11bSB3YWl0IHRpbWUgaGFzCiMgZXhwaXJlcwpTVEVBRFlfU1RBVEVfV0lORE9XPSR7U1RFQURZX1NUQVRFX1dJTkRPVzotNjB9CgojIERlZmF1bHQgc3RlYWR5LXN0YXRlIGFsbG93cyBhbnkgcG9kIGNvdW50IHRvIGJlICJzdGVhZHkgc3RhdGUiCiMgSW5jcmVhc2luZyB0aGlzIHdpbGwgc2tpcCBhbnkgc3RlYWR5LXN0YXRlIGNoZWNrcyB1bnRpbCB0aGUgY291bnQgcmlzZXMgYWJvdmUKIyB0aGlzIG51bWJlciB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaWYgdGhlcmUgYXJlIHNvbWUgcGVyaW9kcyB3aGVyZSB0aGUKIyBjb3VudCBkb2Vzbid0IGluY3JlYXNlIGJ1dCB3ZSBrbm93IHdlIGNhbid0IGJlIGF0IHN0ZWFkeS1zdGF0ZSB5ZXQuClNURUFEWV9TVEFURV9NSU5JTVVNPSR7U1RFQURZX1NUQVRFX01JTklNVU06LTB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpLVUJFTEVUX0NQVV9TVEFURT0vdmFyL2xpYi9rdWJlbGV0L2NwdV9tYW5hZ2VyX3N0YXRlCkZVTExfQ1BVX1NUQVRFPS9zeXMvZnMvY2dyb3VwL2NwdXNldC9jcHVzZXQuY3B1cwp1bnJlc3RyaWN0ZWRDcHVzZXQoKSB7CiAgbG9jYWwgY3B1cwogIGlmIFtbIC1lICRLVUJFTEVUX0NQVV9TVEFURSBdXTsgdGhlbgogICAgICBjcHVzPSQoanEgLXIgJy5kZWZhdWx0Q3B1U2V0JyA8JEtVQkVMRVRfQ1BVX1NUQVRFKQogIGZpCiAgaWYgW1sgLXogJGNwdXMgXV07IHRoZW4KICAgICMgZmFsbCBiYWNrIHRvIHVzaW5nIGFsbCBjcHVzIGlmIHRoZSBrdWJlbGV0IHN0YXRlIGlzIG5vdCBjb25maWd1cmVkIHlldAogICAgW1sgLWUgJEZVTExfQ1BVX1NUQVRFIF1dIHx8IHJldHVybiAxCiAgICBjcHVzPSQoPCRGVUxMX0NQVV9TVEFURSkKICBmaQogIGVjaG8gJGNwdXMKfQoKcmVzdHJpY3RlZENwdXNldCgpIHsKICBmb3IgYXJnIGluICQoPC9wcm9jL2NtZGxpbmUpOyBkbwogICAgaWYgW1sgJGFyZyA9fiBec3lzdGVtZC5jcHVfYWZmaW5pdHk9IF1dOyB0aGVuCiAgICAgIGVjaG8gJHthcmcjKj19CiAgICAgIHJldHVybiAwCiAgICBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpnZXRDUFVDb3VudCAoKSB7CiAgbG9jYWwgY3B1c2V0PSIkMSIKICBsb2NhbCBjcHVsaXN0PSgpCiAgbG9jYWwgY3B1cz0wCiAgbG9jYWwgbWluY3B1cz0yCgogIGlmIFtbIC16ICRjcHVzZXQgfHwgJGNwdXNldCA9fiBbXjAtOSwtXSBdXTsgdGhlbgogICAgZWNobyAkbWluY3B1cwogICAgcmV0dXJuIDEKICBmaQoKICBJRlM9JywnIHJlYWQgLXJhIGNwdWxpc3QgPDw8ICRjcHVzZXQKCiAgZm9yIGVsbSBpbiAiJHtjcHVsaXN0W0BdfSI7IGRvCiAgICBpZiBbWyAkZWxtID1+IF5bMC05XSskIF1dOyB0aGVuCiAgICAgICgoIGNwdXMrKyApKQogICAgZWxpZiBbWyAkZWxtID1+IF5bMC05XSstWzAtOV0rJCBdXTsgdGhlbgogICAgICBsb2NhbCBsb3c9MCBoaWdoPTAKICAgICAgSUZTPSctJyByZWFkIGxvdyBoaWdoIDw8PCAkZWxtCiAgICAgICgoIGNwdXMgKz0gaGlnaCAtIGxvdyArIDEgKSkKICAgIGVsc2UKICAgICAgZWNobyAkbWluY3B1cwogICAgICByZXR1cm4gMQogICAgZmkKICBkb25lCgogICMgUmV0dXJuIGEgbWluaW11bSBvZiAyIGNwdXMKICBlY2hvICQoKCBjcHVzID4gJG1pbmNwdXMgPyBjcHVzIDogJG1pbmNwdXMgKSkKICByZXR1cm4gMAp9CgpyZXNldE9WU3RocmVhZHMgKCkgewogIGxvY2FsIGNwdWNvdW50PSIkMSIKICBsb2NhbCBjdXJSZXZhbGlkYXRvcnM9MAogIGxvY2FsIGN1ckhhbmRsZXJzPTAKICBsb2NhbCBkZXNpcmVkUmV2YWxpZGF0b3JzPTAKICBsb2NhbCBkZXNpcmVkSGFuZGxlcnM9MAogIGxvY2FsIHJjPTAKCiAgY3VyUmV2YWxpZGF0b3JzPSQocHMgLVRlbyBwaWQsdGlkLGNvbW0sY21kIHwgZ3JlcCAtZSByZXZhbGlkYXRvciB8IGdyZXAgLWMgb3ZzLXZzd2l0Y2hkKQogIGN1ckhhbmRsZXJzPSQocHMgLVRlbyBwaWQsdGlkLGNvbW0sY21kIHwgZ3JlcCAtZSBoYW5kbGVyIHwgZ3JlcCAtYyBvdnMtdnN3aXRjaGQpCgogICMgQ2FsY3VsYXRlIHRoZSBkZXNpcmVkIG51bWJlciBvZiB0aHJlYWRzIHRoZSBzYW1lIHdheSBPVlMgZG9lcy4KICAjIE9WUyB3aWxsIHNldCB0aGVzZSB0aHJlYWQgY291bnQgYXMgYSBvbmUgc2hvdCBwcm9jZXNzIG9uIHN0YXJ0dXAsIHNvIHdlCiAgIyBoYXZlIHRvIGFkanVzdCB1cCBvciBkb3duIGR1cmluZyB0aGUgYm9vdCB1cCBwcm9jZXNzLiBUaGUgZGVzaXJlZCBvdXRjb21lIGlzCiAgIyB0byBub3QgcmVzdHJpY3QgdGhlIG51bWJlciBvZiB0aHJlYWQgYXQgc3RhcnR1cCB1bnRpbCB3ZSByZWFjaCBhIHN0ZWFkeQogICMgc3RhdGUuICBBdCB3aGljaCBwb2ludCB3ZSBuZWVkIHRvIHJlc2V0IHRoZXNlIGJhc2VkIG9uIG91ciByZXN0cmljdGVkICBzZXQKICAjIG9mIGNvcmVzLgogICMgU2VlIE9WUyBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlc2UgdGhyZWFkIGNvdW50czoKICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVudnN3aXRjaC9vdnMvYmxvYi9tYXN0ZXIvb2Zwcm90by9vZnByb3RvLWRwaWYtdXBjYWxsLmMjTDYzNQogICgoIGRlc2lyZWRSZXZhbGlkYXRvcnM9JGNwdWNvdW50IC8gNCArIDEgKSkKICAoKCBkZXNpcmVkSGFuZGxlcnM9JGNwdWNvdW50IC0gJGRlc2lyZWRSZXZhbGlkYXRvcnMgKSkKCgogIGlmIFtbICRjdXJSZXZhbGlkYXRvcnMgLW5lICRkZXNpcmVkUmV2YWxpZGF0b3JzIHx8ICRjdXJIYW5kbGVycyAtbmUgJGRlc2lyZWRIYW5kbGVycyBdXTsgdGhlbgoKICAgIGxvZ2dlciAiUmVjb3Zlcnk6IFJlLXNldHRpbmcgT1ZTIHJldmFsaWRhdG9yIHRocmVhZHM6ICR7Y3VyUmV2YWxpZGF0b3JzfSAtPiAke2Rlc2lyZWRSZXZhbGlkYXRvcnN9IgogICAgbG9nZ2VyICJSZWNvdmVyeTogUmUtc2V0dGluZyBPVlMgaGFuZGxlciB0aHJlYWRzOiAke2N1ckhhbmRsZXJzfSAtPiAke2Rlc2lyZWRIYW5kbGVyc30iCgogICAgb3ZzLXZzY3RsIHNldCBcCiAgICAgIE9wZW5fdlN3aXRjaCAuIFwKICAgICAgb3RoZXItY29uZmlnOm4taGFuZGxlci10aHJlYWRzPSR7ZGVzaXJlZEhhbmRsZXJzfSBcCiAgICAgIG90aGVyLWNvbmZpZzpuLXJldmFsaWRhdG9yLXRocmVhZHM9JHtkZXNpcmVkUmV2YWxpZGF0b3JzfQogICAgcmM9JD8KICBmaQoKICByZXR1cm4gJHJjCn0KCnJlc2V0QWZmaW5pdHkoKSB7CiAgbG9jYWwgY3B1c2V0PSIkMSIKICBsb2NhbCBmYWlsY291bnQ9MAogIGxvY2FsIHN1Y2Nlc3Njb3VudD0wCiAgbG9nZ2VyICJSZWNvdmVyeTogU2V0dGluZyBDUFUgYWZmaW5pdHkgZm9yIGNyaXRpY2FsIHByb2Nlc3NlcyBcIiRDUklUSUNBTF9QUk9DRVNTRVNcIiB0byAkY3B1c2V0IgogIGZvciBwcm9jIGluICRDUklUSUNBTF9QUk9DRVNTRVM7IGRvCiAgICBsb2NhbCBwaWRzPSIkKHBncmVwICRwcm9jKSIKICAgIGZvciBwaWQgaW4gJHBpZHM7IGRvCiAgICAgIGxvY2FsIHRhc2tzZXRPdXRwdXQKICAgICAgdGFza3NldE91dHB1dD0iJCh0YXNrc2V0IC1hcGMgIiRjcHVzZXQiICRwaWQgMj4mMSkiCiAgICAgIGlmIFtbICQ/IC1uZSAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiRVJST1I6ICR0YXNrc2V0T3V0cHV0IgogICAgICAgICgoZmFpbGNvdW50KyspKQogICAgICBlbHNlCiAgICAgICAgKChzdWNjZXNzY291bnQrKykpCiAgICAgIGZpCiAgICBkb25lCiAgZG9uZQoKICByZXNldE9WU3RocmVhZHMgIiQoZ2V0Q1BVQ291bnQgJHtjcHVzZXR9KSIKICBpZiBbWyAkPyAtbmUgMCBdXTsgdGhlbgogICAgKChmYWlsY291bnQrKykpCiAgZWxzZQogICAgKChzdWNjZXNzY291bnQrKykpCiAgZmkKCiAgbG9nZ2VyICJSZWNvdmVyeTogUmUtYWZmaW5lZCAkc3VjY2Vzc2NvdW50IHBpZHMgc3VjY2Vzc2Z1bGx5IgogIGlmIFtbICRmYWlsY291bnQgLWd0IDAgXV07IHRoZW4KICAgIGxvZ2dlciAiUmVjb3Zlcnk6IEZhaWxlZCB0byByZS1hZmZpbmUgJGZhaWxjb3VudCBwcm9jZXNzZXMiCiAgICByZXR1cm4gMQogIGZpCn0KCnNldFVucmVzdHJpY3RlZCgpIHsKICBsb2dnZXIgIlJlY292ZXJ5OiBTZXR0aW5nIGNyaXRpY2FsIHN5c3RlbSBwcm9jZXNzZXMgdG8gaGF2ZSB1bnJlc3RyaWN0ZWQgQ1BVIGFjY2VzcyIKICByZXNldEFmZmluaXR5ICIkKHVucmVzdHJpY3RlZENwdXNldCkiCn0KCnNldFJlc3RyaWN0ZWQoKSB7CiAgbG9nZ2VyICJSZWNvdmVyeTogUmVzZXR0aW5nIGNyaXRpY2FsIHN5c3RlbSBwcm9jZXNzZXMgYmFjayB0byBub3JtYWxseSByZXN0cmljdGVkIGFjY2VzcyIKICByZXNldEFmZmluaXR5ICIkKHJlc3RyaWN0ZWRDcHVzZXQpIgp9CgpjdXJyZW50QWZmaW5pdHkoKSB7CiAgbG9jYWwgcGlkPSIkMSIKICB0YXNrc2V0IC1wYyAkcGlkIHwgYXdrIC1GJzogJyAne3ByaW50ICQyfScKfQoKd2l0aGluKCkgewogIGxvY2FsIGxhc3Q9JDEgY3VycmVudD0kMiB0aHJlc2hvbGQ9JDMKICBsb2NhbCBkZWx0YT0wIHBjaGFuZ2UKICBkZWx0YT0kKCggY3VycmVudCAtIGxhc3QgKSkKICBpZiBbWyAkY3VycmVudCAtZXEgJGxhc3QgXV07IHRoZW4KICAgIHBjaGFuZ2U9MAogIGVsaWYgW1sgJGxhc3QgLWVxIDAgXV07IHRoZW4KICAgIHBjaGFuZ2U9MTAwMDAwMAogIGVsc2UKICAgIHBjaGFuZ2U9JCgoICggJGRlbHRhICogMTAwKSAvIGxhc3QgKSkKICBmaQogIGVjaG8gLW4gImxhc3Q6JGxhc3QgY3VycmVudDokY3VycmVudCBkZWx0YTokZGVsdGEgcGNoYW5nZToke3BjaGFuZ2V9JTogIgogIGxvY2FsIGFic29sdXRlIGxpbWl0CiAgY2FzZSAkdGhyZXNob2xkIGluCiAgICAqJSkKICAgICAgYWJzb2x1dGU9JHtwY2hhbmdlIyMtfSAjIGFic29sdXRlIHZhbHVlCiAgICAgIGxpbWl0PSR7dGhyZXNob2xkJSUlfQogICAgICA7OwogICAgKikKICAgICAgYWJzb2x1dGU9JHtkZWx0YSMjLX0gIyBhYnNvbHV0ZSB2YWx1ZQogICAgICBsaW1pdD0kdGhyZXNob2xkCiAgICAgIDs7CiAgZXNhYwogIGlmIFtbICRhYnNvbHV0ZSAtbGUgJGxpbWl0IF1dOyB0aGVuCiAgICBlY2hvICJ3aXRoaW4gKCsvLSkkdGhyZXNob2xkIgogICAgcmV0dXJuIDAKICBlbHNlCiAgICBlY2hvICJvdXRzaWRlICgrLy0pJHRocmVzaG9sZCIKICAgIHJldHVybiAxCiAgZmkKfQoKc3RlYWR5c3RhdGUoKSB7CiAgbG9jYWwgbGFzdD0kMSBjdXJyZW50PSQyCiAgaWYgW1sgJGxhc3QgLWx0ICRTVEVBRFlfU1RBVEVfTUlOSU1VTSBdXTsgdGhlbgogICAgZWNobyAibGFzdDokbGFzdCBjdXJyZW50OiRjdXJyZW50IFdhaXRpbmcgdG8gcmVhY2ggJFNURUFEWV9TVEFURV9NSU5JTVVNIGJlZm9yZSBjaGVja2luZyBmb3Igc3RlYWR5LXN0YXRlIgogICAgcmV0dXJuIDEKICBmaQogIHdpdGhpbiAkbGFzdCAkY3VycmVudCAkU1RFQURZX1NUQVRFX1RIUkVTSE9MRAp9Cgp3YWl0Rm9yUmVhZHkoKSB7CiAgbG9nZ2VyICJSZWNvdmVyeTogV2FpdGluZyAke01BWElNVU1fV0FJVF9USU1FfXMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSIKICBsb2NhbCBsYXN0U3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgbG9jYWwgbGFzdERlc2lyZWRDcHVzZXQ9IiQodW5yZXN0cmljdGVkQ3B1c2V0KSIKICBsb2NhbCB0PTAgcz0xMAogIGxvY2FsIGxhc3RDY291bnQ9MCBjY291bnQ9MCBzdGVhZHlTdGF0ZVRpbWU9MAogIHdoaWxlIFtbICR0IC1sdCAkTUFYSU1VTV9XQUlUX1RJTUUgXV07IGRvCiAgICBzbGVlcCAkcwogICAgKCh0ICs9IHMpKQogICAgIyBSZS1jaGVjayB0aGUgY3VycmVudCBhZmZpbml0eSBvZiBzeXN0ZW1kLCBpbiBjYXNlIHNvbWUgb3RoZXIgcHJvY2VzcyBoYXMgY2hhbmdlZCBpdAogICAgbG9jYWwgc3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgICAjIFJlLWNoZWNrIHRoZSB1bnJlc3RyaWN0ZWQgQ3B1c2V0LCBhcyB0aGUgYWxsb3dlZCBzZXQgb2YgdW5yZXNlcnZlZCBjb3JlcyBtYXkgY2hhbmdlIGFzIHBvZHMgYXJlIGFzc2lnbmVkIHRvIGNvcmVzCiAgICBsb2NhbCBkZXNpcmVkQ3B1c2V0PSIkKHVucmVzdHJpY3RlZENwdXNldCkiCiAgICBpZiBbWyAkc3lzdGVtZENwdXNldCAhPSAkbGFzdFN5c3RlbWRDcHVzZXQgfHwgJGxhc3REZXNpcmVkQ3B1c2V0ICE9ICRkZXNpcmVkQ3B1c2V0IF1dOyB0aGVuCiAgICAgIHJlc2V0QWZmaW5pdHkgIiRkZXNpcmVkQ3B1c2V0IgogICAgICBsYXN0U3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgICAgIGxhc3REZXNpcmVkQ3B1c2V0PSIkZGVzaXJlZENwdXNldCIKICAgIGZpCgogICAgIyBEZXRlY3Qgc3RlYWR5LXN0YXRlIHBvZCBjb3VudAogICAgY2NvdW50PSQoY3JpY3RsIHBzIHwgd2MgLWwpCiAgICBpZiBzdGVhZHlzdGF0ZSAkbGFzdENjb3VudCAkY2NvdW50OyB0aGVuCiAgICAgICgoc3RlYWR5U3RhdGVUaW1lICs9IHMpKQogICAgICBlY2hvICJTdGVhZHktc3RhdGUgZm9yICR7c3RlYWR5U3RhdGVUaW1lfXMvJHtTVEVBRFlfU1RBVEVfV0lORE9XfXMiCiAgICAgIGlmIFtbICRzdGVhZHlTdGF0ZVRpbWUgLWdlICRTVEVBRFlfU1RBVEVfV0lORE9XIF1dOyB0aGVuCiAgICAgICAgbG9nZ2VyICJSZWNvdmVyeTogU3RlYWR5LXN0YXRlICgrLy0gJFNURUFEWV9TVEFURV9USFJFU0hPTEQpIGZvciAke1NURUFEWV9TVEFURV9XSU5ET1d9czogRG9uZSIKICAgICAgICByZXR1cm4gMAogICAgICBmaQogICAgZWxzZQogICAgICBpZiBbWyAkc3RlYWR5U3RhdGVUaW1lIC1ndCAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiUmVzZXR0aW5nIHN0ZWFkeS1zdGF0ZSB0aW1lciIKICAgICAgICBzdGVhZHlTdGF0ZVRpbWU9MAogICAgICBmaQogICAgZmkKICAgIGxhc3RDY291bnQ9JGNjb3VudAogIGRvbmUKICBsb2dnZXIgIlJlY292ZXJ5OiBSZWNvdmVyeSBDb21wbGV0ZSBUaW1lb3V0Igp9CgptYWluKCkgewogIGlmICEgdW5yZXN0cmljdGVkQ3B1c2V0ID4mL2Rldi9udWxsOyB0aGVuCiAgICBsb2dnZXIgIlJlY292ZXJ5OiBObyB1bnJlc3RyaWN0ZWQgQ3B1c2V0IGNvdWxkIGJlIGRldGVjdGVkIgogICAgcmV0dXJuIDEKICBmaQoKICBpZiAhIHJlc3RyaWN0ZWRDcHVzZXQgPiYvZGV2L251bGw7IHRoZW4KICAgIGxvZ2dlciAiUmVjb3Zlcnk6IE5vIHJlc3RyaWN0ZWQgQ3B1c2V0IGhhcyBiZWVuIGNvbmZpZ3VyZWQuICBXZSBhcmUgYWxyZWFkeSBydW5uaW5nIHVucmVzdHJpY3RlZC4iCiAgICByZXR1cm4gMAogIGZpCgogICMgRW5zdXJlIHdlIHJlc2V0IHRoZSBDUFUgYWZmaW5pdHkgd2hlbiB3ZSBleGl0IHRoaXMgc2NyaXB0IGZvciBhbnkgcmVhc29uCiAgIyBUaGlzIHdheSBlaXRoZXIgYWZ0ZXIgdGhlIHRpbWVyIGV4cGlyZXMgb3IgYWZ0ZXIgdGhlIHByb2Nlc3MgaXMgaW50ZXJydXB0ZWQKICAjIHZpYSBeQyBvciBTSUdURVJNLCB3ZSByZXR1cm4gdGhpbmdzIGJhY2sgdG8gdGhlIHdheSB0aGV5IHNob3VsZCBiZS4KICB0cmFwIHNldFJlc3RyaWN0ZWQgRVhJVAoKICBsb2dnZXIgIlJlY292ZXJ5OiBSZWNvdmVyeSBNb2RlIFN0YXJ0aW5nIgogIHNldFVucmVzdHJpY3RlZAogIHdhaXRGb3JSZWFkeQp9CgppZiBbWyAiJHtCQVNIX1NPVVJDRVswXX0iID0gIiR7MH0iIF1dOyB0aGVuCiAgbWFpbiAiJHtAfSIKICBleGl0ICQ/CmZpCg==
mode: 493
path: /usr/local/bin/accelerated-container-startup.sh
systemd:
units:
- contents: |
[Unit]
Description=Unlocks more CPUs for critical system processes during container startup
[Service]
Type=simple
ExecStart=/usr/local/bin/accelerated-container-startup.sh
# Maximum wait time is 600s = 10m:
Environment=MAXIMUM_WAIT_TIME=600
# Steady-state threshold = 2%
# Allowed values:
# 4 - absolute pod count (+/-)
# 4% - percent change (+/-)
# -1 - disable the steady-state check
# Note: '%' must be escaped as '%%' in systemd unit files
Environment=STEADY_STATE_THRESHOLD=2%%
# Steady-state window = 120s
# If the running pod count stays within the given threshold for this time
# period, return CPU utilization to normal before the maximum wait time has
# expires
Environment=STEADY_STATE_WINDOW=120
# Steady-state minimum = 40
# Increasing this will skip any steady-state checks until the count rises above
# this number to avoid false positives if there are some periods where the
# count doesn't increase but we know we can't be at steady-state yet.
Environment=STEADY_STATE_MINIMUM=40
[Install]
WantedBy=multi-user.target
enabled: true
name: accelerated-container-startup.service
- contents: |
[Unit]
Description=Unlocks more CPUs for critical system processes during container shutdown
DefaultDependencies=no
[Service]
Type=simple
ExecStart=/usr/local/bin/accelerated-container-startup.sh
# Maximum wait time is 600s = 10m:
Environment=MAXIMUM_WAIT_TIME=600
# Steady-state threshold
# Allowed values:
# 4 - absolute pod count (+/-)
# 4% - percent change (+/-)
# -1 - disable the steady-state check
# Note: '%' must be escaped as '%%' in systemd unit files
Environment=STEADY_STATE_THRESHOLD=-1
# Steady-state window = 60s
# If the running pod count stays within the given threshold for this time
# period, return CPU utilization to normal before the maximum wait time has
# expires
Environment=STEADY_STATE_WINDOW=60
[Install]
WantedBy=shutdown.target reboot.target halt.target
enabled: true
name: accelerated-container-shutdown.service
17.6.6.5. kdump를 사용한 자동 커널 충돌 덤프
kdump 는 커널이 충돌할 때 커널 크래시 덤프를 생성하는 Linux 커널 기능입니다. kdump 는 다음 MachineConfig CR을 사용하여 활성화됩니다.
권장되는 kdump 설정
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: master
name: 06-kdump-enable-master
spec:
config:
ignition:
version: 3.2.0
systemd:
units:
- enabled: true
name: kdump.service
kernelArguments:
- crashkernel=512M
17.6.6.6. crun을 기본 컨테이너 런타임으로 구성
다음 ContainerRuntimeConfig 사용자 정의 리소스(CR)는 컨트롤 플레인 및 작업자 노드의 기본 OCI 컨테이너 런타임으로 crun을 구성합니다. crun 컨테이너 런타임은 빠르고 경량이며 메모리 풋프린트가 적습니다.
최적의 성능을 위해 단일 노드 OpenShift, 3-노드 OpenShift 및 표준 클러스터에서 마스터 및 작업자 노드에 대해 crun을 활성화합니다. CR이 적용될 때 클러스터 재부팅을 방지하려면 변경 사항을 GitOps ZTP 추가 day-0 install-time 매니페스트로 적용합니다.
컨트롤 플레인 노드에 권장되는 ContainerRuntimeConfig CR
apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:
name: enable-crun-master
spec:
machineConfigPoolSelector:
matchLabels:
pools.operator.machineconfiguration.openshift.io/master: ""
containerRuntimeConfig:
defaultRuntime: crun
작업자 노드에 권장되는 ContainerRuntimeConfig CR
apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:
name: enable-crun-worker
spec:
machineConfigPoolSelector:
matchLabels:
pools.operator.machineconfiguration.openshift.io/worker: ""
containerRuntimeConfig:
defaultRuntime: crun
17.6.7. 권장되는 설치 후 클러스터 구성
클러스터 설치가 완료되면 ZTP 파이프라인에서 DU 워크로드를 실행하는 데 필요한 다음 CR(사용자 정의 리소스)을 적용합니다.
GitOps ZTP v4.10 및 이전 버전에서는 MachineConfig CR을 사용하여 UEFI 보안 부팅을 구성합니다. GitOps ZTP v4.11 이상에서는 더 이상 필요하지 않습니다. v4.11에서는 클러스터를 설치하는 데 사용하는 site Config CR에서 spec.clusters.nodes.bootMode 필드를 업데이트하여 단일 노드 OpenShift 클러스터에 대해 UEFI 보안 부팅을 구성합니다. 자세한 내용은 site Config 및 GitOps ZTP를 사용하여 관리되는 클러스터 배포를 참조하십시오.
17.6.7.1. Operator 네임스페이스 및 Operator groups
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 다음 OperatorGroup 및 Namespace CR(사용자 정의 리소스)이 필요합니다.
- Local Storage Operator
- logging Operator
- PTP Operator
- SR-IOV 네트워크 Operator
다음 YAML은 이러한 CR을 요약합니다.
권장되는 Operator 네임스페이스 및 OperatorGroup 구성
apiVersion: v1
kind: Namespace
metadata:
annotations:
workload.openshift.io/allowed: management
name: openshift-local-storage
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: openshift-local-storage
namespace: openshift-local-storage
spec:
targetNamespaces:
- openshift-local-storage
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
workload.openshift.io/allowed: management
name: openshift-logging
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: cluster-logging
namespace: openshift-logging
spec:
targetNamespaces:
- openshift-logging
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
workload.openshift.io/allowed: management
labels:
openshift.io/cluster-monitoring: "true"
name: openshift-ptp
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: ptp-operators
namespace: openshift-ptp
spec:
targetNamespaces:
- openshift-ptp
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
workload.openshift.io/allowed: management
name: openshift-sriov-network-operator
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: sriov-network-operators
namespace: openshift-sriov-network-operator
spec:
targetNamespaces:
- openshift-sriov-network-operator
17.6.7.2. Operator 서브스크립션
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 다음과 같은 Subscription CR이 필요합니다. 서브스크립션은 다음 Operator를 다운로드할 수 있는 위치를 제공합니다.
- Local Storage Operator
- logging Operator
- PTP Operator
- SR-IOV 네트워크 Operator
권장되는 Operator 서브스크립션
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: cluster-logging namespace: openshift-logging spec: channel: "stable" 1 name: cluster-logging source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual 2 --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: local-storage-operator namespace: openshift-local-storage spec: channel: "stable" installPlanApproval: Automatic name: local-storage-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: ptp-operator-subscription namespace: openshift-ptp spec: channel: "stable" name: ptp-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sriov-network-operator-subscription namespace: openshift-sriov-network-operator spec: channel: "stable" name: sriov-network-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual
17.6.7.3. 클러스터 로깅 및 로그 전달
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 디버깅을 위해 로깅 및 로그 전달이 필요합니다. 다음 예제 YAML은 필수 ClusterLogging 및 ClusterLogForwarder CR을 보여줍니다.
권장되는 클러스터 로깅 및 로그 전달 구성
apiVersion: logging.openshift.io/v1 kind: ClusterLogging 1 metadata: name: instance namespace: openshift-logging spec: collection: logs: fluentd: {} type: fluentd curation: type: "curator" curator: schedule: "30 3 * * *" managementState: Managed --- apiVersion: logging.openshift.io/v1 kind: ClusterLogForwarder 2 metadata: name: instance namespace: openshift-logging spec: inputs: - infrastructure: {} name: infra-logs outputs: - name: kafka-open type: kafka url: tcp://10.46.55.190:9092/test 3 pipelines: - inputRefs: - audit name: audit-logs outputRefs: - kafka-open - inputRefs: - infrastructure name: infrastructure-logs outputRefs: - kafka-open
17.6.7.4. 성능 프로필
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 실시간 호스트 기능 및 서비스를 사용하려면 Node Tuning Operator 성능 프로파일이 필요합니다.
이전 버전의 OpenShift Container Platform에서는 Performance Addon Operator를 사용하여 OpenShift 애플리케이션에 대한 대기 시간을 단축할 수 있도록 자동 튜닝을 구현했습니다. OpenShift Container Platform 4.11 이상에서는 이 기능은 Node Tuning Operator의 일부입니다.
다음 예제 PerformanceProfile CR은 필요한 클러스터 구성을 보여줍니다.
권장되는 성능 프로파일 구성
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: openshift-node-performance-profile 1 spec: additionalKernelArgs: - "rcupdate.rcu_normal_after_boot=0" - "efi=runtime" 2 cpu: isolated: 2-51,54-103 3 reserved: 0-1,52-53 4 hugepages: defaultHugepagesSize: 1G pages: - count: 32 5 size: 1G 6 node: 0 7 machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/master: "" nodeSelector: node-role.kubernetes.io/master: "" numa: topologyPolicy: "restricted" realTimeKernel: enabled: true 8
- 1
이름값이TunedPerformancePatch.yaml의spec.profile.data필드에 지정된 값과 일치하고validatorCRs/informDuValidator.yaml의status.configuration.source.name필드와 일치하는지 확인합니다.- 2
- 클러스터 호스트에 대한 UEFI 보안 부팅을 구성합니다.
- 3
- 분리된 CPU를 설정합니다. 모든 하이퍼 스레딩 쌍이 일치하는지 확인합니다.중요
예약 및 분리된 CPU 풀은 겹치지 않아야 하며 함께 사용 가능한 모든 코어에 걸쳐 있어야 합니다. 고려하지 않은 CPU 코어로 인해 시스템에서 정의되지 않은 동작이 발생합니다.
- 4
- 예약된 CPU를 설정합니다. 워크로드 파티셔닝이 활성화되면 시스템 프로세스, 커널 스레드 및 시스템 컨테이너 스레드가 이러한 CPU로 제한됩니다. 분리되지 않은 모든 CPU는 예약해야 합니다.
- 5
- 대규모 페이지 수를 설정합니다.
- 6
- 대규모 페이지 크기를 설정합니다.
- 7
node를hugepages가 할당된 NUMA 노드로 설정합니다.- 8
- 실시간 Linux 커널을 설치하려면
enabled를true로 설정합니다.
17.6.7.5. PTP
단일 노드 OpenShift 클러스터는 네트워크 시간 동기화에 PTP(Precision Time Protocol)를 사용합니다. 다음 예제 PtpConfig CR은 필요한 PTP 슬레이브 구성을 보여줍니다.
권장되는 PTP 구성
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: du-ptp-slave
namespace: openshift-ptp
spec:
profile:
- interface: ens5f0 1
name: slave
phc2sysOpts: -a -r -n 24
ptp4lConf: |
[global]
#
# Default Data Set
#
twoStepFlag 1
slaveOnly 0
priority1 128
priority2 128
domainNumber 24
#utc_offset 37
clockClass 248
clockAccuracy 0xFE
offsetScaledLogVariance 0xFFFF
free_running 0
freq_est_interval 1
dscp_event 0
dscp_general 0
dataset_comparison ieee1588
G.8275.defaultDS.localPriority 128
#
# Port Data Set
#
logAnnounceInterval -3
logSyncInterval -4
logMinDelayReqInterval -4
logMinPdelayReqInterval -4
announceReceiptTimeout 3
syncReceiptTimeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
masterOnly 0
G.8275.portDS.localPriority 128
#
# Run time options
#
assume_two_step 0
logging_level 6
path_trace_enabled 0
follow_up_info 0
hybrid_e2e 0
inhibit_multicast_service 0
net_sync_monitor 0
tc_spanning_tree 0
tx_timestamp_timeout 1
unicast_listen 0
unicast_master_table 0
unicast_req_duration 3600
use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
check_fup_sync 0
#
# Servo Options
#
pi_proportional_const 0.0
pi_integral_const 0.0
pi_proportional_scale 0.0
pi_proportional_exponent -0.3
pi_proportional_norm_max 0.7
pi_integral_scale 0.0
pi_integral_exponent 0.4
pi_integral_norm_max 0.3
step_threshold 2.0
first_step_threshold 0.00002
max_frequency 900000000
clock_servo pi
sanity_freq_limit 200000000
ntpshm_segment 0
#
# Transport options
#
transportSpecific 0x0
ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E
udp_ttl 1
udp6_scope 0x0E
uds_address /var/run/ptp4l
#
# Default interface options
#
clock_type OC
network_transport L2
delay_mechanism E2E
time_stamping hardware
tsproc_mode filter
delay_filter moving_median
delay_filter_length 10
egressLatency 0
ingressLatency 0
boundary_clock_jbod 0
#
# Clock description
#
productDescription ;;
revisionData ;;
manufacturerIdentity 00:00:00
userDescription ;
timeSource 0xA0
ptp4lOpts: -2 -s --summary_interval -4
recommend:
- match:
- nodeLabel: node-role.kubernetes.io/master
priority: 4
profile: slave
- 1
- PTP 클럭 신호를 수신하는 데 사용되는 인터페이스를 설정합니다.
17.6.7.6. 확장 Tuned 프로파일
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 고성능 워크로드에 필요한 추가 성능 튜닝 구성이 필요합니다. 다음 예제 Tuned CR은 Tuned 프로필을 확장합니다.
권장되는 확장 Tuned 프로파일 구성
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: performance-patch
namespace: openshift-cluster-node-tuning-operator
spec:
profile:
- data: |
[main]
summary=Configuration changes profile inherited from performance created tuned
include=openshift-node-performance-openshift-node-performance-profile
[bootloader]
cmdline_crash=nohz_full=2-51,54-103
[sysctl]
kernel.timer_migration=1
[scheduler]
group.ice-ptp=0:f:10:*:ice-ptp.*
[service]
service.stalld=start,enable
service.chronyd=stop,disable
name: performance-patch
recommend:
- machineConfigLabels:
machineconfiguration.openshift.io/role: master
priority: 19
profile: performance-patch
17.6.7.7. SR-IOV
SR-IOV(Single Root I/O virtualization)는 일반적으로 fronthaul 및 midhaul 네트워크를 활성화하는 데 사용됩니다. 다음 YAML 예제에서는 단일 노드 OpenShift 클러스터에 대해 SR-IOV를 구성합니다.
권장되는 SR-IOV 구성
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: openshift-sriov-network-operator
spec:
configDaemonNodeSelector:
node-role.kubernetes.io/master: ""
disableDrain: true
enableInjector: true
enableOperatorWebhook: true
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: sriov-nw-du-mh
namespace: openshift-sriov-network-operator
spec:
networkNamespace: openshift-sriov-network-operator
resourceName: du_mh
vlan: 150 1
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: sriov-nnp-du-mh
namespace: openshift-sriov-network-operator
spec:
deviceType: vfio-pci 2
isRdma: false
nicSelector:
pfNames:
- ens7f0 3
nodeSelector:
node-role.kubernetes.io/master: ""
numVfs: 8 4
priority: 10
resourceName: du_mh
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: sriov-nw-du-fh
namespace: openshift-sriov-network-operator
spec:
networkNamespace: openshift-sriov-network-operator
resourceName: du_fh
vlan: 140 5
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: sriov-nnp-du-fh
namespace: openshift-sriov-network-operator
spec:
deviceType: netdevice 6
isRdma: true
nicSelector:
pfNames:
- ens5f0 7
nodeSelector:
node-role.kubernetes.io/master: ""
numVfs: 8 8
priority: 10
resourceName: du_fh
17.6.7.8. Console Operator
console-operator는 클러스터에 웹 콘솔을 설치하고 유지 관리합니다. 노드가 중앙에서 관리되면 Operator가 필요하지 않고 애플리케이션 워크로드를 위한 공간을 만듭니다. 다음 콘솔 CR(사용자 정의 리소스) 예에서는 콘솔을 비활성화합니다.
권장되는 콘솔 구성
apiVersion: operator.openshift.io/v1
kind: Console
metadata:
annotations:
include.release.openshift.io/ibm-cloud-managed: "false"
include.release.openshift.io/self-managed-high-availability: "false"
include.release.openshift.io/single-node-developer: "false"
release.openshift.io/create-only: "true"
name: cluster
spec:
logLevel: Normal
managementState: Removed
operatorLogLevel: Normal
17.6.7.9. Grafana 및 Alertmanager
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 OpenShift Container Platform 모니터링 구성 요소에서 사용하는 CPU 리소스가 감소해야 합니다. 다음 ConfigMap CR(사용자 정의 리소스)은 Grafana 및 Alertmanager를 비활성화합니다.
권장되는 클러스터 모니터링 구성
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoring
data:
config.yaml: |
grafana:
enabled: false
alertmanagerMain:
enabled: false
prometheusK8s:
retention: 24h
17.6.7.10. LVM 스토리지
논리 볼륨 관리자 스토리지(LVM Storage)를 사용하여 단일 노드 OpenShift 클러스터에서 로컬 스토리지를 동적으로 프로비저닝할 수 있습니다.
단일 노드 OpenShift에 권장되는 스토리지 솔루션은 Local Storage Operator입니다. 또는 LVM 스토리지를 사용할 수 있지만 추가 CPU 리소스를 할당해야 합니다.
다음 YAML 예제에서는 OpenShift Container Platform 애플리케이션에서 사용할 노드의 스토리지를 구성합니다.
권장 LVMCluster 구성
apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
name: odf-lvmcluster
namespace: openshift-storage
spec:
storage:
deviceClasses:
- name: vg1
deviceSelector: 1
paths:
- /usr/disk/by-path/pci-0000:11:00.0-nvme-1
thinPoolConfig:
name: thin-pool-1
overprovisionRatio: 10
sizePercent: 90
- 1
deviceSelector.paths필드에 디스크가 지정되지 않은 경우 LVM Storage는 지정된 씬 풀에서 사용되지 않는 모든 디스크를 사용합니다.
17.6.7.11. 네트워크 진단
DU 워크로드를 실행하는 단일 노드 OpenShift 클러스터에는 Pod에서 생성하는 추가 로드를 줄이기 위해 포드 간 네트워크 연결 검사가 줄어듭니다. 다음 CR(사용자 정의 리소스)은 이러한 검사를 비활성화합니다.
권장되는 네트워크 진단 구성
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: disableNetworkDiagnostics: true
17.6.7.12. SNO 노드 재부팅 시나리오
단일 노드 OpenShift 클러스터에서는 일반적으로 OpenShift Container Platform 클러스터에서는 애플리케이션 Pod 요청 장치가 UnexpectedAdmissionError 오류로 인해 노드 드레이닝 없이 노드 재부팅이 발생하는 경우 발생할 수 있습니다. 배포, 복제 세트 또는 데몬 세트 오류는 해당 장치를 제공하는 Pod가 시작되기 전에 시작될 수 있으므로 Pod를 제공할 수 있기 때문에 이러한 장치를 사용할 수 있기 때문에 노드 재부팅이 발생할 수 있습니다.
이 동작이 예상되는 동안 Pod가 성공적으로 배포되지 않은 경우에도 클러스터에 남아 있고 UnexpectedAdmissionError 를 계속 보고할 수 있습니다. 애플리케이션 Pod는 일반적으로 배포, 복제본 세트 또는 데몬 세트에 포함되므로 이 문제가 완화됩니다. 이 상태에 Pod를 갖는 것은 다른 인스턴스를 실행해야 하므로 중요하지 않습니다. 배포, replicaset 또는 daemonset의 일부인 경우 후속 Pod를 성공적으로 생성 및 실행하고 애플리케이션을 성공적으로 배포할 수 있습니다.
이러한 Pod가 정상적으로 종료되도록 작업 업스트림이 진행 중입니다. 이 문제가 해결될 때까지 Single-node OpenShift 배포에서 다음 명령을 실행하여 실패한 포드를 제거합니다.
$ kubectl delete pods --field-selector status.phase=Failed -n <POD_NAMESPACE>
노드를 드레이닝하는 옵션은 단일 노드 OpenShift 배포에서 사용할 수 없습니다.
17.7. vDU 애플리케이션 워크로드에 대한 단일 노드 OpenShift 클러스터 튜닝 검증
vDU(가상 분산 장치) 애플리케이션을 배포하기 전에 클러스터 호스트 펌웨어 및 기타 다양한 클러스터 구성 설정을 튜닝하고 구성해야 합니다. 다음 정보를 사용하여 vDU 워크로드를 지원하는 클러스터 구성을 검증합니다.
추가 리소스
- vDU 애플리케이션 배포를 위해 조정된 단일 노드 OpenShift 클러스터에 대한 자세한 내용은 단일 노드 OpenShift에 vDU 배포를 위한 참조 구성 을 참조하십시오.
17.7.1. vDU 클러스터 호스트에 권장되는 펌웨어 구성
다음 표를 기준으로 사용하여 OpenShift Container Platform 4.13에서 실행되는 vDU 애플리케이션의 클러스터 호스트 펌웨어를 구성합니다.
다음 표는 vDU 클러스터 호스트 펌웨어 구성에 대한 일반적인 권장 사항입니다. 정확한 펌웨어 설정은 요구 사항 및 특정 하드웨어 플랫폼에 따라 다릅니다. 펌웨어 자동 설정은 제로 툴 프로비저닝 파이프라인에 의해 처리되지 않습니다.
표 17.7. 권장되는 클러스터 호스트 펌웨어 설정
| 펌웨어 설정 | 설정 | 설명 |
|---|---|---|
| HyperTransport (HT) | enabled | HT(HyperTransport) 버스는 AMD가 개발한 버스 기술입니다. HT는 호스트 메모리의 구성 요소와 기타 시스템(system) 간의 고속 링크를 제공합니다. |
| UEFI | enabled | vDU 호스트의 UEFI 부팅을 활성화합니다. |
| CPU 성능 및 성능 정책 | 성능 | CPU 전원 및 성능 정책을 설정하여 에너지 효율성을 통해 성능을 최적화합니다. |
| Uncore Frequency Scaling | disabled | Uncore Frequency Scaling을 비활성화하여 CPU의 비-코어 부분이 독립적으로 설정되는 것을 방지합니다. |
| Uncore Frequency | 최대 | 캐시 및 메모리 컨트롤러와 같은 CPU의 비코어 부분을 최대 작업 빈도로 설정합니다. |
| 성능 P-limit | disabled | 프로세서의 비코어 빈도 조정을 방지하기 위해 성능 P 제한을 비활성화합니다. |
| 향상된 Intel® SpeedStep Tech | enabled | 강화된 Intel 속도 단계를 활성화하여 시스템의 프로세서 전환 및 코어 빈도를 동적으로 조정하여 호스트의 전력 소비 및 열 생성을 줄일 수 있습니다. |
| Intel®ECDHE Boost Technology | enabled | Intel 기반 CPU용ECDHE Boost 기술을 사용하여 성능, 현재 및 온도 사양 제한 아래 작동하는 경우 프로세서 코어가 정격 운영 빈도보다 빠르게 실행될 수 있습니다. |
| Intel Configurable TDP | enabled | CPU의 열 설계 전원(TDP)을 활성화합니다. |
| 구성 가능한 TDP 수준 | 수준 2 | TDP 수준은 특정 성능 등급에 필요한 CPU 전력 소비를 설정합니다. TDP 수준 2는 소비 비용이 가장 안정적인 성능 수준으로 CPU를 설정합니다. |
| 에너지 효율 (Efficient) | disabled | Mellanox 효율성을 비활성화하여 프로세서가 에너지 효율 기반 정책을 사용하지 못하도록 합니다. |
| 하드웨어 P-States | Enabled 또는 Disabled |
OS를 제어하는 P-State를 활성화하여 절전 구성을 허용합니다. |
| 패키지 C-State | C0/C1 상태 | C0 또는 C1 상태를 사용하여 프로세서를 완전히 활성 상태 (C0)로 설정하거나 소프트웨어 (C1)에서 실행되는 CPU 내부 클럭을 중지합니다. |
| C1E | disabled | CPU Enhanced Halt (C1E)는 Intel 칩의 절전 기능입니다. C1E를 비활성화하면 운영 체제가 비활성 상태일 때 운영 체제가 중단된 명령을 CPU로 전송하지 않습니다. |
| 프로세서 C6 | disabled | C6 전원은 유휴 CPU 코어 및 캐시를 자동으로 비활성화하는 CPU 기능입니다. C6을 비활성화하면 시스템 성능이 향상됩니다. |
| 하위 NUMA | disabled | 하위 NUMA 클러스터링은 프로세서 코어, 캐시 및 메모리를 여러 NUMA 도메인으로 나눕니다. 이 옵션을 비활성화하면 대기 시간에 민감한 워크로드의 성능이 향상될 수 있습니다. |
호스트의 펌웨어에서 글로벌 SR-IOV 및 VT-d 설정을 활성화합니다. 이러한 설정은 베어 메탈 환경과 관련이 있습니다.
C-states 및 OS-controlled P-States 를 모두 활성화하여 Pod 전원 관리에 사용할 수 있습니다.
17.7.2. vDU 애플리케이션을 실행하는 데 권장되는 클러스터 구성
vDU(가상화된 분산 장치) 애플리케이션을 실행하는 클러스터에는 고도로 조정되고 최적화된 구성이 필요합니다. 다음 정보는 OpenShift Container Platform 4.13 클러스터에서 vDU 워크로드를 지원하는 데 필요한 다양한 요소를 설명합니다.
17.7.2.1. 권장되는 클러스터 MachineConfig CR
ztp-site-generate 컨테이너에서 추출한 MachineConfig 사용자 정의 리소스(CR)가 클러스터에 적용되었는지 확인합니다. CR은 추출된 out/source-crs/extra-manifest/ 폴더에 있습니다.
ztp-site-generate 컨테이너의 다음 MachineConfig CR은 클러스터 호스트를 구성합니다.
표 17.8. 권장되는 MachineConfig CR
| CR 파일 이름 | 설명 |
|---|---|
|
|
클러스터의 워크로드 파티셔닝을 구성합니다. 클러스터를 설치할 때 이 |
|
|
SCTP 커널 모듈을 로드합니다. 이러한 |
|
| 컨테이너 마운트 네임스페이스 및 Kubelet 구성을 구성합니다. |
|
| 클러스터의 빠른 시작을 구성합니다. |
|
|
클러스터의 |
17.7.2.2. 권장되는 클러스터 Operator
다음 Operator는 가상화된 분산 장치(vDU) 애플리케이션을 실행하는 클러스터에 필요하며 기준 참조 구성의 일부입니다.
- NTO(Node Tuning Operator). 이전에 Performance Addon Operator와 함께 제공된 NTO 패키지 기능은 이제 NTO의 일부입니다.
- PTP Operator
- SR-IOV 네트워크 Operator
- Red Hat OpenShift Logging Operator
- Local Storage Operator
17.7.2.3. 권장되는 클러스터 커널 구성
클러스터에서 항상 지원되는 최신 실시간 커널 버전을 사용하십시오. 클러스터에서 다음 구성을 적용해야 합니다.
클러스터 성능 프로필에 다음
additionalKernelArgs가 설정되어 있는지 확인합니다.spec: additionalKernelArgs: - "rcupdate.rcu_normal_after_boot=0" - "efi=runtime"
TunedCR의performance-patch프로필이 관련PerformanceProfileCR의 분리된 CPU 세트와 일치하는 올바른 CPU격리세트를 구성하는지 확인합니다. 예를 들면 다음과 같습니다.spec: profile: - name: performance-patch # The 'include' line must match the associated PerformanceProfile name # And the cmdline_crash CPU set must match the 'isolated' set in the associated PerformanceProfile data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-node-performance-profile [bootloader] cmdline_crash=nohz_full=2-51,54-103 1 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable- 1
- 나열된 CPU는 호스트 하드웨어 구성, 특히 시스템 및 CPU 토폴로지에서 사용 가능한 CPU 수에 따라 달라집니다.
17.7.2.4. 실시간 커널 버전 확인
OpenShift Container Platform 클러스터에서 항상 최신 버전의 실시간 커널을 사용하십시오. 클러스터에서 사용 중인 커널 버전에 대해 확실하지 않은 경우 현재 실시간 커널 버전을 릴리스 버전과 다음 절차와 비교할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. -
podman을 설치했습니다.
절차
다음 명령을 실행하여 클러스터 버전을 가져옵니다.
$ OCP_VERSION=$(oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}')릴리스 이미지 SHA 번호를 가져옵니다.
$ DTK_IMAGE=$(oc adm release info --image-for=driver-toolkit quay.io/openshift-release-dev/ocp-release:$OCP_VERSION-x86_64)
릴리스 이미지 컨테이너를 실행하고 클러스터의 현재 릴리스와 함께 패키지된 커널 버전을 추출합니다.
$ podman run --rm $DTK_IMAGE rpm -qa | grep 'kernel-rt-core-' | sed 's#kernel-rt-core-##'
출력 예
4.18.0-305.49.1.rt7.121.el8_4.x86_64
이는 릴리스와 함께 제공되는 기본 실시간 커널 버전입니다.
참고실시간 커널은 커널 버전의
.rt문자열로 표시됩니다.
검증
클러스터의 현재 릴리스에 나열된 커널 버전이 클러스터에서 실행 중인 실제 실시간 커널과 일치하는지 확인합니다. 다음 명령을 실행하여 실행 중인 실시간 커널 버전을 확인합니다.
클러스터 노드에 대한 원격 쉘 연결을 엽니다.
$ oc debug node/<node_name>
실시간 커널 버전을 확인합니다.
sh-4.4# uname -r
출력 예
4.18.0-305.49.1.rt7.121.el8_4.x86_64
17.7.3. 권장 클러스터 구성이 적용되었는지 확인
클러스터가 올바른 구성을 실행 중인지 확인할 수 있습니다. 다음 절차에서는 OpenShift Container Platform 4.13 클러스터에서 DU 애플리케이션을 배포하는 데 필요한 다양한 구성을 확인하는 방법을 설명합니다.
사전 요구 사항
- 클러스터를 배포하고 vDU 워크로드에 맞게 조정했습니다.
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다.
절차
기본 OperatorHub 소스가 비활성화되어 있는지 확인합니다. 다음 명령을 실행합니다.
$ oc get operatorhub cluster -o yaml
출력 예
spec: disableAllDefaultSources: true다음 명령을 실행하여 필요한 모든
CatalogSource리소스에 워크로드 파티셔닝에대한 주석이 추가되었는지 확인합니다.$ oc get catalogsource -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.target\.workload\.openshift\.io/management}{"\n"}{end}'출력 예
certified-operators -- {"effect": "PreferredDuringScheduling"} community-operators -- {"effect": "PreferredDuringScheduling"} ran-operators 1 redhat-marketplace -- {"effect": "PreferredDuringScheduling"} redhat-operators -- {"effect": "PreferredDuringScheduling"}- 1
- 주석이 없는
CatalogSource리소스도 반환됩니다. 이 예에서ran-operatorsCatalogSource리소스에는 주석이 주석이 없으며PreferredDuringScheduling주석이 없습니다.
참고올바르게 구성된 vDU 클러스터에서는 주석이 달린 하나의 카탈로그 소스만 나열됩니다.
해당 OpenShift Container Platform Operator 네임스페이스에 워크로드 파티셔닝에 대한 주석이 추가되었는지 확인합니다. 여기에는 코어 OpenShift Container Platform과 함께 설치된 모든 Operator와 참조 DU 튜닝 구성에 포함된 추가 Operator 세트가 포함됩니다. 다음 명령을 실행합니다.
$ oc get namespaces -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.workload\.openshift\.io/allowed}{"\n"}{end}'출력 예
default -- openshift-apiserver -- management openshift-apiserver-operator -- management openshift-authentication -- management openshift-authentication-operator -- management
중요워크로드 파티셔닝을 위해 추가 Operator에 주석을 달 수 없습니다. 이전 명령의 출력에서
--separator의 오른쪽에 있는 값 없이 추가 Operator를 나열해야 합니다.ClusterLogging구성이 올바른지 확인합니다. 다음 명령을 실행합니다.적절한 입력 및 출력 로그가 구성되었는지 확인합니다.
$ oc get -n openshift-logging ClusterLogForwarder instance -o yaml
출력 예
apiVersion: logging.openshift.io/v1 kind: ClusterLogForwarder metadata: creationTimestamp: "2022-07-19T21:51:41Z" generation: 1 name: instance namespace: openshift-logging resourceVersion: "1030342" uid: 8c1a842d-80c5-447a-9150-40350bdf40f0 spec: inputs: - infrastructure: {} name: infra-logs outputs: - name: kafka-open type: kafka url: tcp://10.46.55.190:9092/test pipelines: - inputRefs: - audit name: audit-logs outputRefs: - kafka-open - inputRefs: - infrastructure name: infrastructure-logs outputRefs: - kafka-open ...큐레이션 일정이 애플리케이션에 적합한지 확인합니다.
$ oc get -n openshift-logging clusterloggings.logging.openshift.io instance -o yaml
출력 예
apiVersion: logging.openshift.io/v1 kind: ClusterLogging metadata: creationTimestamp: "2022-07-07T18:22:56Z" generation: 1 name: instance namespace: openshift-logging resourceVersion: "235796" uid: ef67b9b8-0e65-4a10-88ff-ec06922ea796 spec: collection: logs: fluentd: {} type: fluentd curation: curator: schedule: 30 3 * * * type: curator managementState: Managed ...
다음 명령을 실행하여 웹 콘솔이 비활성화되었는지 확인합니다(
managementState: Removed).$ oc get consoles.operator.openshift.io cluster -o jsonpath="{ .spec.managementState }"출력 예
Removed
다음 명령을 실행하여 클러스터 노드에서
chronyd가 비활성화되어 있는지 확인합니다.$ oc debug node/<node_name>
노드에서
chronyd의 상태를 확인합니다.sh-4.4# chroot /host
sh-4.4# systemctl status chronyd
출력 예
● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:chronyd(8) man:chrony.conf(5)linuxptp-daemon컨테이너 및 PTP 관리 클라이언트(pmc) 툴에 원격 쉘 연결을 사용하여 PTP 인터페이스가 기본 클럭에 성공적으로 동기화되었는지 확인합니다.다음 명령을 실행하여
linuxptp-daemonpod의 이름으로$PTP_POD_NAME변수를 설정합니다.$ PTP_POD_NAME=$(oc get pods -n openshift-ptp -l app=linuxptp-daemon -o name)
다음 명령을 실행하여 PTP 장치의 동기화 상태를 확인합니다.
$ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'출력 예
sending: GET PORT_DATA_SET 3cecef.fffe.7a7020-1 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET portIdentity 3cecef.fffe.7a7020-1 portState SLAVE logMinDelayReqInterval -4 peerMeanPathDelay 0 logAnnounceInterval 1 announceReceiptTimeout 3 logSyncInterval 0 delayMechanism 1 logMinPdelayReqInterval 0 versionNumber 2 3cecef.fffe.7a7020-2 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET portIdentity 3cecef.fffe.7a7020-2 portState LISTENING logMinDelayReqInterval 0 peerMeanPathDelay 0 logAnnounceInterval 1 announceReceiptTimeout 3 logSyncInterval 0 delayMechanism 1 logMinPdelayReqInterval 0 versionNumber 2다음
pmc명령을 실행하여 PTP 클럭 상태를 확인합니다.$ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET TIME_STATUS_NP'출력 예
sending: GET TIME_STATUS_NP 3cecef.fffe.7a7020-0 seq 0 RESPONSE MANAGEMENT TIME_STATUS_NP master_offset 10 1 ingress_time 1657275432697400530 cumulativeScaledRateOffset +0.000000000 scaledLastGmPhaseChange 0 gmTimeBaseIndicator 0 lastGmPhaseChange 0x0000'0000000000000000.0000 gmPresent true 2 gmIdentity 3c2c30.ffff.670e00linuxptp-daemon-container로그에서/var/run/ptp4l.0.config의 값에 해당하는 예상마스터 오프셋값이 있는지 확인합니다.$ oc logs $PTP_POD_NAME -n openshift-ptp -c linuxptp-daemon-container
출력 예
phc2sys[56020.341]: [ptp4l.1.config] CLOCK_REALTIME phc offset -1731092 s2 freq -1546242 delay 497 ptp4l[56020.390]: [ptp4l.1.config] master offset -2 s2 freq -5863 path delay 541 ptp4l[56020.390]: [ptp4l.0.config] master offset -8 s2 freq -10699 path delay 533
다음 명령을 실행하여 SR-IOV 구성이 올바른지 확인합니다.
SriovOperatorConfig리소스의disableDrain값이true로 설정되어 있는지 확인합니다.$ oc get sriovoperatorconfig -n openshift-sriov-network-operator default -o jsonpath="{.spec.disableDrain}{'\n'}"출력 예
true
다음 명령을 실행하여
SriovNetworkNodeState동기화 상태가Succeeded인지 확인합니다.$ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o jsonpath="{.items[*].status.syncStatus}{'\n'}"출력 예
Succeeded
SR-IOV에 대해 구성된 각 인터페이스의 가상 기능(
Vfs)의 예상 수 및 구성이.status.interfaces필드에 있고 올바른지 확인합니다. 예를 들면 다음과 같습니다.$ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o yaml
출력 예
apiVersion: v1 items: - apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodeState ... status: interfaces: ... - Vfs: - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.0 vendor: "8086" vfID: 0 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.1 vendor: "8086" vfID: 1 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.2 vendor: "8086" vfID: 2 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.3 vendor: "8086" vfID: 3 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.4 vendor: "8086" vfID: 4 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.5 vendor: "8086" vfID: 5 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.6 vendor: "8086" vfID: 6 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.7 vendor: "8086" vfID: 7
클러스터 성능 프로필이 올바른지 확인합니다.
cpu및hugepages섹션은 하드웨어 구성에 따라 다릅니다. 다음 명령을 실행합니다.$ oc get PerformanceProfile openshift-node-performance-profile -o yaml
출력 예
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: creationTimestamp: "2022-07-19T21:51:31Z" finalizers: - foreground-deletion generation: 1 name: openshift-node-performance-profile resourceVersion: "33558" uid: 217958c0-9122-4c62-9d4d-fdc27c31118c spec: additionalKernelArgs: - idle=poll - rcupdate.rcu_normal_after_boot=0 - efi=runtime cpu: isolated: 2-51,54-103 reserved: 0-1,52-53 hugepages: defaultHugepagesSize: 1G pages: - count: 32 size: 1G machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/master: "" net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/master: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true status: conditions: - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "True" type: Available - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "True" type: Upgradeable - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "False" type: Progressing - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "False" type: Degraded runtimeClass: performance-openshift-node-performance-profile tuned: openshift-cluster-node-tuning-operator/openshift-node-performance-openshift-node-performance-profile참고CPU 설정은 서버에서 사용할 수 있는 코어 수에 따라 달라지며 워크로드 파티션 설정과 일치해야 합니다.
hugepages구성은 server 및 application dependent입니다.다음 명령을 실행하여
PerformanceProfile이 클러스터에 성공적으로 적용되었는지 확인합니다.$ oc get performanceprofile openshift-node-performance-profile -o jsonpath="{range .status.conditions[*]}{ @.type }{' -- '}{@.status}{'\n'}{end}"출력 예
Available -- True Upgradeable -- True Progressing -- False Degraded -- False
다음 명령을 실행하여
Tuned성능 패치 설정을 확인합니다.$ oc get tuneds.tuned.openshift.io -n openshift-cluster-node-tuning-operator performance-patch -o yaml
출력 예
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: creationTimestamp: "2022-07-18T10:33:52Z" generation: 1 name: performance-patch namespace: openshift-cluster-node-tuning-operator resourceVersion: "34024" uid: f9799811-f744-4179-bf00-32d4436c08fd spec: profile: - data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-node-performance-profile [bootloader] cmdline_crash=nohz_full=2-23,26-47 1 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable name: performance-patch recommend: - machineConfigLabels: machineconfiguration.openshift.io/role: master priority: 19 profile: performance-patch- 1
cmdline=nohz_full=의 cpu 목록은 하드웨어 구성에 따라 다릅니다.
다음 명령을 실행하여 클러스터 네트워킹 진단이 비활성화되어 있는지 확인합니다.
$ oc get networks.operator.openshift.io cluster -o jsonpath='{.spec.disableNetworkDiagnostics}'출력 예
true
Kubelet하우스키핑 간격이 느린 비율로 조정되었는지 확인합니다. 이는containerMountNS머신 구성에 설정됩니다. 다음 명령을 실행합니다.$ oc describe machineconfig container-mount-namespace-and-kubelet-conf-master | grep OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION
출력 예
Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s"
Grafana 및
alertManagerMain이 비활성화되어 있고 다음 명령을 실행하여 Prometheus 보존 기간이 24h로 설정되어 있는지 확인합니다.$ oc get configmap cluster-monitoring-config -n openshift-monitoring -o jsonpath="{ .data.config\.yaml }"출력 예
grafana: enabled: false alertmanagerMain: enabled: false prometheusK8s: retention: 24h
다음 명령을 사용하여 Grafana 및
alertManagerMain경로가 클러스터에 없는지 확인합니다.$ oc get route -n openshift-monitoring alertmanager-main
$ oc get route -n openshift-monitoring grafana
두 쿼리 모두
Error from server (NotFound)메시지를 반환해야 합니다.
다음 명령을 실행하여 각
PerformanceProfile,Tunedperformance-patch, 워크로드 파티셔닝 및 커널 명령줄 인수에예약된최소 4개의 CPU가 할당되었는지 확인합니다.$ oc get performanceprofile -o jsonpath="{ .items[0].spec.cpu.reserved }"출력 예
0-3
참고워크로드 요구 사항에 따라 추가로 예약된 CPU를 할당해야 할 수 있습니다.
17.8. siteConfig 리소스를 사용한 고급 관리형 클러스터 구성
site Config CR(사용자 정의 리소스)을 사용하여 설치 시 관리 클러스터에 사용자 정의 기능 및 구성을 배포할 수 있습니다.
17.8.1. GitOps ZTP 파이프라인에서 추가 설치 매니페스트 사용자 정의
GitOps ZeroForwarded Provisioning (ZTP) 파이프라인의 설치 단계에 포함하기 위해 추가 매니페스트 세트를 정의할 수 있습니다. 이러한 매니페스트는 site Config CR(사용자 정의 리소스)에 연결되며 설치 중에 클러스터에 적용됩니다. 설치 시 MachineConfig CR을 포함하면 설치 프로세스가 향상됩니다.
사전 요구 사항
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성합니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
절차
- GitOps ZTP 파이프라인에서 클러스터 설치를 사용자 지정하는 데 사용하는 추가 매니페스트 CR 세트를 생성합니다.
사용자 지정
/siteconfig디렉터리에서 추가 매니페스트에 대한/extra-manifest폴더를 생성합니다. 다음 예제에서는/extra-manifest폴더가 있는 샘플/siteconfig를 보여줍니다.siteconfig ├── site1-sno-du.yaml ├── site2-standard-du.yaml └── extra-manifest └── 01-example-machine-config.yaml-
사용자 정의 추가 매니페스트 CR을
siteconfig/extra-manifest디렉터리에 추가합니다. site
Config CR에서extraManifestPath필드에 디렉터리 이름을 입력합니다. 예를 들면 다음과 같습니다.clusters: - clusterName: "example-sno" networkType: "OVNKubernetes" extraManifestPath: extra-manifest
-
site
ConfigCR 및/extra-manifestCR을 저장하고 사이트 구성 리포지토리로 내보냅니다.
GitOps ZTP 파이프라인은 클러스터 프로비저닝 중에 /extra-manifest 디렉터리의 CR을 기본 매니페스트 세트에 추가합니다.
17.8.2. siteConfig 필터를 사용하여 사용자 정의 리소스 필터링
필터를 사용하면 GTP(사용자 정의 리소스) 파이프라인의 설치 단계에서 사용할 다른 CR을 포함하거나 제외하도록 SiteConfig 사용자 지정 리소스(CR)를 쉽게 사용자 지정할 수 있습니다.
포함하거나 제외 하려는 특정 extraManifest RAN CR 목록과 함께 site Config CR 포함 또는 제외를 지정할 수 있습니다. inclusionDefault 를 include 로 설정하면 GitOps ZTP 파이프라인에서 설치 중에 /source-crs/extra-manifest 의 모든 파일을 적용합니다. inclusionDefault 를 exclude 로 설정하면 그 반대의 작업이 수행됩니다.
기본적으로 포함된 /source-crs/extra-manifest 폴더에 개별 CR을 제외할 수 있습니다. 다음 예제에서는 설치 시 CR을 구성합니다.
/source-crs/extra-manifest/03-sctp-machine-config-worker.yaml CR을 제외하도록 사용자 지정 단일 노드 OpenShift siteConfig
일부 추가 선택적 필터링 시나리오도 설명되어 있습니다.
사전 요구 사항
- 필요한 설치 및 정책 CR을 생성하기 위해 hub 클러스터를 구성했습니다.
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성하셨습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
절차
GitOps ZTP 파이프라인에서
03-sctp-machine-config-worker.yamlCR 파일을 적용하지 않으려면SiteConfigCR에 다음 YAML을 적용합니다.apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "site1-sno-du" namespace: "site1-sno-du" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" clusterImageSetNameRef: "openshift-4.13" sshPublicKey: "<ssh_public_key>" clusters: - clusterName: "site1-sno-du" extraManifests: filter: exclude: - 03-sctp-machine-config-worker.yamlGitOps ZTP 파이프라인은 설치 중에
03-sctp-machine-config-worker.yamlCR을 건너뜁니다./source-crs/extra-manifest의 다른 모든 CR이 적용됩니다.site
ConfigCR을 저장하고 변경 사항을 사이트 구성 리포지토리로 내보냅니다.GitOps ZTP 파이프라인은
SiteConfig필터 지침에 따라 적용되는 CR을 모니터링하고 조정합니다.선택 사항: GitOps ZTP 파이프라인에서 클러스터 설치 중에 모든
/source-crs/extra-manifestCR을 적용하지 못하도록 하려면SiteConfigCR에 다음 YAML을 적용합니다.- clusterName: "site1-sno-du" extraManifests: filter: inclusionDefault: exclude선택 사항: 모든
/source-crs/extra-manifestRAN CR을 제외하고 설치 중에 사용자 정의 CR 파일을 포함하려면 사용자 정의 siteConfigCR을 편집하여 사용자 정의 매니페스트 폴더 및포함파일을 설정합니다.clusters: - clusterName: "site1-sno-du" extraManifestPath: "<custom_manifest_folder>" 1 extraManifests: filter: inclusionDefault: exclude 2 include: - custom-sctp-machine-config-worker.yaml
다음 예제에서는 사용자 정의 폴더 구조를 보여줍니다.
siteconfig ├── site1-sno-du.yaml └── user-custom-manifest └── custom-sctp-machine-config-worker.yaml
17.9. PolicyGenTemplate 리소스를 사용한 고급 관리형 클러스터 구성
PolicyGenTemplate CR을 사용하여 관리 클러스터에 사용자 정의 기능을 배포할 수 있습니다.
17.9.1. 클러스터에 대한 추가 변경 사항 배포
기본 GitOps Zero IKEv Provisioning (ZTP) 파이프라인 구성 외부에서 클러스터 구성을 변경해야하는 경우 다음 세 가지 옵션이 있습니다.
- GitOps ZTP 파이프라인이 완료된 후 추가 구성을 적용합니다.
- GitOps ZTP 파이프라인 배포가 완료되면 배포된 클러스터는 애플리케이션 워크로드를 지원할 준비가 되어 있습니다. 이 시점에서 추가 Operator를 설치하고 요구 사항에 맞는 구성을 적용할 수 있습니다. 추가 구성이 플랫폼 또는 할당된 CPU 예산의 성능에 부정적인 영향을 미치지 않도록 합니다.
- GitOps ZTP 라이브러리에 콘텐츠 추가
- GitOps ZTP 파이프라인을 사용하여 배포하는 기본 소스 CR(사용자 정의 리소스)은 필요에 따라 사용자 정의 콘텐츠로 보강될 수 있습니다.
- 클러스터 설치에 대한 추가 매니페스트 생성
- 추가 매니페스트는 설치 중에 적용되며 설치 프로세스를 보다 효율적으로 수행할 수 있습니다.
추가 소스 CR을 제공하거나 기존 소스 CR을 수정하면 OpenShift Container Platform의 성능 또는 CPU 프로필에 심각한 영향을 미칠 수 있습니다.
17.9.2. PolicyGenTemplate CR을 사용하여 소스 CR 콘텐츠 덮어쓰기
PolicyGenTemplate 사용자 정의 리소스(CR)를 사용하면 ztp-site-generate 컨테이너에서 GitOps 플러그인과 함께 제공되는 기본 소스 CR 상단에 추가 구성 세부 정보를 오버레이할 수 있습니다. PolicyGenTemplate CR을 기본 CR에 대한 논리적 병합 또는 패치로 생각할 수 있습니다. PolicyGenTemplate CR을 사용하여 기본 CR의 단일 필드를 업데이트하거나 기본 CR의 전체 콘텐츠를 오버레이합니다. 기본 CR에 없는 값을 업데이트하고 필드를 삽입할 수 있습니다.
다음 예제 절차에서는 group-du-sno-ranGen.yaml 파일의 PolicyGenTemplate CR을 기반으로 참조 구성에 대해 생성된 PerformanceProfile CR의 필드를 업데이트하는 방법을 설명합니다. 요구 사항에 따라 PolicyGenTemplate 의 다른 부분을 수정하기 위해 절차를 기준으로 사용하십시오.
사전 요구 사항
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성합니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD의 소스 리포지토리로 정의해야 합니다.
절차
기존 콘텐츠의 기준 소스 CR을 검토합니다. 참조
PolicyGenTemplateCR에 나열된 소스 CR을 검토할 수 있습니다. 이 CR은 GitOps ZeroForwarded Provisioning(ZTP) 컨테이너에서 추출하여 확인할 수 있습니다./out폴더를 생성합니다.$ mkdir -p ./out
소스 CR을 추출합니다.
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13.1 extract /home/ztp --tar | tar x -C ./out
./out/source-crs/에서 기본 PerformanceProfile CR을 검토합니다.PerformanceProfile.yamlapiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: $name annotations: ran.openshift.io/ztp-deploy-wave: "10" spec: additionalKernelArgs: - "idle=poll" - "rcupdate.rcu_normal_after_boot=0" cpu: isolated: $isolated reserved: $reserved hugepages: defaultHugepagesSize: $defaultHugepagesSize pages: - size: $size count: $count node: $node machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/$mcp: "" net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/$mcp: '' numa: topologyPolicy: "restricted" realTimeKernel: enabled: true참고PolicyGenTemplateCR에 제공되지 않는 경우 생성된 CR이 포함된 소스 CR의 모든 필드가 제거됩니다.group-du-sno-ranGen.yaml참조 파일에서PerformanceProfile에 대한PolicyGenTemplate항목을 업데이트합니다. 다음 예제PolicyGenTemplateCR 스탠자는 적절한 CPU 사양을 제공하고hugepages구성을 설정하고globallyDisableIrqLoadBalancing을 false로 설정하는 새 필드를 추가합니다.- fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: name: openshift-node-performance-profile spec: cpu: # These must be tailored for the specific hardware platform isolated: "2-19,22-39" reserved: "0-1,20-21" hugepages: defaultHugepagesSize: 1G pages: - size: 1G count: 10 globallyDisableIrqLoadBalancing: false-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP argo CD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.
출력 예
GitOps ZTP 애플리케이션은 생성된 PerformanceProfile CR이 포함된 RHACM 정책을 생성합니다. 해당 CR의 콘텐츠는 PolicyGenTemplate 의 PerformanceProfile 항목에서 메타데이터 및 사양 콘텐츠를 소스 CR에 병합하여 파생됩니다. 결과 CR에는 다음 내용이 있습니다.
---
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
name: openshift-node-performance-profile
spec:
additionalKernelArgs:
- idle=poll
- rcupdate.rcu_normal_after_boot=0
cpu:
isolated: 2-19,22-39
reserved: 0-1,20-21
globallyDisableIrqLoadBalancing: false
hugepages:
defaultHugepagesSize: 1G
pages:
- count: 10
size: 1G
machineConfigPoolSelector:
pools.operator.machineconfiguration.openshift.io/master: ""
net:
userLevelNetworking: true
nodeSelector:
node-role.kubernetes.io/master: ""
numa:
topologyPolicy: restricted
realTimeKernel:
enabled: true
ztp-site-generate 컨테이너에서 추출한 /source-crs 폴더의 $ 구문은 구문에서 암시적으로 템플릿 대체에 사용되지 않습니다. 대신 policyGen 툴이 문자열에 대한 $ 접두사를 확인하고 관련 PolicyGenTemplate CR에서 해당 필드에 대한 값을 지정하지 않으면 해당 필드가 출력 CR에서 완전히 생략됩니다.
이에 대한 예외는 PolicyGenTemplate CR에서 mcp 값으로 대체되는 /source-crs YAML 파일의 $mcp 변수입니다. 예를 들어 example/policygentemplates/group-du-standard-ranGen.yaml 에서 mcp 의 값은 worker 입니다.
spec:
bindingRules:
group-du-standard: ""
mcp: "worker"
policyGen 툴은 $mcp 의 인스턴스를 출력 CR의 worker 로 교체합니다.
17.9.3. GitOps ZTP 파이프라인에 새 콘텐츠 추가
GitOps ZeroForwarded Provisioning (ZTP) 사이트 생성기 컨테이너의 소스 CR은 RAN Distributed Unit (DU) 애플리케이션에 대한 중요한 기능 및 노드 튜닝 설정 세트를 제공합니다. 이는 GitOps ZTP를 사용하여 배포하는 클러스터에 적용됩니다. ztp-site-generate 컨테이너에서 기존 소스 CR을 추가하거나 수정하려면 ztp-site-generate 컨테이너를 다시 빌드하고 일반적으로 hub 클러스터와 연결된 연결이 끊긴 레지스트리에서 hub 클러스터에서 사용할 수 있도록 합니다. 유효한 OpenShift Container Platform CR을 추가할 수 있습니다.
GitOps ZTP 파이프라인에 새 콘텐츠를 추가하려면 다음 절차를 수행합니다.
절차
업데이트된
ztp-site-generate컨테이너에 포함할 Containerfile 및 소스 CR YAML 파일이 포함된 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.ztp-update/ ├── example-cr1.yaml ├── example-cr2.yaml └── ztp-update.in
ztp-update.inContainerfile에 다음 내용을 추가합니다.FROM registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13 ADD example-cr2.yaml /kustomize/plugin/ran.openshift.io/v1/policygentemplate/source-crs/ ADD example-cr1.yaml /kustomize/plugin/ran.openshift.io/v1/policygentemplate/source-crs/
ztp-update/폴더에 있는 터미널을 열고 컨테이너를 다시 빌드합니다.$ podman build -t ztp-site-generate-rhel8-custom:v4.13-custom-1
빌드 컨테이너 이미지를 연결이 끊긴 레지스트리로 푸시합니다. 예를 들면 다음과 같습니다.
$ podman push localhost/ztp-site-generate-rhel8-custom:v4.13-custom-1 registry.example.com:5000/ztp-site-generate-rhel8-custom:v4.13-custom-1
hub 클러스터에 Argo CD 인스턴스를 패치하여 새로 빌드된 컨테이너 이미지를 가리킵니다.
$ oc patch -n openshift-gitops argocd openshift-gitops --type=json -p '[{"op": "replace", "path":"/spec/repo/initContainers/0/image", "value": "registry.example.com:5000/ztp-site-generate-rhel8-custom:v4.13-custom-1"} ]'Argo CD 인스턴스가 패치되면
openshift-gitops-repo-serverPod가 자동으로 다시 시작됩니다.
검증
새
openshift-gitops-repo-serverPod가 초기화를 완료했으며 이전 repo Pod가 종료되었는지 확인합니다.$ oc get pods -n openshift-gitops | grep openshift-gitops-repo-server
출력 예
openshift-gitops-server-7df86f9774-db682 1/1 Running 1 28s
새로 추가된 컨테이너 이미지 콘텐츠를 사용할 수 있기 전에 새로운
openshift-gitops-repo-serverPod가 초기화를 완료할 때까지 기다려야 합니다.
추가 리소스
-
또는 패치 파일을 적용하기 전에 업데이트된
initContainer이미지로argocd-openshift-gitops-patch.json을 수정하여 ArgoCD를 사용하여 hub 클러스터 구성에 설명된 대로 ArgoCD 인스턴스를 패치할 수 있습니다.
17.9.4. PolicyGenTemplate CR에 대한 정책 준수 평가 타임아웃 구성
관리 클러스터가 적용된 정책을 준수하는지 여부를 모니터링 및 보고하려면 hub 클러스터에 설치된 RHACM(Red Hat Advanced Cluster Management)을 사용합니다. RHACM은 정책 템플릿을 사용하여 사전 정의된 정책 컨트롤러 및 정책을 적용합니다. 정책 컨트롤러는 Kubernetes CRD(사용자 정의 리소스 정의) 인스턴스입니다.
기본 정책 평가 간격은 PolicyGenTemplate CR(사용자 정의 리소스)으로 덮어쓸 수 있습니다. RHACM이 적용된 클러스터 정책을 다시 평가하기 전에 ConfigurationPolicy CR의 상태가 정책 준수 또는 비준수 상태에 있는 기간을 정의하는 기간 설정을 구성합니다.
GitOps ZeroForwarded Provisioning (ZTP) 정책 생성기에서는 사전 정의된 정책 평가 간격으로 ConfigurationPolicy CR 정책을 생성합니다. 비호환 상태의 기본값은 10초입니다. 준수 상태의 기본값은 10분입니다. 평가 간격을 비활성화하려면 값을 never 로 설정합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
PolicyGenTemplateCR에서 모든 정책에 대한 평가 간격을 구성하려면spec필드에evaluationInterval을 추가한 다음 적절한준수및비준수값을 설정합니다. 예를 들면 다음과 같습니다.spec: evaluationInterval: compliant: 30m noncompliant: 20sPolicyGenTemplateCR에서spec.sourceFiles오브젝트에 대한 평가 간격을 구성하려면evaluationInterval을sourceFiles필드에 추가합니다. 예를 들면 다음과 같습니다.spec: sourceFiles: - fileName: SriovSubscription.yaml policyName: "sriov-sub-policy" evaluationInterval: compliant: never noncompliant: 10s-
Git 리포지토리에서
PolicyGenTemplateCR 파일을 커밋하고 변경 사항을 내보냅니다.
검증
관리형 스포크 클러스터 정책이 예상 간격으로 모니터링되는지 확인합니다.
-
관리형 클러스터에서
cluster-admin권한이 있는 사용자로 로그인합니다. open-cluster-management-agent-addon네임스페이스에서 실행 중인 pod를 가져옵니다. 다음 명령을 실행합니다.$ oc get pods -n open-cluster-management-agent-addon
출력 예
NAME READY STATUS RESTARTS AGE config-policy-controller-858b894c68-v4xdb 1/1 Running 22 (5d8h ago) 10d
config-policy-controllerPod에 대한 로그의 예상 간격으로 적용된 정책이 평가되고 있는지 확인합니다.$ oc logs -n open-cluster-management-agent-addon config-policy-controller-858b894c68-v4xdb
출력 예
2022-05-10T15:10:25.280Z info configuration-policy-controller controllers/configurationpolicy_controller.go:166 Skipping the policy evaluation due to the policy not reaching the evaluation interval {"policy": "compute-1-config-policy-config"} 2022-05-10T15:10:25.280Z info configuration-policy-controller controllers/configurationpolicy_controller.go:166 Skipping the policy evaluation due to the policy not reaching the evaluation interval {"policy": "compute-1-common-compute-1-catalog-policy-config"}
17.9.5. 유효성 검사 정보 정책을 사용하여 GitOps ZTP 클러스터 배포 완료
GTP(HITOP) 설치 및 배포된 클러스터의 구성이 완료된 경우 신호를 보내는 유효성 검사 정보 정책을 생성합니다. 이 정책은 단일 노드 OpenShift 클러스터, 3 노드 클러스터 및 표준 클러스터의 배포에 사용할 수 있습니다.
절차
소스 파일
validatorCRs/informDuValidator.yaml을 포함하는 독립 실행형PolicyGenTemplate사용자 정의 리소스(CR)를 생성합니다. 각 클러스터 유형에 대해 하나의 독립 실행형PolicyGenTemplateCR만 있으면 됩니다. 예를 들어, 이 CR은 단일 노드 OpenShift 클러스터에 대한 검증기를 적용합니다.예제 single-node 클러스터 검증기에서는 정책 CR을 알립니다 (group-du-sno-validator-ranGen.yaml).
apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "group-du-sno-validator" 1 namespace: "ztp-group" 2 spec: bindingRules: group-du-sno: "" 3 bindingExcludedRules: ztp-done: "" 4 mcp: "master" 5 sourceFiles: - fileName: validatorCRs/informDuValidator.yaml remediationAction: inform 6 policyName: "du-policy" 7
- 1
PolicyGenTemplates오브젝트의 이름입니다. 이 이름은 요청된네임스페이스에서 생성된placementBinding,placementRule,정책의 이름의 일부로도 사용됩니다.- 2
- 이 값은
PolicyGenTemplates그룹에 사용된네임스페이스와 일치해야 합니다. - 3
bindingRules에 정의된group-du-*레이블은 siteConfig 파일에있어야 합니다.- 4
bindingExcludedRules에 정의된 레이블은 'ztp-done:'이어야 합니다.ztp-done레이블은 토폴로지 Aware Lifecycle Manager와 조정하는 데 사용됩니다.- 5
MCP는 소스 파일validatorCRs/informDuValidator.yaml에서 사용되는MachineConfigPool개체를 정의합니다. 단일 노드 및 표준 클러스터 배포를 위한 3-노드 클러스터 배포의 경우master여야 하며 표준 클러스터 배포를 위한worker여야 합니다.- 6
- 선택 사항: 기본값은
inform입니다. - 7
- 이 값은 생성된 RHACM 정책의 이름의 일부로 사용됩니다. 단일 노드 예제에 대해 생성된 검증기 정책은
group-du-sno-validator-du-policy입니다.
-
Git 리포지토리에서
PolicyGenTemplateCR 파일을 커밋하고 변경 사항을 내보냅니다.
추가 리소스
17.9.6. PolicyGenTemplates CR을 사용하여 전원 상태 구성
대기 시간이 짧고 고성능 엣지 배포의 경우 C 상태 및 P-state를 비활성화하거나 제한해야 합니다. 이 구성으로 CPU는 일반적으로 최대 turbo 빈도인 상수 빈도로 실행됩니다. 이렇게 하면 CPU가 항상 최대 속도로 실행되므로 성능이 향상되고 대기 시간이 짧습니다. 이로 인해 워크로드에 최상의 대기 시간이 발생합니다. 그러나 이로 인해 전력 소비가 가장 높기 때문에 모든 워크로드에 필요하지 않을 수 있습니다.
워크로드는 중요하거나 중요하지 않은 것으로 분류할 수 있으며, 성능 및 짧은 대기 시간을 위해 C-state 및 P-state 설정을 비활성화해야 하는 중요한 워크로드는 중요하지 않은 워크로드에서 일부 대기 시간과 성능을 저하시킬 때 전력 절감을 위해 C-state 및 P-state 설정을 사용합니다. GitOps Zero 10.0.0.1 Provisioning (ZTP)을 사용하여 다음 세 가지 전원 상태를 구성할 수 있습니다.
- 고성능 모드는 가장 높은 전력 소비에서 매우 낮은 대기 시간을 제공합니다.
- 성능 모드는 상대적으로 높은 전력 소비에서 짧은 대기 시간을 제공합니다.
- 전력 절감을 통해 전력 소비를 줄이고 대기 시간이 늘어납니다.
기본 구성은 짧은 대기 시간 성능 모드입니다.
PolicyGenTemplate CR(사용자 정의 리소스)을 사용하면 ztp-site-generate 컨테이너에서 GitOps 플러그인이 제공된 기본 소스 CR에 추가 구성 세부 정보를 오버레이할 수 있습니다.
group-du- 의 s no-ranGen.yamlPolicyGenTemplate CR에 따라 생성된 PerformanceProfile CR에서 생성된 PerformanceProfile CR을 업데이트하여 전원 상태를 구성합니다.
다음의 일반적인 사전 요구 사항은 세 가지 전원 상태를 모두 구성하는 데 적용됩니다.
사전 요구 사항
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD의 소스 리포지토리로 정의해야 합니다.
- " GitOps ZTP 사이트 구성 리포지토리 준비"에 설명된 절차를 따르십시오.
추가 리소스
17.9.6.1. PolicyGenTemplate CR을 사용하여 성능 모드 구성
다음 예제에서는 group-du-sno-ranGen.yaml 의 PolicyGenTemplate CR에 따라 생성된 PerformanceProfile CR에서 생성된 PerformanceProfile CR에 있는 workloadHints 필드를 업데이트하여 성능 모드를 설정합니다.
성능 모드는 상대적으로 높은 전력 소비에서 짧은 대기 시간을 제공합니다.
사전 요구 사항
- "초기 대기 시간과 높은 성능을 위해 호스트 펌웨어 구성"의 지침에 따라 성능 관련 설정으로 BIOS를 구성했습니다.
절차
성능 모드를 설정하기 위해 다음과 같이
out/argocd/example/policygentemplates의group-du-sno-ranGen.yaml참조 파일에서PerformanceProfile의PolicyGenTemplate항목을 업데이트합니다.- fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: [...] spec: [...] workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: false-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP Argo CD 애플리케이션에서 모니터링 중인 Git 리포지토리로 내보냅니다.
17.9.6.2. PolicyGenTemplate CR을 사용하여 고성능 모드 구성
다음 예제에서는 group-du-sno-ranGen.yaml 의 PolicyGenTemplate CR에 따라 생성된 PerformanceProfile CR에서 생성된 PerformanceProfile CR에 있는 workloadHints 필드를 업데이트하여 고성능 모드를 설정합니다.
고성능 모드는 가장 높은 전력 소비에서 매우 낮은 대기 시간을 제공합니다.
사전 요구 사항
- "초기 대기 시간과 높은 성능을 위해 호스트 펌웨어 구성"의 지침에 따라 성능 관련 설정으로 BIOS를 구성했습니다.
절차
다음과 같이
PerformanceProfile의PolicyGenTemplate항목을out/argocd/example/policygentemplates의group-du-sno-ranGen.yaml참조 파일에서 업데이트합니다.- fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: [...] spec: [...] workloadHints: realTime: true highPowerConsumption: true perPodPowerManagement: false-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP Argo CD 애플리케이션에서 모니터링 중인 Git 리포지토리로 내보냅니다.
17.9.6.3. PolicyGenTemplate CR을 사용하여 절전 모드 구성
이 예제를 따라 group-du-sno-ranGen.yaml 의 PolicyGenTemplate CR에 따라 생성된 PerformanceProfile CR에서 생성된 PerformanceProfile CR에 있는 workloadHints 필드를 업데이트하여 전원 절약 모드를 설정합니다.
절전 모드의 균형을 유지하면 대기 시간이 늘어남에 따라 전력 소비가 감소됩니다.
사전 요구 사항
- BIOS에서 C-states 및 OS 제어 P-states를 활성화했습니다.
절차
다음과 같이
PerformanceProfile의PolicyGenTemplate항목을out/argocd/example/policygentemplates의group-du-sno-ranGen.yaml참조 파일에서 업데이트합니다. 추가 커널 인수 오브젝트를 통해 절전 모드에 대한 CPU governor를 구성하는 것이 좋습니다.- fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: [...] spec: [...] workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: true [...] additionalKernelArgs: - [...] - "cpufreq.default_governor=schedutil" 1- 1
- 그러나
schedutilgovernor를 사용하는 것이 좋습니다. 그러나 사용할 수있는 다른 governor에는온디멘트 및이 포함됩니다.전원저장
-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP Argo CD 애플리케이션에서 모니터링 중인 Git 리포지토리로 내보냅니다.
검증
다음 명령을 사용하여 식별되는 노드 목록에서 배포된 클러스터의 작업자 노드를 선택합니다.
$ oc get nodes
다음 명령을 사용하여 노드에 로그인합니다.
$ oc debug node/<node-name>
&
lt;node-name>을 전원 상태를 확인할 노드 이름으로 바꿉니다.디버그 쉘 내에서
/host를 root 디렉터리로 설정합니다. 디버그 Pod는 Pod 내의/host에 호스트의 루트 파일 시스템을 마운트합니다. root 디렉토리를/host로 변경하면 다음 예와 같이 호스트의 실행 경로에 포함된 바이너리를 실행할 수 있습니다.# chroot /host
다음 명령을 실행하여 적용된 전원 상태를 확인합니다.
# cat /proc/cmdline
예상 출력
-
절전 모드의 경우
intel_pstate=passive.
17.9.6.4. 전력 절감 극대화
최대 CPU 빈도를 제한하여 최대 전력 절감을 달성하는 것이 좋습니다. 최대 CPU 빈도를 제한하지 않고 중요한 CPU의 빈도를 늘리지 않고 중요한 워크로드 CPU에서 C 상태를 활성화합니다.
sysfs 플러그인 필드를 업데이트하여 power saving를 극대화하고 참조 구성에 대해 TunedPerformancePatch CR에 적절한 max_perf_pct 값을 설정합니다. 이 예에서는 group-du-sno-ranGen.yaml 을 기반으로 최대 CPU 빈도를 제한하는 프로세스를 설명합니다.
사전 요구 사항
- " PolicyGenTemplate CR 사용"에 설명된 대로 전원 절약 모드를 구성하여 절전 모드를 구성했습니다.
절차
out/argocd/example/policygentemplates에서group-du-sno-ranGen.yaml참조 파일에서TunedPerformancePatch의PolicyGenTemplate항목을 업데이트합니다. 전원 절감을 극대화하려면 다음 예와 같이max_perf_pct를 추가합니다.- fileName: TunedPerformancePatch.yaml policyName: "config-policy" spec: profile: - name: performance-patch data: | [...] [sysfs] /sys/devices/system/cpu/intel_pstate/max_perf_pct=<x> 1- 1
max_perf_pct는cpufreq드라이버가 지원되는 최대 CPU 빈도의 백분율로 설정할 수 있는 최대 빈도를 제어합니다. 이 값은 모든 CPU에 적용됩니다./sys/devices/system/cpu0/cpufreq/cpuinfo_max_freq에서 지원되는 최대 빈도를 확인할 수 있습니다. 시작 지점으로 모든 CPU를 모든코어의 frequency에서 제한하는 백분율을 사용할 수 있습니다.모든 코어가모두 사용 중일 때 모든 코어가 실행되는 빈도입니다.
참고전력 절감을 극대화하려면 더 낮은 값을 설정하십시오.
max_perf_pct에 대해 더 낮은 값을 설정하면 최대 CPU 빈도가 제한되므로 전력 소비를 줄일 수 있지만 성능에 잠재적으로 영향을 미칠 수 있습니다. 서로 다른 값을 실험하고 시스템의 성능과 전력 소비를 모니터링하여 사용 사례에 가장 적합한 설정을 찾습니다.-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP Argo CD 애플리케이션에서 모니터링 중인 Git 리포지토리로 내보냅니다.
17.9.7. PolicyGenTemplate CR을 사용하여 LVM 스토리지 구성
GitOps Zero CloudEvent Provisioning (ZTP)으로 배포하는 관리 클러스터에 대해 LVM 스토리지(Logical Volume Manager Storage)를 구성할 수 있습니다.
HTTP 전송과 함께 PTP 이벤트 또는 베어 메탈 하드웨어 이벤트를 사용할 때 LVM Storage를 사용하여 이벤트 서브스크립션을 유지합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성합니다.
절차
새로운 관리 클러스터의 LVM Storage를 구성하려면
common-ranGen.yaml파일의spec.sourceFiles에 다음 YAML을 추가합니다.- fileName: StorageLVMOSubscriptionNS.yaml policyName: subscription-policies - fileName: StorageLVMOSubscriptionOperGroup.yaml policyName: subscription-policies - fileName: StorageLVMOSubscription.yaml spec: name: lvms-operator channel: stable-4.13 policyName: subscription-policies특정 그룹 또는 개별 사이트 구성 파일의
spec.sourceFiles에LVMClusterCR을 추가합니다. 예를 들어group-du-sno-ranGen.yaml파일에서 다음을 추가합니다.- fileName: StorageLVMCluster.yaml policyName: "lvmo-config" 1 spec: storage: deviceClasses: - name: vg1 thinPoolConfig: name: thin-pool-1 sizePercent: 90 overprovisionRatio: 10- 1
- 이 예제 구성에서는 OpenShift Container Platform이 설치된 디스크를 제외하고 사용 가능한 모든 장치가 포함된 볼륨 그룹(ECDHE
1)을 생성합니다. 씬 풀 논리 볼륨도 생성됩니다.
- 필요한 기타 변경 사항 및 파일을 사용자 정의 사이트 리포지토리와 병합합니다.
-
Git의
PolicyGenTemplate변경 사항을 커밋한 다음 변경 사항을 사이트 구성 리포지토리로 내보내 GitOps ZTP를 사용하여 LVM Storage를 새 사이트로 배포합니다.
17.9.8. PolicyGenTemplate CR을 사용하여 PTP 이벤트 구성
GitOps ZTP 파이프라인을 사용하여 HTTP 또는 AMQP 전송을 사용하는 PTP 이벤트를 구성할 수 있습니다.
가능한 경우 PTP 및 베어 메탈 이벤트에 AMQP 대신 HTTP 전송을 사용합니다. AMQ Interconnect는 2024년 6월 30일부터 EOL입니다. AMQ Interconnect의 ELS (Extended Life cycle Support)는 2029년 11월 29일에 종료됩니다. 자세한 내용은 Red Hat AMQ Interconnect 지원 상태를 참조하십시오.
17.9.8.1. HTTP 전송을 사용하는 PTP 이벤트 구성
GitOps ZeroForwarded Provisioning (ZTP) 파이프라인을 사용하여 배포하는 관리 클러스터에서 HTTP 전송을 사용하는 PTP 이벤트를 구성할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
요구 사항에 따라
group-du-3node-ranGen.yaml,group-du-sno-ranGen.yaml또는group-du-standard-ranGen.yaml파일에 다음PolicyGenTemplate변경 사항을 적용합니다..sourceFiles.sourceFiles에서 전송 호스트를 구성하는PtpOperatorConfigCR 파일을 추가합니다.- fileName: PtpOperatorConfigForEvent.yaml policyName: "config-policy" spec: daemonNodeSelector: {} ptpEventConfig: enableEventPublisher: true transportHost: http://ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043참고OpenShift Container Platform 4.13 이상에서는 PTP 이벤트와 함께 HTTP 전송을 사용할 때
PtpOperatorConfig리소스에서transportHost필드를 설정할 필요가 없습니다.PTP 클럭 유형 및 인터페이스에 대해
linuxptp및phc2sys를 구성합니다. 예를 들어 다음 스탠자를.sourceFiles에 추가합니다.- fileName: PtpConfigSlave.yaml 1 policyName: "config-policy" metadata: name: "du-ptp-slave" spec: profile: - name: "slave" interface: "ens5f1" 2 ptp4lOpts: "-2 -s --summary_interval -4" 3 phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 4 ptpClockThreshold: 5 holdOverTimeout: 30 #secs maxOffsetThreshold: 100 #nano secs minOffsetThreshold: -100 #nano secs
- 1
- 요구 사항에 따라
PtpConfigMaster.yaml,PtpConfigSlave.yaml,PtpConfigSlaveCvl.yaml중 하나일 수 있습니다.PtpConfigSlaveCvl.yaml은 Intel E810 콜롬비아 NIC에 대한linuxptp서비스를 구성합니다.group-du-sno-ranGen.yaml또는group-du-3node-ranGen.yaml을 기반으로 하는 구성의 경우PtpConfigSlave.yaml을 사용합니다. - 2
- 장치별 인터페이스 이름입니다.
- 3
- PTP fast 이벤트를 활성화하려면
.spec.sourceFiles.spec.profile의ptp4lOpts에--summary_interval -4값을 추가해야 합니다. - 4
- 필수
phc2sysOpts값.-m에서stdout에 메시지를 출력합니다.linuxptp-daemonDaemonSet은 로그를 구문 분석하고 Prometheus 지표를 생성합니다. - 5
- 선택 사항:
ptpClockThreshold가 없으면 기본값이ptpClockThreshold필드에 사용됩니다. 스탠자는 기본ptpClockThreshold값을 표시합니다.ptpClockThreshold값은 PTP 이벤트가 트리거되기 전에 PTP 마스터 클럭이 연결 해제된 후의 기간을 구성합니다.holdOverTimeout은 PTP 마스터 클럭의 연결이 끊어지면 PTP 클럭 이벤트 상태가FREERUN로 변경되기 전 시간(초)입니다.maxOffsetThreshold및minOffsetThreshold설정은CLOCK_REALTIME(phc2sys) 또는 마스터 오프셋(ptp4l)의 값과 비교되는 나노초에 오프셋 값을 구성합니다.ptp4l또는phc2sys오프셋 값이 이 범위를 벗어나는 경우 PTP 클럭 상태가FREERUN로 설정됩니다. 오프셋 값이 이 범위 내에 있으면 PTP 클럭 상태가LOCKED로 설정됩니다.
- 필요한 기타 변경 사항 및 파일을 사용자 정의 사이트 리포지토리와 병합합니다.
- 사이트 구성 리포지토리로 변경 사항을 푸시하여 GitOps ZTP를 사용하여 PTP 빠른 이벤트를 새 사이트에 배포합니다.
17.9.8.2. AMQP 전송을 사용하는 PTP 이벤트 구성
GitOps ZeroForwarded Provisioning (ZTP) 파이프라인을 사용하여 배포하는 관리 클러스터에서 AMQP 전송을 사용하는 PTP 이벤트를 구성할 수 있습니다.
가능한 경우 PTP 및 베어 메탈 이벤트에 AMQP 대신 HTTP 전송을 사용합니다. AMQ Interconnect는 2024년 6월 30일부터 EOL입니다. AMQ Interconnect의 ELS (Extended Life cycle Support)는 2029년 11월 29일에 종료됩니다. 자세한 내용은 Red Hat AMQ Interconnect 지원 상태를 참조하십시오.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
common-ranGen.yaml파일의.spec.sourceFiles에 다음 YAML을 추가하여 AMQP Operator를 구성합니다.#AMQ interconnect operator for fast events - fileName: AmqSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: AmqSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: AmqSubscription.yaml policyName: "subscriptions-policy"
요구 사항에 따라
group-du-3node-ranGen.yaml,group-du-sno-ranGen.yaml또는group-du-standard-ranGen.yaml파일에 다음PolicyGenTemplate변경 사항을 적용합니다..sourceFiles.sourceFiles에서 AMQ 전송 호스트를config-policy에 구성하는PtpOperatorConfigCR 파일을 추가합니다.- fileName: PtpOperatorConfigForEvent.yaml policyName: "config-policy" spec: daemonNodeSelector: {} ptpEventConfig: enableEventPublisher: true transportHost: "amqp://amq-router.amq-router.svc.cluster.local"PTP 클럭 유형 및 인터페이스에 대해
linuxptp및phc2sys를 구성합니다. 예를 들어 다음 스탠자를.sourceFiles에 추가합니다.- fileName: PtpConfigSlave.yaml 1 policyName: "config-policy" metadata: name: "du-ptp-slave" spec: profile: - name: "slave" interface: "ens5f1" 2 ptp4lOpts: "-2 -s --summary_interval -4" 3 phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 4 ptpClockThreshold: 5 holdOverTimeout: 30 #secs maxOffsetThreshold: 100 #nano secs minOffsetThreshold: -100 #nano secs
- 1
- 요구 사항에 따라 하나의
PtpConfigMaster.yaml,PtpConfigSlave.yaml또는PtpConfigSlaveCvl.yaml이 될 수 있습니다.PtpConfigSlaveCvl.yaml은 Intel E810 콜롬비아 NIC에 대한linuxptp서비스를 구성합니다.group-du-sno-ranGen.yaml또는group-du-3node-ranGen.yaml을 기반으로 하는 구성의 경우PtpConfigSlave.yaml을 사용합니다. - 2
- 장치별 인터페이스 이름입니다.
- 3
- PTP fast 이벤트를 활성화하려면
.spec.sourceFiles.spec.profile의ptp4lOpts에--summary_interval -4값을 추가해야 합니다. - 4
- 필수
phc2sysOpts값.-m에서stdout에 메시지를 출력합니다.linuxptp-daemonDaemonSet은 로그를 구문 분석하고 Prometheus 지표를 생성합니다. - 5
- 선택 사항:
ptpClockThreshold가 없으면 기본값이ptpClockThreshold필드에 사용됩니다. 스탠자는 기본ptpClockThreshold값을 표시합니다.ptpClockThreshold값은 PTP 이벤트가 트리거되기 전에 PTP 마스터 클럭이 연결 해제된 후의 기간을 구성합니다.holdOverTimeout은 PTP 마스터 클럭의 연결이 끊어지면 PTP 클럭 이벤트 상태가FREERUN로 변경되기 전 시간(초)입니다.maxOffsetThreshold및minOffsetThreshold설정은CLOCK_REALTIME(phc2sys) 또는 마스터 오프셋(ptp4l)의 값과 비교되는 나노초에 오프셋 값을 구성합니다.ptp4l또는phc2sys오프셋 값이 이 범위를 벗어나는 경우 PTP 클럭 상태가FREERUN로 설정됩니다. 오프셋 값이 이 범위 내에 있으면 PTP 클럭 상태가LOCKED로 설정됩니다.
특정 사이트 YAML 파일에 다음
PolicyGenTemplate변경 사항을 적용합니다(예:example-sno-site.yaml)..sourceFiles.sourceFiles에서 AMQ 라우터를config-policy에 구성하는InterconnectCR 파일을 추가합니다.- fileName: AmqInstance.yaml policyName: "config-policy"
- 필요한 기타 변경 사항 및 파일을 사용자 정의 사이트 리포지토리와 병합합니다.
- 사이트 구성 리포지토리로 변경 사항을 푸시하여 GitOps ZTP를 사용하여 PTP 빠른 이벤트를 새 사이트에 배포합니다.
추가 리소스
- AMQ 메시징 버스 설치
- 컨테이너 이미지 레지스트리에 대한 자세한 내용은 OpenShift 이미지 레지스트리 개요 를 참조하십시오.
17.9.9. PolicyGenTemplate CR을 사용하여 베어 메탈 이벤트 구성
GitOps ZTP 파이프라인을 사용하여 HTTP 또는 AMQP 전송을 사용하는 베어 메탈 이벤트를 구성할 수 있습니다.
가능한 경우 PTP 및 베어 메탈 이벤트에 AMQP 대신 HTTP 전송을 사용합니다. AMQ Interconnect는 2024년 6월 30일부터 EOL입니다. AMQ Interconnect의 ELS (Extended Life cycle Support)는 2029년 11월 29일에 종료됩니다. 자세한 내용은 Red Hat AMQ Interconnect 지원 상태를 참조하십시오.
17.9.9.1. HTTP 전송을 사용하는 베어 메탈 이벤트 구성
GitOps ZTP(ZTP) 파이프라인을 사용하여 배포하는 관리 클러스터에서 HTTP 전송을 사용하는 베어 메탈 이벤트를 구성할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
common-ranGen.yaml파일에서spec.sourceFiles에 다음 YAML을 추가하여 Bare Metal Event Relay Operator를 구성합니다.# Bare Metal Event Relay operator - fileName: BareMetalEventRelaySubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscription.yaml policyName: "subscriptions-policy"
특정 그룹 구성 파일의
spec.sourceFiles에HardwareEventCR을 추가합니다(예:group-du-sno-ranGen.yaml파일).- fileName: HardwareEvent.yaml 1 policyName: "config-policy" spec: nodeSelector: {} transportHost: "http://hw-event-publisher-service.openshift-bare-metal-events.svc.cluster.local:9043" logLevel: "info"- 1
- 각 BMC(Baseboard Management Controller)에는 단일
HardwareEventCR만 필요합니다.
참고OpenShift Container Platform 4.13 이상에서는 베어 메탈 이벤트와 함께 HTTP 전송을 사용할 때
HardwareEventCR(사용자 정의 리소스)에서transportHost필드를 설정할 필요가 없습니다.- 필요한 기타 변경 사항 및 파일을 사용자 정의 사이트 리포지토리와 병합합니다.
- 사이트 구성 리포지토리로 변경 사항을 푸시하여 GitOps ZTP를 사용하여 베어 메탈 이벤트를 새 사이트에 배포합니다.
다음 명령을 실행하여 Redfish 보안을 생성합니다.
$ oc -n openshift-bare-metal-events create secret generic redfish-basic-auth \ --from-literal=username=<bmc_username> --from-literal=password=<bmc_password> \ --from-literal=hostaddr="<bmc_host_ip_addr>"
17.9.9.2. AMQP 전송을 사용하는 베어 메탈 이벤트 구성
GitOps ZTP(ZTP) 파이프라인을 사용하여 배포하는 관리 클러스터에서 AMQP 전송을 사용하는 베어 메탈 이벤트를 구성할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
AMQ Interconnect Operator 및 Bare Metal Event Relay Operator를 구성하려면
common-ranGen.yaml파일의spec.sourceFiles에 다음 YAML을 추가합니다.# AMQ interconnect operator for fast events - fileName: AmqSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: AmqSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: AmqSubscription.yaml policyName: "subscriptions-policy" # Bare Metal Event Rely operator - fileName: BareMetalEventRelaySubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscription.yaml policyName: "subscriptions-policy"
사이트 구성 파일의
.spec.sourceFiles에InterconnectCR을 추가합니다(예:example-sno-site.yaml파일).- fileName: AmqInstance.yaml policyName: "config-policy"
특정 그룹 구성 파일의
spec.sourceFiles에HardwareEventCR을 추가합니다(예:group-du-sno-ranGen.yaml파일).- fileName: HardwareEvent.yaml policyName: "config-policy" spec: nodeSelector: {} transportHost: "amqp://<amq_interconnect_name>.<amq_interconnect_namespace>.svc.cluster.local" 1 logLevel: "info"- 1
transportHostURL은 기존 AMQ Interconnect CR이름과네임스페이스로 구성됩니다. 예를 들어transportHost: "amqp://amq-router.amq-router.svc.cluster.local"에서 AMQ Interconnect이름과네임스페이스는 모두mq-router로 설정됩니다.
참고각 BMC(Baseboard Management Controller)에는 단일
HardwareEvent리소스만 필요합니다.-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 사이트 구성 리포지토리에 변경 사항을 푸시하여 GitOps ZTP를 사용하여 베어 메탈 이벤트 모니터링을 새 사이트에 배포합니다. 다음 명령을 실행하여 Redfish 보안을 생성합니다.
$ oc -n openshift-bare-metal-events create secret generic redfish-basic-auth \ --from-literal=username=<bmc_username> --from-literal=password=<bmc_password> \ --from-literal=hostaddr="<bmc_host_ip_addr>"
17.9.10. 이미지 로컬 캐싱을 위해 이미지 레지스트리 Operator 구성
OpenShift Container Platform은 로컬 레지스트리를 사용하여 이미지 캐싱을 관리합니다. 엣지 컴퓨팅 사용 사례에서 클러스터는 종종 중앙 집중식 이미지 레지스트리와 통신할 때 대역폭 제한의 영향을 받으며 이로 인해 이미지 다운로드 시간이 길어질 수 있습니다.
초기 배포 중에 긴 다운로드 시간은 피할 수 없습니다. 시간이 지남에 따라 CRI-O가 예기치 않은 종료의 경우 /var/lib/containers/storage 디렉터리를 해제할 위험이 있습니다. 긴 이미지 다운로드 시간을 해결하기 위해 GitOps Zero CloudEvent Provisioning (ZTP)을 사용하여 원격 관리 클러스터에 로컬 이미지 레지스트리를 생성할 수 있습니다. 이는 클러스터가 네트워크의 맨 에지에 배포되는 에지 컴퓨팅 시나리오에서 유용합니다.
GitOps ZTP를 사용하여 로컬 이미지 레지스트리를 설정하려면 먼저 원격 관리 클러스터를 설치하는 데 사용하는 site Config CR에 디스크 파티셔닝을 구성해야 합니다. 설치한 후 PolicyGenTemplate CR을 사용하여 로컬 이미지 레지스트리를 구성합니다. 그런 다음 GitOps ZTP 파이프라인에서 PV(영구 볼륨) 및 PVC(영구 볼륨 클레임) CR을 생성하고 imageregistry 구성을 패치합니다.
로컬 이미지 레지스트리는 사용자 애플리케이션 이미지에만 사용할 수 있으며 OpenShift Container Platform 또는 Operator Lifecycle Manager Operator 이미지에는 사용할 수 없습니다.
17.9.10.1. siteConfig를 사용하여 디스크 파티션 구성
SiteConfig CR 및 GitOps ZeroForwarded Provisioning(ZTP)을 사용하여 관리 클러스터의 디스크 파티셔닝을 구성합니다. site Config CR의 디스크 파티션 세부 정보가 기본 디스크와 일치해야 합니다.
/dev/sda 및 /dev/sdb 와 같은 장치 이름이 재부팅될 때마다 전환되지 않도록 장치에 영구 이름을 사용합니다. rootDeviceHints 를 사용하여 부팅 가능한 장치를 선택한 다음 추가 파티셔닝에 동일한 장치를 사용할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - GitOps ZeroECDHE Provisioning(ZTP)과 함께 사용할 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
관리 클러스터를 설치하는 데 사용하는 site
ConfigCR에 호스트 디스크 파티셔닝을 설명하는 다음 YAML을 추가합니다.nodes: rootDeviceHints: wwn: "0x62cea7f05c98c2002708a0a22ff480ea" diskPartition: - device: /dev/disk/by-id/wwn-0x62cea7f05c98c2002708a0a22ff480ea 1 partitions: - mount_point: /var/imageregistry size: 102500 2 start: 344844 3-
site
ConfigCR을 저장하고 사이트 구성 리포지토리에 내보냅니다.
GitOps ZTP 파이프라인은 SiteConfig CR을 사용하여 클러스터를 프로비저닝하고 디스크 파티션을 구성합니다.
17.9.10.2. PolicyGenTemplate CR을 사용하여 이미지 레지스트리 구성
PolicyGenTemplate (PGT) CR을 사용하여 이미지 레지스트리를 구성하고 imageregistry 구성을 패치하는 데 필요한 CR을 적용합니다.
사전 요구 사항
- 관리 클러스터에서 디스크 파티션을 구성했습니다.
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - GitOps ZeroECDHE Provisioning(ZTP)과 함께 사용할 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다.
절차
적절한
PolicyGenTemplateCR에서 스토리지 클래스, 영구 볼륨 클레임, 영구 볼륨 및 이미지 레지스트리 구성을 구성합니다. 예를 들어 개별 사이트를 구성하려면 다음 YAML을example-sno-site.yaml파일에 추가합니다.sourceFiles: # storage class - fileName: StorageClass.yaml policyName: "sc-for-image-registry" metadata: name: image-registry-sc annotations: ran.openshift.io/ztp-deploy-wave: "100" 1 # persistent volume claim - fileName: StoragePVC.yaml policyName: "pvc-for-image-registry" metadata: name: image-registry-pvc namespace: openshift-image-registry annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi storageClassName: image-registry-sc volumeMode: Filesystem # persistent volume - fileName: ImageRegistryPV.yaml 2 policyName: "pv-for-image-registry" metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" - fileName: ImageRegistryConfig.yaml policyName: "config-for-image-registry" complianceType: musthave metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: storage: pvc: claim: "image-registry-pvc"중요- fileName: ImageRegistryConfig.yaml구성에complianceType: mustonlyhave를 설정하지 마십시오. 이로 인해 레지스트리 Pod 배포가 실패할 수 있습니다.-
Git에서
PolicyGenTemplate변경 사항을 커밋한 다음 GitOps ZTP ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.
검증
다음 단계를 사용하여 관리 클러스터의 로컬 이미지 레지스트리의 오류 문제를 해결합니다.
관리형 클러스터에 로그인하는 동안 레지스트리에 성공적으로 로그인했는지 확인합니다. 다음 명령을 실행합니다.
관리형 클러스터 이름을 내보냅니다.
$ cluster=<managed_cluster_name>
관리형 클러스터
kubeconfig세부 정보를 가져옵니다.$ oc get secret -n $cluster $cluster-admin-password -o jsonpath='{.data.password}' | base64 -d > kubeadmin-password-$cluster클러스터
kubeconfig를 다운로드하여 내보냅니다.$ oc get secret -n $cluster $cluster-admin-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > kubeconfig-$cluster && export KUBECONFIG=./kubeconfig-$cluster- 관리 클러스터에서 이미지 레지스트리에 대한 액세스를 확인합니다. " registry 액세스"를 참조하십시오.
imageregistry.operator.openshift.io그룹의ConfigCRD에서 오류를 보고하지 않는지 확인합니다. 관리형 클러스터에 로그인하는 동안 다음 명령을 실행합니다.$ oc get image.config.openshift.io cluster -o yaml
출력 예
apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2021-10-08T19:02:39Z" generation: 5 name: cluster resourceVersion: "688678648" uid: 0406521b-39c0-4cda-ba75-873697da75a4 spec: additionalTrustedCA: name: acm-ice관리형 클러스터의
PersistentVolumeClaim이 데이터로 채워졌는지 확인합니다. 관리형 클러스터에 로그인하는 동안 다음 명령을 실행합니다.$ oc get pv image-registry-sc
registry*pod가 실행 중이며openshift-image-registry네임스페이스에 있는지 확인합니다.$ oc get pods -n openshift-image-registry | grep registry*
출력 예
cluster-image-registry-operator-68f5c9c589-42cfg 1/1 Running 0 8d image-registry-5f8987879-6nx6h 1/1 Running 0 8d
관리 클러스터의 디스크 파티션이 올바른지 확인합니다.
관리형 클러스터에 대한 디버그 쉘을 엽니다.
$ oc debug node/sno-1.example.com
lsblk를 실행하여 호스트 디스크 파티션을 확인합니다.sh-4.4# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 446.6G 0 disk |-sda1 8:1 0 1M 0 part |-sda2 8:2 0 127M 0 part |-sda3 8:3 0 384M 0 part /boot |-sda4 8:4 0 336.3G 0 part /sysroot `-sda5 8:5 0 100.1G 0 part /var/imageregistry 1 sdb 8:16 0 446.6G 0 disk sr0 11:0 1 104M 0 rom- 1
/var/imageregistry는 디스크가 올바르게 분할되었음을 나타냅니다.
추가 리소스
17.9.11. PolicyGenTemplate CR에서 hub 템플릿 사용
토폴로지 Aware Lifecycle Manager는 GitOps ZeroForwarded Provisioning(ZTP)과 함께 사용되는 구성 정책에서 RHACM(Advanced Cluster Management) 허브 클러스터 템플릿 기능을 지원합니다.
Hub-side 클러스터 템플릿을 사용하면 대상 클러스터에 동적으로 사용자 지정할 수 있는 구성 정책을 정의할 수 있습니다. 이렇게 하면 similiar 구성이 있지만 값이 다른 많은 클러스터에 대해 별도의 정책을 생성할 필요가 없습니다.
정책 템플릿은 정책이 정의된 네임스페이스와 동일한 네임스페이스로 제한됩니다. 즉, 정책이 생성된 동일한 네임스페이스에서 hub 템플릿에서 참조되는 오브젝트를 생성해야 합니다.
다음 지원되는 hub 템플릿 기능은 TALM과 함께 GitOps ZTP에서 사용할 수 있습니다.
fromConfigmap은 namedConfigMap리소스에 제공된 데이터 키의 값을 반환합니다.참고ConfigMapCR에 대한 1MiB 크기 제한이 있습니다.ConfigMapCR의 유효 크기는last-applied-configuration주석으로 추가로 제한됩니다.last-applied-configuration제한을 방지하려면 템플릿ConfigMap에 다음 주석을 추가합니다.argocd.argoproj.io/sync-options: Replace=true
-
base64enc는 입력 문자열의 base64 인코딩 값을 반환합니다. -
base64dec는 base64로 인코딩된 입력 문자열의 디코딩된 값을 반환합니다. -
indent공백이 추가된 입력 문자열을 반환합니다. -
autoindent는 상위 템플릿에 사용된 간격에 따라 indent 공백이 추가된 입력 문자열을 반환합니다. -
입력 값의 정수 값을 캐스팅하고 반환합니다.
https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/2.6/html-single/governance/index#toInt-function -
toBool은 입력 문자열을 부울 값으로 변환하고 부울을 반환합니다.
GitOps ZTP와 함께 다양한 오픈 소스 커뮤니티 기능 도 사용할 수 있습니다.
추가 리소스
17.9.11.1. hub 템플릿 예
다음 코드 예제는 유효한 hub 템플릿입니다. 이러한 각 템플릿은 기본 네임스페이스에 이름이 test-config 인 ConfigMap CR에서 값을 반환합니다.
common-key키를 사용하여 값을 반환합니다.{{hub fromConfigMap "default" "test-config" "common-key" hub}}.ManagedClusterName필드 및 문자열-name을 사용하여 문자열을 반환합니다.{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) hub}}.ManagedClusterName필드의 연결된 값 및 문자열-name에서 부울 값을 캐스팅하고 반환합니다.{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) | toBool hub}}.ManagedClusterName필드의 연결된 값 및 문자열-name에서 정수 값을 캐스팅하고 반환합니다.{{hub (printf "%s-name" .ManagedClusterName) | fromConfigMap "default" "test-config" | toInt hub}}
17.9.11.2. hub 클러스터 템플릿을 사용하여 site PolicyGenTemplate CR에서 호스트 NIC 지정
단일 ConfigMap CR에서 호스트 NIC를 관리하고 hub 클러스터 템플릿을 사용하여 클러스터 호스트에 적용되는 생성된 정책의 사용자 정의 NIC 값을 채울 수 있습니다. PGT(Site PolicyGenTemplate ) CR에 hub 클러스터 템플릿을 사용하면 각 사이트에 대해 여러 개의 단일 사이트 PGT CR을 생성할 필요가 없습니다.
다음 예제에서는 단일 ConfigMap CR을 사용하여 클러스터 호스트 NIC를 관리하고 단일 PolicyGenTemplate 사이트 CR을 사용하여 클러스터에 정책으로 적용하는 방법을 보여줍니다.
fromConfigmap 함수를 사용하는 경우 printf 변수는 템플릿 리소스 데이터 키 필드에만 사용할 수 있습니다. name 및 namespace 필드와 함께 사용할 수 없습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 GitOps ZTP ArgoCD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
절차
호스트 그룹의 NIC를 설명하는
ConfigMap리소스를 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap metadata: name: sriovdata namespace: ztp-site annotations: argocd.argoproj.io/sync-options: Replace=true 1 data: example-sno-du_fh-numVfs: "8" example-sno-du_fh-pf: ens1f0 example-sno-du_fh-priority: "10" example-sno-du_fh-vlan: "140" example-sno-du_mh-numVfs: "8" example-sno-du_mh-pf: ens3f0 example-sno-du_mh-priority: "10" example-sno-du_mh-vlan: "150"- 1
ConfigMap크기가 1MiB보다 큰 경우에만argocd.argoproj.io/sync-options주석이 필요합니다.
참고ConfigMap은 hub 템플릿 대체가 있는 정책과 동일한 네임스페이스에 있어야 합니다.-
Git에서
ConfigMapCR을 커밋한 다음 Argo CD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다. 템플릿을 사용하여
ConfigMap오브젝트에서 필요한 데이터를 가져오는 사이트 PGT CR을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "site" namespace: "ztp-site" spec: remediationAction: inform bindingRules: group-du-sno: "" mcp: "master" sourceFiles: - fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-fh" spec: resourceName: du_fh vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-vlan" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml policyName: "config-policy" metadata: name: "sriov-nnp-du-fh" spec: deviceType: netdevice isRdma: true nicSelector: pfNames: - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-pf" .ManagedClusterName) | autoindent hub}}' numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-numVfs" .ManagedClusterName) | toInt hub}}' priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-priority" .ManagedClusterName) | toInt hub}}' resourceName: du_fh - fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-mh" spec: resourceName: du_mh vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-vlan" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml policyName: "config-policy" metadata: name: "sriov-nnp-du-mh" spec: deviceType: vfio-pci isRdma: false nicSelector: pfNames: - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-pf" .ManagedClusterName) hub}}' numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-numVfs" .ManagedClusterName) | toInt hub}}' priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-priority" .ManagedClusterName) | toInt hub}}' resourceName: du_mhGit에서 사이트
PolicyGenTemplateCR을 커밋하고 ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.참고참조된
ConfigMapCR에 대한 후속 변경 사항은 적용된 정책과 자동으로 동기화되지 않습니다. 새ConfigMap변경 사항을 수동으로 동기화하여 기존 PolicyGenTemplate CR을 업데이트해야 합니다. "Syncing new ConfigMap changes to existing PolicyGenTemplate CRs"를 참조하십시오.
17.9.11.3. hub 클러스터 템플릿을 사용하여 그룹 PolicyGenTemplate CR에서 VLAN ID 지정
단일 ConfigMap CR에서 관리 클러스터의 VLAN ID를 관리하고 hub 클러스터 템플릿을 사용하여 클러스터에 적용되는 생성된 정책의 VLAN ID를 채울 수 있습니다.
다음 예제에서는 단일 ConfigMap CR에서 VLAN ID를 관리하고 단일 PolicyGenTemplate 그룹 CR을 사용하여 개별 클러스터 정책에서 해당 ID를 적용하는 방법을 보여줍니다.
fromConfigmap 함수를 사용하는 경우 printf 변수는 템플릿 리소스 데이터 키 필드에만 사용할 수 있습니다. name 및 namespace 필드와 함께 사용할 수 없습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 Argo CD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
절차
클러스터 호스트 그룹의 VLAN ID를 설명하는
ConfigMapCR을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap metadata: name: site-data namespace: ztp-group annotations: argocd.argoproj.io/sync-options: Replace=true 1 data: site-1-vlan: "101" site-2-vlan: "234"- 1
ConfigMap크기가 1MiB보다 큰 경우에만argocd.argoproj.io/sync-options주석이 필요합니다.
참고ConfigMap은 hub 템플릿 대체가 있는 정책과 동일한 네임스페이스에 있어야 합니다.-
Git에서
ConfigMapCR을 커밋한 다음 Argo CD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다. hub 템플릿을 사용하여
ConfigMap오브젝트에서 필요한 VLAN ID를 가져오는 그룹 PGT CR을 생성합니다. 예를 들어 PGT CR 그룹에 다음 YAML 조각을 추가합니다.- fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-mh" annotations: ran.openshift.io/ztp-deploy-wave: "10" spec: resourceName: du_mh vlan: '{{hub fromConfigMap "" "site-data" (printf "%s-vlan" .ManagedClusterName) | toInt hub}}'Git에서
PolicyGenTemplateCR 그룹을 커밋한 다음 Argo CD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.참고참조된
ConfigMapCR에 대한 후속 변경 사항은 적용된 정책과 자동으로 동기화되지 않습니다. 새ConfigMap변경 사항을 수동으로 동기화하여 기존 PolicyGenTemplate CR을 업데이트해야 합니다. "Syncing new ConfigMap changes to existing PolicyGenTemplate CRs"를 참조하십시오.
17.9.11.4. 기존 PolicyGenTemplate CR에 새 ConfigMap 변경 사항 동기화
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 hub 클러스터에 로그인했습니다. -
hub 클러스터 템플릿을 사용하여
ConfigMapCR에서 정보를 가져오는PolicyGenTemplateCR을 생성했습니다.
절차
-
ConfigMapCR의 콘텐츠를 업데이트하고 hub 클러스터의 변경 사항을 적용합니다. 업데이트된
ConfigMapCR의 콘텐츠를 배포된 정책에 동기화하려면 다음 중 하나를 수행합니다.옵션 1: 기존 정책을 삭제합니다. ArgoCD는
PolicyGenTemplateCR을 사용하여 삭제된 정책을 즉시 다시 생성합니다. 예를 들어 다음 명령을 실행합니다.$ oc delete policy <policy_name> -n <policy_namespace>
옵션 2:
ConfigMap을 업데이트할 때마다 다른 값을 가진 정책에 특수 주석policy.open-cluster-management.io/trigger-update를 적용합니다. 예를 들면 다음과 같습니다.$ oc annotate policy <policy_name> -n <policy_namespace> policy.open-cluster-management.io/trigger-update="1"
참고변경 사항을 적용하려면 업데이트된 정책을 적용해야 합니다. 자세한 내용은 reprocessing 에 대한 특수 주석을 참조하십시오.
선택 사항: 정책이 있는 경우 정책이 포함된
ClusterGroupUpdateCR을 삭제합니다. 예를 들면 다음과 같습니다.$ oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>
업데이트된
ConfigMap변경과 함께 적용할 정책이 포함된 새ClusterGroupUpdateCR을 생성합니다. 예를 들어cgr-example.yaml파일에 다음 YAML을 추가합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: <cgr_name> namespace: <policy_namespace> spec: managedPolicies: - <managed_policy> enable: true clusters: - <managed_cluster_1> - <managed_cluster_2> remediationStrategy: maxConcurrency: 2 timeout: 240업데이트된 정책을 적용합니다.
$ oc apply -f cgr-example.yaml
17.10. 토폴로지 Aware Lifecycle Manager로 관리형 클러스터 업데이트
Topology Aware Lifecycle Manager (TALM)를 사용하여 OpenShift Container Platform 관리 클러스터의 소프트웨어 라이프사이클을 관리할 수 있습니다. TALM은 RHACM(Red Hat Advanced Cluster Management) 정책을 사용하여 대상 클러스터에서 변경 사항을 수행합니다.
추가 리소스
- 토폴로지 Aware Lifecycle Manager에 대한 자세한 내용은 토폴로지 Aware Lifecycle Manager 정보를 참조하십시오.
17.10.1. 연결이 끊긴 환경에서 클러스터 업데이트
GitOps ZTP(ZTP) 및 토폴로지 라이프사이클 관리자(TALM)를 사용하여 배포한 관리형 클러스터 및 Operator를 업그레이드할 수 있습니다.
17.10.1.1. 환경 설정
TALM은 플랫폼과 Operator 업데이트를 모두 수행할 수 있습니다.
TALM을 사용하여 연결이 끊긴 클러스터를 업데이트할 플랫폼 이미지와 Operator 이미지를 미러 레지스트리에서 미러링해야 합니다. 이미지를 미러링하려면 다음 단계를 완료합니다.
플랫폼 업데이트의 경우 다음 단계를 수행해야 합니다.
원하는 OpenShift Container Platform 이미지 저장소를 미러링합니다. 추가 리소스에 연결된 "OpenShift Container Platform 이미지 저장소 미러링" 절차에 따라 원하는 플랫폼 이미지가 미러링되었는지 확인합니다.
imageContentSources.yaml파일에imageContentSources섹션의 내용을 저장합니다.출력 예
imageContentSources: - mirrors: - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4 source: quay.io/openshift-release-dev/ocp-release - mirrors: - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4 source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
미러링된 플랫폼 이미지의 이미지 서명을 저장합니다. 플랫폼 업데이트를 위해 이미지 서명을
PolicyGenTemplateCR에 추가해야 합니다. 이미지 서명을 가져오려면 다음 단계를 수행합니다.다음 명령을 실행하여 원하는 OpenShift Container Platform 태그를 지정합니다.
$ OCP_RELEASE_NUMBER=<release_version>
다음 명령을 실행하여 클러스터의 아키텍처를 지정합니다.
$ ARCHITECTURE=<cluster_architecture> 1- 1
x86_64,aarch64,s390x또는ppc64le과 같은 클러스터의 아키텍처를 지정합니다.
다음 명령을 실행하여 Quay에서 릴리스 이미지 다이제스트를 가져옵니다.
$ DIGEST="$(oc adm release info quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE_NUMBER}-${ARCHITECTURE} | sed -n 's/Pull From: .*@//p')"다음 명령을 실행하여 다이제스트 알고리즘을 설정합니다.
$ DIGEST_ALGO="${DIGEST%%:*}"다음 명령을 실행하여 다이제스트 서명을 설정합니다.
$ DIGEST_ENCODED="${DIGEST#*:}"다음 명령을 실행하여 mirror.openshift.com 웹 사이트에서 이미지 서명을 가져옵니다.
$ SIGNATURE_BASE64=$(curl -s "https://mirror.openshift.com/pub/openshift-v4/signatures/openshift/release/${DIGEST_ALGO}=${DIGEST_ENCODED}/signature-1" | base64 -w0 && echo)다음 명령을 실행하여
체크섬-<OCP_RELEASE_NUMBER>.yaml파일에 이미지 서명을 저장합니다.$ cat >checksum-${OCP_RELEASE_NUMBER}.yaml <<EOF ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} EOF
업데이트 그래프를 준비합니다. 업데이트 그래프를 준비하는 두 가지 옵션이 있습니다.
OpenShift 업데이트 서비스를 사용합니다.
hub 클러스터에서 그래프를 설정하는 방법에 대한 자세한 내용은 OpenShift Update Service용 Operator 배포 및 그래프 데이터 init 컨테이너 빌드를 참조하십시오.
업스트림 그래프의 로컬 사본을 만듭니다. 연결이 끊긴 환경의
http또는https서버에서 관리 클러스터에 액세스할 수 있는 업데이트 그래프를 호스팅합니다. 업데이트 그래프를 다운로드하려면 다음 명령을 사용합니다.$ curl -s https://api.openshift.com/api/upgrades_info/v1/graph?channel=stable-4.13 -o ~/upgrade-graph_stable-4.13
Operator 업데이트의 경우 다음 작업을 수행해야 합니다.
- Operator 카탈로그를 미러링합니다. 연결이 끊긴 클러스터에서 사용할 수 있도록 "운영자 카탈로그 미러링" 섹션의 절차에 따라 원하는 Operator 이미지가 미러링되었는지 확인합니다.
추가 리소스
- GitOps ZeroForwarded Provisioning (ZTP)을 업데이트하는 방법에 대한 자세한 내용은 GitOps ZTP 업그레이드를 참조하십시오.
- OpenShift Container Platform 이미지 리포지토리 미러링 방법에 대한 자세한 내용은 OpenShift Container Platform 이미지 저장소 미러링을 참조하십시오.
- 연결이 끊긴 클러스터의 Operator 카탈로그를 미러링하는 방법에 대한 자세한 내용은 연결이 끊긴 클러스터에서 사용할 Operator 카탈로그 미러링을 참조하십시오.
- 연결이 끊긴 환경을 준비하고 원하는 이미지 리포지토리를 미러링하는 방법에 대한 자세한 내용은 연결이 끊긴 환경 준비를 참조하십시오.
- 업데이트 채널 및 릴리스에 대한 자세한 내용은 업데이트 채널 및 릴리스 이해 를 참조하십시오.
17.10.1.2. 플랫폼 업데이트 수행
TALM을 사용하여 플랫폼 업데이트를 수행할 수 있습니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- GitOps Zero ScanSetting Provisioning (ZTP)을 최신 버전으로 업데이트합니다.
- GitOps ZTP를 사용하여 하나 이상의 관리형 클러스터를 프로비저닝합니다.
- 원하는 이미지 저장소를 미러링합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - hub 클러스터에 RHACM 정책을 생성합니다.
절차
플랫폼 업데이트에 대한
PolicyGenTemplateCR을 생성합니다.du-upgrade.yaml파일에PolicyGenTemplateCR의 다음 내용을 저장합니다.플랫폼 업데이트를 위한
PolicyGenTemplate의 예apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: - fileName: ImageSignature.yaml 1 policyName: "platform-upgrade-prep" binaryData: ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} 2 - fileName: DisconnectedICSP.yaml policyName: "platform-upgrade-prep" metadata: name: disconnected-internal-icsp-for-ocp spec: repositoryDigestMirrors: 3 - mirrors: - quay-intern.example.com/ocp4/openshift-release-dev source: quay.io/openshift-release-dev/ocp-release - mirrors: - quay-intern.example.com/ocp4/openshift-release-dev source: quay.io/openshift-release-dev/ocp-v4.0-art-dev - fileName: ClusterVersion.yaml 4 policyName: "platform-upgrade-prep" metadata: name: version annotations: ran.openshift.io/ztp-deploy-wave: "1" spec: channel: "stable-4.13" upstream: http://upgrade.example.com/images/upgrade-graph_stable-4.13 - fileName: ClusterVersion.yaml 5 policyName: "platform-upgrade" metadata: name: version spec: channel: "stable-4.13" upstream: http://upgrade.example.com/images/upgrade-graph_stable-4.13 desiredUpdate: version: 4.13.4 status: history: - version: 4.13.4 state: "Completed"- 1
ConfigMapCR에는 업데이트할 릴리스 이미지의 서명이 포함되어 있습니다.- 2
- 원하는 OpenShift Container Platform 릴리스의 이미지 서명을 표시합니다. "환경 설정" 섹션의 절차에 따라 저장한
체크섬-${OCP_RELASE_NUMBER}.yaml파일에서 서명을 가져옵니다. - 3
- 원하는 OpenShift Container Platform 이미지가 포함된 미러 저장소를 표시합니다. "환경 설정" 섹션의 절차에 따라 저장한
imageContentSources.yaml파일에서 미러를 가져옵니다. - 4
- 업스트림을 업데이트할
ClusterVersionCR을 표시합니다. - 5
- 업데이트를 트리거하는
ClusterVersionCR을 표시합니다.채널,업스트림및desiredVersion필드는 모두 이미지 사전 캐싱에 필요합니다.
PolicyGenTemplateCR은 다음 두 가지 정책을 생성합니다.-
du-upgrade-platform-upgrade-prep정책은 플랫폼 업데이트에 대한 준비 작업을 수행합니다. 원하는 릴리스 이미지 서명을 위해ConfigMapCR을 생성하고 미러링된 릴리스 이미지 저장소의 이미지 콘텐츠 소스를 생성하고, 연결이 끊긴 환경에서 관리되는 클러스터에서 연결할 수 있는 업데이트 채널을 사용하여 클러스터 버전을 업데이트합니다. -
du-upgrade-platform-upgrade정책은 플랫폼 업그레이드를 수행하는 데 사용됩니다.
PolicyGenTemplateCR의 GitOps ZTP Git 리포지토리에 있는kustomization.yaml파일에du-upgrade.yaml파일 내용을 추가하고 변경 사항을 Git 리포지토리로 내보냅니다.ArgoCD는 Git 리포지토리에서 변경 사항을 가져오고 hub 클러스터에 정책을 생성합니다.
다음 명령을 실행하여 생성된 정책을 확인합니다.
$ oc get policies -A | grep platform-upgrade
TALM으로 플랫폼 업데이트를 시작하기 전에 필요한 업데이트 리소스를 적용합니다.
다음 예와 같이
du-upgrade-정책 및 대상 관리형 클러스터를 사용하여platform-upgrade-prepplatform-upgrade-prepClusterUpgradeGroupCR의 내용을 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-platform-upgrade-prep namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade-prep clusters: - spoke1 remediationStrategy: maxConcurrency: 1 enable: true다음 명령을 실행하여 hub 클러스터에 정책을 적용합니다.
$ oc apply -f cgu-platform-upgrade-prep.yml
업데이트 프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies --all-namespaces
spec.enable필드를false로 설정하여 플랫폼 업데이트에 대한ClusterGroupUpdateCR을 생성합니다.다음 예와 같이
du-upgrade-platform-upgrade정책 및 대상 클러스터를 사용하여 플랫폼 업데이트ClusterGroupUpdateCR의 내용을cgu-platform-upgrade.yml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-platform-upgrade namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade preCaching: false clusters: - spoke1 remediationStrategy: maxConcurrency: 1 enable: false다음 명령을 실행하여
ClusterGroupUpdateCR을 hub 클러스터에 적용합니다.$ oc apply -f cgu-platform-upgrade.yml
선택 사항: 플랫폼 업데이트의 이미지를 미리 캐시합니다.
다음 명령을 실행하여
ClusterGroupUpdateCR에서 사전 캐싱을 활성화합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge업데이트 프로세스를 모니터링하고 사전 캐싱이 완료될 때까지 기다립니다. hub 클러스터에서 다음 명령을 실행하여 사전 캐싱의 상태를 확인합니다.
$ oc get cgu cgu-platform-upgrade -o jsonpath='{.status.precaching.status}'
플랫폼 업데이트를 시작합니다.
다음 명령을 실행하여
cgu-platform-upgrade정책을 활성화하고 사전 캐싱을 비활성화합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies --all-namespaces
추가 리소스
- 연결이 끊긴 환경에서 이미지를 미러링하는 방법에 대한 자세한 내용은 연결이 끊긴 환경 준비를 참조하십시오.
17.10.1.3. Operator 업데이트 수행
TALM을 사용하여 Operator 업데이트를 수행할 수 있습니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- GitOps Zero ScanSetting Provisioning (ZTP)을 최신 버전으로 업데이트합니다.
- GitOps ZTP를 사용하여 하나 이상의 관리형 클러스터를 프로비저닝합니다.
- 번들 이미지에서 참조하는 모든 Operator 이미지, 번들 이미지, 원하는 인덱스 이미지를 미러링합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - hub 클러스터에 RHACM 정책을 생성합니다.
절차
Operator 업데이트에 대한
PolicyGenTemplateCR을 업데이트합니다.파일에서 다음과 같은 추가 콘텐츠로 du-upgradedu-upgrade.yamlPolicyGenTemplateCR을 업데이트합니다.apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: - fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "operator-catsrc-policy" metadata: name: redhat-operators spec: displayName: Red Hat Operators Catalog image: registry.example.com:5000/olm/redhat-operators:v4.13 1 updateStrategy: 2 registryPoll: interval: 1h- 1
- 인덱스 이미지 URL에는 원하는 Operator 이미지가 포함되어 있습니다. 인덱스 이미지가 항상 동일한 이미지 이름 및 태그로 푸시되면 이 변경 사항이 필요하지 않습니다.
- 2
- OLM(Operator Lifecycle Manager)에서
registryPoll.interval필드를 사용하여 새 Operator 버전의 인덱스 이미지를 폴링하는 빈도를 설정합니다. 이러한 변경 사항은 y-stream 및 z-stream Operator 업데이트에 새 인덱스 이미지 태그를 항상 푸시하는 경우 필요하지 않습니다.registryPoll.interval필드는 업데이트를 신속하게 제공하기 위해 짧은 간격으로 설정할 수 있지만 간격은 더 짧습니다. 이 문제를 방지하려면 업데이트가 완료되면registryPoll.interval을 기본값으로 복원할 수 있습니다.
이번 업데이트에서는
redhat-operators카탈로그 소스를 원하는 Operator 이미지가 포함된 새 인덱스 이미지로 업데이트하기 위해 하나의 정책du-upgrade-operator-catsrc-policy를 생성합니다.참고Operator에 이미지 사전 캐싱을 사용하고
redhat-operators가 아닌 다른 카탈로그 소스의 Operator가 있는 경우 다음 작업을 수행해야 합니다.- 다른 카탈로그 소스에 대한 새 인덱스 이미지 또는 레지스트리 폴링 간격 업데이트를 사용하여 별도의 카탈로그 소스 정책을 준비합니다.
- 다른 카탈로그 소스의 원하는 Operator에 대해 별도의 서브스크립션 정책을 준비합니다.
예를 들어, 원하는 SRIOV-FEC Operator는
certified-operators카탈로그 소스에서 사용할 수 있습니다. 카탈로그 소스 및 Operator 서브스크립션을 업데이트하려면 다음 콘텐츠를 추가하여du-upgrade-fec-catsrc-policy및du-upgrade-subscriptions-fec-policy를 생성합니다.apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: … - fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "fec-catsrc-policy" metadata: name: certified-operators spec: displayName: Intel SRIOV-FEC Operator image: registry.example.com:5000/olm/far-edge-sriov-fec:v4.10 updateStrategy: registryPoll: interval: 10m - fileName: AcceleratorsSubscription.yaml policyName: "subscriptions-fec-policy" spec: channel: "stable" source: certified-operators지정된 구독 채널이 존재하는 경우 common
PolicyGenTemplateCR에서 제거합니다. GitOps ZTP 이미지의 기본 서브스크립션 채널은 업데이트에 사용됩니다.참고GitOps ZTP 4.13을 통해 적용된 Operator의 기본 채널은
performance-addon-operator를 제외하고stable입니다. OpenShift Container Platform 4.11부터performance-addon-operator기능이node-tuning-operator로 이동되었습니다. 4.10 릴리스의 경우 PAO의 기본 채널은v4.10입니다. commonPolicyGenTemplateCR에서 기본 채널을 지정할 수도 있습니다.PolicyGenTemplateCR의 업데이트를 GitOps ZTP Git 리포지토리로 내보냅니다.ArgoCD는 Git 리포지토리에서 변경 사항을 가져오고 hub 클러스터에 정책을 생성합니다.
다음 명령을 실행하여 생성된 정책을 확인합니다.
$ oc get policies -A | grep -E "catsrc-policy|subscription"
Operator 업데이트를 시작하기 전에 필요한 카탈로그 소스 업데이트를 적용합니다.
카탈로그 소스 정책과 대상 관리형 클러스터를 사용하여
operator-upgrade-prep이라는ClusterGroupUpgradeCR의 콘텐츠를cgu-operator-upgrade-prep.yml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-operator-upgrade-prep namespace: default spec: clusters: - spoke1 enable: true managedPolicies: - du-upgrade-operator-catsrc-policy remediationStrategy: maxConcurrency: 1다음 명령을 실행하여 hub 클러스터에 정책을 적용합니다.
$ oc apply -f cgu-operator-upgrade-prep.yml
업데이트 프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies -A | grep -E "catsrc-policy"
spec.enable필드를false로 설정하여 Operator 업데이트에 대한ClusterGroupUpgradeCR을 생성합니다.다음 예와 같이
du-upgrade-operator-catsrc-policy정책 및 일반 클러스터에서 생성된 서브스크립션 정책을 사용하여 Operator 업데이트ClusterGroupUpgradeCR의 콘텐츠를cgu-operator-upgrade.yml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-operator-upgrade namespace: default spec: managedPolicies: - du-upgrade-operator-catsrc-policy 1 - common-subscriptions-policy 2 preCaching: false clusters: - spoke1 remediationStrategy: maxConcurrency: 1 enable: false
참고하나의
ClusterGroupUpgradeCR은ClusterGroupUpgradeCR에 포함된 하나의 카탈로그 소스에서 서브스크립션 정책에 정의된 원하는 Operator의 이미지만 미리 캐시할 수 있습니다. SRIOV-FEC Operator의 예제와 같이 필요한 Operator가 다른 카탈로그 소스의 경우 SRIOV-FEC Operator 이미지 사전 캐싱 및 업데이트에 대한du-upgrade-fec-policy및du-upgrade-subscriptions-fec-policy정책을 사용하여 다른ClusterGroupUpgradeCR을 생성해야 합니다.다음 명령을 실행하여 hub 클러스터에
ClusterGroupUpgradeCR을 적용합니다.$ oc apply -f cgu-operator-upgrade.yml
선택 사항: Operator 업데이트의 이미지를 미리 캐시합니다.
이미지 사전 캐싱을 시작하기 전에 다음 명령을 실행하여 서브스크립션 정책이 이 시점에서
NonCompliant인지 확인합니다.$ oc get policy common-subscriptions-policy -n <policy_namespace>
출력 예
NAME REMEDIATION ACTION COMPLIANCE STATE AGE common-subscriptions-policy inform NonCompliant 27d
다음 명령을 실행하여
ClusterGroupUpgradeCR에서 사전 캐싱을 활성화합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge프로세스를 모니터링하고 사전 캐싱이 완료될 때까지 기다립니다. 관리 클러스터에서 다음 명령을 실행하여 사전 캐싱의 상태를 확인합니다.
$ oc get cgu cgu-operator-upgrade -o jsonpath='{.status.precaching.status}'다음 명령을 실행하여 업데이트를 시작하기 전에 사전 캐싱이 완료되었는지 확인합니다.
$ oc get cgu -n default cgu-operator-upgrade -ojsonpath='{.status.conditions}' | jq출력 예
[ { "lastTransitionTime": "2022-03-08T20:49:08.000Z", "message": "The ClusterGroupUpgrade CR is not enabled", "reason": "UpgradeNotStarted", "status": "False", "type": "Ready" }, { "lastTransitionTime": "2022-03-08T20:55:30.000Z", "message": "Precaching is completed", "reason": "PrecachingCompleted", "status": "True", "type": "PrecachingDone" } ]
Operator 업데이트를 시작합니다.
cgu-operator-upgradeClusterGroupUpgradeCR을 활성화하고 다음 명령을 실행하여 사전 캐싱을 비활성화하여 Operator 업데이트를 시작합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies --all-namespaces
추가 리소스
- GitOps ZTP 업데이트에 대한 자세한 내용은 GitOps ZTP 업그레이드 를 참조하십시오.
17.10.1.4. 플랫폼 및 Operator 업데이트 수행
동시에 플랫폼 및 Operator 업데이트를 수행할 수 있습니다.
사전 요구 사항
- TALM(토폴로지 라이프사이클 관리자)을 설치합니다.
- GitOps Zero ScanSetting Provisioning (ZTP)을 최신 버전으로 업데이트합니다.
- GitOps ZTP를 사용하여 하나 이상의 관리형 클러스터를 프로비저닝합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다. - hub 클러스터에 RHACM 정책을 생성합니다.
절차
-
"플랫 플랫폼 업데이트 수행" 및 "Operator 업데이트 수행" 섹션에 설명된 단계에 따라 업데이트에 대한
PolicyGenTemplateCR을 생성합니다. 플랫폼 및 Operator 업데이트에 prep 작업을 적용합니다.
플랫폼 업데이트 준비 작업, 카탈로그 소스 업데이트 및 대상 클러스터의 정책을 사용하여
ClusterGroupUpgradeCR의 콘텐츠를cgu-platform-operator-upgrade-prep.yml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-platform-operator-upgrade-prep namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade-prep - du-upgrade-operator-catsrc-policy clusterSelector: - group-du-sno remediationStrategy: maxConcurrency: 10 enable: true다음 명령을 실행하여
cgu-platform-operator-upgrade-prep.yml파일을 hub 클러스터에 적용합니다.$ oc apply -f cgu-platform-operator-upgrade-prep.yml
프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies --all-namespaces
플랫폼의
ClusterGroupUpdateCR 및spec.enable필드를 사용하여 Operator 업데이트를생성합니다.다음 예와 같이 플랫폼 및 Operator의 콘텐츠를 정책 및 대상 클러스터를 사용하여
ClusterGroupUpdateCR을cgu-platform-operator-upgrade.yml파일에 저장합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-du-upgrade namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade 1 - du-upgrade-operator-catsrc-policy 2 - common-subscriptions-policy 3 preCaching: true clusterSelector: - group-du-sno remediationStrategy: maxConcurrency: 1 enable: false
다음 명령을 실행하여
cgu-platform-operator-upgrade.yml파일을 hub 클러스터에 적용합니다.$ oc apply -f cgu-platform-operator-upgrade.yml
선택 사항: 플랫폼 및 Operator 업데이트의 이미지를 미리 캐시합니다.
다음 명령을 실행하여
ClusterGroupUpgradeCR에서 사전 캐싱을 활성화합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge업데이트 프로세스를 모니터링하고 사전 캐싱이 완료될 때까지 기다립니다. 관리 클러스터에서 다음 명령을 실행하여 사전 캐싱의 상태를 확인합니다.
$ oc get jobs,pods -n openshift-talm-pre-cache
다음 명령을 실행하여 업데이트를 시작하기 전에 사전 캐싱이 완료되었는지 확인합니다.
$ oc get cgu cgu-du-upgrade -ojsonpath='{.status.conditions}'
플랫폼 및 Operator 업데이트를 시작합니다.
cgu-du-upgradeClusterGroupUpgradeCR을 활성화하여 다음 명령을 실행하여 플랫폼 및 Operator 업데이트를 시작합니다.$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge프로세스를 모니터링합니다. 완료되면 다음 명령을 실행하여 정책을 준수했는지 확인합니다.
$ oc get policies --all-namespaces
참고spec.enable: true로 설정을 구성하여 플랫폼의 CR 및 Operator 업데이트를 생성할 수 있습니다. 이 경우 사전 캐싱이 완료된 후 업데이트가 즉시 시작되고 CR을 수동으로 활성화할 필요가 없습니다.사전 캐싱 및 업데이트 둘 다 정책, 배치 바인딩, 배치 규칙, 관리 클러스터 작업 및 관리 클러스터 뷰와 같은 추가 리소스를 생성하여 절차를 완료하는 데 도움이 됩니다.
afterCompletion.deleteObjects필드를true로 설정하면 업데이트가 완료된 후 이러한 모든 리소스가 삭제됩니다.
17.10.1.5. 배포된 클러스터에서 Performance Addon Operator 서브스크립션 제거
이전 버전의 OpenShift Container Platform에서 Performance Addon Operator는 애플리케이션에 대한 짧은 대기 시간 성능 튜닝을 제공합니다. OpenShift Container Platform 4.11 이상에서는 이러한 기능이 Node Tuning Operator의 일부입니다.
OpenShift Container Platform 4.11 이상을 실행하는 클러스터에 Performance Addon Operator를 설치하지 마십시오. OpenShift Container Platform 4.11 이상으로 업그레이드하는 경우 Node Tuning Operator는 Performance Addon Operator를 자동으로 제거합니다.
Operator 재설치를 방지하기 위해 Performance Addon Operator 서브스크립션을 생성하는 정책을 제거해야 합니다.
참조 DU 프로파일에는 PolicyGenTemplate CR common-ranGen.yaml 에 Performance Addon Operator가 포함되어 있습니다. 배포된 관리형 클러스터에서 서브스크립션을 제거하려면 common-ranGen.yaml 을 업데이트해야 합니다.
OpenShift Container Platform 4.11 이상에서 Performance Addon Operator 4.10.3-5 이상을 설치하는 경우 Performance Addon Operator는 클러스터 버전을 감지하고 자동으로 Node Tuning Operator 기능을 방해하지 않도록 합니다. 그러나 최상의 성능을 보장하기 위해 OpenShift Container Platform 4.11 클러스터에서 Performance Addon Operator를 제거하십시오.
사전 요구 사항
- 사용자 정의 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성합니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 ArgoCD의 소스 리포지토리로 정의해야 합니다.
- OpenShift Container Platform 4.11 이상으로 업데이트합니다.
-
cluster-admin권한이 있는 사용자로 로그인합니다.
절차
common-ranGen.yaml파일에서 Performance Addon Operator 네임스페이스, Operator group 및 subscription에 대해complianceType을필수로 변경합니다.- fileName: PaoSubscriptionNS.yaml policyName: "subscriptions-policy" complianceType: mustnothave - fileName: PaoSubscriptionOperGroup.yaml policyName: "subscriptions-policy" complianceType: mustnothave - fileName: PaoSubscription.yaml policyName: "subscriptions-policy" complianceType: mustnothave-
사용자 정의 사이트 리포지토리와 변경 사항을 병합하고 ArgoCD 애플리케이션이 변경 사항을 hub 클러스터에 동기화할 때까지 기다립니다.
common-subscriptions-policy정책의 상태는 비준수로 변경됩니다. - 토폴로지 Aware Lifecycle Manager를 사용하여 대상 클러스터에 변경 사항을 적용합니다. 구성 변경 사항을 배포하는 방법에 대한 자세한 내용은 "ECDHE 리소스" 섹션을 참조하십시오.
프로세스를 모니터링합니다. 대상 클러스터의
common-subscriptions-policy정책의 상태가Compliant인 경우 Performance Addon Operator가 클러스터에서 제거되었습니다. 다음 명령을 실행하여common-subscriptions-policy의 상태를 가져옵니다.$ oc get policy -n ztp-common common-subscriptions-policy
-
common-ranGen.yaml파일의.spec.sourceFiles에서 Performance Addon Operator 네임스페이스, Operator group 및 서브스크립션 CR을 삭제합니다. - 사용자 정의 사이트 리포지토리와 변경 사항을 병합하고 ArgoCD 애플리케이션이 변경 사항을 hub 클러스터에 동기화할 때까지 기다립니다. 정책은 계속 준수합니다.
17.10.2. GitOps ZTP에 대한 자동 생성 ClusterGroupUpgrade CR 정보
TALM에는 hub 클러스터에서 ManagedCluster CR의 Ready 상태를 모니터링하고 GitOps ZeroForwarded Provisioning(ZTP)에 대한 ClusterGroupUpgrade CR을 생성하는 ManagedClusterForCGU 라는 컨트롤러가 있습니다.
ztp-done 레이블이 적용되지 않은 Ready 상태의 관리형 클러스터의 경우 ManagedClusterForCGU 컨트롤러는 GitOps ZTP 프로세스 중에 생성된 관련 RHACM 정책을 사용하여 ztp-install 네임스페이스에 ClusterGroupUpgrade CR을 자동으로 생성합니다. 그런 다음 TALM은 자동 생성된 ClusterGroupUpgrade CR에 나열된 구성 정책 세트를 수정하여 구성 CR을 관리형 클러스터로 푸시합니다.
클러스터가 준비 상태가 되면 관리형 클러스터에 대한 정책이 없는 경우 정책이 생성되지 않는 ClusterGroupUpgrade CR이 생성됩니다. ClusterGroupUpgrade 가 완료되면 관리형 클러스터에 ztp-done 으로 레이블이 지정됩니다. 해당 관리 클러스터에 적용하려는 정책이 있는 경우 day-2 작업으로 ClusterGroupUpgrade 를 수동으로 생성합니다.
GitOps ZTP에 대한 자동 생성 ClusterGroupUpgrade CR의 예
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
generation: 1
name: spoke1
namespace: ztp-install
ownerReferences:
- apiVersion: cluster.open-cluster-management.io/v1
blockOwnerDeletion: true
controller: true
kind: ManagedCluster
name: spoke1
uid: 98fdb9b2-51ee-4ee7-8f57-a84f7f35b9d5
resourceVersion: "46666836"
uid: b8be9cd2-764f-4a62-87d6-6b767852c7da
spec:
actions:
afterCompletion:
addClusterLabels:
ztp-done: "" 1
deleteClusterLabels:
ztp-running: ""
deleteObjects: true
beforeEnable:
addClusterLabels:
ztp-running: "" 2
clusters:
- spoke1
enable: true
managedPolicies:
- common-spoke1-config-policy
- common-spoke1-subscriptions-policy
- group-spoke1-config-policy
- spoke1-config-policy
- group-spoke1-validator-du-policy
preCaching: false
remediationStrategy:
maxConcurrency: 1
timeout: 240
17.11. GitOps ZTP 업데이트
hub 클러스터, RHACM(Red Hat Advanced Cluster Management) 및 관리형 OpenShift Container Platform 클러스터와 별도로 GitOps ZeroForwarded(ZTP) 인프라를 업데이트할 수 있습니다.
새 버전이 사용 가능하게 되면 Red Hat OpenShift GitOps Operator를 업데이트할 수 있습니다. GitOps ZTP 플러그인을 업데이트할 때 참조 구성에서 업데이트된 파일을 검토하고 변경 사항이 요구 사항을 충족하는지 확인합니다.
17.11.1. GitOps ZTP 업데이트 프로세스 개요
이전 버전의 GitOps ZTP 인프라를 실행하는 완전히 작동 중인 허브 클러스터의 GitOps ZTP(ZTP)를 업데이트할 수 있습니다. 업데이트 프로세스에서는 관리형 클러스터에 영향을 미치지 않습니다.
권장 콘텐츠를 포함한 정책 설정 변경으로 인해 관리 클러스터에 롤아웃되고 조정되어야 하는 업데이트된 정책이 생성됩니다.
높은 수준에서 GitOps ZTP 인프라를 업데이트하는 전략은 다음과 같습니다.
-
모든 기존 클러스터에
ztp-done라벨을 지정합니다. - ArgoCD 애플리케이션을 중지합니다.
- 새 GitOps ZTP 툴을 설치합니다.
- Git 리포지토리의 필수 콘텐츠 및 선택적 변경 사항을 업데이트합니다.
- 애플리케이션 구성을 업데이트하고 다시 시작합니다.
17.11.2. 업그레이드 준비
다음 절차에 따라 GitOps ZeroForwarded Provisioning (ZTP) 업그레이드를 위해 사이트를 준비합니다.
절차
- GitOps ZTP와 함께 사용하기 위해 Red Hat OpenShift GitOps를 구성하는 데 사용되는 CR(사용자 정의 리소스)이 있는 GitOps ZTP 컨테이너의 최신 버전을 가져옵니다.
다음 명령을 사용하여
argocd/deployment디렉터리를 추출합니다.$ mkdir -p ./update
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.13 extract /home/ztp --tar | tar x -C ./update
/update디렉터리에는 다음 하위 디렉터리가 있습니다.-
update/extra-manifest: siteConfigCR이 추가 매니페스트configMap을 생성하는 데 사용하는 소스 CR 파일이 포함되어 있습니다. -
update/source-crs:PolicyGenTemplateCR에서 RHACM(Red Hat Advanced Cluster Management) 정책을 생성하는 데 사용하는 소스 CR 파일이 포함되어 있습니다. -
update/argocd/deployment: 이 절차의 다음 단계에서 사용할 hub 클러스터에 적용할 패치 및 YAML 파일이 포함되어 있습니다. -
update/argocd/example: 권장 구성을 나타내는siteConfig및PolicyGenTemplate파일 예제가 포함되어 있습니다.
-
애플리케이션 이름과 Git 리포지토리의 URL, 분기 및 경로를 반영하도록 cluster
-app.yaml 및 policy-app.yaml파일을 업데이트합니다.업그레이드에 더 이상 사용되지 않는 정책이 생성되는 변경 사항이 포함된 경우 업그레이드를 수행하기 전에 더 이상 사용되지 않는 정책을 제거해야 합니다.
함대 사이트 CR을 관리하는
/update폴더의 구성 및 배포 소스 CR과 Git 리포지토리 간 변경 사항을 구분합니다. 필요한 변경 사항을 적용하고 사이트 리포지토리에 내보냅니다.중요GitOps ZTP를 최신 버전으로 업데이트할 때
update/argocd/deployment디렉터리의 변경 사항을 사이트 리포지토리에 적용해야 합니다. 이전 버전의argocd/deployment/파일을 사용하지 마십시오.
17.11.3. 기존 클러스터에 레이블 지정
툴 업데이트로 기존 클러스터가 변경되지 않도록 하려면 기존 관리형 클러스터에 ztp-done 라벨을 지정합니다.
이 절차는 TALM ( Topology Topology Aware Lifecycle Manager)을 사용하여 프로비저닝되지 않은 클러스터를 업데이트하는 경우에만 적용됩니다. TALM으로 프로비저닝하는 클러스터는 자동으로 ztp-done 으로 레이블이 지정됩니다.
절차
local-cluster!=true와 같이 GitOps Zero 10.0.0.1 Provisioning(ZTP)을 사용하여 배포된 관리형 클러스터를 나열하는 라벨 선택기를 찾습니다.$ oc get managedcluster -l 'local-cluster!=true'
결과 목록에 GitOps ZTP와 함께 배포된 모든 관리형 클러스터가 포함되어 있는지 확인한 다음 해당 선택기를 사용하여
ztp-done레이블을 추가합니다.$ oc label managedcluster -l 'local-cluster!=true' ztp-done=
17.11.4. 기존 GitOps ZTP 애플리케이션 중지
기존 애플리케이션을 제거하면 새 버전의 툴을 사용할 수 있을 때까지 Git 리포지토리의 기존 콘텐츠에 대한 변경 사항이 롤아웃되지 않습니다.
배포 디렉터리의 애플리케이션 파일을 사용합니다. 애플리케이션에 사용자 지정 이름을 사용한 경우 먼저 이러한 파일의 이름을 업데이트합니다.
절차
생성된 모든 리소스를 제자리에 배치하려면
클러스터애플리케이션에서 non-cascaded 삭제를 수행합니다.$ oc delete -f update/argocd/deployment/clusters-app.yaml
이전
정책을 모두 제거하려면 정책애플리케이션에서 cascaded 삭제를 수행합니다.$ oc patch -f policies-app.yaml -p '{"metadata": {"finalizers": ["resources-finalizer.argocd.argoproj.io"]}}' --type merge$ oc delete -f update/argocd/deployment/policies-app.yaml
17.11.5. Git 리포지터리에 필요한 변경 사항
이전 릴리스의 GitOps Zero ScanSetting Provisioning (ZTP)에서 4.10 이상으로 ztp-site-generate 컨테이너를 업그레이드할 때 Git 리포지토리 콘텐츠에 대한 추가 요구 사항이 있습니다. 이러한 변경 사항을 반영하도록 리포지토리의 기존 콘텐츠를 업데이트해야 합니다.
PolicyGenTemplate파일을 필요한 대로 변경합니다.모든
PolicyGenTemplate파일은ztp접두사가지정된 네임스페이스에서 생성해야 합니다. 이렇게 하면 GitOps ZTP 애플리케이션에서 RHACM(Red Hat Advanced Cluster Management)이 내부적으로 정책을 관리하는 방식과 충돌하지 않고 GitOps ZTP에서 생성한 정책 CR을 관리할 수 있습니다.kustomization.yaml파일을 리포지토리에 추가합니다.모든
siteConfig및PolicyGenTemplateCR은 해당 디렉토리 줄기의kustomization.yaml파일에 포함되어야 합니다. 예를 들면 다음과 같습니다.├── policygentemplates │ ├── site1-ns.yaml │ ├── site1.yaml │ ├── site2-ns.yaml │ ├── site2.yaml │ ├── common-ns.yaml │ ├── common-ranGen.yaml │ ├── group-du-sno-ranGen-ns.yaml │ ├── group-du-sno-ranGen.yaml │ └── kustomization.yaml └── siteconfig ├── site1.yaml ├── site2.yaml └── kustomization.yaml참고생성기섹션에 나열된 파일에는 siteConfig또는PolicyGenTemplateCR만 포함되어야 합니다. 기존 YAML 파일에 다른 CR(예:네임스페이스)이 포함된 경우 이러한 다른 CR을 별도의 파일로 가져와서resources섹션에 나열해야 합니다.PolicyGenTemplatekustomization 파일은generator섹션에 있는 모든PolicyGenTemplateYAML 파일과resources섹션에있는 네임스페이스CR을 포함해야 합니다. 예를 들면 다음과 같습니다.apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization generators: - common-ranGen.yaml - group-du-sno-ranGen.yaml - site1.yaml - site2.yaml resources: - common-ns.yaml - group-du-sno-ranGen-ns.yaml - site1-ns.yaml - site2-ns.yaml
site
Configkustomization 파일은generator섹션의 모든 siteConfigYAML 파일과 리소스의 다른 CR을 포함해야 합니다.apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization generators: - site1.yaml - site2.yaml
pre-sync.yaml및post-sync.yaml파일을 제거합니다.OpenShift Container Platform 4.10 이상에서는
pre-sync.yaml및post-sync.yaml파일이 더 이상 필요하지 않습니다.update/deployment/kustomization.yamlCR은 hub 클러스터에서 정책 배포를 관리합니다.참고site
Config및PolicyGenTemplateleaves에pre-sync.yaml및post-sync.yaml파일 세트가 있습니다.권장 변경 사항 검토 및 통합
각 릴리스에는 배포된 클러스터에 적용된 구성에 대한 권장 변경 사항이 포함되어 있을 수 있습니다. 일반적으로 이러한 변경으로 인해 OpenShift 플랫폼, 추가 기능 또는 플랫폼의 개선된 튜닝에서 CPU 사용이 감소합니다.
네트워크의 클러스터 유형에 적용되는 참조 site
Config및PolicyGenTemplateCR을 검토하십시오. 이러한 예제는 GitOps ZTP 컨테이너에서 추출한argocd/example디렉터리에서 확인할 수 있습니다.
17.11.6. 새 GitOps ZTP 애플리케이션 설치
추출된 argocd/deployment 디렉터리를 사용하고 애플리케이션이 사이트 Git 리포지토리를 가리키는 후 배포 디렉터리의 전체 콘텐츠를 적용합니다. 디렉터리의 전체 콘텐츠를 적용하면 애플리케이션에 필요한 모든 리소스가 올바르게 구성됩니다.
절차
이전에
update/argocd/deployment/디렉터리에 추출한 패치 파일을 사용하여 hub 클러스터에 ArgoCD 인스턴스를 패치하려면 다음 명령을 입력합니다.$ oc patch argocd openshift-gitops \ -n openshift-gitops --type=merge \ --patch-file update/argocd/deployment/argocd-openshift-gitops-patch.json
argocd/deployment디렉터리의 내용을 적용하려면 다음 명령을 입력합니다.$ oc apply -k update/argocd/deployment
17.11.7. GitOps ZTP 구성 변경 사항 롤아웃
권장 변경 사항을 구현하여 업그레이드에 구성 변경이 포함된 경우 업그레이드 프로세스로 인해 비준수 상태의 hub 클러스터에 대한 정책 CR 세트가 생성됩니다. GitOps Zero ScanSetting Provisioning (ZTP) 버전 4.10 및 이후의 ztp-site-generate 컨테이너를 사용하면 이러한 정책은 정보 모드로 설정되고 사용자가 추가 단계없이 관리형 클러스터로 푸시되지 않습니다. 이렇게 하면 유지 관리 기간 중 변경 사항이 동시에 업데이트되는 경우와 같이 변경 사항이 발생하는 경우와 같이 클러스터에 대한 잠재적으로 중단되는 변경을 관리할 수 있습니다.
변경 사항을 롤아웃하려면 TALM 문서에 설명된 대로 하나 이상의 ClusterGroupUpgrade CR을 생성합니다. CR에는 관리 클러스터로 내보내고자 하는 비준수 정책 목록과 업데이트에 포함되어야 하는 클러스터의 목록 또는 선택기가 포함되어야 합니다.
추가 리소스
- TALM(토폴로지 라이프사이클 관리자)에 대한 자세한 내용은 토폴로지 Aware Lifecycle Manager 구성 정보를 참조하십시오.
-
ClusterGroupUpgradeCR 생성에 대한 자세한 내용은 ZTP용 자동 생성된 ClusterGroupUpgrade CR 정보를 참조하십시오.
17.12. GitOps ZTP를 사용하여 단일 노드 OpenShift 클러스터 확장
GitOps Zero 10.0.0.1 Provisioning (ZTP)을 사용하여 단일 노드 OpenShift 클러스터를 확장할 수 있습니다. 단일 노드 OpenShift 클러스터에 작업자 노드를 추가하면 원래 단일 노드 OpenShift 클러스터는 컨트롤 플레인 노드 역할을 유지합니다. 작업자 노드를 추가해도 기존 단일 노드 OpenShift 클러스터에 대한 다운타임이 필요하지 않습니다.
단일 노드 OpenShift 클러스터에 추가할 수 있는 작업자 노드 수에 대한 제한은 없지만 추가 작업자 노드의 컨트롤 플레인 노드에서 예약된 CPU 할당을 다시 평가해야 합니다.
작업자 노드에 워크로드 파티셔닝이 필요한 경우 노드를 설치하기 전에 hub 클러스터에 관리형 클러스터 정책을 배포하고 수정해야 합니다. 이렇게 하면 GitOps ZTP 워크플로우에서 MachineConfig 를 작업자 노드에 적용하기 전에 워크로드 파티셔닝 머신 구성 풀과 연결되고 작업자 머신 구성 풀과 연결됩니다.
MachineConfig 오브젝트가 작업자
먼저 정책을 수정한 다음 작업자 노드를 설치하는 것이 좋습니다. 작업자 노드를 설치한 후 워크로드 파티션 매니페스트를 생성하는 경우 노드를 수동으로 드레이닝하고 데몬 세트에서 관리하는 모든 Pod를 삭제해야 합니다. 관리 데몬 세트에서 새 Pod를 생성하면 새 Pod에 워크로드 파티셔닝 프로세스가 수행됩니다.
GitOps ZTP를 사용하여 단일 노드 OpenShift 클러스터에 작업자 노드를 추가하는 것은 기술 프리뷰 기능입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
추가 리소스
- vDU 애플리케이션 배포를 위해 조정된 단일 노드 OpenShift 클러스터에 대한 자세한 내용은 단일 노드 OpenShift에 vDU 배포를 위한 참조 구성 을 참조하십시오.
- 작업자 노드에 대한 자세한 내용은 단일 노드 OpenShift 클러스터에 작업자 노드 추가를 참조하십시오.
17.12.1. 작업자 노드에 프로필 적용
DU 프로필을 사용하여 추가 작업자 노드를 구성할 수 있습니다.
GitOps ZeroForwarded Provisioning (ZTP) common, group 및 site-specific PolicyGenTemplate 리소스를 사용하여 작업자 노드 클러스터에 RAN distributed unit (DU) 프로필을 적용할 수 있습니다. ArgoCD 정책 애플리케이션에 연결된 GitOps ZTP 파이프라인에는 ztp-site-generate 컨테이너를 추출할 때 out/argocd/example/policygentemplates 폴더에 있는 다음 CR이 포함되어 있습니다.
-
common-ranGen.yaml -
group-du-sno-ranGen.yaml -
example-sno-site.yaml -
ns.yaml -
kustomization.yaml
작업자 노드에서 DU 프로필을 구성하는 것은 업그레이드로 간주됩니다. 업그레이드 흐름을 시작하려면 기존 정책을 업데이트하거나 추가 정책을 생성해야 합니다. 그런 다음 클러스터 그룹의 정책을 조정하려면 ClusterGroupUpgrade CR을 생성해야 합니다.
17.12.2. (선택 사항) PTP 및 SR-IOV 데몬 선택기 호환성 강화
GTP(HITOP) 플러그인 버전 4.11 이상을 사용하여 DU 프로필이 배포된 경우 master 로 레이블이 지정된 노드에만 데몬을 배치하도록 PTP 및 SR-IOV Operator를 구성할 수 있습니다. 이 구성으로 PTP 및 SR-IOV 데몬이 작업자 노드에서 작동하지 않습니다. PTP 및 SR-IOV 데몬 노드 선택기가 시스템에 잘못 구성된 경우 작업자 DU 프로필 구성을 진행하기 전에 데몬을 변경해야 합니다.
절차
설명된 클러스터 중 하나에서 PTP Operator의 데몬 노드 선택기 설정을 확인합니다.
$ oc get ptpoperatorconfig/default -n openshift-ptp -ojsonpath='{.spec}' | jqPTP Operator 출력 예
{"daemonNodeSelector":{"node-role.kubernetes.io/master":""}} 1- 1
- 노드 선택기가
마스터로 설정된 경우 spoke는 변경이 필요한 GitOps ZTP 플러그인 버전으로 배포되었습니다.
설명된 클러스터 중 하나에서 SR-IOV Operator의 데몬 노드 선택기 설정을 확인합니다.
$ oc get sriovoperatorconfig/default -n \ openshift-sriov-network-operator -ojsonpath='{.spec}' | jqSR-IOV Operator의 출력 예
{"configDaemonNodeSelector":{"node-role.kubernetes.io/worker":""},"disableDrain":false,"enableInjector":true,"enableOperatorWebhook":true} 1- 1
- 노드 선택기가
마스터로 설정된 경우 spoke는 변경이 필요한 GitOps ZTP 플러그인 버전으로 배포되었습니다.
그룹 정책에서 다음
complianceType및spec항목을 추가합니다.spec: - fileName: PtpOperatorConfig.yaml policyName: "config-policy" complianceType: mustonlyhave spec: daemonNodeSelector: node-role.kubernetes.io/worker: "" - fileName: SriovOperatorConfig.yaml policyName: "config-policy" complianceType: mustonlyhave spec: configDaemonNodeSelector: node-role.kubernetes.io/worker: ""중요daemonNodeSelector필드를 변경하면 임시 PTP 동기화 손실 및 SR-IOV 연결이 끊어집니다.- Git의 변경 사항을 커밋한 다음 GitOps ZTP ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.
17.12.3. PTP 및 SR-IOV 노드 선택기 호환성
PTP 구성 리소스 및 SR-IOV 네트워크 노드 정책은 node-role.kubernetes.io/master: "" 를 노드 선택기로 사용합니다. 추가 작업자 노드에 컨트롤 플레인 노드와 동일한 NIC 구성이 있는 경우 컨트롤 플레인 노드를 구성하는 데 사용되는 정책을 작업자 노드에 재사용할 수 있습니다. 그러나 "node-role.kubernetes.io/worker" 레이블과 같이 노드 유형을 둘 다 선택하도록 노드 선택기를 변경해야 합니다.
17.12.4. PolicyGenTemplate CR을 사용하여 작업자 노드에 작업자 노드 정책 적용
작업자 노드에 대한 정책을 생성할 수 있습니다.
절차
다음 정책 템플릿을 생성합니다.
apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "example-sno-workers" namespace: "example-sno" spec: bindingRules: sites: "example-sno" 1 mcp: "worker" 2 sourceFiles: - fileName: MachineConfigGeneric.yaml 3 policyName: "config-policy" metadata: labels: machineconfiguration.openshift.io/role: worker name: enable-workload-partitioning spec: config: storage: files: - contents: source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMyIgfQo= mode: 420 overwrite: true path: /etc/crio/crio.conf.d/01-workload-partitioning user: name: root - contents: source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTMiCiAgfQp9Cg== mode: 420 overwrite: true path: /etc/kubernetes/openshift-workload-pinning user: name: root - fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: name: openshift-worker-node-performance-profile spec: cpu: 4 isolated: "4-47" reserved: "0-3" hugepages: defaultHugepagesSize: 1G pages: - size: 1G count: 32 realTimeKernel: enabled: true - fileName: TunedPerformancePatch.yaml policyName: "config-policy" metadata: name: performance-patch-worker spec: profile: - name: performance-patch-worker data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-worker-node-performance-profile [bootloader] cmdline_crash=nohz_full=4-47 5 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable recommend: - profile: performance-patch-worker일반
MachineConfigCR은 작업자 노드에서 워크로드 파티셔닝을 구성하는 데 사용됩니다.crio및kubelet구성 파일의 콘텐츠를 생성할 수 있습니다.-
ArgoCD 정책 애플리케이션에서 모니터링하는 Git 리포지토리에 생성된
정책템플릿을 추가합니다. -
kustomization.yaml파일에 정책을 추가합니다. - Git의 변경 사항을 커밋한 다음 GitOps ZTP ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.
새로운 정책을 스포크 클러스터에 수정하려면 TALM 사용자 정의 리소스를 생성합니다.
$ cat <<EOF | oc apply -f - apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: example-sno-worker-policies namespace: default spec: backup: false clusters: - example-sno enable: true managedPolicies: - group-du-sno-config-policy - example-sno-workers-config-policy - example-sno-config-policy preCaching: false remediationStrategy: maxConcurrency: 1 EOF
17.12.5. GitOps ZTP를 사용하여 단일 노드 OpenShift 클러스터에 작업자 노드 추가
기존 단일 노드 OpenShift 클러스터에 하나 이상의 작업자 노드를 추가하여 클러스터에서 사용 가능한 CPU 리소스를 늘릴 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 4.11 이상 베어 메탈 허브 클러스터에서 RHACM 2.6 이상을 설치하고 구성
- 허브 클러스터에 Topology Aware Lifecycle Manager 설치
- hub 클러스터에 Red Hat OpenShift GitOps 설치
-
GitOps ZTP
ztp-site-generate컨테이너 이미지 버전 4.12 이상을 사용합니다. - GitOps ZTP를 사용하여 관리형 단일 노드 OpenShift 클러스터 배포
- RHACM 문서에 설명된 대로 중앙 인프라 관리 구성
-
내부 API 엔드포인트
api-int.<cluster_name>.<base_domain>을 확인하도록 클러스터에 DNS 서비스를 구성
절차
example-sno.yamlsiteConfig매니페스트를 사용하여 클러스터를 배포한 경우 새 작업자 노드를spec.clusters['example-sno'].nodes목록에 추가합니다.nodes: - hostName: "example-node2.example.com" role: "worker" bmcAddress: "idrac-virtualmedia+https://[1111:2222:3333:4444::bbbb:1]/redfish/v1/Systems/System.Embedded.1" bmcCredentialsName: name: "example-node2-bmh-secret" bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" nodeNetwork: interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up macAddress: "AA:BB:CC:DD:EE:11" ipv4: enabled: false ipv6: enabled: true address: - ip: 1111:2222:3333:4444::1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254site
Config파일의spec.nodes섹션에 있는bmcCredentialsName필드에서 참조하는 대로 새 호스트의 BMC 인증 시크릿을 생성합니다.apiVersion: v1 data: password: "password" username: "username" kind: Secret metadata: name: "example-node2-bmh-secret" namespace: example-sno type: Opaque
Git의 변경 사항을 커밋한 다음 GitOps ZTP ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.
ArgoCD
클러스터애플리케이션이 동기화되면 GitOps ZTP 플러그인에서 생성한 hub 클러스터에 두 개의 새 매니페스트가 나타납니다.-
BareMetalHost NMStateConfig중요worker 노드에 대해
cpuset필드를 구성해서는 안 됩니다. 노드 설치가 완료된 후 작업자 노드의 워크로드 파티션은 관리 정책을 통해 추가됩니다.
-
검증
여러 가지 방법으로 설치 프로세스를 모니터링할 수 있습니다.
다음 명령을 실행하여 사전 프로비저닝된 이미지가 생성되었는지 확인합니다.
$ oc get ppimg -n example-sno
출력 예
NAMESPACE NAME READY REASON example-sno example-sno True ImageCreated example-sno example-node2 True ImageCreated
베어 메탈 호스트의 상태를 확인합니다.
$ oc get bmh -n example-sno
출력 예
NAME STATE CONSUMER ONLINE ERROR AGE example-sno provisioned true 69m example-node2 provisioning true 4m50s 1- 1
provisioning상태는 설치 미디어에서 부팅 중인 노드가 진행 중임을 나타냅니다.
설치 프로세스를 지속적으로 모니터링합니다.
다음 명령을 실행하여 에이전트 설치 프로세스를 확인합니다.
$ oc get agent -n example-sno --watch
출력 예
NAME CLUSTER APPROVED ROLE STAGE 671bc05d-5358-8940-ec12-d9ad22804faa example-sno true master Done [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Starting installation 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Installing 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Writing image to disk [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Waiting for control plane [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Rebooting 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Done
작업자 노드 설치가 완료되면 작업자 노드 인증서가 자동으로 승인됩니다. 이 시점에서 작업자는
ManagedClusterInfo상태에 나타납니다. 다음 명령을 실행하여 상태를 확인합니다.$ oc get managedclusterinfo/example-sno -n example-sno -o \ jsonpath='{range .status.nodeList[*]}{.name}{"\t"}{.conditions}{"\t"}{.labels}{"\n"}{end}'출력 예
example-sno [{"status":"True","type":"Ready"}] {"node-role.kubernetes.io/master":"","node-role.kubernetes.io/worker":""} example-node2 [{"status":"True","type":"Ready"}] {"node-role.kubernetes.io/worker":""}
17.13. 단일 노드 OpenShift 배포의 이미지 사전 캐싱
대역폭이 제한된 환경에서 GitOps Zero 10.0.0.1 Provisioning (ZTP) 솔루션을 사용하여 많은 수의 클러스터를 배포하는 경우 OpenShift Container Platform을 부트스트랩 및 설치하는 데 필요한 모든 이미지를 다운로드하지 않으려고 합니다. 원격 단일 노드 OpenShift 사이트의 대역폭이 제한된 경우 배포 시간이 길어질 수 있습니다. construction-precaching-cli 도구를 사용하면 ZTP 프로비저닝을 위해 원격 사이트로 전송하기 전에 사전 단계를 수행할 수 있습니다.
construction-precaching-cli 도구는 다음을 수행합니다.
- 부팅하는 데 최소한의 ISO에 필요한 RHCOS rootfs 이미지를 다운로드합니다.
-
데이터로레이블이 지정된 설치 디스크에서 파티션을 생성합니다. - xfs로 디스크를 포맷합니다.
- 디스크 끝에 GUID 파티션 테이블(GPT) 데이터 파티션을 만듭니다. 여기서 파티션 크기는 도구에서 구성할 수 있습니다.
- OpenShift Container Platform을 설치하는 데 필요한 컨테이너 이미지를 복사합니다.
- ZTP에 필요한 컨테이너 이미지를 복사하여 OpenShift Container Platform을 설치합니다.
- 선택사항: 2일 차 Operator를 파티션에 복사합니다.
division-precaching-cli 툴은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
17.13.1. construction-precaching-cli 툴 받기
sector-precaching-cli 툴 Go 바이너리는 Telco RAN 툴 컨테이너 이미지에서 공개적으로 사용할 수 있습니다. 컨테이너 이미지의 bootstrap-precaching-cli 툴 Go 바이너리는 podman 을 사용하여 RHCOS 라이브 이미지를 실행하는 서버에서 실행됩니다. 연결이 끊긴 환경에서 작업 중이거나 프라이빗 레지스트리가 있는 경우 이미지를 서버에 다운로드할 수 있도록 이미지를 복사해야 합니다.
절차
다음 명령을 실행하여 builder-precaching-cli 툴 이미지를 가져옵니다.
# podman pull quay.io/openshift-kni/telco-ran-tools:latest
검증
도구를 사용할 수 있는지 확인하려면 현재 버전의 Operating-precaching-cli 툴 Go 바이너리를 쿼리합니다.
# podman run quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli -v
출력 예
factory-precaching-cli version 20221018.120852+main.feecf17
17.13.2. 라이브 운영 체제 이미지에서 부팅
하나의 디스크만 사용할 수 있고 외부 디스크 드라이브를 서버에 연결할 수 없는 부팅 서버를 함께 사용할 수 있습니다.
디스크가 RHCOS 이미지로 작성될 때 RHCOS를 사용하지 않아야 합니다.
서버 하드웨어에 따라 다음 방법 중 하나를 사용하여 빈 서버에 RHCOS 라이브 ISO를 마운트할 수 있습니다.
- Dell 서버에서 Dell RACADM 툴 사용.
- HP 서버에서 HPONCFG 툴 사용.
- Redfish BMC API 사용.
마운트 절차를 자동화하는 것이 좋습니다. 절차를 자동화하려면 필요한 이미지를 가져와서 로컬 HTTP 서버에서 호스팅해야 합니다.
사전 요구 사항
- 호스트의 전원을 높였습니다.
- 호스트에 대한 네트워크 연결이 있어야 합니다.
이 예제 절차에서는 Redfish BMC API를 사용하여 RHCOS 라이브 ISO를 마운트합니다.
RHCOS 라이브 ISO를 마운트합니다.
가상 미디어 상태를 확인합니다.
$ curl --globoff -H "Content-Type: application/json" -H \ "Accept: application/json" -k -X GET --user ${username_password} \ https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1 | python -m json.toolISO 파일을 가상 미디어로 마운트합니다.
$ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Image": "http://[$HTTPd_IP]/RHCOS-live.iso"}' -X POST https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1/Actions/VirtualMedia.InsertMedia가상 미디어에서 부팅하도록 부팅 순서를 설정합니다.
$ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Boot":{ "BootSourceOverrideEnabled": "Once", "BootSourceOverrideTarget": "Cd", "BootSourceOverrideMode": "UEFI"}}' -X PATCH https://$BMC_ADDRESS/redfish/v1/Systems/Self
- 서버가 가상 미디어에서 부팅되고 있는지 확인합니다.
추가 리소스
-
butane유틸리티에 대한 자세한 내용은 Butane 정보를 참조하십시오. - 사용자 정의 라이브 RHCOS ISO를 생성하는 방법에 대한 자세한 내용은 원격 서버 액세스를 위한 사용자 정의 라이브 RHCOS ISO 생성 을 참조하십시오.
- Dell RACADM 툴 사용에 대한 자세한 내용은 Integrated Dell Remote Access Controller 9 RACADM CLI 가이드를 참조하십시오.
- HP HPONCFG 툴 사용에 대한 자세한 내용은 HPONCFG 사용을 참조하십시오.
- Redfish BMC API 사용에 대한 자세한 내용은 Redfish API 를 사용하여 HTTP 호스트 ISO 이미지에서 부팅을 참조하십시오.
17.13.3. 디스크 파티션 설정
전체 사전 캐싱 프로세스를 실행하려면 라이브 ISO에서 부팅하고 컨테이너 이미지에서 loading-precaching-cli 툴을 사용하여 필요한 모든 아티팩트를 파티션하고 캐시해야 합니다.
운영 체제(RHCOS)가 프로비저닝 중 장치에 기록될 때 디스크를 사용하지 않아야 하므로 라이브 ISO 또는 RHCOS 라이브 ISO가 필요합니다. 이 절차를 통해 단일 디스크 서버를 활성화할 수도 있습니다.
사전 요구 사항
- 분할되지 않은 디스크가 있습니다.
-
quay.io/openshift-kni/telco-ran-tools:latest이미지에 액세스할 수 있습니다. - OpenShift Container Platform을 설치하고 필요한 이미지를 사전 캐시할 수 있는 충분한 스토리지가 있습니다.
절차
디스크가 지워졌는지 확인합니다.
# lsblk
출력 예
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk
장치에서 모든 파일 시스템, RAID 또는 파티션 테이블 서명이 만료됩니다.
# wipefs -a /dev/nvme0n1
출력 예
/dev/nvme0n1: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/nvme0n1: 8 bytes were erased at offset 0x1749a955e00 (gpt): 45 46 49 20 50 41 52 54 /dev/nvme0n1: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
아티팩트 사전 캐싱을 위해 장치의 파티션 번호 1을 사용하므로 디스크가 비어 있지 않은 경우 툴이 실패합니다.
17.13.3.1. 파티션 생성
장치가 준비되면 단일 파티션과 GPT 파티션 테이블을 만듭니다. 파티션에 자동으로 데이터 레이블이 지정되고 장치 끝에 생성됩니다. 그렇지 않으면 coreos-installer 에 의해 파티션이 재정의됩니다.
coreos-installer 는 장치 끝에 파티션을 생성하고 데이터로 레이블이 지정되어야 합니다. RHCOS 이미지를 디스크에 쓸 때 파티션을 저장하려면 두 가지 요구 사항이 모두 필요합니다.
사전 요구 사항
-
컨테이너는 호스트 장치
포맷으로인해 권한으로 실행되어야 합니다. -
컨테이너 내부에서 프로세스를 실행할 수 있도록
/dev폴더를 마운트해야 합니다.
절차
다음 예에서 2일 Operator의 DU 프로필을 사전 캐싱할 수 있기 때문에 파티션 크기는 250GiB입니다.
권한으로 컨테이너를 실행하고 디스크를 분할합니다.
# podman run -v /dev:/dev --privileged \ --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli partition \ 1 -d /dev/nvme0n1 \ 2 -s 250 3
스토리지 정보를 확인합니다.
# lsblk
출력 예
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk └─nvme0n1p1 259:3 0 250G 0 part
검증
다음 요구 사항이 충족되었는지 확인해야 합니다.
- 장치에 GPT 파티션 테이블이 있습니다.
- 파티션은 장치의 최신 섹터를 사용합니다.
-
파티션의 레이블이
data로 올바르게 지정됩니다.
디스크 상태를 쿼리하여 디스크가 예상대로 분할되었는지 확인합니다.
# gdisk -l /dev/nvme0n1
출력 예
GPT fdisk (gdisk) version 1.0.3 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/nvme0n1: 3125627568 sectors, 1.5 TiB Model: Dell Express Flash PM1725b 1.6TB SFF Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): CB5A9D44-9B3C-4174-A5C1-C64957910B61 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 3125627534 Partitions will be aligned on 2048-sector boundaries Total free space is 2601338846 sectors (1.2 TiB) Number Start (sector) End (sector) Size Code Name 1 2601338880 3125627534 250.0 GiB 8300 data
17.13.3.2. 파티션 마운트
디스크가 올바르게 분할되었는지 확인한 후 장치를 /mnt 에 마운트할 수 있습니다.
GitOps ZTP 준비 중에 마운트 지점이 사용되므로 장치를 /mnt 에 마운트하는 것이 좋습니다.
파티션이
xfs로 포맷되었는지 확인합니다.# lsblk -f /dev/nvme0n1
출력 예
NAME FSTYPE LABEL UUID MOUNTPOINT nvme0n1 └─nvme0n1p1 xfs 1bee8ea4-d6cf-4339-b690-a76594794071
파티션을 마운트합니다.
# mount /dev/nvme0n1p1 /mnt/
검증
파티션이 마운트되었는지 확인합니다.
# lsblk
출력 예
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk └─nvme0n1p1 259:2 0 250G 0 part /var/mnt 1- 1
- RHCOS의
/mnt폴더는/var/mnt에 대한 링크이므로 마운트 지점은/var/mnt입니다.
17.13.4. 이미지 다운로드
division-precaching-cli 도구를 사용하면 다음과 같은 이미지를 분할된 서버로 다운로드할 수 있습니다.
- OpenShift Container Platform 이미지
- 5G RAN 사이트의 DU(Distributed Unit) 프로필에 포함된 Operator 이미지
- 연결이 끊긴 레지스트리의 Operator 이미지
사용 가능한 Operator 이미지 목록은 OpenShift Container Platform 릴리스마다 다를 수 있습니다.
17.13.4.1. 병렬 작업자로 다운로드
division-precaching-cli 툴은 병렬 작업자를 사용하여 여러 이미지를 동시에 다운로드합니다. --parallel 또는 -p 옵션을 사용하여 작업자 수를 구성할 수 있습니다. 기본값은 서버 사용 가능한 CPU의 80%로 설정됩니다.
로그인 쉘은 CPU의 하위 집합으로 제한될 수 있으므로 컨테이너에서 사용 가능한 CPU가 줄어듭니다. 이 제한을 제거하려면 명령 앞에 0xffffffff의 작업 보다 우선합니다. 예를 들면 다음과 같습니다.
# taskset 0xffffffff podman run --rm quay.io/openshift-kni/telco-ran-tools:latest factory-precaching-cli download --help
17.13.4.2. OpenShift Container Platform 이미지 다운로드 준비
OpenShift Container Platform 컨테이너 이미지를 다운로드하려면 멀티 클러스터 엔진 (MCE) 버전을 알아야 합니다. --du-profile 플래그를 사용하는 경우 단일 노드 OpenShift를 프로비저닝할 hub 클러스터에서 실행되는 RHACM(Red Hat Advanced Cluster Management) 버전도 지정해야 합니다.
사전 요구 사항
- RHACM 및 MCE가 설치되어 있어야 합니다.
- 스토리지 장치를 분할했습니다.
- 분할된 장치에 이미지에 충분한 공간이 있습니다.
- 베어 메탈 서버를 인터넷에 연결하셨습니다.
- 유효한 풀 시크릿이 있습니다.
절차
hub 클러스터에서 다음 명령을 실행하여 RHACM 및 MCE 버전을 확인합니다.
$ oc get csv -A | grep -i advanced-cluster-management
출력 예
open-cluster-management advanced-cluster-management.v2.6.3 Advanced Cluster Management for Kubernetes 2.6.3 advanced-cluster-management.v2.6.3 Succeeded
$ oc get csv -A | grep -i multicluster-engine
출력 예
multicluster-engine cluster-group-upgrades-operator.v0.0.3 cluster-group-upgrades-operator 0.0.3 Pending multicluster-engine multicluster-engine.v2.1.4 multicluster engine for Kubernetes 2.1.4 multicluster-engine.v2.0.3 Succeeded multicluster-engine openshift-gitops-operator.v1.5.7 Red Hat OpenShift GitOps 1.5.7 openshift-gitops-operator.v1.5.6-0.1664915551.p Succeeded multicluster-engine openshift-pipelines-operator-rh.v1.6.4 Red Hat OpenShift Pipelines 1.6.4 openshift-pipelines-operator-rh.v1.6.3 Succeeded
컨테이너 레지스트리에 액세스하려면 설치할 서버에 유효한 풀 시크릿을 복사합니다.
.docker폴더를 생성합니다.$ mkdir /root/.docker
config.json파일에 유효한 가져오기를 이전에 생성한.docker/폴더에 복사합니다.$ cp config.json /root/.docker/config.json 1- 1
/root/.docker/config.json은podman이 레지스트리의 로그인 자격 증명을 확인하는 기본 경로입니다.
다른 레지스트리를 사용하여 필요한 아티팩트를 가져오는 경우 적절한 풀 시크릿을 복사해야 합니다. 로컬 레지스트리가 TLS를 사용하는 경우 레지스트리의 인증서도 포함해야 합니다.
17.13.4.3. OpenShift Container Platform 이미지 다운로드
seamless-precaching-cli 툴을 사용하면 특정 OpenShift Container Platform 릴리스를 프로비저닝하는 데 필요한 모든 컨테이너 이미지를 사전 캐시할 수 있습니다.
절차
다음 명령을 실행하여 릴리스를 사전 캐시합니다.
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools -- \ factory-precaching-cli download \ 1 -r 4.13.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6
출력 예
Generated /mnt/imageset.yaml Generating list of pre-cached artifacts... Processing artifact [1/176]: ocp-v4.0-art-dev@sha256_6ac2b96bf4899c01a87366fd0feae9f57b1b61878e3b5823da0c3f34f707fbf5 Processing artifact [2/176]: ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c Processing artifact [3/176]: ocp-v4.0-art-dev@sha256_a480390e91b1c07e10091c3da2257180654f6b2a735a4ad4c3b69dbdb77bbc06 Processing artifact [4/176]: ocp-v4.0-art-dev@sha256_ecc5d8dbd77e326dba6594ff8c2d091eefbc4d90c963a9a85b0b2f0e6155f995 Processing artifact [5/176]: ocp-v4.0-art-dev@sha256_274b6d561558a2f54db08ea96df9892315bb773fc203b1dbcea418d20f4c7ad1 Processing artifact [6/176]: ocp-v4.0-art-dev@sha256_e142bf5020f5ca0d1bdda0026bf97f89b72d21a97c9cc2dc71bf85050e822bbf ... Processing artifact [175/176]: ocp-v4.0-art-dev@sha256_16cd7eda26f0fb0fc965a589e1e96ff8577e560fcd14f06b5fda1643036ed6c8 Processing artifact [176/176]: ocp-v4.0-art-dev@sha256_cf4d862b4a4170d4f611b39d06c31c97658e309724f9788e155999ae51e7188f ... Summary: Release: 4.13.0 Hub Version: 2.6.3 ACM Version: 2.6.3 MCE Version: 2.1.4 Include DU Profile: No Workers: 83
검증
모든 이미지가 서버의 대상 폴더에 압축되어 있는지 확인합니다.
$ ls -l /mnt 1- 1
/mnt폴더의 이미지를 사전 캐시하는 것이 좋습니다.
출력 예
-rw-r--r--. 1 root root 136352323 Oct 31 15:19 ocp-v4.0-art-dev@sha256_edec37e7cd8b1611d0031d45e7958361c65e2005f145b471a8108f1b54316c07.tgz -rw-r--r--. 1 root root 156092894 Oct 31 15:33 ocp-v4.0-art-dev@sha256_ee51b062b9c3c9f4fe77bd5b3cc9a3b12355d040119a1434425a824f137c61a9.tgz -rw-r--r--. 1 root root 172297800 Oct 31 15:29 ocp-v4.0-art-dev@sha256_ef23d9057c367a36e4a5c4877d23ee097a731e1186ed28a26c8d21501cd82718.tgz -rw-r--r--. 1 root root 171539614 Oct 31 15:23 ocp-v4.0-art-dev@sha256_f0497bb63ef6834a619d4208be9da459510df697596b891c0c633da144dbb025.tgz -rw-r--r--. 1 root root 160399150 Oct 31 15:20 ocp-v4.0-art-dev@sha256_f0c339da117cde44c9aae8d0bd054bceb6f19fdb191928f6912a703182330ac2.tgz -rw-r--r--. 1 root root 175962005 Oct 31 15:17 ocp-v4.0-art-dev@sha256_f19dd2e80fb41ef31d62bb8c08b339c50d193fdb10fc39cc15b353cbbfeb9b24.tgz -rw-r--r--. 1 root root 174942008 Oct 31 15:33 ocp-v4.0-art-dev@sha256_f1dbb81fa1aa724e96dd2b296b855ff52a565fbef003d08030d63590ae6454df.tgz -rw-r--r--. 1 root root 246693315 Oct 31 15:31 ocp-v4.0-art-dev@sha256_f44dcf2c94e4fd843cbbf9b11128df2ba856cd813786e42e3da1fdfb0f6ddd01.tgz -rw-r--r--. 1 root root 170148293 Oct 31 15:00 ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c.tgz -rw-r--r--. 1 root root 168899617 Oct 31 15:16 ocp-v4.0-art-dev@sha256_f5099b0989120a8d08a963601214b5c5cb23417a707a8624b7eb52ab788a7f75.tgz -rw-r--r--. 1 root root 176592362 Oct 31 15:05 ocp-v4.0-art-dev@sha256_f68c0e6f5e17b0b0f7ab2d4c39559ea89f900751e64b97cb42311a478338d9c3.tgz -rw-r--r--. 1 root root 157937478 Oct 31 15:37 ocp-v4.0-art-dev@sha256_f7ba33a6a9db9cfc4b0ab0f368569e19b9fa08f4c01a0d5f6a243d61ab781bd8.tgz -rw-r--r--. 1 root root 145535253 Oct 31 15:26 ocp-v4.0-art-dev@sha256_f8f098911d670287826e9499806553f7a1dd3e2b5332abbec740008c36e84de5.tgz -rw-r--r--. 1 root root 158048761 Oct 31 15:40 ocp-v4.0-art-dev@sha256_f914228ddbb99120986262168a705903a9f49724ffa958bb4bf12b2ec1d7fb47.tgz -rw-r--r--. 1 root root 167914526 Oct 31 15:37 ocp-v4.0-art-dev@sha256_fa3ca9401c7a9efda0502240aeb8d3ae2d239d38890454f17fe5158b62305010.tgz -rw-r--r--. 1 root root 164432422 Oct 31 15:24 ocp-v4.0-art-dev@sha256_fc4783b446c70df30b3120685254b40ce13ba6a2b0bf8fb1645f116cf6a392f1.tgz -rw-r--r--. 1 root root 306643814 Oct 31 15:11 troubleshoot@sha256_b86b8aea29a818a9c22944fd18243fa0347c7a2bf1ad8864113ff2bb2d8e0726.tgz
17.13.4.4. Operator 이미지 다운로드
5G DU(Radio Access Network) DC(Distributed Unit) 클러스터 구성에서 사용되는 Day-2 Operator를 사전 캐시할 수도 있습니다. Day-2 Operator는 설치된 OpenShift Container Platform 버전에 따라 다릅니다.
--acm-version 및 --mce-version 플래그를 사용하여 RHACM 허브 및 MCE Operator 버전을 포함해야 하므로 equipment-precaching-cli 툴이 RHACM 및 MCE Operator에 적절한 컨테이너 이미지를 미리 캐시할 수 있습니다.
절차
Operator 이미지를 미리 캐시합니다.
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1 -r 4.13.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s 7
출력 예
Generated /mnt/imageset.yaml Generating list of pre-cached artifacts... Processing artifact [1/379]: ocp-v4.0-art-dev@sha256_7753a8d9dd5974be8c90649aadd7c914a3d8a1f1e016774c7ac7c9422e9f9958 Processing artifact [2/379]: ose-kube-rbac-proxy@sha256_c27a7c01e5968aff16b6bb6670423f992d1a1de1a16e7e260d12908d3322431c Processing artifact [3/379]: ocp-v4.0-art-dev@sha256_370e47a14c798ca3f8707a38b28cfc28114f492bb35fe1112e55d1eb51022c99 ... Processing artifact [378/379]: ose-local-storage-operator@sha256_0c81c2b79f79307305e51ce9d3837657cf9ba5866194e464b4d1b299f85034d0 Processing artifact [379/379]: multicluster-operators-channel-rhel8@sha256_c10f6bbb84fe36e05816e873a72188018856ad6aac6cc16271a1b3966f73ceb3 ... Summary: Release: 4.13.0 Hub Version: 2.6.3 ACM Version: 2.6.3 MCE Version: 2.1.4 Include DU Profile: Yes Workers: 83
17.13.4.5. 연결이 끊긴 환경에서 사용자 정의 이미지 사전 캐싱
--generate-imageset 인수는 ImageSetConfiguration CR(사용자 정의 리소스)이 생성된 후 production-precaching-cli 툴을 중지합니다. 이렇게 하면 이미지를 다운로드하기 전에 ImageSetConfiguration CR을 사용자 지정할 수 있습니다. CR을 사용자 지정한 후 --skip-imageset 인수를 사용하여 ImageSetConfiguration CR에 지정한 이미지를 다운로드할 수 있습니다.
다음과 같은 방법으로 ImageSetConfiguration CR을 사용자 지정할 수 있습니다.
- Operator 및 추가 이미지 추가
- Operator 및 추가 이미지 제거
- Operator 및 카탈로그 소스를 로컬 또는 연결이 끊긴 레지스트리로 변경
절차
이미지를 미리 캐시합니다.
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1 -r 4.13.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s \ 7 --generate-imageset 8
- 1
- loading-precaching-cli 툴의 다운로드 기능을 지정합니다.
- 2
- OpenShift Container Platform 릴리스 버전을 정의합니다.
- 3
- RHACM 버전을 정의합니다.
- 4
- MCE 버전을 정의합니다.
- 5
- 디스크의 이미지를 다운로드하려는 폴더를 정의합니다.
- 6
- 선택 사항: 추가 이미지를 저장할 리포지토리를 정의합니다. 이러한 이미지는 다운로드되어 디스크에 사전 캐시됩니다.
- 7
- DU 구성에 포함된 Operator 사전 캐싱을 지정합니다.
- 8
--generate-imageset인수는 CR을 사용자 지정할 수 있는ImageSetConfigurationCR만 생성합니다.
출력 예
Generated /mnt/imageset.yaml
ImageSetConfiguration CR의 예
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration mirror: platform: channels: - name: stable-4.13 minVersion: 4.13.0 1 maxVersion: 4.13.0 additionalImages: - name: quay.io/custom/repository operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.13 packages: - name: advanced-cluster-management 2 channels: - name: 'release-2.6' minVersion: 2.6.3 maxVersion: 2.6.3 - name: multicluster-engine 3 channels: - name: 'stable-2.1' minVersion: 2.1.4 maxVersion: 2.1.4 - name: local-storage-operator 4 channels: - name: 'stable' - name: ptp-operator 5 channels: - name: 'stable' - name: sriov-network-operator 6 channels: - name: 'stable' - name: cluster-logging 7 channels: - name: 'stable' - name: lvms-operator 8 channels: - name: 'stable-4.13' - name: amq7-interconnect-operator 9 channels: - name: '1.10.x' - name: bare-metal-event-relay 10 channels: - name: 'stable' - catalog: registry.redhat.io/redhat/certified-operator-index:v4.13 packages: - name: sriov-fec 11 channels: - name: 'stable'CR에서 카탈로그 리소스를 사용자 지정합니다.
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration mirror: platform: [...] operators: - catalog: eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/certified-operator-index:v4.13 packages: - name: sriov-fec channels: - name: 'stable'로컬 또는 연결이 끊긴 레지스트리를 사용하여 이미지를 다운로드하는 경우 먼저 콘텐츠를 가져오려는 레지스트리의 인증서를 추가해야 합니다.
오류를 방지하려면 레지스트리 인증서를 서버에 복사합니다.
# cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
그런 다음 인증서 신뢰 저장소를 업데이트합니다.
# update-ca-trust
호스트
/etc/pki폴더를 production-cli 이미지에 마운트합니다.# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli download \ 1 -r 4.13.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s \ 7 --skip-imageset 8
- 1
- loading-precaching-cli 툴의 다운로드 기능을 지정합니다.
- 2
- OpenShift Container Platform 릴리스 버전을 정의합니다.
- 3
- RHACM 버전을 정의합니다.
- 4
- MCE 버전을 정의합니다.
- 5
- 디스크의 이미지를 다운로드하려는 폴더를 정의합니다.
- 6
- 선택 사항: 추가 이미지를 저장할 리포지토리를 정의합니다. 이러한 이미지는 다운로드되어 디스크에 사전 캐시됩니다.
- 7
- DU 구성에 포함된 Operator 사전 캐싱을 지정합니다.
- 8
--skip-imageset인수를 사용하면 사용자 지정된ImageSetConfigurationCR에서 지정한 이미지를 다운로드할 수 있습니다.
새
imageSetConfigurationCR을 생성하지 않고 이미지를 다운로드합니다.# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download -r 4.13.0 \ --acm-version 2.6.3 --mce-version 2.1.4 -f /mnt \ --img quay.io/custom/repository \ --du-profile -s \ --skip-imageset
추가 리소스
- 온라인 Red Hat 레지스트리에 액세스하려면 OpenShift 설치 사용자 지정 툴 을 참조하십시오.
- 다중 클러스터 엔진 사용에 대한 자세한 내용은 다중 클러스터 엔진 Operator 를 사용한 클러스터 라이프사이클 정보를 참조하십시오.
17.13.5. GitOps ZTP의 이미지 사전 캐싱
site Config 매니페스트는 OpenShift 클러스터를 설치 및 구성하는 방법을 정의합니다. GitOps Zero 10.0.0.1 Provisioning (ZTP) 프로비저닝 워크플로우에서 factory-precaching-cli 툴에는 SiteConfig 매니페스트의 다음과 같은 추가 필드가 필요합니다.
-
clusters.ignitionConfigOverride -
nodes.installerArgs -
nodes.ignitionConfigOverride
추가 필드가 있는 siteConfig 예
apiVersion: ran.openshift.io/v1
kind: SiteConfig
metadata:
name: "example-5g-lab"
namespace: "example-5g-lab"
spec:
baseDomain: "example.domain.redhat.com"
pullSecretRef:
name: "assisted-deployment-pull-secret"
clusterImageSetNameRef: "img4.9.10-x86-64-appsub"
sshPublicKey: "ssh-rsa ..."
clusters:
- clusterName: "sno-worker-0"
clusterImageSetNameRef: "eko4-img4.11.5-x86-64-appsub"
clusterLabels:
group-du-sno: ""
common-411: true
sites : "example-5g-lab"
vendor: "OpenShift"
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
machineNetwork:
- cidr: 10.19.32.192/26
serviceNetwork:
- 172.30.0.0/16
networkType: "OVNKubernetes"
additionalNTPSources:
- clock.corp.redhat.com
ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-images.service\nBindsTo=precache-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-images.service"},{"name":"precache-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached images in discovery stage\nAfter=var-mnt.mount\nBefore=agent.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ai.sh\n#TimeoutStopSec=30\n\n[Install]\nWantedBy=multi-user.target default.target\nWantedBy=agent.service"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ai.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ai-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0A%23%20workaround%20while%20https%3A%2F%2Fgithub.com%2Fopenshift%2Fassisted-service%2Fpull%2F3546%0A%23cp%20%2Fvar%2Fmnt%2Fmodified-rhcos-4.10.3-x86_64-metal.x86_64.raw.gz%20%2Fvar%2Ftmp%2F.%0A%0Aexit%200"}},{"overwrite":true,"path":"/usr/local/bin/agent-fix-bz1964591","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fusr%2Fbin%2Fsh%0A%0A%23%20This%20script%20is%20a%20workaround%20for%20bugzilla%201964591%20where%20symlinks%20inside%20%2Fvar%2Flib%2Fcontainers%2F%20get%0A%23%20corrupted%20under%20some%20circumstances.%0A%23%0A%23%20In%20order%20to%20let%20agent.service%20start%20correctly%20we%20are%20checking%20here%20whether%20the%20requested%0A%23%20container%20image%20exists%20and%20in%20case%20%22podman%20images%22%20returns%20an%20error%20we%20try%20removing%20the%20faulty%0A%23%20image.%0A%23%0A%23%20In%20such%20a%20scenario%20agent.service%20will%20detect%20the%20image%20is%20not%20present%20and%20pull%20it%20again.%20In%20case%0A%23%20the%20image%20is%20present%20and%20can%20be%20detected%20correctly%2C%20no%20any%20action%20is%20required.%0A%0AIMAGE%3D%24%28echo%20%241%20%7C%20sed%20%27s%2F%3A.%2A%2F%2F%27%29%0Apodman%20image%20exists%20%24IMAGE%20%7C%7C%20echo%20%22already%20loaded%22%20%7C%7C%20echo%20%22need%20to%20be%20pulled%22%0A%23podman%20images%20%7C%20grep%20%24IMAGE%20%7C%7C%20podman%20rmi%20--force%20%241%20%7C%7C%20true"}}]}}'
nodes:
- hostName: "snonode.sno-worker-0.example.domain.redhat.com"
role: "master"
bmcAddress: "idrac-virtualmedia+https://10.19.28.53/redfish/v1/Systems/System.Embedded.1"
bmcCredentialsName:
name: "worker0-bmh-secret"
bootMACAddress: "e4:43:4b:bd:90:46"
bootMode: "UEFI"
rootDeviceHints:
deviceName: /dev/nvme0n1
cpuset: "0-1,40-41"
installerArgs: '["--save-partlabel", "data"]'
ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-ocp-images.service\nBindsTo=precache-ocp-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-ocp-images.service"},{"name":"precache-ocp-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached OCP images into containers storage\nAfter=var-mnt.mount\nBefore=machine-config-daemon-pull.service nodeip-configuration.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ocp.sh\nTimeoutStopSec=60\n\n[Install]\nWantedBy=multi-user.target"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ocp.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ocp-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0Aexit%200"}}]}}'
nodeNetwork:
config:
interfaces:
- name: ens1f0
type: ethernet
state: up
macAddress: "AA:BB:CC:11:22:33"
ipv4:
enabled: true
dhcp: true
ipv6:
enabled: false
interfaces:
- name: "ens1f0"
macAddress: "AA:BB:CC:11:22:33"
17.13.5.1. cluster.ignitionConfigOverride 필드 이해
clusters.ignitionConfigOverride 필드는 GitOps ZTP 검색 단계에서 Ignition 형식의 구성을 추가합니다. 구성에는 가상 미디어에 마운트된 ISO에 systemd 서비스가 포함됩니다. 이렇게 하면 스크립트가 검색 RHCOS 라이브 ISO의 일부이며, Assisted Installer(AI) 이미지를 로드하는 데 사용할 수 있습니다.
systemd서비스-
systemd서비스는var-mnt.mount및precache-images.services입니다.precache-images.service는var-mnt.mount단위로/var/mnt에 마운트할 디스크 파티션에 따라 다릅니다. 서비스는extract-ai.sh라는 스크립트를 호출합니다. extract-ai.sh-
extract-ai.sh스크립트는 디스크 파티션에서 로컬 컨테이너 스토리지로 필요한 이미지를 추출하고 로드합니다. 스크립트가 완료되면 이미지를 로컬에서 사용할 수 있습니다. agent-fix-bz1964591-
agent-fix-bz1964591스크립트는 AI 문제에 대한 해결 방법입니다. AI가 이미지를 제거하지 못하도록agent.service가 레지스트리에서 이미지를 다시 가져오도록 하려면agent-fix-bz1964591스크립트에서 요청된 컨테이너 이미지가 존재하는지 확인합니다.
17.13.5.2. nodes.installerArgs 필드 이해
nodes.installerArgs 필드를 사용하면 coreos-installer 유틸리티에서 RHCOS 라이브 ISO를 디스크에 쓰는 방법을 구성할 수 있습니다. OpenShift Container Platform 설치 단계에서 데이터 파티션에 저장된 아티팩트가 필요하므로 데이터로 레이블이 지정된 디스크 파티션을 저장하도록 지정해야 합니다.
추가 매개변수는 라이브 RHCOS를 디스크에 쓰는 coreos-installer 유틸리티로 직접 전달됩니다. 다음 재부팅 시 운영 체제는 디스크에서 시작됩니다.
coreos-installer 유틸리티에 여러 옵션을 전달할 수 있습니다.
OPTIONS:
...
-u, --image-url <URL>
Manually specify the image URL
-f, --image-file <path>
Manually specify a local image file
-i, --ignition-file <path>
Embed an Ignition config from a file
-I, --ignition-url <URL>
Embed an Ignition config from a URL
...
--save-partlabel <lx>...
Save partitions with this label glob
--save-partindex <id>...
Save partitions with this number or range
...
--insecure-ignition
Allow Ignition URL without HTTPS or hash17.13.5.3. nodes.ignitionConfigOverride 필드 이해
cluster .ignitionConfigOverride 와 유사하게 nodes.ignitionConfigOverride 필드를 사용하면 coreos-installer 유틸리티에 Ignition 형식의 구성을 추가할 수 있지만 OpenShift Container Platform 설치 단계에서 RHCOS가 디스크에 기록되면 GitOps ZTP 검색 ISO에 포함된 추가 구성을 더 이상 사용할 수 없습니다. 검색 단계에서 추가 구성이 라이브 OS의 메모리에 저장됩니다.
이 단계에서 추출 및 로드된 컨테이너 이미지 수는 검색 단계보다 많습니다. OpenShift Container Platform 릴리스 및 Day-2 Operator 설치 여부에 따라 설치 시간이 다를 수 있습니다.
설치 단계에서 var-mnt.mount 및 precache-ocp.services systemd 서비스가 사용됩니다.
precache-ocp.serviceprecache-ocp.service는var-mnt.mount단위로/var/mnt에 마운트할 디스크 파티션에 따라 다릅니다.precache-ocp.service서비스는extract-ocp.sh이라는 스크립트를 호출합니다.중요OpenShift Container Platform 설치 전에 모든 이미지를 추출하려면
machine-config-daemon-pull.service및nodeip-configuration.service서비스를 실행하기 전에precache-ocp.service를 실행해야 합니다.extract-ocp.sh-
extract-ocp.sh스크립트는 디스크 파티션에서 로컬 컨테이너 스토리지로 필요한 이미지를 추출하고 로드합니다. 스크립트가 완료되면 이미지를 로컬에서 사용할 수 있습니다.
Argo CD가 모니터링하는 Git 리포지터리에 site Config 및 선택적 PolicyGenTemplates 사용자 정의 리소스(CR)를 업로드할 때 hub 클러스터와 CR을 동기화하여 GitOps ZTP 워크플로를 시작할 수 있습니다.
17.13.6. 문제 해결
17.13.6.1. 렌더링된 카탈로그가 잘못됨
로컬 또는 연결이 끊긴 레지스트리를 사용하여 이미지를 다운로드하면 렌더링된 카탈로그가 유효하지 않은 것으로 표시될 수 있습니다. 즉, 콘텐츠를 가져올 새 레지스트리의 인증서가 누락되어 있습니다.
history-precaching-cli 툴 이미지는 UBI RHEL 이미지를 기반으로 빌드됩니다. 인증서 경로와 위치는 RHCOS에서 동일합니다.
오류 예
Generating list of pre-cached artifacts... error: unable to run command oc-mirror -c /mnt/imageset.yaml file:///tmp/fp-cli-3218002584/mirror --ignore-history --dry-run: Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/publish Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/v2 Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/charts Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/release-signatures backend is not configured in /mnt/imageset.yaml, using stateless mode backend is not configured in /mnt/imageset.yaml, using stateless mode No metadata detected, creating new workspace level=info msg=trying next host error=failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority host=eko4.cloud.lab.eng.bos.redhat.com:8443 The rendered catalog is invalid. Run "oc-mirror list operators --catalog CATALOG-NAME --package PACKAGE-NAME" for more information. error: error rendering new refs: render reference "eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/redhat-operator-index:v4.11": error resolving name : failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority
절차
레지스트리 인증서를 서버에 복사합니다.
# cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
인증서 신뢰 저장소를 업데이트합니다.
# update-ca-trust
호스트
/etc/pki폴더를 production-cli 이미지에 마운트합니다.# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged -it --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli download -r 4.13.0 --acm-version 2.5.4 \ --mce-version 2.0.4 -f /mnt \--img quay.io/custom/repository --du-profile -s --skip-imageset