开源k8slb工具Metallb
本文最后更新于 1678 天前, 如有失效请评论区留言.
本文主要讲述穷人如何使用 LoadBalancer
简介
kubernetes 本身并没有实现 LoadBalancer, 如果是云上用户,可以使用云服务商提供 k8s 的 LoadBalancer, 如阿里云的 slb。
当我们把 k8s 部署在私有云时,需要简单的 LoadBalancer 来验证工作,开源的 metallb 就是一个不错的选择。
通过 k8s 原生的方式提供 LB 类型的 Service 支持,开箱即用。
核心特性:
地址分配
MetalLB 会为用户的 lb 类型 service 分配 IP 地址,该 IP 地址需要用户预先分配外部申明
地址分配后还需要通知到网络中的其他主机, 有两种方式基于 ARP 的 Layer2 和 BGP
原理
- Layer2 (默认使用)
- BGP
Layer2
只需要一段跟 K8s 管理网相同网段的地址即可, 通常这种就可以了。
在此模式下, 会从 k8s 节点中选一个 Leader 节点,在这个节点上面响应 LB 地址段的 ARP 请求,从而使上层路由把发往 LB 的流量都发到 Leader 节点。缺点也很明显,所有对 LB 的请求都会发往 Leader 节点。如果当前 Service 下面的 Pod 分布在不同节点,那么这个流量还会从 Leader 发往相应的节点。
局限性: 单节点流量瓶颈和慢故障转移
BGP
需要上层路由器支持 BGP,不在需要 Leader 节点。
安装
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm upgrade -i metallb bitnami/metallb --create-namespace -n metallb-system
# 默认空配置
kubectl get cm/metallb-config -n metallb-system -o yaml
kubectl apply -f https://sh.ysicing.me/k8s/helm/metallb/lbconfig.yaml
配置说明
# https://sh.ysicing.me/k8s/helm/metallb/lbconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: metallb-config
data:
config: |
address-pools:
- name: lbpool
protocol: layer2
addresses:
- 11.11.11.150-11.11.11.200
测试
# lb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
测试
root@k8s1:~# kubectl apply -f lb.yaml
root@k8s1:~# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-d46f5678b-hm7r6 1/1 Running 0 96s
pod/nginx-deployment-d46f5678b-zgfxd 1/1 Running 0 96s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 88m
service/nginx-service LoadBalancer 10.98.184.75 11.11.11.150 80:32002/TCP 6s