我有一个内部部署的 k8s 集群,有 3 个 master 和 4 个 worker。安装了 Metallb,并从与本地集群 IP 相同的网络为他提供了 DHCP。
我尝试在集群中启动 Kubernetes Dashboard 应用程序,除 Kubernetes Dashboard 的 LoadBalancer 服务类型外,一切正常:
apiVersion: v1
metadata:
annotations:
metallb.universe.tf/address-pool: single-ip
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
externalIPs:
- 192.168.1.129
root@master1:/# kubectl get services -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.249.40.230 <none> 8000/TCP 6h8m
kubernetes-dashboard LoadBalancer 10.249.3.22 192.168.1.129 443:32593/TCP 6h8m
应用所有配置后,仪表板开始在 https://192.168.1.129 从群集和我的计算机正确工作。
但是在一段时间后停止在我的电脑上工作,但继续在集群上工作。从我的电脑我得到“连接被拒绝错误”。
从我的电脑和集群 192.168.1.129 IP 正常 ping 没有任何问题。
externalTrafficPolicy 默认为 Cluster。将其更改为本地没有帮助。
发生什么事了?服务工作然后停止工作然后再次开始工作时如何解决问题? :)
我让它再次工作的一种方法是更改 MetalLB 配置中的值以重新加载它。
编辑:
将
externalTrafficPolicy
从Local
更改为Cluster
后,对我来说似乎很稳定。
根据文档:https://metallb.universe.tf/usage/
Layer2 在 layer2 模式下发布时,集群中的一个节点将 为服务IP吸引流量。从那里,行为取决于 在选定的流量策略上。
“Cluster”流策略使用默认的Cluster流策略, 接收流量的节点上的 kube-proxy 做负载均衡, 并将流量分配给您服务中的所有 Pod。
此策略导致在所有 pod 中统一流量分配 服务。但是kube-proxy会隐藏源IP地址 进行负载平衡时的连接,因此您的 pod 日志将显示 外部流量似乎来自服务的领导者 节点。
“Local”流量策略 有了 Local 流量策略,kube-proxy on 接收流量的节点仅将其发送到服务的 位于同一节点上的 pod。没有“水平”流量 节点之间的流动。
因为kube-proxy不需要在集群节点之间发送流量, 您的 Pod 可以看到传入连接的真实源 IP 地址。
此策略的缺点是传入流量仅流向某些 服务中的豆荚。不在当前领导节点上的 Pod 没有流量,它们只是作为副本存在,以防故障转移 是需要的。