AKSのリソース管理とセキュリティ設定（あと小ネタ）

# はじめに
AKSを運用している中で、これまでやったことを記録として残しておきたいと思います。
項目としては、下記のような感じです。

- リソース管理（監視）
- セキュリティ
- 小ネタ集

# リソース管理
Kubernetesは複数ノードをたてるので、無駄にノードをたてるとコストが見合わないためリソースの管理は大切です。
ただ、リソースぎりぎりで運用すると動作が不安定になることがありますし、デプロイ時やCronJob、HPAでのPod増加に対応できなくなることもあるのである程度余裕をもったメモリ、CPUの上限設定が大事かと思います。

どのくらいのリソースを使っていかを確認し、多すぎず少なすぎずで設定し、自動でオートスケールするように設定します。

## リソースの確認方法
### kubectl
一番手軽なのは`kubectl describe node <node name>`ですね。
これでcpuやメモリのリクエスト、リミットを確認できます。
また、`kubectl top node <node name>`で現在の使用CPUやメモリがわかります。
ただし、トラッキングとかはできず現在の値がわかるだけです。

### Azure Portal
ポータルからも確認できます。
前提として**Log Analyticsワークスペース**を作成しておく必要があります。（これがないと下記の「分析情報」が見れなかったり、メトリックでとれる情報に制限が出てきます）

Kubernetesリソースにアクセスし、監視項目に「分析情報」、「メトリック」の2つがあります。
分析情報は基本的な情報が見れますが、見れる情報が限られているのと、欲しい情報を取得するまでに多少操作が必要ですので、基本的にはメトリックが良いかと思います。

作ったグラフをダッシュボードに保存しておくことで欲しいグラフをいつでも簡単に見ることができます。

操作方法は使っていればなんとなく分かると思いますが、ノードごとのCPU使用率は下記のようにして見ることができます。

![Screen Shot 2021-11-02 at 18.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/759c23a5-9402-4b96-2121-e260e020a5ed.png)
まずメトリックの選択で上記のように選択します。

![Screen Shot 2021-11-02 at 18.32.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/8ec70c51-0b79-ca33-1a95-77e304b93097.png)

そのご、黄色の分割を適用するをクリックすると、NodeごとやNode Poolごとの値に分割できるのでそちらを選択すると、上のグラフのようにNodeごとのCPU使用率のグラフ選べます。

この状態で右上のダッシュボードにピン留めを選択すると、既存のダッシュボードや新しくダッシュボードを作成してグラフを保存しておくことができます。

新しいアラートルールもここで作成できます。（後述の監視のところで説明します）

メモリの使用率やコンテナごとのリソース配分も見れるので、必要な情報をダッシュボードに保存しておくことで、簡単にリソースの確認ができます。

### 他サービス
他にも色々な外部サービスやライブラリを使ってリソース管理やログの取得を行うことができます。
有名なところだと、

- ElasticSearch + kibana
- Prometheus + Grafana
- Datadog

あたりかと思います。
ElasticSearchは利用していましたが使用用途的にオーバースペックだったので、現在は使っていません。
ログの全文分析など色々できることはありますが、Azureのサービスで十分対応可能です。

ただ、Log Analysisのワークスペースはデータが増えると金額も比例で増加しますので、Pod数やノード数が増えたら、またElasticSearch + kibanaの運用をするかもしれません。ElasticSearch自体が結構なリソースを使うため、結局ノードを増やした分の料金はかかるので当分は現在の状態で運用する予定です。

