一、说明

k8s集群没有4层负载均衡,对外暴露服务时,只能使用NodePort,一方面节点地址有限,另一方面,需要记不同的端口号,还是比较麻烦的。云上一般云提供商会有现成的负载均衡(如阿里云的SLB)可供使用,但是自建K8S集群就需要自己搭建负载均衡了,目前自建K8S集群常用的负载均衡主要是MetalLB。

二、安装

  1. 搭建好K8S集群
  2. ipvs开启严格arp模式
[root@master01 ~]# kubectl edit configmap -n kube-system kube-proxy
……
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true    #这里要改为true
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
……
  1. 安装
[root@master01 ~]# mkdir -p $HOME/metallb && cd $_
[root@master01 ~]# wget https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
[root@master01 ~]# kubectl apply -f metallb-native.yaml
[root@master01 ~]# kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS       AGE
controller-5bc7d4b8b4-mj8kv   1/1     Running   0              4d21h
speaker-6hjpw                 1/1     Running   1 (8d ago)     111d
speaker-959ph                 1/1     Running   0              111d
speaker-jr2b4                 1/1     Running   0              111d
speaker-lpg88                 1/1     Running   2 (6d4h ago)   111d
speaker-wrqlb                 1/1     Running   0              111d
  1. 配置地址池
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: layer2-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.17.60-192.168.17.254
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: layer2-lb
  namespace: metallb-system
spec:
  ipAddressPools:
  - layer2-pool
  1. 测试
[root@master01 metallb]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.4
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
[root@master01 metallb]# kubectl get svc nginx-svc
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
nginx-svc   LoadBalancer   10.233.46.159   192.168.17.61   8080:30503/TCP   111d

三、后续维护

  1. 后续如想调整IP地址池,可在“”中修改即可

K8S MetalLB 安装_负载均衡