次の方法で共有


カスタム ネットワーク セキュリティ グループがトラフィックをブロックする

Azure Kubernetes Service (AKS) クラスターでホストされているアプリケーションにアクセスすると、"タイムアウト" エラー メッセージが表示されます。 このエラーは、アプリケーションが実行されていて、残りの構成が正しいと思われる場合でも発生する可能性があります。

前提条件

  • Kubernetes kubectl ツール、または同様のツールを使用してクラスターに接続します。 Azure CLI を使用して kubectl をインストールするには、az aks install-cli コマンドを実行します。

  • クライアント URL (cURL) ツール、または同様のコマンド ライン ツール。

  • パッケージを処理するための apt-get コマンドライン ツール。

現象

次の kubectl get および cURL コマンドを実行すると、次のコンソール出力のような "タイムアウト" エラーが発生します。

$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-66648877fc-v78jm   1/1     Running   0          5m53s

$ kubectl get service
NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
my-loadbalancer-service   LoadBalancer   10.0.107.79   10.81.x.x   80:31048/TCP   4m14s

$ curl -Iv http://10.81.124.39  # Use an IP address that fits the "EXTERNAL-IP" pattern.
*   Trying 10.81.x.x:80...
* connect to 10.81.x.x port 80 failed: Timed out
* Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out
* Closing connection 0
curl: (28) Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out

原因

毎回同じ "タイムアウト" エラーが発生する場合は、通常、ネットワーク コンポーネントがトラフィックをブロックしていることを示します。

この問題をトラブルシューティングするには、まずポッドへのアクセスを確認してから、アプローチでクライアントに移動します。

ポッドを確認するには、次の kubectl get を実行し、 kubectl describe コマンドを実行します。

$ kubectl get pods -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE                               
my-deployment-66648877fc-v78jm   1/1     Running   0          53s   172.25.0.93   aks-agentpool-42617579-vmss000000

$ kubectl describe pod my-deployment-66648877fc-v78jm  # Specify the pod name from the previous command.
...
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  117s  default-scheduler  Successfully assigned default/my-deployment-66648877fc-v78jm to aks-agentpool-42617579-vmss000000
  Normal  Pulling    116s  kubelet            Pulling image "httpd"
  Normal  Pulled     116s  kubelet            Successfully pulled image "httpd" in 183.532816ms
  Normal  Created    116s  kubelet            Created container webserver
  Normal  Started    116s  kubelet            Started container webserver

この出力に基づいて、ポッドは再起動なしで正常に実行されているようです。

テスト ポッドを開いて、アプリケーション ポッドへのアクセスを確認します。 次の kubectl getkubectl runapt-get、および cURL コマンドを実行します。

$ kubectl get pods -o wide  # Get the pod IP address.
NAME                             READY   STATUS    RESTARTS   AGE     IP            NODE                                
my-deployment-66648877fc-v78jm   1/1     Running   0          7m45s   172.25.0.93   aks-agentpool-42617579-vmss000000  

$ kubectl run -it --rm aks-ssh --image=debian:stable  # Launch the test pod.
If you don't see a command prompt, try pressing enter.
$ root@aks-ssh:

$ # Install packages inside the test pod.
$ root@aks-ssh: apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
...
...
Running hooks in /etc/ca-certificates/update.d...
done.

$ # Try to check access to the pod using the pod IP address from the "kubectl get" output.
$ curl -Iv http://172.25.0.93
*   Trying 172.25.0.93:80...
* Connected to 172.25.0.93 (172.25.0.93) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 172.25.0.93 left intact

ポッドには直接アクセスできます。 そのため、アプリケーションが実行されています。

定義されたサービスは LoadBalancer 型です。 つまり、エンド クライアントからポッドへの要求フローは次のようになります。

アプリケーション ポッド>> AKS ノード>>クライアント >> ロード バランサー

