広告

Azure Kubernetes Service(AKS) コンポーネントの概要

Azure

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 のコンポーネントの動作はざっと以下のようになっています。

  1. API Server (kube-apiserver) 経由で Pod の情報が登録されます (kubectl コマンドなどで)
  2. kube-scheduler によって Pod がどのノードで作成(起動) するかが決定されます
  3. 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 のほかのサービスとも連携しやすいところが魅力的なポイントだと思います。(セキュリティや監視など)

参考情報

コメント

タイトルとURLをコピーしました