externalTrafficPolicy: Local
含义
externalTrafficPolicy: Local 表示来自集群外部的流量只会被路由到运行有服务后端 Pod 的节点上。
工作原理
-
当外部请求到达某个节点的 NodePort 时:
-
如果该节点上有服务对应的 Pod 在运行,请求会被转发到本地的 Pod
-
如果该节点上没有服务对应的 Pod,请求会被丢弃(返回 TCP RST)
-
-
特点:
-
保留原始客户端 IP(不会做 SNAT)
-
可能导致流量分布不均(只有有 Pod 的节点才会接收流量)
-
适合需要保留客户端源 IP 的场景
-
internalTrafficPolicy: Cluster
含义
internalTrafficPolicy: Cluster 表示来自集群内部的流量会被均匀分配到所有可用的后端 Pod,无论这些 Pod 运行在哪个节点上。
工作原理
-
当集群内部的服务请求发生时:
-
请求会被均匀分配到所有健康的 Pod
-
不考虑 Pod 所在的节点位置
-
-
特点:
-
提供更好的负载均衡
-
可能导致跨节点流量(pod 在节点 A,请求来自节点 B)
-
默认行为
-
验证-LoadBalancer模式
修改ARP模式,启用严格ARP模式
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system
#查看修改结果
kubectl edit configmap -n kube-system kube-proxy
搭建metallb支持LoadBalancer
Metallb 在 Kubernetes 中的作用主要是为没有运行在如 AWS、GCP 等具有完善网络服务的云平台上的集群,提供网络负载均衡器的实现。
-
实现 LoadBalancer 服务类型:在 Kubernetes 中,Service 有多种类型,其中 LoadBalancer 类型通常需要外部的负载均衡器支持。Metallb 可以在缺乏原生云平台负载均衡支持的环境下,模拟实现 LoadBalancer 类型的 Service。它能够为应用提供可从集群外部访问的固定 IP 地址。
-
IP 地址分配与管理:负责在指定的 IP 地址范围(IP address pool)内,为 LoadBalancer 类型的 Service 分配 IP 地址,并确保这些 IP 地址的正确映射和管理,使外部流量能够准确地路由到相应的 Kubernetes 服务后端 Pod。
-
提供高可用的网络连接:通过实现 BGP(Border Gateway Protocol)或 Layer2 模式的负载均衡机制,确保即使在节点故障或网络波动的情况下,也能维持应用的外部网络连接的稳定性和可靠性。
配置环境
拉取压缩包并解压:unzip metallb-0.14.8.zip
for i in node{1,2}; do scp metallb-0.14.tar k8s-$i:/root;done
给本地 Kubernetes 安装「LoadBalancer 功能」:docker load -i metallb-0.14.tar
进入目录cd /root/ingress/metallb-0.14.8/config/manifests
创建命名空间kubectl create -f metallb-native.yaml

创建目录:mkdir ippool cd ippool
给 MetalLB 设置一个 "IP 地址池":
cat > IPAddressPool.yaml<<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: planip-pool #这里与下面的L2Advertisement的ip池名称需要一样
namespace: metallb-system
spec:
addresses:
- 192.168.11.170-192.168.11.200 #自定义ip段
EOF
关联IP地址池:
cat >L2Advertisement.yaml<<EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: planip-pool
namespace: metallb-system
spec:
ipAddressPools:
- planip-pool #这里需要跟上面ip池的名称保持一致
EOF
创建:kubectl create -f ./

打开并修改 Nginx 网关的「外网访问方式」:
kubectl -n ingress-nginx edit svc ingress-nginx-controller


验证
vim svc.yml

vim dv1.yaml

kubectl create -f svc.yml
kubectl create -f dv1.yaml
kubectl get svc


删除命名空间使用
