Kubernetes 【负载均衡器】 MetalLB 实践

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes 【负载均衡器】 MetalLB 实践

文章目录


1. 什么是MetalLB

根据 官方文档 MetalLB 是裸机Kubernetes 集群的负载均衡器实现 ,使用标准路由协议。

2. 为什么需要它

如果您在云解决方案(AWS、GCP)之外部署 Kubernetes 集群,您需要一种在集群之外公开服务的方法。您可以使用 NodePort 使用端口范围 30000–32767 公开您的服务,但是每次您的客户需要访问您的服务时,他们都需要指定这个高阶端口。如果您尝试在裸机中使用 LoadBalancer 服务,您将看到您的服务将永远挂起。在这些情况下,您可以使用 MetlabLB。

3. 要求

MetalLB 需要以下功能才能运行:


一个 Kubernetes 集群,运行 Kubernetes 1.13.0 或更高版本,还没有网络负载平衡功能。

一个 集群网络配置 可以与MetalLB共存。

一些供 MetalLB 分发的 IPv4 地址。

使用 BGP 操作模式时,您需要一台或多台能够通话的路由器 BGP.

节点之间必须允许端口 7946(TCP 和 UDP)上的流量,如 会员名单.

4. 准备

如果您在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,您必须启用严格的 ARP 模式。


请注意,如果您使用 kube-router 作为服务代理,则不需要这个,因为它默认启用严格的 ARP。


您可以通过在当前集群中编辑 kube-proxy 配置来实现这一点:

$ kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

您还可以将此配置片段添加到您的 kubeadm-config 中,只需将其附加—到主配置之后。

如果您尝试自动执行此更改,这些 shell 片段可能会帮助您:

# 查看将进行哪些更改,如果不同则返回非零返回码
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system
# 实际应用更改,仅在错误时返回非零返回码
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

5. 安装

5.1 通过清单安装

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml

这会将 MetalLB 部署到metallb-system 命名空间下的集群。清单中的组件是:


该metallb-system/controller deployment。这是处理 IP 地址分配的集群范围的控制器。

该metallb-system/speaker daemonset。这是使用您选择的协议以使服务可访问的组件。

控制器和扬声器的Service accounts,以及组件运行所需的 RBAC 权限。

安装清单不包含配置文件。MetalLB 的组件仍将启动,但将保持空闲状态,直到您 定义和部署配置图.

5.2 Kustomize 安装

您可以使用 Kustomize 安装 MetalLB 通过指向远程 kustomization 文件:

# kustomization.yml
namespace: metallb-system
resources:
  - github.com/metallb/metallb//manifests?ref=v0.11.0
  - configmap.yml 

