本文介紹如何解決資料面Kubernetes叢集中的Pod無法訪問入口網關的CLB地址的問題。
問題現象
Service MeshASM已添加Kubernetes叢集,並且使用Local類型的負載平衡CLB部署入口網關。當應用Pod訪問入口網關暴露的CLB地址時,出現以下問題:
部分節點上的Pod能訪問入口網關暴露的CLB地址。
部分節點上的Pod不能訪問入口網關暴露的CLB地址。
問題原因
如果Kubernetes叢集的服務配置了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