云原生
Kubernetes基础
容器技术介绍
Docker快速入门
Containerd快速入门
K8S主要资源罗列
认识YAML
API资源对象
Kubernetes安全掌控
Kubernetes网络
Kubernetes高级调度
Kubernetes 存储
Kubernetes集群维护
Skywalking全链路监控
ConfigMap&Secret场景应用
Kubernetes基础概念及核心组件
水平自动扩容和缩容HPA
Jenkins
k8s中部署jenkins并利用master-slave模式实现CICD
Jenkins构建过程中常见问题排查与解决
Jenkins部署在k8s集群之外使用动态slave模式
Jenkins基于Helm的应用发布
Jenkins Pipeline语法
EFKStack
EFK日志平台部署管理
海量数据下的EFK架构优化升级
基于Loki的日志收集系统
Ingress
基于Kubernetes的Ingress-Nginx解决方案
Ingress-Nginx高级配置
使用 Ingress-Nginx 进行灰度(金丝雀)发布
Ingress-nginx优化配置
APM
Skywalking全链路监控
基于Helm部署Skywalking
应用接入Skywalking
服务网格
Istio
基于Istio的微服务可观察性
基于Istio的微服务Gateway实战
Kubernetes高可用集群部署
Kuberntes部署MetalLB负载均衡器
Ceph
使用cephadm部署ceph集群
使用Rook部署Ceph存储集群
openstack
glance上传镜像失败
mariadb运行不起来
创建域和项目错误_1
创建域和项目错误_2
安装计算节点
时钟源
网络创建失败
本文档使用 MrDoc 发布
-
+
首页
Kuberntes部署MetalLB负载均衡器
# 1、MetalLB简介 在使用kubenetes的过程中,**主要解决将服务开放到集群外部访问的重要的问题**。当使用云平台(阿里云、腾讯云、AWS等)的容器服务时,我们可以通过配置service为 LoadBalancer模式来绑定云平台的负载均衡器,从而实现外网的访问。对于自建的 kubernetes裸机集群我们一般使用**MetalLB**。,如果没有在受支持的IaaS平台(阿里云、腾讯云、AWS等)上运行,那么负载均衡器在创建时将无限期地保持pending状 态。 祼机集群不支持负载均衡的方式,可用的不外乎NodePort、HostNetwork、 ExternalIPs等方式来实现外部访问。但这些方式并不完美,而MetalLB旨在**通过提供与标准网络设备集成的Network LB**实施来解决这个痛点,从而使裸机群集上的外部服务 也尽可能“正常运行”,减少运维上的管理成本。 MetalLB 由David Anderson开发,直到 2019 年 3 月,MetalLB 的版权归谷歌所有,目 前已经脱离谷歌,原作者现在已经授权一个维护人员团队协助推进项目。 官方网站:https://metallb.universe.tf 项目地址:https://github.com/metallb/metallb # 2、MetalLB原理 Metallb包含两个组件,**Controller**(Deployment方式部署)和**Speaker**(daemonset方式部署)。 Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,就会完成两部分的工作: - **Controller**: 负责监听service变化,当service配置为LoadBalancer模式时,从IP池分配给到相应的IP,并进行IP的生命周期管理。 - **Speaker**: 则依据Service的变化,按具体的协议发起相应的广播或应答,根据工作模式 (Layer2/BGP)的不同,可采用Leader的方式或负载均衡的方式来响应请求。 **基本原理图:** 当业务流量通过TCP/UDP协议到达指定的Node时,由Node上面运行的Kube-Proxy组 件对流量进行处理,并分发到对应的Pod上面。  **Metallb** **支持两种模式:** - Layer2(推荐): L2 工作模式,使用 ARP/NDP 协议分配地址池; - BGP: 使用 BGP 协议分配地址池; # 3、MetalLB安装 ## 3.1 前提条件 已准备kuberntes集群:v1.21.0,已准备网络插件:calico等。 ```bash kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master01 Ready control-plane 30d v1.27.2 10.0.1.201 <none> Rocky Linux 8.8 (Green Obsidian) 4.18.0-477.27.1.el8_8.x86_64 containerd://1.6.24 ``` 如果在 **IPVS** 模式下使用 **kube-proxy**,从 Kubernetes v1.14.2 开始,必须启用严格的 ARP模式。 可以通过在当前集群中编辑 kube-proxy 配置来实现这一点,执行一下命令: ```bash ## IPVS模式: $ kubectl edit configmap -n kube-system kube-proxy kind: KubeProxyConfiguration metricsBindAddress: "" mode: "ipvs" ##设置kubernetes的kube-proxy的ARP模式 $ kubectl get configmap kube-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" $ kubectl apply -f -n kube-system ``` ## 3.2 MetalLB 安装 Metallb 支持 yaml文件、Kustomize、Helm 和 MetalLB Operator多种安装方法,这里使用yaml方式进行安装。 下载release版本 ```bash $ wget https://github.com/metallb/metallb/archive/refs/tags/v0.12.1.tar.gz $ tar -zxvf metallb-0.12.1.tar.gz $ cd metallb-0.12.1/manifests ``` 执行yaml文件进行安装 ```bash $ kubectl apply -f namespace.yaml $ kubectl apply -f metallb.yaml ``` 查看运行的pods,metalLB包含两个部分: a cluster-wide controller, and a per- machine protocol speaker. ```bash $ kubectl get po -nmetallb-system NAME READY STATUS RESTARTS AGE controller-6bb898ffc5-xn2nh 1/1 Running 0 4d14h speaker-6wkb6 1/1 Running 0 4d14h speaker-7c2lh 1/1 Running 0 4d14h speaker-b5qsb 1/1 Running 0 4d14h speaker-bs4kw 1/1 Running 0 4d14h speaker-gj6lq 1/1 Running 0 4d14h speaker-vrcdg 1/1 Running 0 4d14h ``` 查看其它信息,包含了 “controller” deployment 和 the “speaker” DaemonSet. ```bash $ kubectl get deploy -nmetallb-system NAME READY UP-TO-DATE AVAILABLE AGE controller 1/1 1 1 4d14h $ kubectl get ds -nmetallb-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE speaker 6 6 6 6 6 kubernetes.io/os=linux 4d14h ``` 接下来要生成一个 Configmap 文件,为 Metallb 设置 **IP地址范围** 以及 **协议** 相关的选择 和配置,这里以一个简单的二层配置为例。 # 4、配置Layer2模式 创建config.yaml提供IP地址池,查看提供的默认示例configmap ```bash $ cat example-layer2-config.yaml ``` 修改ip地址池,从集群IP地址段中为MetalLB分配部分IP地址: ```bash $ cat example-layer2-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: devops name: config data: config: | address-pools: - name: default-ip-pools protocol: layer2 addresses: - 192.10.192.222-192.10.192.225 ``` 执行yaml文件 ```bash $ kubectl apply -f example-layer2-config.yaml ``` 创建测试后端应用和服务 ```bash $ kubectl apply -f tutorial-2.yaml ``` 查看yaml文件配置,包含了一个deployment和一个LoadBalancer类型的service,默认 即可。 ```bash $ cat tutorial-2.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1 ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer ``` 查看service分配的EXTERNAL-IP ```bash $ kubectl get svc -n devops NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.101.112.1 192.168.72.200 80:31274/TCP 18h ``` 从集群外访问该IP地址 
阿星
2024年1月27日 16:15
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码