33.2. 安装 MetalLB Operator

作为集群管理员,您可以添加 MetallB Operator,以便 Operator 可以管理集群中的 MetalLB 实例的生命周期。

MetalLB 和 IP 故障转移不兼容。如果您为集群配置了 IP 故障切换,请在安装 Operator 前执行删除 IP 故障切换的步骤。

33.2.1. 使用 Web 控制台从 OperatorHub 安装 MetalLB Operator

作为集群管理员,您可以使用 OpenShift Container Platform Web 控制台安装 MetalLB Operator。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录。

流程

  1. 在 OpenShift Container Platform Web 控制台中进入至 OperatorsOperatorHub
  2. Filter by keyword 框中输入关键字,或滚动以查找您想要的 Operator。例如,键入 metallb 来查找 MetalLB Operator。

    您还可以根据 基础架构功能过滤选项。例如,如果您希望 Operator 在断开连接的环境中工作,请选择 Disconnected

  3. Install Operator 页面中,接受默认值并点 Install

验证

  1. 确认安装成功:

    1. 进入到 OperatorsInstalled Operators 页面。
    2. 检查 Operator 是否安装在 openshift-operators 命名空间中,其状态是否为 Succeeded
  2. 如果 Operator 没有成功安装,请检查 Operator 的状态并查看日志:

    1. 进入到 OperatorsInstalled Operators 页面,并检查 Status 列中是否有任何错误或故障。
    2. 进入到 WorkloadsPods 页面,检查 openshift-operators 项目中报告问题的 pod 的日志。

33.2.2. 使用 CLI 从 OperatorHub 安装

您可以使用 CLI 从 OperatorHub 安装 Operator,而不必使用 OpenShift Container Platform Web 控制台。您可以使用 OpenShift CLI (oc) 安装 MetalLB Operator。

建议您使用在 metallb-system 命名空间中安装 Operator 的 CLI 时。

先决条件

  • 在裸机硬件上安装的集群。
  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 权限的用户身份登录。

流程

  1. 输入以下命令为 MetalLB Operator 创建命名空间:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: metallb-system
    EOF
  2. 在命名空间中创建 Operator 组自定义资源(CR):

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: metallb-operator
      namespace: metallb-system
    EOF
  3. 确认 Operator 组已安装在命名空间中:

    $ oc get operatorgroup -n metallb-system

    输出示例

    NAME               AGE
    metallb-operator   14m

  4. 创建一个 Subscription 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. 要创建 Subscription CR,请运行以下命令:

      $ oc create -f metallb-sub.yaml
  5. 可选: 要确保 BGP 和 BFD 指标出现在 Prometheus 中,您可以使用以下命令标记命名空间:

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

验证

验证步骤假定 metallb-system 命名空间中安装了 MetalLB Operator。

  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

33.2.3. 在集群中启动 MetalLB

安装 Operator 后,您需要配置 MetalLB 自定义资源的单一实例。配置自定义资源后,Operator 会在集群中启动 MetalLB。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 权限的用户身份登录。
  • 安装 MetalLB Operator。

流程

此流程假设 MetalLB Operator 已安装在 metallb-system 命名空间中。如果使用 Web 控制台安装,请替换命名空间的 openshift-operators

  1. 创建 MetalLB 自定义资源的单一实例:

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

验证

确认 MetalLB 控制器的部署和 MetalLB speaker 的守护进程集正在运行。

  1. 验证控制器的部署是否正在运行:

    $ oc get deployment -n metallb-system controller

    输出示例

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

  2. 验证发言人的守护进程集是否正在运行:

    $ 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 个 speaker Pod。集群中的 speaker pod 数量可能与示例输出不同。确保输出指示集群中每个节点有一个容器集。

33.2.4. MetalLB 的部署规格

当使用 MetalLB 自定义资源启动 MetalLB 实例时,您可以在 MetalLB 自定义资源中配置部署规格,以管理 controllerspeaker pod 如何在集群中部署并运行。使用这些部署规格来管理以下任务:

  • 为 MetalLB pod 部署选择节点。
  • 使用 pod 优先级和 pod 关联性来管理调度。
  • 为 MetalLB pod 分配 CPU 限值。
  • 为 MetalLB pod 分配容器 RuntimeClass。
  • 为 MetalLB pod 分配元数据。

33.2.4.1. 将 speaker pod 限制到特定的节点

默认情况下,当使用 MetalLB Operator 启动 MetalLB 时,Operator 会在集群中的每个节点上启动 speaker pod 的实例。只有具有 speaker pod 的节点可以公告负载均衡器 IP 地址。您可以使用节点选择器配置 MetalLB 自定义资源,以指定运行 speaker pod 的节点。

speaker Pod 限制到特定的节点的最常见原因是,确保只有具有特定网络上网络接口的节点公告负载均衡器 IP 地址。只有具有正在运行的 speaker pod 的节点才会公告为负载均衡器 IP 地址的目的地。

如果将 speaker 的 pod 限制到特定的节点,并为服务的外部流量策略指定 local,则必须确保该服务的应用程序 pod 部署到同一节点上。

将 speaker pod 限制为 worker 节点的配置示例

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"

