Azure Kubernetes Service(AKS) とは
Azure Kubernetes Service(AKS) は Azure が提供している Kubernetes クラスタのマネージドサービスです。
AKS コンポーネント
Kubernetes クラスタは2つのコンポーネントで構成されています。
また、それぞれが持っている Kubernetes コンポーネントも以下で説明します。
- コントロール プレーン:Kubernetes のコアサービスを提供し、アプリのオーケストレーション を実施するワークロード
- MS 管理する部分になります
- ノード:アプリケーションのワークロードを実行します。
- ユーザー管理部分になります
※ ワークロード:ノード(VM)、deployment、pod、demonset などのリソースのこと
MS 公式の画像をお借りします。
コントロール プレーンのコンポーネント
- kube-apiserver:kubectl や Kubernetes ダッシュボードなどのツールのリクエストを受け付けるコンポーネント
- etcd:クラスタ構成の状態を保持する DB (key-value 形式の DB)
- kube-scheduler:スケーリングをするコンポーネント(どのノードにワークロードをデプロイするかの判断&実施)
- kube-controler-manager:多数の小さいコントローラ(Pod の複製やノード操作処理を実行する)を監視するコンポーネント
コントロール プレーンの特徴
コントロール プレーン は以下の特徴があります。
- コントロール プレーンとノードの間のセキュリティで保護された通信が構成される
- 各 Kubernetes コンポーネントが高可用性を備えている
- AKS クラスタと一緒に作成される
- コントロール プレーンとそのリソースは、クラスタと同じリージョンに作成される
- 無料
- コントロール プレーン への直接のアクセスはできない
- トラブルシューティングを行うために、Azure Monitor ログからコントロール プレーンのログを確認できる
- Kubernetes のコントロール プレーンとノードのアップグレードは、Azure CLI または Azure portal を使用する
※ コントロール プレーンの管理もしたい場合、すべて自前で構築する必要があります。構築について
ノード(Agent node)のコンポーネント
- kube-proxy:ネットワーク トラフィックをルーティングして、Service と Pod の IP アドレスを管理する
- kubelet:ノードのコンテナランタイムと連携し、コンテナの起動や停止などを管理する
- コンテナランタイム:kubelet から命令を受けて、実際に Pod やコンテナの操作を行う (OS のカーネルやネームスペースなどで操作する)
- Linux ノード (AKS):Kubernetes バージョン 1.19 以降では、コンテナー ランタイムとして containerd が使用される
- Windows ノード:Kubernetes バージョン 1.20 以降では、既定のコンテナー ランタイムは引き続き Docker (containerd はプレビュー) が使用される
※ 他にもコンテナランタイムの種類はあるものの、AKS では使用されていません。
※ 他のコンテナランタイムを使用したい場合、すべて自前で構築する必要があります。構築について
MS 公式の画像をお借りします。
Pod 起動時の動きについて
実際に、Pod を起動する時に、Kubernetes のコンポーネントの動作はざっと以下のようになっています。
- API Server (kube-apiserver) 経由で Pod の情報が登録されます (kubectl コマンドなどで)
- kube-scheduler によって Pod がどのノードで作成(起動) するかが決定されます
- kubelet がこの情報を検知し、コンテナランタイムに命令をして、実際 Pod を起動します
ノードリソースの予約
AKS は常に、ノードの実行のためにリソースを予約(バッファー)しています。
ノードにまだリソース(メモリや CPU)があるのに、Pod がデプロイできない時に、リソースの予約が原因かもしれません。
ノードがPod に割り当てできるリソースの確認は、以下のコマンドで確認できます。
kubectl describe node <node名>
結果抜粋:
...
Allocatable:
attachable-volumes-azure-disk: 8
cpu: 1900m
ephemeral-storage: 119716326407
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 4675304Ki
pods: 110
...
AKS には、既定の予約値が設定されています。これらの予約値を変更することはできません。
では、予約値を見ていきましょう。
CPU の予約
CPU の予約は、ノードのタイプやクラスタの設定によって変わります。
ノードの CPU コア数 | 1 | 2 | 4 | 8 | 16 | 32 | 64 |
---|---|---|---|---|---|---|---|
予約コア(Mi) | 60 | 100 | 140 | 180 | 260 | 420 | 740 |
※ Mi は 1/1000 コア
メモリの予約
メモリの予約は以下の2つの値の合計になります。
- Kubelet デーモン(daemon)
- 750 Mi
- Kubelet デーモンが正常稼働するためのバッファー(kube-reserved)
- ノードメモリが 0~4GB の場合:25%
- ノードメモリが 4~8GB の場合:1GB(上記のメモリ) + (4GBより多い分)*20%
- ノードメモリが 8~16GB の場合:(1GB + 0.8GB) + (8GBより多い分)*10%
- ノードメモリが 16~128GB の場合:(1GB + 0.8GB + 0.8GB) + (16GBより多い分)*6%
- ノードメモリが 128GB~ の場合:(1GB + 0.8GB + 0.8GB + 6.72GB) + (128GBより多い分)*2%
※ Mi は 1/1000 GB
例えば、7GB のノードの場合、予約メモリは:
0.75 + (0.25*4) + (0.20*3) = 0.75GB + 1GB + 0.6GB = 2.35GB
最後に
今回は、Azure Kubernetes Service(AKS) の基本のコンポーネントについて、一緒に見てきました。
本質は Kubernetes であることは変わらないので、Deployment や Pod などのワークロードの作成は全く同じです。
マネージッド サービスですので、触れない部分は多々ありますが、その代わりにユーザー側の管理コストも削減できますので、大体の場合メリットになる場合が多いかと思います。
その他、Azure のほかのサービスとも連携しやすいところが魅力的なポイントだと思います。(セキュリティや監視など)
コメント