アプリケーション ルーティング アドオンを使用した高度な NGINX イングレス コントローラーとイングレスの構成
アプリケーション ルーティング アドオンでは、イングレス コントローラーとイングレス オブジェクトを構成する 2 つの方法がサポートされています。
- 複数のコントローラーの作成、プライベート ロード バランサーの構成、静的 IP アドレスの設定などの NGINX イングレス コントローラーの構成。
- 注釈を使用したイングレス リソースごとの構成。
前提条件
アプリケーション ルーティング アドオンでの AKS クラスター。
ご利用の AKS クラスターに接続する
お使いのローカル コンピューターから Kubernetes クラスターに接続するには、kubectl
(Kubernetes コマンドライン クライアント) を使用します。 az aks install-cli コマンドを使用してローカルにインストールできます。 Azure Cloud Shell を使用している場合、kubectl
は既にインストールされています。
az aks get-credentials
コマンドを使って Kubernetes クラスターに接続するように、kubectl を構成します。
az aks get-credentials -resource-group <ResourceGroupName> --name <ClusterName>
NGINX イングレス コントローラーの構成
アプリケーション ルーティング アドオンは、NginxIngressController
と呼ばれる Kubernetes カスタム リソース定義 (CRD) を使用して、NGINX イングレス コントローラーを構成します。 より多くのイングレス コントローラーを作成することも、既存の構成を変更することもできます。
NginxIngressController
CRD には、ロード バランサーの注釈を設定することで NGINX イングレス コントローラーのサービスの動作を制御する loadBalancerAnnotations
フィールドがあります。
既定の NGINX イングレス コントローラー
NGINX を使用してアプリケーション ルーティング アドオンを有効にすると、一般向けの Azure ロード バランサーを使用して構成された app-routing-namespace
に、default
と呼ばれるイングレス コントローラーが作成されます。 このイングレス コントローラーは、webapprouting.kubernetes.azure.com
のイングレス クラス名を使用します。
別の一般向けの NGINX イングレス コントローラーを作成する
一般向けの Azure Load Balancer を使用して別の NGINX イングレス コントローラーを作成するには:
次の YAML マニフェストを nginx-public-controller.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。
apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-public spec: ingressClassName: nginx-public controllerNamePrefix: nginx-public
kubectl apply
コマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-public-controller.yaml
次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
プライベート IP アドレスを持つ内部 NGINX イングレス コントローラーを作成する
プライベート IP アドレスを持つ内部接続の Azure Load Balancer を使用して NGINX イングレス コントローラーを作成するには:
次の YAML マニフェストを nginx-internal-controller.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。
apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-internal spec: ingressClassName: nginx-internal controllerNamePrefix: nginx-internal loadBalancerAnnotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true"
kubectl apply
コマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-internal-controller.yaml
次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
静的 IP アドレスを使用して NGINX イングレス コントローラーを作成する
Azure Load Balancer で静的 IP アドレスを使用して NGINX イングレス コントローラーを作成するには:
az group create
コマンドを使用して、Azure リソース グループを作成します。az group create --name myNetworkResourceGroup --location eastus
az network public ip create
コマンドを使用して静的パブリック IP アドレスを作成します。az network public-ip create \ --resource-group myNetworkResourceGroup \ --name myIngressPublicIP \ --sku Standard \ --allocation-method static
Note
AKS クラスターで Basic SKU ロード バランサーを使用している場合は、パブリック IP を定義するときに パラメーターに Basic
--sku
を使用します。 Basic SKU IP のみが Basic SKU ロード バランサーで動作し、Standard SKU IP のみが Standard SKU ロード バランサーで動作します。[
az role assignment create
][az-role-assignment-create] コマンドを使用して、AKS クラスターで使用されるクラスター ID に、パブリック IP のリソース グループへの委任されたアクセス許可が含まれていることを確認してください。Note
<ClusterName>
と<ClusterResourceGroup>
を AKS クラスターの名前とリソース グループ名で更新します。CLIENT_ID=$(az aks show --name <ClusterName> --resource-group <ClusterResourceGroup> --query identity.principalId -o tsv) RG_SCOPE=$(az group show --name myNetworkResourceGroup --query id -o tsv) az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
次の YAML マニフェストを nginx-staticip-controller.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。
Note
YAML 例のように、パブリック IP 名に
service.beta.kubernetes.io/azure-pip-name
を使用するか、IPv4 アドレスにはservice.beta.kubernetes.io/azure-load-balancer-ipv4
、IPv6 アドレスにはservice.beta.kubernetes.io/azure-load-balancer-ipv6
を使用できます。service.beta.kubernetes.io/azure-pip-name
注釈を追加することで、最も効率的な LoadBalancer が確実に作成されます。調整の可能性があるため、それを回避するために強く推奨されます。apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-static spec: ingressClassName: nginx-static controllerNamePrefix: nginx-static loadBalancerAnnotations: service.beta.kubernetes.io/azure-pip-name: "myIngressPublicIP" service.beta.kubernetes.io/azure-load-balancer-resource-group: "myNetworkResourceGroup"
kubectl apply
コマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-staticip-controller.yaml
次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
イングレス コントローラーが作成されたことを確認する
kubectl get nginxingresscontroller
コマンドを使用して、NGINX イングレス コントローラーの状態を検証できます。
Note
'NginxIngressController' の作成時に使用した名前で <IngressControllerName>
を更新します。
kubectl get nginxingresscontroller -n <IngressControllerName>
次の出力例では、作成されたリソースが示されています。 コントローラーが使用可能になるまでに数分かかる場合があります。
NAME INGRESSCLASS CONTROLLERNAMEPREFIX AVAILABLE
nginx-public nginx-public nginx True
問題のトラブルシューティングを行う条件を表示することもできます。
kubectl get nginxingresscontroller -n <IngressControllerName> -o jsonpath='{range .items[*].status.conditions[*]}{.lastTransitionTime}{"\t"}{.status}{"\t"}{.type}{"\t"}{.message}{"\n"}{end}'
次の出力例では、正常なイングレス コントローラーの状態が示されています。
2023-11-29T19:59:24Z True IngressClassReady Ingress Class is up-to-date
2023-11-29T19:59:50Z True Available Controller Deployment has minimum availability and IngressClass is up-to-date
2023-11-29T19:59:50Z True ControllerAvailable Controller Deployment is available
2023-11-29T19:59:25Z True Progressing Controller Deployment has successfully progressed
イングレスでイングレス コントローラーを使用する
次の YAML マニフェストを ingress.yaml という名前の新しいファイルにコピーし、ファイルをローカル コンピューターに保存します。
Note
<Hostname>
を DNS ホスト名で更新します。<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: aks-helloworld namespace: hello-web-app-routing spec: ingressClassName: <IngressClassName> rules: - host: <Hostname> http: paths: - backend: service: name: aks-helloworld port: number: 80 path: / pathType: Prefix
kubectl apply
コマンドを使ってクラスター リソースを作成します。kubectl apply -f ingress.yaml -n hello-web-app-routing
次の出力例では、作成されたリソースが示されています。
ingress.networking.k8s.io/aks-helloworld created
マネージド イングレスが作成されたことを確認する
マネージド イングレスが作成されたことは、kubectl get ingress
コマンドを使って確認できます。
kubectl get ingress -n hello-web-app-routing
次の出力例では、作成されたマネージド イングレスが示されています。 イングレス クラス、ホスト、IP アドレスは異なる場合があります。
NAME CLASS HOSTS ADDRESS PORTS AGE
aks-helloworld webapprouting.kubernetes.azure.com myapp.contoso.com 20.51.92.19 80, 443 4m
イングレス コントローラーをクリーンアップする
kubectl delete nginxingresscontroller
コマンドを使用して NGINX イングレス コントローラーを削除できます。
Note
NginxIngressController
の作成時に使用した名前で <IngressControllerName>
を更新します。
kubectl delete nginxingresscontroller -n <IngressControllerName>
注釈を使用したイングレス リソースごとの構成
NGINX イングレス コントローラーでは、特定のイングレス オブジェクトへの注釈の追加による動作のカスタマイズがサポートされています。
metadata.annotations
フィールドにそれぞれの注釈を追加すると、イングレス オブジェクトに注釈を設定できます。
Note
注釈キーおよび値には文字列のみを使用できます。 ブール値や数値などのその他の型は引用符で囲む必要があります (つまり、"true"
、"false"
、"100"
)。
一般的な構成の注釈の例を次に示します。 完全なリストについては、「NGINX イングレスの注釈のドキュメント」を確認してください。
カスタムの最大本文サイズ
NGINX の場合、要求のサイズがクライアントの要求本文の最大許容サイズを超えると、クライアントに 413 エラーが返されます。 既定値をオーバーライドするには、注釈を使用します。
nginx.ingress.kubernetes.io/proxy-body-size: 4m
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 4m
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
カスタム接続タイムアウト
NGINX イングレス コントローラーがワークロードとの接続を閉じるのを待機するタイムアウトを変更できます。 タイムアウト値はすべて、単位が付けられていません (秒単位)。 既定のタイムアウトをオーバーライドするには、次の注釈を使用して有効な 120 秒のプロキシ読み取りタイムアウトを設定します。
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
その他の構成オプションについては、「カスタム タイムアウト」を確認してください。
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
バックエンド プロトコル
既定では、NGINX イングレス コントローラーは HTTP
を使用してサービスに到達します。 HTTPS
や GRPC
などの代替バックエンド プロトコルを構成するには、次の注釈を使用します。
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
または
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
その他の構成オプションについては、「バックエンド プロトコル」を確認してください。
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
クロスオリジン リソース共有 (CORS)
イングレス ルールでクロス オリジン リソース共有 (CORS) を有効にするには、次の注釈を使用します。
nginx.ingress.kubernetes.io/enable-cors: "true"
その他の構成オプションについては、「CORS を有効にする」を確認してください。
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
SSL リダイレクトを無効にする
既定では、イングレスに対して TLS が有効になっている場合、コントローラーは (308) を HTTPS にリダイレクトします。 特定のイングレス リソースに対してこの機能を無効にするには、次の注釈を使用します。
nginx.ingress.kubernetes.io/ssl-redirect: "false"
その他の構成オプションについては、「リダイレクトを使用した サーバー側の HTTPS の適用」を確認してください。
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
URL リライト
一部のシナリオでは、バックエンド サービスで公開されている URL がイングレス ルールに指定されたパスと異なります。 再書き込みがない場合、要求は 404 を返します。 これは、同じドメインの下で 2 つの異なる Web アプリケーションを処理できるパス ベースのルーティングの場合に特に便利です。 次の注釈を使用して、サービスで想定されるパスを設定できます。
nginx.ingress.kubernetes.io/rewrite-target": /$2
この注釈を使用したイングレス構成の例を次に示します。
Note
<Hostname>
を DNS ホスト名で更新します。
<IngressClassName>
は、NginxIngressController
の作成時に定義したものです。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: <IngressClassName>
rules:
- host: <Hostname>
http:
paths:
- path: /app-one(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-one
port:
number: 80
- path: /app-two(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-two
port:
number: 80
次のステップ
アプリケーションのパフォーマンスと使用状況の分析の一環として、Grafana で Prometheus を使用して、アプリケーション ルーティング アドオンに含まれる ingress-nginx コントローラー メトリックを監視する方法についてご確認ください。