介紹
Kubernetes沒有為裸機集群提供網絡負載平衡器的實現(svc 類型為loadbalance),Kubernetes附帶的Network LB的實現都是調用各種IaaS平臺(GCP,AWS,Azure等)的粘合代碼。如果您未在受支持的IaaS平臺(GCP,AWS,Azure等)上運行,
則LoadBalancers在創建時將無限期保持pending狀態
metalb解決了這種問題,使得裸機集群也能使用svc 類型為loadbalance
依賴
- k8s 1.13.0+,沒有其他的loadbalancer
- 集群網絡配置可以與metalb共存
- 給metalb 的IP地址
- 根據模式不同可能需要支持BGP的路由器
安裝
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml
配置
二層
二層只需要配置IP地址段即可
cat >> metallb < EOF
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 10.10.8.200-10.10.8.205
EOF
bgp
bgp模式需要配置以下信息
- MetalLB應該連接的路由器IP地址,
- 路由器的AS號,
- MetalLB應該使用的AS號,
- 以CIDR前綴表示的IP地址範圍。
示例配置:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 10.0.0.1
peer-asn: 64501
my-asn: 64500
address-pools:
- name: default
protocol: bgp
addresses:
- 192.168.10.0/24
廣播配置
缺省情況下,BGP模式將每個分配的IP通告給配置的對等方,而沒有其他BGP屬性。
對於每個svc ip對等路由器將受到一個32位掩碼的路由信息,BGP localpref設置為零且沒有BGP Community。
通過bgp-advertisements可以自定義廣播配置,
除了可以配置localpref和Community之外還可以配置聚合路由,aggregation-length廣播參數擴大32位掩碼
結合多種廣播配置,這使您可以創建與BGP網絡其餘部分互操作的廣播
假設您租用/24了公共IP空間,並且已將其分配給MetalLB。默認情況下,MetalLB將每個IP通告為/32,
但您的IP提供商拒絕路由/24意外的路由。因此,您需要以某種方式/24向您的傳輸提供商進行廣播發布,但仍然可以在內部進行每個IP路由。
配置如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 10.0.0.1
peer-asn: 64501
my-asn: 64500
address-pools:
- name: default
protocol: bgp
addresses:
- 198.51.100.0/24
bgp-advertisements:
- aggregation-length: 32
localpref: 100
communities:
- no-advertise
- aggregation-length: 24
bgp-communities:
no-advertise: 65535:65282
將對等體限制到某些節點
通過使用node-selectors 配置中的對等方屬性將對等方限制為某些節點
使用主機名hostA或hostB有rack=frontend標籤,但沒有標籤network-speed=slow使用該配置
peers:
- peer-address: 10.0.0.1
peer-asn: 64501
my-asn: 64500
node-selectors:
- match-labels:
rack: frontend
match-expressions:
- key: network-speed
operator: NotIn
values: [slow]
- match-expressions:
- key: kubernetes.io/hostname
operator: In
values: [hostA, hostB]
處理buggy網絡
由於錯誤的Smurf_attack保護, 一些舊的用戶網絡設備錯誤地阻止了以.0和結尾的IP地址。.255
如果您的用戶或網絡遇到此問題,則可以avoid-buggy-ips: true在地址池上進行設置 以將.0和標記.255 為不可用。
應用loadbalance
修改type: LoadBalancer查看狀態
# kubectl get svc -n kube-system kube-state-metrics
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-state-metrics LoadBalancer 200.0.210.165 10.10.8.203 8080:31527/TCP,8081:32312/TCP 4s
分配IP
- 分配指定IP - 指定spec.loadBalancerIP 字段
- 分配IP池 - metadata.annotations.metallb.universe.tf/address-pool
- IP地址共享 metadata.annotations.metallb.universe.tf/allow-shared-ip: “共享秘鑰”,只有共享秘鑰相同的svc才能共享IP
總結
metallb 賦予了我們使用本地網絡直接訪問K8S內部服務的能力而不需要依賴於nodeport或者host port,但是當前為beta,不推薦生產使用
閱讀更多 有點技術 的文章