AKS ノードに関するお問い合わせあれこれ

この記事は、[Microsoft Azure Tech Advent Calendar 2019](https://qiita.com/advent-calendar/2019/microsoft-azure-tech) 13 日目です。

こんにちは、@task_woof です。普段、AKS 等の IaaS 製品で技術サポートをしています。
毎回華やかな (?) アップデートが多い AKS ですが、今回は地味目なテーマでお送りしますー:sweat_smile:

はじめに
--------

Azure Kubernetes Servcie (以降、AKS) は、マスター機能 (kube-apisever, kube-schedular, etcd) を Azure 側がマネージドサービスとして提供し、エージェント機能 をご利用者と Azure で責任を持ち合うような形を取っています。

今回は、AKS ノードに関して比較的よくいただくお問い合わせについて紹介いたします。

1. AKS ノードの停止 (割り当て解除) が可能か
2. 仮想マシンのサイズを変更したい
3. 脆弱性対応は必要か
4. 時刻同期はどのように行われているか
5. AKS ノードに特定のパッケージをインストールしたい

----

1.AKS ノードの停止 (割り当て解除) が可能か
-----------------------------------------

はい、開発目的等により利用金額を抑えたい場合、仮想マシンを停止 (割り当て解除) いただくことが可能です。
ただ、停止 (割り当て解除) された場合でも、ストレージの利用料金が掛かることにご注意ください [^1]

2.仮想マシンのサイズを変更したい
-------------------------------

AKS ノードは、通常の仮想マシン/仮想マシンスケールセットと同様に、変更/削除操作がユーザから可能です。

そのため、ワークロードの増大によりサイズ変更されたいというのは、
良くある話ですが、残念ながらこちらは操作自体は可能なもののサポートされておりません。 [^2]

その替わりに、既存 AKS クラスタに変更されたいサイズのノードプールを追加いただくことで、
対応することが可能です。

あとは、Pod がその AKS ノードに配備されるように、マニフェストにて
```nodeSelector``` を追加いただくことで、追加された AKS ノードに Pod を配備するように設定可能です。 [^3]

3.脆弱性対応は必要か
--------------------

AKS ノードに対する OS, Kubernetes, コンテナランタイムの脆弱性については、セキュリティパッチが配布されます。

Linux ノード (Ubuntu) の場合、Ubuntu の機能 (/lib/systemd/system/apt-daily-upgrade.timer) により、自動適用され、AKS ノードを再起動いただくことにより適用されます。 [^4]
それに対して、Windows ノードの方では、ノードプールをアップグレードいただくことにより、最新の修正が当てられたノードに替わります。

4.時刻同期はどのように行われているか
-----------------------------------

Linux (Ubuntu 18.04) の場合は、"ntp.ubuntu.com" を [^5]、Windows の場合は、"time.windows.com" をそれぞれ参照しています。[^6]
また、Pod (コンテナ) は AKS ノードの時刻を参照する挙動となっております。

5.AKS ノードに特定のパッケージをインストールしたい
-------------------------------------------------

基本的には、AKS ノードに対する変更は、サポートされません。 [^7]
(AKS ノードにログインしてインストール/設定された変更内容は、スケールアウト/インやアップグレード時に保持されません)

どうしても AKS ノードに対する変更/設定が必要なる場合には、DaemonSet をご利用ください。
DaemonSet リソースは必ず AKS ノード 1 台に 1 つ作成されるリソースになります。
この性質を利用して、ソフトウェアのインストール [^8] や セキュリティソフトの実行 [^9] が行うことができます。

Windows ノードが混在する場合には、```nodeSelector``` で ```beta.kubernetes.io/os``` により、OS の種別を指定してください。

```bash
$ cat << EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: installpkg
  namespace: kube-system
spec:
  template:
    metadata:
      labels:
        name: installpkg
    spec:
      hostPID: true
      hostNetwork: true
      containers:
        - name: installpkg
          image: busybox
          command:
            - nsenter
            - --mount=/proc/1/ns/mnt
            - --
            - sh
            - -c
            - apt-get update -y && apt-get install -y monit
          securityContext:
            privileged: true
EOF
```

---

最後に、現在 Azure では Kubernetes をご利用いただくにあたり、Azure Container Service (ACS) という選択肢もありますが、こちらは、2020 年 1 月 31 日に廃止予定です。 [^10]

ということでますます AKS を利用される機会が増えること思いますので、引き続きご支援できればと思います:whale:


[^1]: [Azure Kubernetes Service (AKS) の価格](https://azure.microsoft.com/ja-jp/pricing/details/kubernetes-service/)

[^2]: [Changing node vm-size of existing cluster #132](https://github.com/Azure/AKS/issues/132)

[^3]: [Node上へのPodのスケジューリング](https://kubernetes.io/ja/docs/concepts/configuration/assign-pod-node/#nodeselector)

[^4]: [ノードのセキュリティ - Azure Kubernetes Service (AKS) でのアプリケーションとクラスターに対するセキュリティの概念](https://docs.microsoft.com/ja-jp/azure/aks/concepts-security#node-security)

[^5]: [Linux VM (Ubuntu 18.04) の時刻同期](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/time-sync#systemd)
	 
[^6]: [Windows VM の時刻同期](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/time-sync#configuration-options)

[^7]: [カスタム VM 拡張機能を使用できますか?](https://docs.microsoft.com/ja-jp/azure/aks/faq#can-i-use-custom-vm-extensions)

[^8]: [Initialize your AKS nodes with DaemonSets](https://medium.com/@patnaikshekhar/initialize-your-aks-nodes-with-daemonsets-679fa81fd20e)

[^9]: [clamav-container/clamav-daemonset.yaml](https://github.com/legionus/clamav-container/blob/master/clamav-daemonset.yaml)

[^10]: [Azure Container Service は 2020 年 1 月 31 日に廃止予定](https://azure.microsoft.com/ja-jp/updates/azure-container-service-will-retire-on-january-31-2020/)