콘텐츠로 이동

OpenShift 커널 파라미터 설정

NPU 노드의 커널 부트 파라미터를 MachineConfig로 관리합니다. 아래 목록은 명시된 하드웨어에서 검증한 설정입니다.

대상 하드웨어

프로파일 서버 CPU NPU 검증 드라이버
amd-smci-cr13 Supermicro AS-5126GS-TNRT2 AMD RBLN-CR13 3.5.1
프로파일 서버 CPU NPU 검증 드라이버
amd-smci-ca25 Supermicro AMD RBLN-CA22, RBLN-CA25 3.4.1
amd-gigabyte-ca25 Gigabyte G494-ZB4-AAP2, G294-Z21-AAP2 AMD RBLN-CA22, RBLN-CA25 3.4.1

커널 파라미터

파라미터 의미 적용 대상
transparent_hugepage=madvise 애플리케이션이 요청한 메모리 영역에 THP 적용 전체
pcie_aspm=force PCIe Active State Power Management 강제 활성화 전체
pci=pcie_bus_perf PCIe 버스 성능 설정 전체
pci=bfsort PCI 장치를 너비 우선 순서로 정렬 전체
파라미터 의미 적용 대상
transparent_hugepage=madvise 애플리케이션이 요청한 메모리 영역에 THP 적용 전체
pcie_aspm=force PCIe Active State Power Management 강제 활성화 전체
pci=pcie_bus_perf PCIe 버스 성능 설정 전체
pci=bfsort PCI 장치를 너비 우선 순서로 정렬 전체
iommu.strict=1 DMA 매핑 해제 시 IOMMU 변환 캐시를 즉시 갱신 전체

적용 전 확인

cluster-admin 권한과 oc가 필요합니다. 하드웨어와 현재 설정을 확인하고 대상 노드의 /proc/cmdline을 보관합니다.

1
2
3
4
5
6
7
oc get nodes
oc get mcp
oc debug node/<NODE_NAME> -- chroot /host dmidecode -s system-manufacturer
oc debug node/<NODE_NAME> -- chroot /host dmidecode -s system-product-name
oc debug node/<NODE_NAME> -- chroot /host lscpu
oc debug node/<NODE_NAME> -- chroot /host lspci -d 1eff: -n
oc debug node/<NODE_NAME> -- chroot /host cat /proc/cmdline

PCI 장치 ID로 카드를 구분합니다. 같은 서버라도 NPU 모델에 따라 프로파일을 선택해야 합니다.

RBLN-CR13의 PCI 장치 ID는 2130입니다.

RBLN-CA22의 PCI 장치 ID는 1220이고, RBLN-CA25는 1250입니다. 두 카드는 같은 ATOM™ 프로파일을 사용합니다.

적용 범위 설정

flowchart LR
    MC["MachineConfig"] -->|"machineConfigSelector"| MCP["MachineConfigPool"]
    MCP -->|"nodeSelector"| N["대상 노드"]

일부 워커에만 적용하려면 전용 MCP를 사용합니다. 클러스터에 두 제품군 노드가 함께 있다면 파라미터가 다르므로 풀을 분리합니다.

대상 노드 재부팅

커널 파라미터를 적용하거나 제거하면 MCO가 대상 노드를 drain하고 재부팅합니다. MachineConfig의 role을 worker로 설정하면 기본 worker 설정을 상속하는 풀까지 영향을 받을 수 있습니다. 작업 전에 대상 MCP와 노드 수를 확인해야 합니다.

커스텀 MachineConfigPool 생성

아래 파일을 npu-mcp.yaml로 저장합니다. __MCP_NAME__은 선택한 프로파일 이름으로 모두 바꿉니다. worker 설정을 상속하도록 유지하고, 대상 노드가 다른 커스텀 MCP에도 선택되지 않는지 확인합니다.

npu-mcp.yaml
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
metadata:
  name: __MCP_NAME__
spec:
  machineConfigSelector:
    matchExpressions:
      - key: machineconfiguration.openshift.io/role
        operator: In
        values:
          - worker
          - __MCP_NAME__
  nodeSelector:
    matchLabels:
      node-role.kubernetes.io/__MCP_NAME__: ""
1
2
3
oc apply -f npu-mcp.yaml
oc label node <NODE_NAME> node-role.kubernetes.io/__MCP_NAME__=""
oc get mcp __MCP_NAME__

MACHINECOUNT가 대상 노드 수와 같고 풀이 정상인지 확인합니다. NFD 자동 식별을 사용하면 위 role 라벨 대신 다음 절의 프로파일 선택자를 사용합니다.

(선택) NFD NodeFeatureRule을 활용한 자동 식별

