次の方法で共有


Azure Kubernetes Service (AKS) 用のアプリケーション ルーティング アドオンを使用した高度な NGINX イングレス コントローラーとイングレス構成

この記事では、Azure Kubernetes Service (AKS) のアプリケーション ルーティング アドオンを使用してイングレス コントローラーとイングレス オブジェクトを構成する 2 つの方法について説明します。

前提条件

ご利用の 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 イングレス コントローラーを作成する

  1. 次の YAML マニフェストを nginx-public-controller.yaml という名前の新しいファイルにコピーし、ローカル コンピューターに保存します。

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. kubectl apply コマンドを使用して NGINX イングレス コントローラー リソースを作成します。

    kubectl apply -f nginx-public-controller.yaml
    

    次の出力例では、作成されたリソースが示されています。

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
    

プライベート IP アドレスを持つ内部 NGINX イングレス コントローラーを作成する

  1. 次の 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"
    
  2. kubectl apply コマンドを使用して NGINX イングレス コントローラー リソースを作成します。

    kubectl apply -f nginx-internal-controller.yaml
    

    次の出力例では、作成されたリソースが示されています。

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    

静的 IP アドレスを使用して NGINX イングレス コントローラーを作成する

  1. az group create コマンドを使用して、Azure リソース グループを作成します。

    az group create --name $NETWORK_RESOURCE_GROUP --location $LOCATION
    
  2. az network public ip create コマンドを使用して静的パブリック IP アドレスを作成します。

    az network public-ip create \
      --resource-group $NETWORK_RESOURCE_GROUP \
      --name $PUBLIC_IP_NAME \
      --sku Standard \
      --allocation-method static
    

    Note

    AKS クラスターで Basic SKU ロード バランサーを使用している場合は、パブリック IP を定義するときに、Basic パラメーターに--skuを使用します。 Basic SKU IP のみが Basic SKU ロード バランサーで動作し、Standard SKU ロード バランサーで動作する SKU IP はのみです。

  3. 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}
    
  4. 次の 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"
    
  5. 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
    

イングレスでイングレス コントローラーを使用する

  1. 次の 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
    
  2. kubectl 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 を使用してサービスに到達します。 HTTPSGRPCなどの代替バックエンド プロトコルを構成するには、次のいずれかの注釈を使用します。

# 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 コントローラー メトリックを監視する方法についてご確認ください。