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
特权的用户身份登录。
流程
-
在 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
。
-
导航到 Operators
如果 Operator 没有成功安装,请检查 Operator 的状态并查看日志:
-
导航到 Operators
Installed Operators 页面,并检查 Status
列中是否有任何错误或故障。 -
导航到 Workloads
Pods 页面,并检查 openshift-operators
项目中报告问题的 pod 的日志。
-
导航到 Operators
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
特权的用户身份登录。
流程
输入以下命令为 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
创建一个
Subscription
CR:定义
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
值。
要创建
Subscription
CR,请运行以下命令:$ 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
33.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 数量可能与示例输出不同。确保输出指示集群中每个节点有一个容器集。
33.2.4. MetalLB 的部署规格
当使用 MetalLB 自定义资源启动 MetalLB
实例时,您可以在 MetalLB
自定义资源中配置部署规格,以管理 controller
或 speaker
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 部署中配置 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。
- 已在集群中启动 MetalLB Operator。
流程
创建
PriorityClass
自定义资源,如myPriorityClass.yaml
,以配置优先级级别。这个示例定义了名为high-priority
的PriorityClass
,值设为1000000
。与具有较低优先级类的 pod 相比,在调度过程中分配此优先级类的 Pod 被视为优先级更高: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 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
应用
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.3. 在 MetalLB 部署中配置 pod CPU 限制
您可以通过配置 MetalLB
自定义资源(可选)将 pod CPU 限值分配给 controller
和 speaker
pod。为 controller
或 speaker
pod 定义 CPU 限制可帮助您管理节点上的计算资源。这样可确保节点上的所有 pod 具有必要的计算资源来管理工作负载和集群内务。
先决条件
-
您以具有
cluster-admin
权限的用户身份登录。 - 已安装 MetalLB Operator。
流程
创建
MetalLB
自定义资源文件,如CPULimits.yaml
,以指定controller
和speaker
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"
应用
MetalLB
自定义资源配置:$ oc apply -f CPULimits.yaml
验证
要查看 pod 的计算资源,请运行以下命令,将
<pod_name>
替换为您的目标 pod:$ oc describe pod <pod_name>