この要求フローでは、次のコンポーネントを介してトラフィックをブロックできます。

  • クラスター内のネットワーク ポリシー
  • AKS サブネットと AKS ノードのネットワーク セキュリティ グループ (NSG)

ネットワーク ポリシーを確認するには、次の kubectl get コマンドを実行します。

$ kubectl get networkpolicy --all-namespaces
NAMESPACE     NAME                 POD-SELECTOR             AGE
kube-system   konnectivity-agent   app=konnectivity-agent   3h8m

AKS の既定のポリシーのみが存在します。 そのため、ネットワーク ポリシーがトラフィックをブロックしていないようです。

AKS を使用して NSG とそれに関連付けられているルールを確認するには、次の手順に従います。

  1. Azure ポータルで仮想マシン スケール セット検索して選択

  2. スケール セット インスタンスの一覧で、使用しているインスタンスを選択します。

  3. スケール セット インスタンスのメニュー ウィンドウで、 Networkingを選択します。

スケール セット インスタンスの [ネットワーク] ページが表示されます。 [バインド ポート規則] タブには、スケール セット インスタンスに対して動作する 2 つの NSG に基づく 2 つのルール セットが表示されます。

  • 最初のセットは、サブネット レベルの NSG ルールで構成されます。 これらのルールは、次の注見出しの下に表示されます。

    ネットワーク セキュリティ グループ <my-aks-nsg> (サブネットにアタッチ: <my-aks-subnet>)

    この配置は、AKS クラスターのカスタム仮想ネットワークとカスタム サブネットが使用される場合に一般的です。 サブネット レベルの規則のセットは、次の表のようになります。

    Priority 名前 [ポート] プロトコル ソース Destination (公開先) アクション
    65000 AllowVnetInBound Any Any VirtualNetwork VirtualNetwork Allow
    65001 AllowAzureLoadBalancerInBound Any Any AzureLoadBalancer Any Allow
    65500 DenyAllInBound Any Any Any Any 拒否
  • 2 つ目のセットは、ネットワーク アダプター レベルの NSG ルールで構成されます。 これらのルールは、次の注見出しの下に表示されます。

    ネットワーク セキュリティ グループ aks-agentpool-<agentpool-number>-nsg (ネットワーク インターフェイスに接続: aks-agentpool-<vm-scale-set-number>-vmss)

    この NSG は AKS クラスターによって適用され、AKS によって管理されます。 対応するルールのセットは、次の表のようになります。

    Priority 名前 [ポート] プロトコル ソース Destination (公開先) 操作
    500 <guid>-TCP-80-Internet 80 TCP Internet 10.81.x.x 許可
    65000 AllowVnetInBound Any Any VirtualNetwork VirtualNetwork Allow
    65001 AllowAzureLoadBalancerInBound Any Any AzureLoadBalancer Any Allow
    65500 DenyAllInBound Any Any Any Any 拒否

ネットワーク アダプター レベルでは、IP アドレス 10.81. の TCP の NSG 受信規則がありますx.x ポート 80 (表で強調表示されています)。 ただし、サブネット レベルの NSG の規則には、同等の規則がありません。

AKS がカスタム NSG に規則を適用しなかったのはなぜですか? AKS はそのサブネットに NSG を適用せず、そのサブネットに関連付けられている NSG を変更しないためです。 AKS は、ネットワーク アダプター レベルでのみ NSG を変更します。 詳細については、「 NSG を AKS で構成できますか?」を参照してください。

ソリューション

アプリケーションで特定のポートへのアクセスが有効になっている場合は、カスタム NSG によってそのポートが Inbound 規則として許可されていることを確認する必要があります。 サブネット レベルでカスタム NSG に適切な規則が追加されると、アプリケーションにアクセスできます。

$ curl -Iv http://10.81.x.x
*   Trying 10.81.x.x:80...
* Connected to 10.81.x.x (10.81.x.x) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 10.81.x.x left intact

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。