Kubernetes如何在Linux上实现负载均衡
导读:Kubernetes在Linux上的负载均衡实现路径 在Linux上,Kubernetes的负载均衡通常分为三层:内核数据面的Service代理模式(iptables/IPVS)、面向外部访问的Service: LoadBalancer与I...
Kubernetes在Linux上的负载均衡实现路径
在Linux上,Kubernetes的负载均衡通常分为三层:内核数据面的Service代理模式(iptables/IPVS)、面向外部访问的Service: LoadBalancer与Ingress,以及在裸金属或私有环境中提供LoadBalancer能力的MetalLB等方案。整体关系如下:
- 内核数据面:由每个节点的kube-proxy将Service的虚拟IP映射到后端Pod,支持iptables与高性能的IPVS两种实现。
- 外部四层入口:使用Service type=LoadBalancer对外暴露,公有云通常自动分配外部IP;私有环境可配合MetalLB分配地址。
- 外部七层入口:使用**Ingress Controller(如Nginx Ingress)**统一暴露HTTP/HTTPS路由与TLS终止。
一、内核数据面负载均衡 iptables 与 IPVS
- 原理与差异
- iptables:通过内核Netfilter规则做DNAT与连接跟踪,规则多时性能下降,但兼容性好。
- IPVS:基于Linux内核IPVS模块,支持多种调度算法(如rr、lc、dh、sh、sed、nq),在高并发下吞吐与可扩展性更优。
- 启用IPVS(示例)
- 安装管理工具
- CentOS/RHEL:sudo yum install -y ipvsadm
- 切换kube-proxy为IPVS
- kubectl edit cm kube-proxy -n kube-system
- 设置:mode: “ipvs”,按需开启strictARP: true
- 重启kube-proxy生效
- kubectl delete pod -l k8s-app=kube-proxy -n kube-system
- 验证
- ipvsadm -Ln 应能看到kube-ipvs0及Service对应的虚拟服务与后端Pod。
- 安装管理工具
二、Service类型与典型用法
- 常用类型与场景
- ClusterIP:集群内部访问的虚拟IP,默认提供负载均衡到后端Pod。
- NodePort:在每个节点开放静态端口,外部可通过任意节点IP:NodePort访问。
- LoadBalancer:面向外部四层入口;公有云自动分配外部IP;私有环境可结合MetalLB提供地址分配与对外通告。
- ExternalName:为外部服务创建CNAME映射,无负载均衡能力。
- 示例Service(LoadBalancer)
- apiVersion: v1 kind: Service metadata: name: lb-svc spec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
- 公有云:kubectl get svc lb-svc 将出现EXTERNAL-IP;私有环境配合MetalLB分配地址池中的IP。
三、私有环境 LoadBalancer 方案 MetalLB
- 适用场景:裸金属、虚拟机或任何不提供云厂商LB的环境。
- 部署与配置
- 部署MetalLB组件(controller与speaker)
- kubectl apply -f metallb.yaml
- 配置地址池(示例为二层模式)
- apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 172.25.52.100-172.25.52.200
- kubectl apply -f configmap.yaml
- 创建Service(type=LoadBalancer)后,MetalLB将分配地址池中的IP作为EXTERNAL-IP。
- 部署MetalLB组件(controller与speaker)
四、七层路由与 Ingress
- 适用场景:基于域名/路径的HTTP/HTTPS路由、TLS终止、限流、鉴权等。
- 部署与使用
- 部署Nginx Ingress Controller(示例)
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
- 创建Ingress资源
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: / pathType: Prefix backend: service: name: example-service port: number: 80
- host: example.com
http:
paths:
- 将域名解析到Ingress Controller的Service地址(NodePort或LoadBalancer)即可对外服务。
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- 部署Nginx Ingress Controller(示例)
五、会话保持与健康检查要点
- 会话保持
- Service支持sessionAffinity: ClientIP,可将会话粘滞到同一后端Pod;可设置超时时间sessionAffinityConfig.clientIP.timeoutSeconds。
- 健康检查与可用性
- 为Pod配置readinessProbe,只有就绪的Pod才会被加入Service后端Endpoint,避免将请求转发到未就绪实例(在iptables模式下尤为重要)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Kubernetes如何在Linux上实现负载均衡
本文地址: https://pptw.com/jishu/775440.html
