本文介紹如何解決數據面Kubernetes集群中的Pod無法訪問入口網關的CLB地址的問題。
問題現象
服務網格ASM已添加Kubernetes集群,并且使用Local類型的負載均衡CLB部署入口網關。當應用Pod訪問入口網關暴露的CLB地址時,出現以下問題:
部分節點上的Pod能訪問入口網關暴露的CLB地址。
部分節點上的Pod不能訪問入口網關暴露的CLB地址。
問題原因
如果Kubernetes的Service配置了externalTrafficPolicy: Local
,則只有從部署了服務后端Pod的節點才能訪問CLB。由于CLB地址僅在集群外使用,如果從集群節點或Pod不能直接訪問CLB地址,請求不會路由到負載均衡,而是被當作服務的擴展IP地址,被kube-proxy的iptables或IPVS轉發。
如果集群節點或者Pod所在的節點上沒有相應的后端服務Pod,就會發生網絡不通的問題。而如果有相應的后端服務Pod,則可以正常訪問CLB地址。更多信息,請參見iptables規則。
解決方案
您可以在Kubernetes集群內通過ClusterIP或者服務名訪問CLB地址。其中入口網關的服務名為istio-ingressgateway.istio-system。
說明推薦使用該方法。
如果您不需要源IP,您可以使用以下方法。
將入口網關服務中的
externalTrafficPolicy
修改為Cluster
,但是在應用中會丟失源IP。關于修改入口網關的更多信息,請參見ASM網關CRD說明。apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: name: ingressgateway namespace: istio-system .... spec: externalTrafficPolicy: Cluster ....
如果您使用的是Terway的ENI或者ENI多IP集群,您可以使用以下方法。該方法不會丟失源IP,也支持在集群內訪問CLB地址。
將入口網關服務中的
externalTrafficPolicy
修改為Cluster
,并且添加ENI直通的Annotation,例如serviceAnnotations: service.beta.kubernetes.io/backend-type: eni
。關于修改入口網關的更多信息,請參見ASM網關CRD說明。apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: name: ingressgateway namespace: istio-system .... spec: externalTrafficPolicy: Cluster maxReplicas: 5 minReplicas: 2 ports: - name: status-port port: 15020 targetPort: 15020 - name: http2 port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 - name: tls port: 15443 targetPort: 15443 replicaCount: 2 resources: limits: cpu: '2' memory: 2G requests: cpu: 200m memory: 256Mi runAsRoot: false serviceAnnotations: service.beta.kubernetes.io/backend-type: eni serviceType: LoadBalancer