34.2. 安装 MetalLB Operator
作为集群管理员,您可以添加 MetallB Operator,以便 Operator 可以管理集群中的 MetalLB 实例的生命周期。
MetalLB 和 IP 故障转移不兼容。如果您为集群配置了 IP 故障切换,请在安装 Operator 前执行删除 IP 故障切换的步骤。
34.2.1. 使用 Web 控制台从 OperatorHub 安装 MetalLB Operator
作为集群管理员,您可以使用 OpenShift Container Platform Web 控制台安装 MetalLB Operator。
先决条件
-
以具有
cluster-admin权限的用户身份登录。
流程
- 在 OpenShift Container Platform Web 控制台中进入至 Operators → OperatorHub。
在 Filter by keyword 框中输入关键字,或滚动以查找您想要的 Operator。例如,键入
metallb来查找 MetalLB Operator。您还可以根据 基础架构功能过滤选项。例如,如果您希望 Operator 在断开连接的环境中工作,请选择 Disconnected。
- 在 Install Operator 页面中,接受默认值并点 Install。
验证
确认安装成功:
- 进入到 Operators → Installed Operators 页面。
-
检查 Operator 是否安装在
openshift-operators命名空间中,其状态是否为Succeeded。
如果 Operator 没有成功安装,请检查 Operator 的状态并查看日志:
-
进入到 Operators → Installed Operators 页面,并检查
Status列中是否有任何错误或故障。 -
进入到 Workloads → Pods 页面,检查
openshift-operators项目中报告问题的 pod 的日志。
-
进入到 Operators → Installed Operators 页面,并检查
34.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权限的用户身份登录。
流程
输入以下命令为 MetalLB Operator 创建命名空间:
$ cat << EOF | oc apply -f - apiVersion: v1 kind: Namespace metadata: name: metallb-system EOF
在命名空间中创建 Operator 组自定义资源(CR):
$ cat << EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: metallb-operator namespace: metallb-system EOF
确认 Operator 组已安装在命名空间中:
$ oc get operatorgroup -n metallb-system
输出示例
NAME AGE metallb-operator 14m
创建一个
SubscriptionCR:定义
SubscriptionCR 并保存 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值。
要创建
SubscriptionCR,请运行以下命令:$ oc create -f metallb-sub.yaml
可选: 要确保 BGP 和 BFD 指标出现在 Prometheus 中,您可以使用以下命令标记命名空间:
$ oc label ns metallb-system "openshift.io/cluster-monitoring=true"
验证
验证步骤假定 metallb-system 命名空间中安装了 MetalLB Operator。
确认安装计划位于命名空间中:
$ oc get installplan -n metallb-system
输出示例
NAME CSV APPROVAL APPROVED install-wzg94 metallb-operator.4.13.0-nnnnnnnnnnnn Automatic true
注意安装 Operator 可能需要几秒钟。
要验证是否已安装 Operator,请输入以下命令:
$ oc get clusterserviceversion -n metallb-system \ -o custom-columns=Name:.metadata.name,Phase:.status.phase
输出示例
Name Phase metallb-operator.4.13.0-nnnnnnnnnnnn Succeeded
34.2.3. 在集群中启动 MetalLB
安装 Operator 后,您需要配置 MetalLB 自定义资源的单一实例。配置自定义资源后,Operator 会在集群中启动 MetalLB。
先决条件
-
安装 OpenShift CLI (
oc) 。 -
以具有
cluster-admin权限的用户身份登录。 - 安装 MetalLB Operator。
流程
此流程假设 MetalLB Operator 已安装在 metallb-system 命名空间中。如果使用 Web 控制台安装,请替换命名空间的 openshift-operators。
创建 MetalLB 自定义资源的单一实例:
$ cat << EOF | oc apply -f - apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system EOF
验证
确认 MetalLB 控制器的部署和 MetalLB speaker 的守护进程集正在运行。
验证控制器的部署是否正在运行:
$ oc get deployment -n metallb-system controller
输出示例
NAME READY UP-TO-DATE AVAILABLE AGE controller 1/1 1 1 11m
验证发言人的守护进程集是否正在运行:
$ 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 数量可能与示例输出不同。确保输出指示集群中每个节点有一个容器集。
34.2.4. MetalLB 的部署规格
当使用 MetalLB 自定义资源启动 MetalLB 实例时,您可以在 MetalLB 自定义资源中配置部署规格,以管理 controller 或 speaker pod 如何在集群中部署并运行。使用这些部署规格来管理以下任务:
- 为 MetalLB pod 部署选择节点。
- 使用 pod 优先级和 pod 关联性来管理调度。
- 为 MetalLB pod 分配 CPU 限值。
- 为 MetalLB pod 分配容器 RuntimeClass。
- 为 MetalLB pod 分配元数据。
34.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。如需有关关联性规则、污点和容限的更多信息,请参阅其他资源。
34.2.4.2. 在 MetalLB 部署中配置 pod 优先级和 pod 关联性
您可以通过配置 MetalLB 自定义资源,选择将 pod 优先级和 pod 关联性规则分配给 controller 和speaker pod。pod 优先级指示节点上 pod 的相对重要性,并根据这个优先级调度 pod。在 controller 或 speaker pod 上设置高优先级,以确保在节点上的其他 pod 上调度优先级。
Pod 关联性管理 pod 间的关系。将 pod 关联性分配给 controller 或 speaker pod,以控制调度程序将 pod 放置到 pod 关系的节点上。例如,您可以允许在同一节点上带有逻辑上相关工作负载的 pod,或者确保具有冲突工作负载的 pod 位于单独的节点上。
先决条件
-
以具有
cluster-admin权限的用户身份登录。 - 已安装 MetalLB Operator。
流程
创建
PriorityClass自定义资源,如myPriorityClass.yaml,以配置优先级级别。这个示例使用高优先级类:apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000
应用
PriorityClass自定义资源配置:$ oc apply -f myPriorityClass.yaml
创建
MetalLB自定义资源,如MetalLBPodConfig.yaml,以指定priorityClassName和podAffinity值: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应用
MetalLB自定义资源配置:$ oc apply -f MetalLBPodConfig.yaml
验证
要查看分配给命名空间中的 pod 的优先级类,请运行以下命令,将
<namespace>替换为目标命名空间:$ oc get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
要验证调度程序是否根据 pod 关联性规则放置 pod,请运行以下命令来查看 pod 节点的元数据,将
<namespace>替换为您的目标命名空间:$ oc get pod -o=custom-columns=NODE:.spec.nodeName,NAME:.metadata.name -n <namespace>
34.2.4.3. 在 MetalLB 部署中配置 pod CPU 限制
您可以通过配置 MetalLB 自定义资源(可选)将 pod CPU 限值分配给 controller 和 speaker pod。为 controller 或 speaker pod 定义 CPU 限制可帮助您管理节点上的计算资源。这样可确保节点上的所有 pod 具有必要的计算资源来管理工作负载和集群内务。
先决条件
-
以具有
cluster-admin权限的用户身份登录。 - 已安装 MetalLB Operator。
流程
创建
MetalLB自定义资源文件,如CPULimits.yaml,以指定controller和speakerpod 的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"应用
MetalLB自定义资源配置:$ oc apply -f CPULimits.yaml
验证
要查看 pod 的计算资源,请运行以下命令,将
<pod_name>替换为您的目标 pod:$ oc describe pod <pod_name>
34.2.4.4. 在 MetalLB 部署中配置容器运行时类
您可以通过配置 MetalLB 自定义资源,选择性地将容器运行时类分配给 controller 和 speaker pod。例如,对于 Windows 工作负载,您可以将 Windows 运行时类分配给 pod,它将这个运行时类用于 pod 中所有容器。
先决条件
-
以具有
cluster-admin权限的用户身份登录。 - 已安装 MetalLB Operator。
流程
创建
RuntimeClass自定义资源,如myRuntimeClass.yaml,以定义您的运行时类:apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: myclass handler: myconfiguration
应用
RuntimeClass自定义资源配置:$ oc apply -f myRuntimeClass.yaml
创建
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应用
MetalLB自定义资源配置:$ oc apply -f MetalLBRuntime.yaml
验证
要查看 pod 的容器运行时,请运行以下命令:
$ oc get pod -o custom-columns=NAME:metadata.name,STATUS:.status.phase,RUNTIME_CLASS:.spec.runtimeClassName