Skip to content

几种负载均衡

MetalLB

安装 MetalLB

如果 kube-proxy 使用的是 ipvs 模式,需要修改 kube-proxy 配置文件,启用严格的 ARP

bash
kubectl edit configmap -n kube-system kube-proxy

ipvs:
  strictARP: true

使用yaml安装

bash
curl -O https://raw.githubusercontent.com/metallb/metallb/refs/tags/v0.14.9/config/manifests/metallb-native.yaml
kubectl apply -f metallb-native.yaml

Layer 2 模式配置

  1. 创建 IPAdressPool
bash
cat <<EOF > IPAddressPool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  # 可分配的 IP 地址,可以指定多个,包括 ipv4、ipv6
  - 172.20.175.140-172.20.175.150
EOF

kubectl apply -f IPAddressPool.yaml
  1. 创建 L2Advertisement,并关联 IPAdressPool 如果不设置关联到 IPAdressPool,那默认 L2Advertisement 会关联上所有可用的 IPAdressPool
bash
cat <<EOF > L2Advertisement.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - ip-pool #上一步创建的 ip 地址池,通过名字进行关联
EOF

kubectl apply -f L2Advertisement.yaml

OpenELB

openELB靠注解来绑定!!!

官网安装指南

安装

bash
wget https://raw.githubusercontent.com/openelb/openelb/release-0.6/deploy/openelb.yaml
kubectl apply -f openelb.yaml

配置(Layer 2)

yml
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
    name: eip-pool
spec:
    address: 192.168.153.110-192.168.153.130  # 修改为k8s同网段
    protocol: layer2
    interface: enp0s8  # 修改为网卡接口

验证是否可用

bash
cat <<EOF > nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx:1.27-alpine
        ports:
        - containerPort: 80
EOF

kubectl apply -f nginx-dp.yaml
bash
cat <<EOF > nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
  annotations:
    # openELB靠注解来绑定
    lb.kubesphere.io/v1alpha1: openelb
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
    # For versions below 0.6.0, you also need to specify the protocol
    # protocol.openelb.kubesphere.io/v1alpha1: layer2
spec:
  selector:
    app: nginx
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
  externalTrafficPolicy: Cluster
EOF

kubectl apply -f nginx-svc.yaml