Prometheus + Grafanaは試したことはないですが、[Azureの公式サンプル](https://github.com/Azure/AKS/tree/master/examples/kube-prometheus)もあるので、試しても良いかも知れません。

## オートスケーリング
オートスケーリングといっても2種類あり、Podのオートスケーリングとノードのオートスケーリングの2種類があります。

### Podのスケーリング
こちらはHorizontal Pod Autoscalerリソースを作成するだけです。
詳細は割愛させて頂きますが、PodのCPU使用率など色々なメトリクスでPodの増減を設定できます。

### ノードのスケーリング
AKSではノードのオートスケーリング機能があるので、これも設定しておいた方が良いかと思います。
HPAでPodを増やそうとしても、そもそもノードがなければPodを増やすことができません。

AKSのサービス > ノードプール（設定）> 設定したいノードプールを選択 > ノードプールのスケーリング
で自動スケーリングを設定することで、Podが増えてノードのリソースが足らなくなったら勝手にノードが増えてくれます。助かる。


# セキュリティ
### WAFの設定
Nginx-Ingress controllerでWAFの設定も可能なのですが、AKS外にWAFを置きたかったのでFront Doorを設定して、WAFを追加しました。Application Gatewayでも設定可能です。

Front Doorであれば設定のところにWebアプリケーションファイアウォールという項目があるので、WAFを設定したいサービスを選択します。これだけでWAFの設定完了です。

Azureが用意しているデフォルトのWAF設定をいじってホワイトリストなど、自分の環境に必要な設定は各自設定してください。

またこちらのログ（FrontDoorのWAFのログ）も下記手順で設定することができます。

1. Log Analyticsワークスペースを作成
2. フロントドアの監視項目の診断設定を選択
3. 診断設定を追加するを選択
4. 下記のような画面が出るので、必要な項目を選択して保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/b19382fb-4f56-fd70-4f1a-fb932769cb15.png)

あとはLog Analyticsのクエリ画面で、下記のようなクエリを実行するだけです。

```
// Frontdoorに対するアクセスログを表示
AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "FrontdoorAccessLog"

// Frontdoorで設定しているWAFのログを表示
AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "FrontdoorWebApplicationFirewallLog"

// 同一IPによるアクセスをまとめる
// 例えばこの回数に制限を設けてアラートを表示することもできる。
AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.NETWORK" and Category == "FrontdoorAccessLog"
| summarize count() by clientIp_s
```

また、WAFの細かい設定等は公式ドキュメントを参照してください
[Application Gateway 用の Web アプリケーション ファイアウォール ポリシーの作成](https://docs.microsoft.com/ja-jp/azure/web-application-firewall/ag/create-waf-policy-ag)
[Application Gateway の Azure Web アプリケーション ファイアウォールに関してよく寄せられる質問](https://docs.microsoft.com/ja-jp/azure/web-application-firewall/ag/application-gateway-waf-faq)

### Service Principalの認証情報の更新
AKSにService Principal設定して他のAzureリソースにアクセスできるようにしてる場合（Azure Container Registryにアクセスできるような設定にしてる人は多いと思います）、定期的な認証情報の更新が必要です。というか有効期限がデフォルトで1年なので、いきなりアクセスできなくなるみたいなことが起こりうるので気をつけましょう。

```
az aks update-credentials \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --reset-service-principal \
    --service-principal "$SP_ID" \
    --client-secret "$SP_SECRET"
```

詳細は以下を参照お願いします。
[Azure Kubernetes Service (AKS) 用の資格情報を更新またはローテーションする](https://docs.microsoft.com/ja-jp/azure/aks/update-credentials)


# 小ネタ集
### Node selector
Kubernetesにはスケジューリングするノードを選ぶ項目をPodの作成の定義に含めることができますが、ノードプールを指定することもできます。

```
nodeSelector:
    agentpool: pool_name
```

こんな感じで、サービスごとにノードプールを分けるという方法も可能ですね。

### Log Analytics料金
本記事ではLog Analytics使っていますが、ログが多いと結構な料金になってしまいます。
従量課金では、2021/11/05現在、**¥379.825/GB**の料金がかかります。

しかし、これは東日本の料金です。Log AnalyticsをEast USで作成するとなんと**¥261.556/GB**です。
見た感じ、このリージョンが一番安かったです。
AKSはノードが増えるとそれだけログも高くなっちゃうので、これを活用しない手はないと思います。

注意点としては、

- 料金がいつ変わるか分からない
- クラスターが日本にあって、Log AnalyticsがEast USにある場合の影響がいまいち分かっていない（メトリクスをEast USにあるLog Analyticsのサーバーに送ってるだけなので、多少ラグがある程度なのではとは思っています。）

リージョンでの料金違いは結構大きいかもしれません。