32.2. MetalLB Operator 설치

클러스터 관리자는 Operator가 클러스터에서 MetalLB 인스턴스의 라이프사이클을 관리할 수 있도록 MetallB Operator를 추가할 수 있습니다.

MetalLB 및 IP 페일오버가 호환되지 않습니다. 클러스터에 대한 IP 페일오버를 구성한 경우 Operator를 설치하기 전에 IP 페일오버를 제거하는 단계를 수행합니다.

32.2.1. 웹 콘솔을 사용하여 OperatorHub에서 MetalLB Operator 설치

클러스터 관리자는 OpenShift Container Platform 웹 콘솔을 사용하여 MetalLB Operator를 설치할 수 있습니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 로그인합니다.

절차

  1. OpenShift Container Platform 웹 콘솔에서 OperatorOperatorHub 로 이동합니다.
  2. MetalLB Operator를 검색한 다음 설치를 클릭합니다.
  3. Operator 설치 페이지에서 기본값을 적용하고 설치를 클릭합니다.

검증

  1. 설치에 성공했는지 확인하려면 다음을 수행하십시오.

    1. Operator → 설치된 Operator 페이지로 이동합니다.
    2. Operator가 openshift-operators 네임스페이스에 설치되어 있고 해당 상태가 Succeeded 인지 확인합니다.
  2. Operator가 성공적으로 설치되지 않은 경우 Operator의 상태를 확인하고 로그를 확인합니다.

    1. Operator → 설치된 Operator 페이지로 이동하여 Status 열에 오류 또는 실패가 있는지 검사합니다.
    2. 워크로드Pod 페이지로 이동하여 openshift-operators 프로젝트에서 문제를 보고하는 Pod의 로그를 확인합니다.

32.2.2. CLI를 사용하여 OperatorHub에서 설치

OpenShift Container Platform 웹 콘솔을 사용하는 대신 CLI를 사용하여 OperatorHub에서 Operator를 설치할 수 있습니다. OpenShift CLI(oc)를 사용하여 MetalLB Operator를 설치할 수 있습니다.

CLI를 사용할 때는 metallb-system 네임스페이스에 Operator를 설치하는 것이 좋습니다.

사전 요구 사항

  • 클러스터가 베어 메탈 하드웨어에 설치되어 있어야 합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.

절차

  1. 다음 명령을 입력하여 MetalLB Operator의 네임스페이스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: metallb-system
    EOF
  2. 네임스페이스에서 Operator group CR(사용자 정의 리소스)을 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: metallb-operator
      namespace: metallb-system
    EOF
  3. Operator group이 네임스페이스에 설치되어 있는지 확인합니다.

    $ oc get operatorgroup -n metallb-system

    출력 예

    NAME               AGE
    metallb-operator   14m

  4. 서브스크립션 CR을 생성합니다.

    1. Subscription CR을 정의하고 YAML 파일을 저장합니다(예: metallb-sub.yaml ).

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: metallb-operator-sub
        namespace: metallb-system
      spec:
        channel: stable
        name: metallb-operator
        source: redhat-operators 1
        sourceNamespace: openshift-marketplace
      1
      redhat-operators 값을 지정해야 합니다.
    2. 서브스크립션 CR을 생성하려면 다음 명령을 실행합니다.

      $ oc create -f metallb-sub.yaml
  5. 선택 사항: Prometheus에 BGP 및 BFD 지표가 표시되는지 확인하려면 다음 명령과 같이 네임스페이스에 라벨을 지정할 수 있습니다.

    $ oc label ns metallb-system "openshift.io/cluster-monitoring=true"

검증

확인 단계에서는 MetalLB Operator가 metallb-system 네임스페이스에 설치되어 있다고 가정합니다.

  1. 설치 계획이 네임스페이스에 있는지 확인합니다.

    $ oc get installplan -n metallb-system

    출력 예

    NAME            CSV                                   APPROVAL    APPROVED
    install-wzg94   metallb-operator.4.12.0-nnnnnnnnnnnn   Automatic   true

    참고

    Operator를 설치하는 데 몇 초가 걸릴 수 있습니다.

  2. Operator가 설치되었는지 확인하려면 다음 명령을 입력합니다.

    $ oc get clusterserviceversion -n metallb-system \
      -o custom-columns=Name:.metadata.name,Phase:.status.phase

    출력 예

    Name                                  Phase
    metallb-operator.4.12.0-nnnnnnnnnnnn   Succeeded

32.2.3. 클러스터에서 MetalLB 시작

Operator를 설치한 후 MetalLB 사용자 정의 리소스의 단일 인스턴스를 구성해야 합니다. 사용자 정의 리소스를 구성한 후 Operator는 클러스터에서 MetalLB를 시작합니다.

사전 요구 사항

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

절차

이 절차에서는 MetalLB Operator가 metallb-system 네임스페이스에 설치되어 있다고 가정합니다. 웹 콘솔을 사용하여 설치한 경우 네임스페이스의 openshift-operators 를 대체합니다.

  1. MetalLB 사용자 지정 리소스의 단일 인스턴스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    EOF

검증

