前回は asp.net core アプリを AKS 上にデプロイしましたが、まだ一台構成のままです。また外部からのアクセスは IP アドレスを行っているため、この記事ではネットワークの考察とイングレスおよび名前解決、およびアプリの複数台構成についてみていきます。
イングレスとは
こちらの記事から説明を抜粋すると、「イングレス コントローラーは、リバース プロキシ、構成可能なトラフィック ルーティング、および Kubernetes サービスの TLS 終端を提供するソフトウェア」です。
Azure ロードバランサ―と k8s サービス
AKS で k8s サービスをロードバランスとして作成した場合、裏では Azure ロードバランサーが構成されます。以下で具体的に確認してみます。
1. コマンドプロンプトよりロードバランサ―のアドレスを確認。
>kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
core3webapp LoadBalancer 10.0.23.19 40.115.179.34 80:30242/TCP 10d
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 12d
mssql-deployment ClusterIP 10.0.138.88 <none> 1433/TCP 10d
2. Azure ポータルより、ロードバランサ―が存在することを確認。
3. ロードバランサ―リソースを開き、フロントエンド IP 構成から IP アドレスが手順 1 で確認したものと同じであることを確認。
4. バックエンドプールで、ノードとなる VM が設定されていることを確認。
このロードバランサ―の IP アドレスに DNS 名を追加すると名前解決ができますが、レイヤー 4 で動作するため、パスによるルーティングなどはできません。
HTTP アプリケーションルーティング アドオン
開発時に簡単にアプリケーションルーティングなど、レイヤー 7 の機能を試せるよう、AKS ではアドオンを用意しています。
このページの注意事項に 「このアドオンを運用環境で使用することはお勧めできません。」 とあるためあくまで開発環境向けではありますが、今回はこの機能を試してみます。
アドオンのインストール
アドオンは AKS クラスタ新規構築時と、既存クラスタへの追加の両方をサポートしています。今回はすでに存在する環境に対して追加していきます。またアドオンをインストールすると、自動的に DNS リソースも追加されます。
1. コマンドプロンプトより以下コマンドを実行。
az aks enable-addons -g netcoresample -n myaks --addons http_application_routing
2. アドオンのインストールが完了したら、登録されている DNS ゾーン名を取得。
>az aks show -g netcoresample -n myaks --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName -o table
Result
----------------------------------------
15d7f373484d4e04917f.japaneast.aksapp.io
3. Azure 上に DNS リソースが追加されているので確認。リソースグループはノードが追加されている方のグループ。
イングレスリソースの追加
追加したアドオンを利用するため、イングレスの追加と、サービスのタイプを変更します。
1. core3webapp.yaml を以下に書き換え。
- サービスから Type: LoadBalancer を削除 (既定の ClusterIP になる)
- イングレスの追加: DNS 名は上記で確認したゾーンを利用
- ルーティングのパスは、ルート (/) を使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: core3webapp
namespace: default
labels:
app: core3webapp
spec:
replicas: 1
selector:
matchLabels:
app: core3webapp
template:
metadata:
name: core3webapp
labels:
app: core3webapp
spec:
containers:
- name: core3webapp
image: kenakamuacr.azurecr.io/core3webapp:20191017063305
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: core3webapp
labels:
app: core3webapp
spec:
ports:
- protocol: TCP
port: 80
selector:
app: core3webapp
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: core3webapp
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
spec:
rules:
- host: core3webapp.15d7f373484d4e04917f.japaneast.aksapp.io
http:
paths:
- backend:
serviceName: core3webapp
servicePort: 80
path: /
2. kubectl apply でデプロイを実行。
- --force をつけている理由は ClusterIP の場合に失敗する不具合があるため
kubectrl apply -f core3webapp.yaml --force
3. サービスを取得して EXTERNAL-IP がないことを確認。
>kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
core3webapp ClusterIP 10.0.92.73 <none> 80/TCP 5m56s
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 12d
mssql-deployment ClusterIP 10.0.138.88 <none> 1433/TCP 10d
4. イングレスを取得してホスト名を確認。
>kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
core3webapp core3webapp.15d7f373484d4e04917f.japaneast.aksapp.io 40.115.246.205 80 6m58s
6. Azure ロードバランサ―の設定も自動で変更される。
アプリケーションの複数台構成
次に複数台構成を試します。
1. 異なるポッドにアクセスしている様子がわかるように、アプリを改修。Visual Studio で Views | Home | Index.cshtml を以下のコードと差し替え。
- @Environment.MachineName で実行中のポッド名を表示
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<h3>@Environment.MachineName</h3>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
4. core3webapp.yaml の Deployment のみを以下に変更。
- イメージのタグを変更
- レプリカで 2 を指定
kind: Deployment
metadata:
name: core3webapp
namespace: default
labels:
app: core3webapp
spec:
replicas: 2
selector:
matchLabels:
app: core3webapp
template:
metadata:
name: core3webapp
labels:
app: core3webapp
spec:
containers:
- name: core3webapp
image: kenakamuacr.azurecr.io/core3webapp:20191028123417
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 30
5. デプロイを適用。
kubectrl apply -f core3webapp.yaml --force
6. ポッドを確認。アプリのポッドが 2 つになっていることを確認。
>kubectl get pods
NAME READY STATUS RESTARTS AGE
core3webapp-6d5b8fcb5-f29gc 1/1 Running 0 25s
core3webapp-6d5b8fcb5-tqnrb 1/1 Running 0 20s
mssql-deployment-5b74bdb6f7-5tk9k 1/1 Running 0 21h
7. ブラウザよりアプリにアクセス。F5 で更新してポッド名が変わることを確認。
まとめ
今回はイングレスを使った構成および名前解決の作成を行ったほか、レプリカセットを使ってアプリを 2 台構成にしました。次回は SQL サーバーと Web アプリの配置について詳細を見ていきます。
参考情報
Azure Kubernetes Service (AKS) で Standard SKU ロード バランサーを使用する