次の方法で共有


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

この記事では、Azure Application Gateway を使用して HTTP または HTTPS 経由で Azure Kubernetes Service (AKS) の例を公開するために Kubernetes イングレス リソースを使用する方法について説明します。

ヒント

Kubernetes イングレス ソリューションには Application Gateway for Containers を検討してください。

前提条件

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

ゲストブック アプリケーションをデプロイする

guestbook アプリケーションは正規の Kubernetes アプリケーションであり、Web UI フロントエンド、バックエンド、Redis データベースで構成されます。

guestbook では既定で、名前が frontend のサービスを介して、アプリケーションをポート 80 に公開します。 Kubernetes イングレス リソースがない場合、AKS クラスターの外部からサービスにアクセスすることはできません。 アプリケーションを使用し、イングレス リソースを設定して、HTTP および HTTPS 経由でアプリケーションにアクセスします。

guestbook アプリケーションを展開するには、次の手順を行います。

  1. こちらの GitHub ページから guestbook-all-in-one.yaml をダウンロードします。

  2. 次のコマンドを実行して、guestbook-all-in-one.yaml を AKS クラスターにデプロイします。

    kubectl apply -f guestbook-all-in-one.yaml
    

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

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

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 経由でサービスを公開する

ホスト名を指定しない場合

ホスト名を指定しない場合、Application Gateway のデプロイを指すすべてのホスト名で、guestbook サービスを使用できます。

  1. イングレスをデプロイする前に、Kubernetes シークレットを作成して、証明書と秘密キーをホストします。

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

    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
    
  3. ing-guestbook-tls.yaml という名前のファイルにイングレス リソースを保存します。

  4. 次のコマンドを実行して ing-guestbook-tls.yaml をデプロイします。

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

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

ホスト名を指定する場合

TLS の構成とサービスを多重化するために、イングレス リソースのホスト名を指定することもできます。 ホスト名を指定すると、guestbook サービスを使用できるのは、指定されたホスト上のみに限られます。

  1. 次のイングレス リソースを定義します。 secretName セクションで、<guestbook-secret-name> を実際のシークレットの名前に置き換えます。 hosts および host セクションで、<guestbook.contoso.com> を実際のホスト名に置き換えます。

    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 アプリケーションは、指定されたホスト上でのみ、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