一、说明
k8s集群没有4层负载均衡,对外暴露服务时,只能使用NodePort,一方面节点地址有限,另一方面,需要记不同的端口号,还是比较麻烦的。云上一般云提供商会有现成的负载均衡(如阿里云的SLB)可供使用,但是自建K8S集群就需要自己搭建负载均衡了,目前自建K8S集群常用的负载均衡主要是MetalLB。
二、安装
- 搭建好K8S集群
- 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
……
- 安装
[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
- 配置地址池
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
- 测试
[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
三、后续维护
- 后续如想调整IP地址池,可在“”中修改即可