NFD v0.16+에서는 system.dmiid.sys_vendor, cpu.model.vendor_id, pci.device feature를 NodeFeatureRule 하나에 묶어 프로파일 라벨을 자동으로 부여할 수 있습니다. 이 규칙을 적용하면 새로 추가된 노드에도 프로파일 라벨이 부여되어 해당 MCP에 포함됩니다.

Note

system.dmiid는 NFD 내장 feature이지만, 자동으로 라벨이 생성되지는 않습니다. 반드시 NodeFeatureRule을 작성해야 합니다.

NFD 기본 라벨 네임스페이스 밖의 라벨은 nfd-master에서 --extra-label-ns=rebellions.io로 허용하지 않으면 무시됩니다.

NodeFeatureRule 생성

각 규칙은 matchFeatures에 나열한 조건을 모두 만족하는 노드에만 라벨을 붙입니다. 서버 벤더와 CPU 벤더만으로는 같은 서버에서 두 제품군을 구분할 수 없으므로, pci.device의 장치 ID로 카드까지 구분합니다. 클러스터에 두 제품군 노드가 함께 있다면 두 탭의 규칙을 NodeFeatureRule 하나에 함께 넣습니다.

apiVersion: nfd.k8s-sigs.io/v1alpha1
kind: NodeFeatureRule
metadata:
  name: rbln-hardware-detection
spec:
  rules:
    - name: "amd-smci-cr13"
      labels:
        rebellions.io/profile: "amd-smci-cr13"
      matchFeatures:
        - feature: system.dmiid
          matchExpressions:
            sys_vendor: {op: In, value: ["Supermicro"]}
        - feature: cpu.model
          matchExpressions:
            vendor_id: {op: In, value: ["AMD"]}
        - feature: pci.device
          matchExpressions:
            vendor: {op: In, value: ["1eff"]}
            device: {op: In, value: ["2130"]}
apiVersion: nfd.k8s-sigs.io/v1alpha1
kind: NodeFeatureRule
metadata:
  name: rbln-hardware-detection
spec:
  rules:
    - name: "amd-smci-ca25"
      labels:
        rebellions.io/profile: "amd-smci-ca25"
      matchFeatures:
        - feature: system.dmiid
          matchExpressions:
            sys_vendor: {op: In, value: ["Supermicro"]}
        - feature: cpu.model
          matchExpressions:
            vendor_id: {op: In, value: ["AMD"]}
        - feature: pci.device
          matchExpressions:
            vendor: {op: In, value: ["1eff"]}
            device: {op: NotIn, value: ["2130"]}
    - name: "amd-gigabyte-ca25"
      labels:
        rebellions.io/profile: "amd-gigabyte-ca25"
      matchFeatures:
        - feature: system.dmiid
          matchExpressions:
            sys_vendor: {op: In, value: ["Giga Computing"]}
        - feature: cpu.model
          matchExpressions:
            vendor_id: {op: In, value: ["AMD"]}
        - feature: pci.device
          matchExpressions:
            vendor: {op: In, value: ["1eff"]}
            device: {op: NotIn, value: ["2130"]}
oc apply -f <NFR_YAML_FILE>

라벨 확인

적용 후 대상 노드에 프로파일 라벨이 부여되었는지 확인합니다:

oc get node <NODE_NAME> -o jsonpath='{.metadata.labels}' | python3 -m json.tool | grep rebellions.io/profile

Supermicro AMD 노드의 기대 출력:

"rebellions.io/profile": "amd-smci-cr13",

Supermicro AMD 노드의 기대 출력:

"rebellions.io/profile": "amd-smci-ca25",

Gigabyte AMD 노드에는 amd-gigabyte-ca25가 부여됩니다.

CPU 벤더는 NFD가 NodeFeatureRule 없이도 부여하는 내장 라벨 feature.node.kubernetes.io/cpu-model.vendor_id=AMD로 미리 확인할 수 있습니다.

NFD 라벨을 MCP nodeSelector에 활용

NFD가 프로파일 라벨을 붙이고 나면 수동 라벨링 없이 MCP의 nodeSelector에서 직접 활용할 수 있습니다. 커스텀 MachineConfigPool 생성의 MCP YAML에서 nodeSelector를 아래와 같이 변경합니다.

1
2
3
  nodeSelector:
    matchLabels:
      rebellions.io/profile: __MCP_NAME__

MachineConfig 선택

해당 프로파일의 매니페스트 하나만 npu-kargs.yaml로 저장합니다. __MCP_NAME__을 대상 MCP 이름으로 바꿉니다. 같은 풀에 중복 파라미터를 정의하면 커널 명령줄에도 중복해서 추가됩니다.

