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

posted @   哈喽哈喽111111  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享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日志割接
点击右上角即可分享
微信分享提示