MetalLB 컨트롤러 및 MetalLB 발표자의 데몬 세트가 실행 중인지 확인합니다.

  1. 컨트롤러의 배포가 실행 중인지 확인합니다.

    $ oc get deployment -n metallb-system controller

    출력 예

    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    controller   1/1     1            1           11m

  2. speaker의 데몬 세트가 실행 중인지 확인합니다.

    $ oc get daemonset -n metallb-system speaker

    출력 예

    NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    speaker   6         6         6       6            6           kubernetes.io/os=linux   18m

    예제 출력은 6개의 발표자 pod를 나타냅니다. 클러스터의 발표자 Pod 수는 예제 출력과 다를 수 있습니다. 출력에 클러스터의 각 노드에 하나의 pod가 표시되는지 확인합니다.

32.2.4. MetalLB 배포 사양

MetalLB 사용자 정의 리소스를 사용하여 MetalLB 인스턴스를 시작하는 경우 MetalLB 사용자 지정 리소스에서 배포 사양을 구성하여 컨트롤러 또는 발표자 Pod가 클러스터에서 배포 및 실행되는 방법을 관리할 수 있습니다. 이러한 배포 사양을 사용하여 다음 작업을 관리합니다.

  • MetalLB Pod 배포의 노드를 선택합니다.
  • Pod 우선순위 및 Pod 유사성을 사용하여 예약을 관리합니다.
  • MetalLB Pod에 대한 CPU 제한을 할당합니다.
  • MetalLB Pod에 대해 container RuntimeClass를 할당합니다.
  • MetalLB Pod에 대한 메타데이터를 할당합니다.

32.2.4.1. 발표자 Pod를 특정 노드로 제한

기본적으로 MetalLB Operator를 사용하여 MetalLB를 시작하면 Operator는 클러스터의 각 노드에서 발표 Pod 인스턴스를 시작합니다. 발표자 Pod가 있는 노드만 로드 밸런서 IP 주소를 알릴 수 있습니다. 노드 선택기를 사용하여 MetalLB 사용자 정의 리소스를 구성하여 발표자 Pod를 실행하는 노드를 지정할 수 있습니다.

발표자 Pod를 특정 노드로 제한하는 가장 일반적인 이유는 특정 네트워크에서 네트워크 인터페이스가 있는 노드만 로드 밸런서 IP 주소를 알리는 것입니다. 실행중인 speaker Pod가 있는 노드만 로드 밸런서 IP 주소의 대상으로 알려집니다.

발표자 Pod를 특정 노드로 제한하고 서비스의 외부 트래픽 정책에 대한 local 을 지정하는 경우 서비스의 애플리케이션 Pod가 동일한 노드에 배포되었는지 확인해야 합니다.

speaker Pod를 작업자 노드로 제한하기 위한 구성의 예

apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
  name: metallb
  namespace: metallb-system
spec:
  nodeSelector:  <.>
    node-role.kubernetes.io/worker: ""
  speakerTolerations:   <.>
  - key: "Example"
    operator: "Exists"
    effect: "NoExecute"

<.> 예제 구성은 발표자 Pod를 작업자 노드에 할당하도록 지정하지만, 노드 또는 유효한 노드 선택기에 할당한 라벨을 지정할 수 있습니다. 이 예제 구성에서 Operator 를 사용하여 값과 effect 값과 일치하는 테인트를 허용하도록 이 허용 오차가 연결된 Pod를 허용할 수 있습니다.

spec.nodeSelector 필드를 사용하여 매니페스트를 적용한 후 oc get daemonset -n metallb-system speaker 명령으로 Operator가 배포한 Pod 수를 확인할 수 있습니다. 마찬가지로 oc get nodes -l node-role.kubernetes.io/worker= 와 같은 명령을 사용하여 라벨과 일치하는 노드를 표시할 수 있습니다.

선택 옵션으로 노드에서 선호도 규칙을 사용하여 예약해야 하는 발표자 Pod를 제어하도록 허용할 수 있습니다. 허용 오차 목록을 적용하여 이러한 Pod를 제한할 수도 있습니다. 유사성 규칙, 테인트 및 허용 오차에 대한 자세한 내용은 추가 리소스를 참조하십시오.

32.2.4.2. MetalLB 배포에서 Pod 우선순위 및 Pod 유사성 구성

MetalLB 사용자 정의 리소스를 구성하여 컨트롤러발표자 Pod에 Pod 우선순위 및 Pod 유사성 규칙을 선택적으로 할당할 수 있습니다. Pod 우선순위는 노드에서 Pod의 상대적 중요성을 나타내며 이 우선 순위에 따라 Pod를 예약합니다. 컨트롤러 또는 발표자 Pod에서 높은 우선 순위를 설정하여 노드의 다른 Pod보다 우선 순위를 지정합니다.

Pod 유사성은 Pod 간 관계를 관리합니다. 컨트롤러 또는 발표자 Pod에 Pod 유사성을 할당하여 스케줄러가 Pod 관계 컨텍스트에 Pod를 배치하는 노드를 제어합니다. 예를 들어 동일한 노드에서 논리적으로 관련된 Pod를 허용하거나 워크로드가 충돌하는 Pod가 별도의 노드에 있는지 확인할 수 있습니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 로그인했습니다.
  • MetalLB Operator가 설치되어 있습니다.

