Application Gateway を使用して HTTP または HTTPS 経由で AKS サービスを公開する

これらのチュートリアルでは、HTTP または HTTPS 経由で Azure Application Gateway を通して Kubernetes サービスの例を公開するための Kubernetes イングレス リソースの使用方法について説明します。

ヒント

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

前提条件

  • ingress-azure Helm Chart がインストールされている。
    • グリーンフィールド デプロイ: 最初から開始する場合は、次のインストール手順を参照してください。Application Gateway を利用して AKS クラスターをデプロイし、AKS クラスター上に Application Gateway のイングレス コントローラーをインストールするおおまかな手順を示しています。
    • ブラウンフィールド デプロイ: 既存の AKS クラスターと Application Gateway がある場合は、次の手順を参照して、AKS クラスター上に Application Gateway イングレス コントローラーをインストールしてください。
  • このアプリケーションで HTTPS を使用する場合は、x509 証明書とその秘密キーが必要です。

guestbook アプリケーションのデプロイ

ゲストブック アプリケーションは、Web UI フロントエンド、バックエンド、Redis データベースから構成される正規の Kubernetes アプリケーションです。 guestbook では既定で、名前が frontend のサービスを介して、ポート 80 上にアプリケーションを公開します。 Kubernetes イングレス リソースがない場合、AKS クラスターの外部からサービスにアクセスすることはできません。 アプリケーションを使用して、イングレス リソースを設定して、HTTP および HTTPS 経由でアプリケーションにアクセスします。

ゲストブック アプリケーションをデプロイするには、次の手順に従います。

  1. guestbook-all-in-one.yamlこちらからダウンロードします
  2. 以下を実行して、ご自身の AKS クラスターに guestbook-all-in-one.yaml をデプロイします
kubectl apply -f guestbook-all-in-one.yaml

これで、guestbook アプリケーションがデプロイされました。

HTTP 経由でサービスを公開する

ゲストブック アプリケーションを公開するには、次のイングレス リソースを使用します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: guestbook
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: frontend
          servicePort: 80

このイングレスでは、guestbook-all-in-one デプロイの frontend サービスが Application Gateway の既定のバックエンドとして公開されます。

上記のイングレス リソースを ing-guestbook.yaml として保存します。

  1. 次を実行して、ing-guestbook.yaml をデプロイします。

    kubectl apply -f ing-guestbook.yaml
    
  2. イングレス コントローラーのログ上でデプロイの状態を確認します。

これで、guestbook アプリケーションが使用可能になりました。 Application Gateway のパブリック アドレスにアクセスすると、可用性を確認できます。

HTTPS 経由でサービスを公開する

ホスト名を指定しない

ホスト名を指定しない場合、そのアプリケーション ゲートウェイを参照するすべてのホスト名において、ゲストブック サービスを使用できます。

  1. イングレスをデプロイする前に、kubernetes シークレットを作成して、証明書と秘密キーをホストする必要があります。 次を実行して、Kubernetes シークレットを作成できます

    kubectl create secret tls <guestbook-secret-name> --key <path-to-key> --cert <path-to-cert>
    
  2. 次のイングレスを定義します。 イングレス内で、secretName セクションにシークレットの名前を指定します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
    spec:
      tls:
        - secretName: <guestbook-secret-name>
      rules:
      - http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    

    Note

    上記のイングレス リソース内の <guestbook-secret-name> を、お使いのシークレットの名前に置き換えます。 ファイル名 ing-guestbook-tls.yaml に上記のイングレス リソースを保存します。

  3. 次を実行して、ing-guestbook-tls.yaml をデプロイします

    kubectl apply -f ing-guestbook-tls.yaml
    
  4. イングレス コントローラーのログ上でデプロイの状態を確認します。

これで、HTTP および HTTPS の両方で guestbook アプリケーションが使用できます。

ホスト名が指定されている

TLS の構成とサービスを多重化するために、イングレス上でホスト名を指定することもできます。 ホスト名を指定すると、指定したホスト上のみでゲストブック サービスを使用できます。

  1. 次のイングレスを定義します。 イングレス内で、secretName セクションにシークレットの名前を指定し、それに従って hosts セクション内のホスト名を置き換えます。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
    spec:
      tls:
        - hosts:
          - <guestbook.contoso.com>
          secretName: <guestbook-secret-name>
      rules:
      - host: <guestbook.contoso.com>
        http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    
  2. 次を実行して、ing-guestbook-tls-sni.yaml をデプロイします

    kubectl apply -f ing-guestbook-tls-sni.yaml
    
  3. イングレス コントローラーのログ上でデプロイの状態を確認します。

これで、guestbook アプリケーションは、指定されたホスト上 (この例では <guestbook.contoso.com>) のみで、HTTP および HTTPS の両方で使用できます。

他のサービスとの統合

次のイングレスでは、このイングレスに他のパスを付加して、それらのパスを他のサービスにリダイレクトできます。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: guestbook
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - path: </other/*>
        backend:
          serviceName: <other-service>
          servicePort: 80
       - backend:
          serviceName: frontend
          servicePort: 80