イングレス コントローラーに関する一般的な質問または問題のトラブルシューティング
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
まで、コマンド全体をコピーしたことを確認します。
アプリが正常にデプロイされると、AKS クラスターに新しいポッド、サービス、イングレスが追加されます。
Cloud Shellkubectl get pods -o wide
を使用して、ポッドの一覧を取得します。 IP アドレスを持つ test-agic-app-pod という名前のポッドが作成されているはずです。 このアドレスは、AKS で使用される Application Gateway の VNET 内にある必要があります。
サービスの一覧を取得します: kubectl get services -o wide
。 test-agic-app-service という名前のサービスが表示されるはずです。
イングレスの一覧を取得します: kubectl get ingress
。 test-agic-app-ingress という名前のイングレス リソースが作成されているはずです。 リソースのホスト名は test.agic.contoso.com になります。
ポッドの 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 Shell で kubectl logs <ingress-azure-....> | grep 'Applied App Gateway config in'
を使用して、Application Gateway の構成が成功したことを示す行のみを取得できます。<ingress-azure....>
は、AGIC ポッドの正確な名前です。
Application Gateway には、次の構成が適用されています。
リスナー:
ルーティング規則:
バックエンド プール:
- バックエンド アドレス プールには 1 つの IP アドレスがあり、それは前に
kubectl get pods -o wide
で見たポッドの IP アドレスと一致します
- バックエンド アドレス プールには 1 つの IP アドレスがあり、それは前に
最後に、Cloud Shell 内から cURL
コマンドを使用して、新しくデプロイされたアプリへの HTTP 接続を確立できます。
kubectl get ingress
を使用して、Application Gateway のパブリック IP アドレスを取得しますcurl -I -H 'test.agic.contoso.com' <publitc-ip-address-from-previous-command>
を使用します
HTTP/1.1 200 OK
の結果では、Application Gateway と AKS と AGIC のシステムが想定どおりに動作していることが示されます。
Kubernetes のインストールを調べる
ポッド、サービス、イングレス
Application Gateway イングレス コントローラー (AGIC) では、次の Kubernetes リソースが継続的に監視されます: デプロイまたはポッド、サービス、イングレス
AGIC が想定どおりに機能するには、次の条件が必要です。
AKS には、1 つ以上の正常なポッドが必要です。 この構成を、Cloud Shell の
kubectl 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
1 つ以上のサービス。一致する
selector
ラベルでこれらのポッドを参照します。 この構成を、Cloud Shell のkubectl 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>
kubernetes.io/ingress.class: azure/application-gateway
の注釈が付けられたイングレス。前述のサービスを参照します。 この構成を、Cloud Shell のkubectl 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>
前述のイングレスの注釈を表示します:
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 イベントが出力されます。 これらのイベントを表示できます。
- ターミナルでは
kubectl get events --sort-by=.metadata.creationTimestamp
を使用します - ブラウザーでは Kubernetes Web UI (ダッシュボード) を使用します
- ターミナルでは
ログ記録のレベル
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>