Supermicro AMD + RBLN-CR13

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  name: 99-grub-kargs-amd-smci-cr13
  labels:
    machineconfiguration.openshift.io/role: __MCP_NAME__
    rebellions.io/component: grub-kargs
    rebellions.io/profile: amd-smci-cr13
    rebellions.io/cpu-vendor: amd
    rebellions.io/server-vendor: supermicro
    rebellions.io/accelerator: cr13
spec:
  kernelArguments:
    - transparent_hugepage=madvise
    - pcie_aspm=force
    - pci=pcie_bus_perf
    - pci=bfsort

Supermicro AMD + RBLN-CA22, RBLN-CA25

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  name: 99-grub-kargs-amd-smci-ca25
  labels:
    machineconfiguration.openshift.io/role: __MCP_NAME__
    rebellions.io/component: grub-kargs
    rebellions.io/profile: amd-smci-ca25
    rebellions.io/cpu-vendor: amd
    rebellions.io/server-vendor: supermicro
    rebellions.io/accelerator: ca25
spec:
  kernelArguments:
    - transparent_hugepage=madvise
    - pcie_aspm=force
    - pci=pcie_bus_perf
    - pci=bfsort
    - iommu.strict=1

Gigabyte AMD + RBLN-CA22, RBLN-CA25

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  name: 99-grub-kargs-amd-gigabyte-ca25
  labels:
    machineconfiguration.openshift.io/role: __MCP_NAME__
    rebellions.io/component: grub-kargs
    rebellions.io/profile: amd-gigabyte-ca25
    rebellions.io/cpu-vendor: amd
    rebellions.io/server-vendor: gigabyte
    rebellions.io/accelerator: ca25
spec:
  kernelArguments:
    - transparent_hugepage=madvise
    - pcie_aspm=force
    - pci=pcie_bus_perf
    - pci=bfsort
    - iommu.strict=1

적용과 확인

oc apply -f npu-kargs.yaml
oc get mcp __MCP_NAME__ -w
출력 예시
$ oc get mcp __MCP_NAME__ \
>   -o 'custom-columns=NAME:.metadata.name,UPDATED:.status.conditions[?(@.type=="Updated")].status,UPDATING:.status.conditions[?(@.type=="Updating")].status,DEGRADED:.status.conditions[?(@.type=="Degraded")].status'
NAME            UPDATED   UPDATING   DEGRADED
amd-smci-ca25   True      False      False

UPDATED=True, UPDATING=False, DEGRADED=False가 되면 대상 노드에서 확인합니다.

oc debug node/<NODE_NAME> -- chroot /host cat /proc/cmdline
출력 예시 (결과 행)
$ oc debug node/<NODE_NAME> -- chroot /host cat /sys/kernel/mm/transparent_hugepage/enabled
...
always [madvise] never

선택한 프로파일의 파라미터가 모두 있고 THP 출력에서 [madvise]가 선택되어야 합니다.

롤백

이 페이지에서 추가한 MachineConfig를 삭제하고 MCP 롤아웃이 끝날 때까지 기다립니다.

oc delete -f npu-kargs.yaml
oc get mcp __MCP_NAME__ -w

풀이 정상으로 돌아오면 /proc/cmdline을 적용 전 값과 비교합니다. 다른 MachineConfig에서 같은 파라미터를 지정했다면 해당 값은 유지됩니다.

다른 MachineConfig가 해당 풀을 사용하지 않을 때만 MCP를 제거해야 합니다. 순서는 노드 라벨 해제 → worker 풀로 복귀하고 적용 완료 → MCP 삭제입니다. NFD로 선택한 노드는 프로파일 라벨 생성 규칙도 확인해야 합니다.

oc label node <NODE_NAME> node-role.kubernetes.io/__MCP_NAME__-
oc get mcp worker __MCP_NAME__ -w

노드 이동과 설정 적용이 완료된 뒤 실행합니다.

oc delete mcp __MCP_NAME__

적용이 완료되지 않는 경우

1
2
3
oc describe mcp __MCP_NAME__
oc describe node <NODE_NAME>
oc get pods -n openshift-machine-config-operator -o wide

MCP의 상태 메시지와 해당 노드의 Machine Config Daemon 로그를 확인합니다. 노드 선택자, 중복된 커스텀 MCP, drain을 막는 워크로드, 누락된 MachineConfig를 우선 확인합니다. 노드의 currentConfig나 desiredConfig 어노테이션을 수동으로 바꾸면 실제 적용 상태와 달라질 수 있습니다.

MCO 설정과 복구는 Red Hat MachineConfig 문서에서 확인할 수 있습니다.