次の方法で共有


イングレス コントローラーに関する一般的な質問または問題のトラブルシューティング

AKS および AGIC のインストールに関する問題をトラブルシューティングするための最も便利な方法は、Azure Cloud Shell です。 shell.azure.com から、または次のリンクを選択して、シェルを起動します。

ヒント

また、「Application Gateway for Containers とは」も参照してください。

簡単な Kubernetes アプリでテストする

以下の手順では、次のことを前提としています。

  • 高度なネットワークが有効になっている AKS クラスターがある
  • AKS クラスターに AGIC がインストールされている
  • お使いの AKS クラスターと共有されている VNET 上に、Application Gateway が既にある

Application Gateway と AKS と AGIC のインストールが正しくセットアップされていることを確認するには、考えられる最も簡単なアプリをデプロイします。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: test-agic-app-pod
  labels:
    app: test-agic-app
spec:
  containers:
  - image: "mcr.microsoft.com/dotnet/samples:aspnetapp"
    name: aspnetapp-image
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: test-agic-app-service
spec:
  selector:
    app: test-agic-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-agic-app-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  ingressClassName: azure-application-gateway
  rules:
    - host: test.agic.contoso.com
      http:
        paths:
          - path: /
            backend:
              serviceName: test-agic-app-service
              servicePort: 80
EOF

前述のスクリプトのすべての行を一度にコピーして、Azure Cloud Shell に貼り付けます。 cat から最後の EOF まで、コマンド全体をコピーしたことを確認します。

apply

アプリが正常にデプロイされると、AKS クラスターに新しいポッド、サービス、イングレスが追加されます。

Cloud Shellkubectl get pods -o wide を使用して、ポッドの一覧を取得します。 IP アドレスを持つ test-agic-app-pod という名前のポッドが作成されているはずです。 このアドレスは、AKS で使用される Application Gateway の VNET 内にある必要があります。

Screenshot of the Bash window in Azure Cloud Shell showing a list of pods that includes test-agic-app-pod in the list.

サービスの一覧を取得します: kubectl get services -o widetest-agic-app-service という名前のサービスが表示されるはずです。

Screenshot of the Bash window in Azure Cloud Shell showing a list of services that includes test-agic-app-pod in the list.

イングレスの一覧を取得します: kubectl get ingresstest-agic-app-ingress という名前のイングレス リソースが作成されているはずです。 リソースのホスト名は test.agic.contoso.com になります。

Screenshot of the Bash window in Azure Cloud Shell showing a list of ingresses that includes test-agic-app-ingress in the list.

ポッドの 1 つは AGIC です。 kubectl get pods によりポッドの一覧が表示され、その 1 つは 'ingress-azure' で始まっています。 kubectl logs <name-of-ingress-controller-pod> を使用してそのポッドのすべてのログを取得し、デプロイが成功したことを確認します。 デプロイが成功すると、ログに次の行が追加されます。

I0927 22:34:51.281437       1 process.go:156] Applied Application Gateway config in 20.461335266s
I0927 22:34:51.281585       1 process.go:165] cache: Updated with latest applied config.
I0927 22:34:51.282342       1 process.go:171] END AppGateway deployment

または、Cloud Shellkubectl logs <ingress-azure-....> | grep 'Applied App Gateway config in' を使用して、Application Gateway の構成が成功したことを示す行のみを取得できます。<ingress-azure....> は、AGIC ポッドの正確な名前です。

Application Gateway には、次の構成が適用されています。

  • リスナー: listener

  • ルーティング規則: routing_rule

  • バックエンド プール:

    • バックエンド アドレス プールには 1 つの IP アドレスがあり、それは前にkubectl get pods -o widebackend_pool で見たポッドの IP アドレスと一致します

最後に、Cloud Shell 内から cURL コマンドを使用して、新しくデプロイされたアプリへの HTTP 接続を確立できます。

  1. kubectl get ingress を使用して、Application Gateway のパブリック IP アドレスを取得します
  2. curl -I -H 'test.agic.contoso.com' <publitc-ip-address-from-previous-command> を使用します

Screenshot of the Bash window in Azure Cloud Shell showing a cURL command successfully establishing an HTTP connection to the test app.

HTTP/1.1 200 OK の結果では、Application Gateway と AKS と AGIC のシステムが想定どおりに動作していることが示されます。

Kubernetes のインストールを調べる

ポッド、サービス、イングレス

Application Gateway イングレス コントローラー (AGIC) では、次の Kubernetes リソースが継続的に監視されます: デプロイまたはポッドサービスイングレス

AGIC が想定どおりに機能するには、次の条件が必要です。

  1. AKS には、1 つ以上の正常なポッドが必要です。 この構成を、Cloud Shellkubectl get pods -o wide --show-labels で確認します。apsnetapp が含まれるポッドがある場合、出力は次のようになります。

    delyan@Azure:~$ kubectl get pods -o wide --show-labels
    
    NAME                   READY   STATUS    RESTARTS   AGE   IP          NODE                       NOMINATED NODE   READINESS GATES   LABELS
    aspnetapp              1/1     Running   0          17h   10.0.0.6    aks-agentpool-35064155-1   <none>           <none>            app=aspnetapp
    
  2. 1 つ以上のサービス。一致する selector ラベルでこれらのポッドを参照します。 この構成を、Cloud Shellkubectl get services -o wide で確認します

    delyan@Azure:~$ kubectl get services -o wide --show-labels
    
    NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR        LABELS
    aspnetapp           ClusterIP   10.2.63.254    <none>        80/TCP    17h   app=aspnetapp   <none>
    
  3. kubernetes.io/ingress.class: azure/application-gateway の注釈が付けられたイングレス。前述のサービスを参照します。 この構成を、Cloud Shellkubectl get ingress -o wide --show-labels で確認します

    delyan@Azure:~$ kubectl get ingress -o wide --show-labels
    
    NAME        HOSTS   ADDRESS   PORTS   AGE   LABELS
    aspnetapp   *                 80      17h   <none>
    
  4. 前述のイングレスの注釈を表示します: kubectl get ingress aspnetapp -o yaml (aspnetapp をお使いのイングレスの名前に置き換えます)

    delyan@Azure:~$ kubectl get ingress aspnetapp -o yaml
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
      name: aspnetapp
    spec:
      backend:
        serviceName: aspnetapp
        servicePort: 80
    

    イングレス リソースには、kubernetes.io/ingress.class: azure/application-gateway で注釈が付けられている必要があります。

