Kubernetes集群中訪問LoadBalancer暴露出去的SLB地址不通
更新時間:
問題描述
在Kubernetes集群中有部分節點能訪問集群暴露出去的Local類型SLB,但是也有部分節點不能訪問,且Ingress出現該問題較多。
問題原因
SLB設置了externalTrafficPolicy: Local
類型,這種類型的SLB地址只有在Node中部署了對應的后端Pod,才能被訪問。因為SLB的地址是集群外使用,如果集群節點和Pod不能直接訪問,請求不會到SLB,會被當作Service的擴展IP地址,被kube-proxy的iptables或ipvs轉發。
如果剛好集群節點或者Pod所在的節點上沒有相應的后端服務Pod,就會發生網絡不通的問題,而如果有相應的后端服務Pod,是可以正常訪問。相關問題的更多信息請參見kube-proxy將external-lb的地址添加到節點本地iptables規則。
解決方案
阿里云提醒您:
- 如果您對實例或數據有修改、變更等風險操作,務必注意實例的容災、容錯能力,確保數據安全。
- 如果您對實例(包括但不限于ECS、RDS)等進行配置與數據修改,建議提前創建快照或開啟RDS日志備份等功能。
- 如果您在阿里云平臺授權或者提交過登錄賬號、密碼等安全信息,建議您及時修改。
若出現該問題,可以參見以下方法解決問題,推薦您使用第一種方法:
- 在Kubernetes集群內通過ClusterIP或者服務名訪問。
其中Ingress的服務名為:nginx-ingress-lb.kube-system
- 將LoadBalancer的Service中的externalTrafficPolicy修改為Cluster,但是在應用中會丟失源IP,Ingress的服務修改命令如下。
說明:若是Ingress的SLB,只有Ingress的Pod所在節點上,Pod才能訪問通過Ingress或SLB暴露出去的服務。
- 修改Ingress上的svc為Cluster類型,集群會進行SNAT,Ingress的Pod不在的節點上也可以訪問Ingress或SLB暴露出去的服務,后端應用無法獲取客戶端真實IP地址。
kubectl edit svc nginx-ingress-lb -n kube-system
- 若是Terway的ENI或者ENI多IP的集群,將LoadBalancer的Service中的externalTrafficPolicy修改為Cluster,并且添加ENI直通的annotation,例如
annotation: service.beta.kubernetes.io/backend-type:"eni"
,具體格式如下,可以保留源IP,并且在集群內訪問也沒有問題。詳細信息請參見通過負載均衡(Server Load Balancer)訪問服務。apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/backend-type: eni
labels:
app: nginx-ingress-lb
name: nginx-ingress-lb
namespace: kube-system
spec:
externalTrafficPolicy: Cluster
適用于
- 容器服務Kubernetes版
說明:請在升級到Kubernetes V1.14之前檢查下是否做了對應配置,排除升級后出現該問題的風險。
文檔內容是否對您有幫助?