讓本地k8s集群使用LoadBalancer成為可能

介紹

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,不推薦生產使用


分享到:


相關文章: