このトピックでは、データプレーン上の Kubernetes クラスターのポッドが、イングレスゲートウェイで設定されている Classic Load Balancer(CLB)インスタンスの IP アドレスにアクセスできない問題を解決する方法について説明します。
問題の説明
Kubernetes クラスターが Service Mesh(ASM)インスタンスに追加されています。externalTrafficPolicy パラメーターが Local に設定されている CLB インスタンスが、ASM インスタンスのイングレスゲートウェイで設定されています。Kubernetes クラスターのポッドが、イングレスゲートウェイで設定されている CLB インスタンスの IP アドレスにアクセスすると、次の問題が発生します。
特定のノード上のポッドは、エントリゲートウェイによって公開されている CLB アドレスにアクセスできます。
特定のノード上のポッドは、エントリゲートウェイによって公開されている CLB アドレスにアクセスできません。
原因
externalTrafficPolicy
パラメーターが Local に設定されている CLB インスタンスが Kubernetes クラスターのイングレスゲートウェイサービスに指定されている場合、サービスがデプロイされているバックエンドポッドのみが CLB インスタンスの IP アドレスにアクセスできます。これは、CLB インスタンスの IP アドレスがサービスの外部 IP アドレスと見なされ、Kubernetes クラスターの外部からイングレスゲートウェイにアクセスするために使用されるためです。Kubernetes クラスター内のノードとポッドが CLB インスタンスの IP アドレスに直接アクセスできない場合、システムは CLB インスタンスへのリクエストをルーティングしません。代わりに、リクエストは iptables モードまたは IP Virtual Server(IPVS)モードの kube-proxy によって転送されます。
サービスのバックエンドポッドが Kubernetes クラスターのノード、またはリクエストを送信するポッドが存在するノードにデプロイされていない場合、CLB インスタンスの IP アドレスにはアクセスできません。サービスのバックエンドポッドがデプロイされている場合、CLB インスタンスの IP アドレスにアクセスできます。詳細については、「Why kube-proxy add external-lb's address to node local iptables rule?」をご参照ください。
解決策
Kubernetes クラスターの IP アドレス、またはイングレスゲートウェイサービスの名前を使用して、Kubernetes クラスター内から CLB インスタンスの IP アドレスにアクセスできます。イングレスゲートウェイサービスの名前は istio-ingressgateway.istio-system です。
説明この解決策を使用することをお勧めします。
送信元 IP アドレスが不要な場合は、次の解決策を使用できます。
イングレスゲートウェイの
externalTrafficPolicy
パラメーターの値をCluster
に変更します。この場合、CLB インスタンスの IP アドレスにアクセスするときに送信元 IP アドレスを取得できません。詳細については、「ゲートウェイの CRD フィールド」をご参照ください。apiVersion: istio.alibabacloud.com/v1beta1 kind: IstioGateway metadata: name: ingressgateway namespace: istio-system .... spec: externalTrafficPolicy: Cluster ....
Terway の Elastic Network Interface(ENI)を使用している場合、またはクラスターが包括的 ENI モードになっている場合は、次の解決策を使用できます。この解決策では、送信元 IP アドレスを失うことなく、Kubernetes クラスター内から CLB インスタンスの IP アドレスにアクセスできます。
イングレスゲートウェイの
externalTrafficPolicy
パラメーターの値をCluster
に変更し、serviceAnnotations: service.beta.kubernetes.io/backend-type: eni
などのアノテーションを追加して、ENI に直接接続します。詳細については、「ゲートウェイの 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