【Azure】AGICでSSL証明書を利用する【AKS】


はじめに

Azure Kubernetes Service (AKS) は Microsoft Azure の Kubernetes サービスである。
AKS で利用するイングレスコントローラーは主に以下の2つのいずれかになる。

  • NGINX イングレス コントローラー
  • Application Gateway イングレス コントローラー

Application Gateway とは、Azure の L7 ロードバランサーであり、SSL終端やWAF機能(オプション)等を利用することができる。
本記事では、Application Gateway イングレス コントローラー (AGIC) を利用したときの HTTPS 設定方法を解説する。

AGICのデプロイ

AGICのデプロイ方法は、大きく分けて以下の2つの方法がある。

  • AGIC アドオンによるデプロイ
  • Helm によるデプロイ

2020年12月現在、AGIC アドオンによるデプロイはプレビュー機能である。
現時点では、AGIC アドオンでは shared が適用されない(=AKSによる振り分けと手動振り分け設定が共存できない)ことから、Helmデプロイをお勧めする。(※ちょっと大変です。)

具体的なデプロイ手順については、以下のドキュメントを参照されたい。

AGICを利用してHTTPSでWebアプリを公開する

手順の概要は、以下である。

  1. SSL証明書を作成し、AppGwに証明書を構成する

  2. Ingress のマニフェスト yaml ファイルを修正し、デプロイする

例として https://test.com というURLのサイトを公開する手順を示す。

1. SSL証明書を作成し、AppGwに証明書を構成する

Linux 端末にて下記のコマンドを実行する。概要は次の通り。

  1. OpenSSL で test.com の自己署名証明書を作成する。
  2. Application Gateway にアップロードするため、SSL証明書を PKCS #12 形式に変換する。
  3. Azure CLI を使用して、Application Gateway にSSL証明書をアップロードする。
appgwName="<Application Gateway 名>"
resgp="<Application Gatway のリソースグループ>"

# generate certificate for testing
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -out test-cert.crt \
  -keyout test-cert.key \
  -subj "/CN=test"

openssl pkcs12 -export \
  -in test-cert.crt \
  -inkey test-cert.key \
  -passout pass:test \
  -out test.pfx

# configure certificate to app gateway
az network application-gateway ssl-cert create \
  --resource-group $resgp \
  --gateway-name $appgwName \
  -n mysslcert \
  --cert-file test.pfx \
  --cert-password "test"

上記コマンド例では Application Gateway に直接SSL証明書をアップロードしているが、KeyVault を経由して Application Gateway にSSL証明書を構成することも可能。
参考:【Azure】Application Gateway と Key Vault を連携してSSL証明書を設定する(Azure CLI)

2. Ingress のマニフェスト yaml ファイルを修正し、デプロイする

手順1 を実施したことで Application Gateay に mysslcert という名前で証明書が構成されている。
Ingress のマニフェストファイルに新しいアノテーション appgw.ingress.kubernetes.io/appgw-ssl-certificate: mysslcert を追加することで、HTTPS設定を有効にすることができる。

一例として test-com-app.yml を作成し、以下の内容とする。

test-com-app.yml
apiVersion: v1
kind: Pod
metadata:
  name: aspnetapp
  labels:
    app: aspnetapp
spec:
  containers:
  - image: "mcr.microsoft.com/dotnet/core/samples:aspnetapp"
    name: aspnetapp-image
    ports:
    - containerPort: 80
      protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: aspnetapp
spec:
  selector:
    app: aspnetapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: aspnetapp
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: mysslcert
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: aspnetapp
          servicePort: 80

作成したマニフェストデでデプロイする。

kubectl apply -f test-com-app.yml

Ingress を確認し、 ADDRESS に Application Gateway のIPアドレスが反映されていることを確認する。Application Gateway の更新に5分ほど時間がかかる場合がある。

kubectl get ingress

ブラウザにて、 https://test.com にアクセスし、HTTPS通信になっていることを確認する。
※ アクセス元端末の hosts に test.com --> Applciation Gateway のIPアドレス を追加すること。

また、Azure Portal で Application Gateway を確認すると、AKSによって構成されたHTTPSのリスナーが確認できる。

参考