Kubernetes开源LoadBalancer—Metallb(BGP)
转载自:https://cloud.tencent.com/developer/article/2107224
Metallb介绍
Kubernetes没有为裸金属集群提供网络负载均衡器(LoadBalancer)。Kubernetes发布的网络负载均衡器的实现都是调用各种IaaS平台的外部负载均衡器。如果你不是运行在一个受支持的IaaS平台上,那么loadbalancer在创建时就会无限期地保持“Pending”状态。
裸金属集群运营商只剩下两个方式来将用户流量引入集群,即“NodePort”和“externalIPs”服务。这两种选择对生产用途都有显著的不利影响,这使得裸金属集群在Kubernetes生态系统中成为二等公民。
MetalLB的目标是通过提供一个与标准网络设备集成的网络负载均衡器实现来纠正这种不平衡,这样裸金属集群上的外部服务也可以尽可能地“正常工作”。
MetalLB有两个共同提供此服务的特性:地址分配和外部通知。
部署MetalLB(BGP)
部署环境
这是我们内部集群拓扑的一个简化图
注意:如果集群的CNI使用的是calico,你需要禁用calico的BGP模式,否则会影响MetalLB的正常工作
部署
# 安装前准备
# 如果kube-proxy使用的是IPVS模式,你需要启用staticARP
kubectl edit configmap -n kube-system kube-proxy
# 设置staticARP为true
mode: "ipvs"
ipvs:
strictARP: true
# 部署metalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
# 检查pod运行状态
[root@node1 ~]# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-6554b76d68-gxwml 1/1 Running 0 35d
speaker-p9x5v 1/1 Running 0 35d
speaker-pgxkw 1/1 Running 0 35d
# 配置metalLB
cat > metallb-eip.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 192.168.0.254 # BGP邻居IP(Core Switch的IP)
peer-asn: 50000 # 对端AS号
my-asn: 50001 # 本地AS号
address-pools:
- name: default
protocol: bgp # 协议使用BGP
addresses: # 地址池
- 10.11.11.1-10.11.11.254
EOF
# 之前我地址池配置成10.11.11.0/24,Metallb分配地址时会把10.11.11.0也分配出去。
# 配置核心交换机
[Core-Switch]bgp 50000
[Core-Switch-bgp]peer 192.168.0.1 as-num 50001
[Core-Switch-bgp]peer 192.168.0.2 as-num 50001
[Core-Switch-bgp]peer 192.168.0.3 as-num 50001
注意:BGP协议分配的地址可以跟节点主机地址在不同网段
查看BGP邻居建立情况 [Core-Switch]dis bgp peer
# 现在使用K8S dashboard做个实验
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.1.189.92 <none> 8000/TCP 35d
kubernetes-dashboard NodePort 10.1.88.59 <none> 443:31956/TCP 35d
# 现在使用的是NodePort,把他修改成LoadBalancer
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard
type: LoadBalancer
# 保存退出, 再次查看svc
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.1.189.92 <none> 8000/TCP 35d
kubernetes-dashboard LoadBalancer 10.1.88.59 10.11.11.1 443:31956/TCP 35d
# 可以看到kubernetes-dashboard的EXTERNAL-IP已经被分配了一个地址
现在到交换机上看一下 [Core-Switch]dis bgp routing-table [Core-Switch]dis ip rou 10.11.11.1
可以看到交换机已经学习到了10.11.11.1的路由 在浏览器中访问https://10.11.11.1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2022-03-16 Kubernetes HPA 使用详解
2022-03-16 在 Kubernetes 集群中使用 NodeLocal DNSCache
2022-03-16 使用ingress-nginx
2022-03-16 Minio VS Ceph
2022-03-16 kubectl插件管理工具krew
2022-03-16 Centos7新增静态路由
2022-03-16 catalina.out日志割接