如果你想使用一个 configMapGenerator 对于配置文件,您想告诉 Kustomize 不要将哈希附加到配置映射,因为 MetalLB 正在等待名为的配置映射config (请参阅 https://github.com/kubernetes-sigs/kustomize/blob/master/examples/generatorOptions.md):

# kustomization.yml
namespace: metallb-system
resources:
  - github.com/metallb/metallb//manifests?ref=v0.11.0
configMapGenerator:
- name: config
  files:
    - configs/config
generatorOptions:
 disableNameSuffixHash: true

5.3 Helm 安装

使用 Helm 图表存储库: https://metallb.github.io/metallb

helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb

可以在安装时指定值文件。建议在 Helm 值中提供配置:

helm install metallb metallb/metallb -f values.yaml

MetalLB CONFIGS在设置values.yamlconfigInLine

configInline:
  address-pools:
   - name: default
     protocol: layer2
     addresses:
     - 198.51.100.0/24

6. 示例

kind创建kubernets

$ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
$ kind get  clusters 
kind
docker pull nginx:1.14.2
kind load docker-image nginx:1.14.2 --name kind
kubectl create deployment nginx:1.14.2 --image=nginx
kubectl expose deploy nginx --port 80 --type LoadBalancer

如果检查部署情况,则external-ip状态为pending

$ kubectl get svc nginx          
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   10.96.255.195   <pending>     80:30681/TCP   46s

安装metal LB

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
namespace/metallb-system created
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/controller created
podsecuritypolicy.policy/speaker created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
role.rbac.authorization.k8s.io/pod-lister created
role.rbac.authorization.k8s.io/controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
rolebinding.rbac.authorization.k8s.io/pod-lister created
rolebinding.rbac.authorization.k8s.io/controller created
daemonset.apps/speaker created
deployment.apps/controller createdl
$ kubectl get all -n metallb-system
NAME                             READY   STATUS    RESTARTS   AGE
pod/controller-77c44876d-b8gsw   1/1     Running   0          42s
pod/speaker-wqxlq                1/1     Running   0          42s
NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   1         1         1       1            1           kubernetes.io/os=linux   42s
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           42s
NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-77c44876d   1         1         1       42sm

如果您查看pod,您将在应用清单之后创建两种类型的pod,即controller和speaker。 该控制器是集群范围的MetalLB控制器,负责IP分配。 speaker是一个deamonset,它将安装在集群中的每个节点上,并使用各种广告策略使用指定的ip发布服务。


作为最后一步,您需要定义configmap。 根据环境的不同,可以选择Layer 2模式或BGP模式,也可以选择external IP范围。 在这个演示中,我将使用协议作为layer2,地址为172.18.0.200-172.18.0.250,因为我的Kubernetes节点在子网范围内运行(检查kubectl get nodes -o wide命令的输出)。

$ kubectl get nodes -o wide
NAME                 STATUS   ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION     CONTAINER-RUNTIME
kind-control-plane   Ready    control-plane,master   24h   v1.21.1   172.18.0.2    <none>     
$ cat cm.yaml                                  
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 172.18.0.200-172.18.0.250
$ kubectl create -f cm.yaml

如果您检查服务,您将看到metallb从您在configmap下定义的池中为它分配了external ip

$ kubectl get svc nginx
NAME  TYPE      CLUSTER-IP   EXTERNAL-IP  PORT(S)    AGE
nginx  LoadBalancer  10.96.131.55  172.18.0.200  80:30355/TCP  10m
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 开发工具 Docker
微服务实践k8s与dapr开发部署实验(2)状态管理
微服务实践k8s与dapr开发部署实验(2)状态管理
65 3
微服务实践k8s与dapr开发部署实验(2)状态管理
|
19天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
205 3
|
2月前
|
存储 运维 监控
Kubernetes 集群监控与日志管理实践
【5月更文挑战第28天】在微服务架构日益普及的当下,容器编排工具如 Kubernetes 已成为运维工作的核心。有效的集群监控和日志管理是确保系统稳定性和服务可靠性的关键。本文将深入探讨 Kubernetes 集群的监控策略,以及如何利用现有的工具进行日志收集、存储和分析,以实现对集群健康状况的实时掌握和问题快速定位。
|
2月前
|
存储 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【5月更文挑战第27天】 在微服务架构日益普及的当下,容器化技术与编排工具如Kubernetes已成为现代云原生应用的基石。然而,随着集群规模的不断扩大和复杂性的增加,如何有效监控和管理这些动态变化的服务成为了维护系统稳定性的关键。本文将深入探讨Kubernetes环境下的监控策略和日志管理的最佳实践,旨在为运维人员提供一套系统的解决思路,确保应用性能的最优化和问题的快速定位。
|
4天前
|
Prometheus 监控 Kubernetes
深入理解Prometheus: Kubernetes环境中的监控实践
Kubernetes简介 在深入Prometheus与Kubernetes的集成之前,首先简要回顾一下Kubernetes的核心概念。Kubernetes是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了高度的可扩展性和灵活性,使得它成为微服务和云原生应用的理想选择。 核心组件 • 控制平面(Control Plane):集群管理相关的组件,如API服务器、调度器等。 • 工作节点(Nodes):运行应用容器的机器。 • Pods:Kubernetes的基本运行单位,可以容纳一个或多个容器。
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s 二进制安装 优化架构之 部署负载均衡,加入master02
k8s 二进制安装 优化架构之 部署负载均衡,加入master02
|
2月前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的实践
【5月更文挑战第30天】 在当今的快速迭代和持续部署的软件发布环境中,自动化运维的重要性愈发凸显。本文旨在探讨如何利用容器化技术与微服务架构,特别是Docker和Kubernetes,来构建一个高效、可伸缩且自愈的自动化运维体系。通过详细分析容器化的优势及Kubernetes的集群管理机制,文章将提供一个清晰的指南,帮助读者理解并实现现代软件部署的最佳实践。
|
2月前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【5月更文挑战第30天】 在动态且日益复杂的云原生环境中,维持 Kubernetes 集群的高性能运行是一个持续的挑战。本文将探讨一系列针对性能监控、问题定位及优化措施的实践方法,旨在帮助运维专家确保其 Kubernetes 环境能够高效、稳定地服务于不断变化的业务需求。通过深入分析系统瓶颈,我们不仅提供即时的性能提升方案,同时给出长期维护的策略建议,确保集群性能的可持续性。
|
2月前
|
运维 Prometheus 监控
Kubernetes 集群监控与日志管理实践
【5月更文挑战第29天】 在微服务架构日益盛行的今天,容器化技术已成为现代应用部署的标准。其中,Kubernetes 作为容器编排的事实标准,其集群的稳定性和性能监控变得至关重要。本文将深入探讨 Kubernetes 集群的监控策略和日志管理的最佳实践,旨在为运维工程师提供一套高效、可靠的集群监控解决方案。通过引入 Prometheus 和 Grafana 工具进行数据收集与可视化,以及 Fluentd 和 Elasticsearch 配合 Kibana 实现日志聚合与分析,本文将带领读者构建起一个全面的 Kubernetes 监控系统,确保系统的高可用性和故障快速响应。
|
2月前
|
存储 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【5月更文挑战第28天】 在动态且复杂的微服务架构中,保持 Kubernetes 集群的高性能和稳定性是一项挑战。本文将探讨一系列实用的性能监测、调优策略以及最佳实践,旨在帮助运维专家确保其容器化应用能在 Kubernetes 环境中达到最优表现。我们将通过分析真实案例,总结出一套系统化的优化流程,并介绍相关工具与技术,使读者能够对 Kubernetes 集群进行有效的性能监控和提升。