この記事では、Azure Kubernetes Service (AKS) のアプリケーション ルーティング アドオンを使用してイングレス コントローラーとイングレス オブジェクトを構成する 2 つの方法について説明します。
- 複数のコントローラーの作成、プライベート ロード バランサーの構成、静的 IP アドレスの設定などの NGINX イングレス コントローラーの構成。
- 注釈を使用したイングレス リソースごとの構成。
前提条件
- アプリケーション ルーティング アドオンが有効になっている AKS クラスター。
-
kubectlAKS クラスターに接続するように構成されています。 詳細については、「 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 $RESOURCE_GROUP --name $CLUSTER_NAME
NGINX イングレス コントローラーの構成プロパティ
アプリケーション ルーティング アドオンは、 と呼ばれる NginxIngressController を使用して、NGINX イングレス コントローラーを構成します。 さらにイングレス コントローラーを作成することも、既存の構成を変更することもできます。
次の表に、 NginxIngressControllerを構成するために設定できるプロパティを示します。
| フィールド | タイプ | 説明 | 必須 | 既定値 |
|---|---|---|---|---|
controllerNamePrefix |
文字列 | マネージド NGINX イングレス コントローラー リソースの名前。 | イエス | nginx |
customHTTPErrors |
アレイ | エラーが発生した場合に既定のバックエンドに送信されるエラー コードの配列。 | いいえ | |
defaultBackendService |
オブジェクト | 一致しない HTTP トラフィックをルーティングするサービス。 入れ子になったプロパティが含まれています。 | いいえ | |
name |
文字列 | サービス名 | イエス | |
namespace |
文字列 | サービス名前空間。 | イエス | |
defaultSSLCertificate |
オブジェクト | 既定のバックエンド サービスにアクセスするための既定の証明書が含まれています。 入れ子になったプロパティが含まれています。 | いいえ | |
forceSSLRedirect |
ブーリアン | 証明書が設定されているときに HTTPS リダイレクトを強制します。 | いいえ | false |
keyVaultURI |
文字列 | 証明書を格納する Key Vault シークレットの URI。 | いいえ | |
secret |
オブジェクト | 既定の SSL 証明書のシークレット情報を保持します。 入れ子になったプロパティが含まれています。 | いいえ | |
name |
文字列 | シークレット名。 | イエス | |
namespace |
文字列 | シークレット名前空間。 | イエス | |
httpDisabled |
ブーリアン | コントローラーへの HTTP トラフィックを無効にするフラグ。 | いいえ | |
ingressClassName |
文字列 | コントローラーで使用される IngressClass 名。 | イエス | nginx.approuting.kubernetes.azure.com |
loadBalancerAnnotations |
オブジェクト | NGINX イングレス コントローラーのサービスの動作を制御するために、ロード バランサーの注釈を設定するアノテーションのマップ。 | いいえ | |
scaling |
オブジェクト | コントローラーをスケーリングするための構成。 入れ子になったプロパティが含まれています。 | いいえ | |
maxReplicas |
整数 | レプリカ数の上限。 | いいえ | 100 |
minReplicas |
整数 | レプリカ数の下限。 | いいえ | 2 |
threshold |
文字列 | どの程度積極的にスケーリングするかを定義する、スケーリングのしきい値。
rapid では突然の急増に対して迅速にスケーリングし、steady ではコスト効率が優先され、balanced はその組み合わせです。 |
いいえ | balanced |
既定の NGINX イングレス コントローラー構成を制御する
NGINX を使用してアプリケーション ルーティング アドオンを有効にすると、一般向けの Azure ロード バランサーを使用して構成された default に、app-routing-namespace と呼ばれるイングレス コントローラーが作成されます。 このイングレス コントローラーは、webapprouting.kubernetes.azure.com のイングレス クラス名を使用します。
既定値がパブリック IP または内部 IP どちらを取得するか、アドオンを有効にするときに作成するかどうかを制御することもできます。
使用可能な構成オプションは次のとおりです。
-
None: 既定の NGINX イングレス コントローラーは作成されず、既に存在する場合は削除されません。 必要に応じて、既定のNginxIngressControllerカスタム リソースを手動で削除する必要があります。 -
Internal: 既定の NGINX イングレス コントローラーは、内部ロード バランサーを使用して作成されます。NginxIngressControllerカスタム リソースを外部にするための注釈の変更は上書きされます。 -
External: 外部ロード バランサーで作成された既定の NGINX イングレス コントローラー。NginxIngressControllerカスタム リソースを内部にするための注釈の変更はすべて上書きされます。 -
AnnotationControlled(既定値): 既定の NGINX イングレス コントローラーは、外部ロード バランサーを使用して作成されます。 既定のNginxIngressControllerカスタム リソースを編集して、ロード バランサーの注釈を構成できます)。
新しいクラスターで既定のイングレス コントローラー構成を制御する
az aks createフラグと--enable-app-routingフラグを指定して--app-routing-default-nginx-controllerコマンドを使用して、新しいクラスターでアプリケーション ルーティングを有効にします。<DefaultIngressControllerType>を、「既定の NGINX イングレス コントローラー構成の制御」で説明されている構成オプションのいずれかに設定する必要があります。az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --location $LOCATION \ --enable-app-routing \ --app-routing-default-nginx-controller <DefaultIngressControllerType>
既存のクラスターで既定のイングレス コントローラーの構成を更新する
az aks approuting updateフラグを指定して--nginxコマンドを使用して、既存のクラスターでアプリケーション ルーティングの既定のイングレス コントローラー構成を更新します。<DefaultIngressControllerType>を、「既定の NGINX イングレス コントローラー構成の制御」で説明されている構成オプションのいずれかに設定する必要があります。az aks approuting update \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --nginx <DefaultIngressControllerType>
別の一般向けの NGINX イングレス コントローラーを作成する
次の YAML マニフェストを
nginx-public-controller.yamlという名前の新しいファイルにコピーし、ローカル コンピューターに保存します。apiVersion: approuting.kubernetes.azure.com/v1alpha1 kind: NginxIngressController metadata: name: nginx-public spec: ingressClassName: nginx-public controllerNamePrefix: nginx-publickubectl applyコマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-public-controller.yaml次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
プライベート IP アドレスを持つ内部 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 イングレス コントローラーを作成する
az group createコマンドを使用して、Azure リソース グループを作成します。az group create --name $NETWORK_RESOURCE_GROUP --location $LOCATIONaz network public ip createコマンドを使用して静的パブリック IP アドレスを作成します。az network public-ip create \ --resource-group $NETWORK_RESOURCE_GROUP \ --name $PUBLIC_IP_NAME \ --sku Standard \ --allocation-method staticNote
AKS クラスターで Basic SKU ロード バランサーを使用している場合は、パブリック IP を定義するときに、
Basicパラメーターに--skuを使用します。BasicSKU IP のみが Basic SKU ロード バランサーで動作し、StandardSKU ロード バランサーで動作する SKU IP はのみです。az role assignment createコマンドを使用して、AKS クラスターで使用されるクラスター ID に、パブリック IP のリソース グループへの委任されたアクセス許可が含まれていることを確認してください。CLIENT_ID=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query identity.principalId -o tsv) RG_SCOPE=$(az group show --name $NETWORK_RESOURCE_GROUP --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注釈を追加すると、最も効率的なロードバランサーの作成を可能にし、潜在的なスロットリングを回避するために強く推奨されます。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: "$PUBLIC_IP_NAME" service.beta.kubernetes.io/azure-load-balancer-resource-group: "$NETWORK_RESOURCE_GROUP"kubectl applyコマンドを使用して NGINX イングレス コントローラー リソースを作成します。kubectl apply -f nginx-staticip-controller.yaml次の出力例では、作成されたリソースが示されています。
nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
イングレス コントローラーが作成されたことを確認する
kubectl get nginxingresscontrollerコマンドを使用して、NGINX イングレス コントローラーの状態を確認します。kubectl get nginxingresscontroller --name $INGRESS_CONTROLLER_NAME次の出力例では、作成されたリソースが示されています。 コントローラーが使用可能になるまでに数分かかる場合があります。
NAME INGRESSCLASS CONTROLLERNAMEPREFIX AVAILABLE nginx-public nginx-public nginx True
イングレス コントローラーの条件を表示する
kubectl get nginxingresscontrollerコマンドを使用して、イングレス コントローラーの条件を表示して問題のトラブルシューティングを行います。kubectl get nginxingresscontroller --name $INGRESS_CONTROLLER_NAME -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: Prefixkubectl applyコマンドを使ってクラスター リソースを作成します。kubectl apply -f ingress.yaml --namespace hello-web-app-routing次の出力例では、作成されたリソースが示されています。
ingress.networking.k8s.io/aks-helloworld created
マネージド イングレスが作成されたことを確認する
kubectl get ingressコマンドを使用して、マネージド イングレスが作成されたことを確認します。kubectl get ingress --namespace hello-web-app-routing出力は、次の出力例のようになります。
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 イングレス コントローラーを削除します。kubectl delete nginxingresscontroller --name $INGRESS_CONTROLLER_NAME
注釈を使用したイングレス リソースごとの構成
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などの代替バックエンド プロトコルを構成するには、次のいずれかの注釈を使用します。
# HTTPS annotation
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
# GRPC annotation
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
NGINX 正常性チェック パスのアップデート
NGINX イングレス コントローラーに関連付けられている Azure Load Balancer の既定の正常性プローブ パスは、 "/healthz"に設定する必要があります。 正しい正常性チェックを行うために、イングレス コントローラー サービスに次の注釈があることを確認します。
metadata:
annotations:
service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: "/healthz"
Helm を使用して NGINX イングレス コントローラーを管理している場合は、Azure Load Balancer の正常性プローブ注釈を値ファイルに定義し、アップグレード中に適用できます。
controller:
service:
annotations:
service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: "/healthz"
この構成は、サービスの可用性を維持し、アップグレード中の予期しないトラフィックの中断を回避するのに役立ちます。
次のステップ
アプリケーションのパフォーマンスと使用状況の分析の一環として、Grafana で Prometheus を使用して、アプリケーション ルーティング アドオンに含まれる ingress-nginx コントローラー メトリックを監視する方法についてご確認ください。
Azure Kubernetes Service