<.> 示例配置指定将 speaker pod 分配给 worker 节点,但您可以指定分配给节点或任何有效的节点选择器的标签。<.> 在这个示例配置中,附加此容限的 pod 会容限使用 operator 的,与 key 的值和 effect 值匹配的污点。

使用 spec.nodeSelector 字段应用清单后,您可以检查 Operator 使用 oc get daemonset -n metallb-system speaker 命令部署的 pod 数量。同样,您可以使用 oc get nodes -l node-role.kubernetes.io/worker= 等命令显示与标签匹配的节点。

您可以选择允许节点使用关联性规则控制哪些 speaker pod 应该或不应该调度到节点上。您还可以通过应用容限列表来限制这些 pod。如需有关关联性规则、污点和容限的更多信息,请参阅其他资源。

33.2.4.2. 在 MetalLB 部署中配置容器运行时类

您可以通过配置 MetalLB 自定义资源,选择将容器运行时类分配给 controllerspeaker pod。例如,对于 Windows 工作负载,您可以将 Windows 运行时类分配给 pod,它将这个运行时类用于 pod 中所有容器。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录。
  • 已安装 MetalLB Operator。

流程

  1. 创建 RuntimeClass 自定义资源,如 myRuntimeClass.yaml,以定义您的运行时类:

    apiVersion: node.k8s.io/v1
    kind: RuntimeClass
    metadata:
      name: myclass
    handler: myconfiguration
  2. 应用 RuntimeClass 自定义资源配置:

    $ oc apply -f myRuntimeClass.yaml
  3. 创建 MetalLB 自定义资源,如 MetalLBRuntime.yaml,以指定 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

33.2.4.3. 在 MetalLB 部署中配置 pod 优先级和 pod 关联性

您可以通过配置 MetalLB 自定义资源,选择将 pod 优先级和 pod 关联性规则分配给 controllerspeaker pod。pod 优先级指示节点上 pod 的相对重要性,并根据这个优先级调度 pod。在 controllerspeaker pod 上设置高优先级,以确保在节点上的其他 pod 上调度优先级。

Pod 关联性管理 pod 间的关系。将 pod 关联性分配给 controllerspeaker pod,以控制调度程序将 pod 放置到 pod 关系的节点上。例如,您可以使用 pod 关联性规则来确保某些 pod 位于同一节点或节点上,这有助于提高网络通信并减少这些组件之间的延迟。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录。
  • 已安装 MetalLB Operator。
  • 已在集群中启动 MetalLB Operator。

流程

  1. 创建 PriorityClass 自定义资源,如 myPriorityClass.yaml,以配置优先级级别。这个示例定义了名为 high-priorityPriorityClass,值为 1000000。与具有较低优先级类的 pod 相比,在调度过程中分配此优先级类的 Pod 被视为优先级更高:

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
  2. 应用 PriorityClass 自定义资源配置:

    $ oc apply -f myPriorityClass.yaml
  3. 创建 MetalLB 自定义资源,如 MetalLBPodConfig.yaml,以指定 priorityClassNamepodAffinity 值:

    apiVersion: metallb.io/v1beta1
    kind: MetalLB
    metadata:
      name: metallb
      namespace: metallb-system
    spec:
      logLevel: debug
      controllerConfig:
        priorityClassName: high-priority 1
        affinity:
          podAffinity: 2
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                 app: metallb
              topologyKey: kubernetes.io/hostname
      speakerConfig:
        priorityClassName: high-priority
        affinity:
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                 app: metallb
              topologyKey: kubernetes.io/hostname
    1
    指定 MetalLB 控制器 pod 的优先级类。在这种情况下,它被设置为 high-priority
    2
    指定您要配置 pod 关联性规则。这些规则指定如何调度 pod 与其他 pod 或节点。此配置指示调度程序将具有标签 app: metallb 的 pod 调度到共享同一主机名的节点。这有助于在同一节点上并置与 MetalLB 相关的 pod,可能会优化这些 pod 之间的网络通信、延迟和资源使用情况。
  4. 应用 MetalLB 自定义资源配置:

    $ oc apply -f MetalLBPodConfig.yaml

验证

  • 要在 metallb-system 命名空间中查看分配给 pod 的优先级类,请运行以下命令:

    $ oc get pods -n metallb-system -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName

    输出示例

    NAME                                                 PRIORITY
    controller-584f5c8cd8-5zbvg                          high-priority
    metallb-operator-controller-manager-9c8d9985-szkqg   <none>
    metallb-operator-webhook-server-c895594d4-shjgx      <none>
    speaker-dddf7                                        high-priority

  • 要验证调度程序是否根据 pod 关联性规则放置 pod,请运行以下命令来查看 pod 的节点或节点的元数据:

    $ oc get pod -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -n metallb-system

33.2.4.4. 在 MetalLB 部署中配置 pod CPU 限制

您可以通过配置 MetalLB 自定义资源(可选)将 pod CPU 限值分配给 controllerspeaker pod。为 controllerspeaker pod 定义 CPU 限制可帮助您管理节点上的计算资源。这样可确保节点上的所有 pod 具有必要的计算资源来管理工作负载和集群内务。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录。
  • 已安装 MetalLB Operator。

流程

  1. 创建 MetalLB 自定义资源文件,如 CPULimits.yaml,以指定 controllerspeaker 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>

33.2.5. 其他资源

33.2.6. 后续步骤