절차

  1. my PriorityClass.yaml 과 같은 PriorityClass 사용자 정의 리소스를 생성하여 우선 순위 수준을 구성합니다. 이 예에서는 우선순위가 높은 클래스를 사용합니다.

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
  2. PriorityClass 사용자 정의 리소스 구성을 적용합니다.

    $ oc apply -f myPriorityClass.yaml
  3. MetalLB PodConfig.yaml 과 같은 MetalLB 사용자 정의 리소스를 생성하여 priorityClassNamepodAffinity 값을 지정합니다.

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        priorityClassName: high-priority
        runtimeClassName: myclass
      speakerConfig:
        priorityClassName: high-priority
        runtimeClassName: myclass
      affinity:
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                 app: metallb
              topologyKey: kubernetes.io/hostname
  4. MetalLB 사용자 정의 리소스 구성을 적용합니다.

    $ oc apply -f MetalLBPodConfig.yaml

검증

  • 네임스페이스의 Pod에 할당한 우선순위 클래스를 보려면 다음 명령을 실행하여 < namespace >를 대상 네임스페이스로 교체합니다.

    $ oc get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
  • 스케줄러가 Pod 유사성 규칙에 따라 Pod를 배치했는지 확인하려면 다음 명령을 실행하여 < namespace >를 대상 네임스페이스로 교체하여 Pod 노드의 메타데이터를 확인합니다.

    $ oc get pod -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -n <namespace>

32.2.4.3. MetalLB 배포에서 Pod CPU 제한 구성

MetalLB 사용자 정의 리소스를 구성하여 컨트롤러발표자 Pod에 Pod CPU 제한을 선택적으로 할당할 수 있습니다. 컨트롤러 또는 발표자 Pod에 대한 CPU 제한을 정의하면 노드에서 컴퓨팅 리소스를 관리하는 데 도움이 됩니다. 이렇게 하면 노드의 모든 Pod에 워크로드 및 클러스터 하우스키핑을 관리하는 데 필요한 컴퓨팅 리소스가 있습니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 로그인했습니다.
  • MetalLB Operator가 설치되어 있습니다.

절차

  1. CPULimits.yaml 과 같은 MetalLB 사용자 정의 리소스 파일을 생성하여 컨트롤러발표자 Pod의 cpu 값을 지정합니다.

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        resources:
          limits:
            cpu: "200m"
      speakerConfig:
        resources:
          limits:
            cpu: "300m"
  2. MetalLB 사용자 정의 리소스 구성을 적용합니다.

    $ oc apply -f CPULimits.yaml

검증

  • Pod의 컴퓨팅 리소스를 보려면 다음 명령을 실행하여 < pod_name >을 대상 Pod로 교체합니다.

    $ oc describe pod <pod_name>

32.2.4.4. MetalLB 배포에서 컨테이너 런타임 클래스 구성

MetalLB 사용자 정의 리소스를 구성하여 컨트롤러발표자 Pod에 컨테이너 런타임 클래스를 선택적으로 할당할 수 있습니다. 예를 들어 Windows 워크로드의 경우 Pod의 모든 컨테이너에 이 런타임 클래스를 사용하는 Pod에 Windows 런타임 클래스를 할당할 수 있습니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 로그인했습니다.
  • MetalLB Operator가 설치되어 있습니다.

절차

  1. runtime 클래스를 정의하려면 myRuntimeClass.yaml 과 같은 RuntimeClass 사용자 정의 리소스를 생성합니다.

    apiVersion: node.k8s.io/v1
    kind: RuntimeClass
    metadata:
      name: myclass
    handler: myconfiguration
  2. RuntimeClass 사용자 정의 리소스 구성을 적용합니다.

    $ oc apply -f myRuntimeClass.yaml
  3. MetalLB Runtime.yaml 과 같은 MetalLB 사용자 정의 리소스를 생성하여 runtimeClassName 값을 지정합니다.

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        runtimeClassName: myclass
        annotations: 1
          controller: demo
      speakerConfig:
        runtimeClassName: myclass
        annotations: 2
          speaker: demo
    1 2
    이 예제에서는 주석을 사용하여 빌드 릴리스 정보 또는 GitHub 가져오기 요청 정보와 같은 메타데이터를 추가합니다. 레이블에서 허용되지 않은 문자로 주석을 채울 수 있습니다. 그러나 주석을 사용하여 오브젝트를 식별하거나 선택할 수 없습니다.
  4. MetalLB 사용자 정의 리소스 구성을 적용합니다.

    $ oc apply -f MetalLBRuntime.yaml

검증

  • Pod의 컨테이너 런타임을 보려면 다음 명령을 실행합니다.

    $ oc get pod -o custom-columns=NAME:metadata.name,STATUS:.status.phase,RUNTIME_CLASS:.spec.runtimeClassName

32.2.5. 추가 리소스

32.2.6. 다음 단계