監視対象の名前空間を確認する

  • Kubernetes クラスターで既存の名前空間を取得します。 アプリはどのような名前空間で実行されていますか。 その名前空間は AGIC で監視されていますか。 監視対象の名前空間を適切に構成する方法については、複数の名前空間のサポートに関するドキュメントを参照してください。

    # What namespaces exist on your cluster
    kubectl get namespaces
    
    # What pods are currently running
    kubectl get pods --all-namespaces -o wide
    
  • AGIC ポッドは、default 名前空間に存在する必要があります (NAMESPACE 列を参照)。 正常なポッドでは、STATUS 列に Running と表示されます。 少なくとも 1 つの AGIC ポッドが必要です。

    # Get a list of the Application Gateway Ingress Controller pods
    kubectl get pods --all-namespaces --selector app=ingress-azure
    
  • AGIC ポッドが正常でない (前述のコマンドの STATUS 列が Running ではない) 場合は、次のようにします。

    • ログを取得して理由を調べます: kubectl logs <pod-name>
    • ポッドの前のインスタンスのログを取得します: kubectl logs <pod-name> --previous
    • ポッドを説明して詳細なコンテキストを取得します: kubectl describe pod <pod-name>
  • Kubernetes のサービス リソースとイングレス リソースがありますか。

    # Get all services across all namespaces
    kubectl get service --all-namespaces -o wide
    
    # Get all ingress resources across all namespaces
    kubectl get ingress --all-namespaces -o wide
    
  • イングレスには kubernetes.io/ingress.class: azure/application-gateway で注釈が付けられていますか。 AGIC では、この注釈を持つ Kubernetes イングレス リソースのみが監視されます。

    # Get the YAML definition of a particular ingress resource
    kubectl get ingress --namespace  <which-namespace?>  <which-ingress?>  -o yaml
    
  • AGIC では、特定の重大なエラーに対して Kubernetes イベントが出力されます。 これらのイベントを表示できます。

ログ記録のレベル

AGIC には、3 つのログ記録レベルがあります。 レベル 1 は既定で、ログ行数は最小限になります。 一方、レベル 5 では、ARM に適用された構成のサニタイズ済みコンテンツを含むすべてのログが表示されます。

Kubernetes コミュニティでは、kubectl ツール用に 9 レベルのログ記録が確立されています。 このリポジトリでは、セマンティクスが似た次の 3 つのレベルを使用しています。

詳細度 説明
1 既定のログ レベル。スタートアップの詳細、警告、エラーが表示されます
3 イベントと変更に関する拡張情報、作成されたオブジェクトの一覧
5 マーシャリングされたオブジェクトをログに記録します。ARM に適用されたサニタイズ済み JSON 構成が表示されます

詳細レベルは、helm-config.yaml ファイルの verbosityLevel 変数を使用して調整できます。 詳細レベルを 5 に上げると、ARM にディスパッチされた JSON 構成が取得されます。

  • helm-config.yaml 内の 1 行に verbosityLevel: 5 を追加し、再インストールします
  • kubectl logs <pod-name> でログを取得します

サンプルの Helm 構成ファイル

# This file contains the essential configs for the ingress controller helm chart

# Verbosity level of the App Gateway Ingress Controller
verbosityLevel: 3

################################################################################
# Specify which application gateway the ingress controller manages
#
appgw:
    subscriptionId: <subscriptionId>
    resourceGroup: <resourceGroupName>
    name: <applicationGatewayName>

    # Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD.
    # This prohibits AGIC from applying config for any host/path.
    # Use "kubectl get AzureIngressProhibitedTargets" to view and change this.
    shared: false

################################################################################
# Specify which kubernetes namespace the ingress controller watches
# Default value is "default"
# Leaving this variable out or setting it to blank or empty string would
# result in Ingress Controller observing all acessible namespaces.
#
# kubernetes:
#   watchNamespace: <namespace>

################################################################################
# Specify the authentication with Azure Resource Manager
#
# Two authentication methods are available:
# - Option 1: AAD-Pod-Identity (https://github.com/Azure/aad-pod-identity)
armAuth:
    type: aadPodIdentity
    identityResourceID: <identityResourceId>
    identityClientID:  <identityClientId>

## Alternatively you can use Service Principal credentials
# armAuth:
#    type: servicePrincipal
#    secretJSON: <<Generate this value with: "az ad sp create-for-rbac --subscription <subscription-uuid> --role Contributor --sdk-auth | base64 -w0" >>

################################################################################
# Specify if the cluster is Kubernetes RBAC enabled or not
rbac:
    enabled: false # true/false

# Specify aks cluster related information. THIS IS BEING DEPRECATED.
aksClusterConfiguration:
    apiServerAddress: <aks-api-server-address>