🎼

AKS で Pod Sandboxing という機能がプレビュー提供

2023/03/04に公開

Azure Kubernetes Service (AKS) にて Pod Sandboxing という機能がプレビュー提供されました。興味があったので、調べたり触ったりしてみました。

概要

この Pod Sandboxing 機能は Kata Containers というオープンソースの仕組みを AKS 上に導入しているもので、ホストとコンテナ (Pod) の間に更に個別のカーネル層を挟むことで、カーネルレベルでの分離を図っているものでした。

なお、AKS での当該機能は、コンテナーホストの OS (ノードプール VMSS の OS) として Ubuntu や Windows ではなく、Microsoft 独自の Linux ディストリビューションである Mariner のみがサポートされています (本記事公開時点)。

環境・準備

  • Azure Kubernetes Service (v1.24.9)
  • Windows 10
  • Azure CLI (v2.45.0)

プレビュー機能を使う準備

公式ドキュメントの「Install the aks-preview Azure CLI extension」と「Register the KataVMIsolationPreview feature flag」を実施しておきます。

プレビュー機能を使う際は、毎度おなじみですね。

リソースグループ名とクラスター名の変数登録

PowerShell にて、下記を実行して変数に登録しておきます。

$RGNAME = "<リソースグループ名>"
$CLNAME = "<クラスター名>"

クラスターの作成

下記のコマンドを実行し、新規に「リソースグループ」と「Pod Sandboxing が有効な AKS クラスター」を作成します。

az group create --name $RGNAME --location eastus
az aks create --name $CLNAME --resource-group $RGNAME --os-sku mariner `
--workload-runtime KataMshvVmIsolation --node-vm-size Standard_D4s_v3 --node-count 1

公式ドキュメントに記載の通り、下記の点に考慮が必要とのことです。

  • --workload-runtime: "KataMshvVmIsolation" と指定する必要あり。
  • --os-sku: Mariner OS を使用するため "mariner" と指定する必要あり。
  • --node-vm-size: 第二世代 VM をサポートする SKU を指定する必要あり。

クラスターの作成が完了したら、クラスターへの接続情報を取得しておきます。

az aks get-credentials --resource-group $RGNAME --name $CLNAME

動作確認

クラスターの準備ができましたので、実際に Sandbox 化、つまりカーネルレベルでの隠蔽ができているか確認してみます。

実際に Sandbox 上で動かす場合は、マニフェストの spec.runtimeClassName にて "kata-mshv-vm-isolation" をすればよいとのこと。早速やってみましょう。

普通に起動した Pod

下記のような yaml ファイルを用意しておきます。

app.yaml
kind: Pod
apiVersion: v1
metadata:
  name: app
spec:
  containers:
  - name: app
    image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]

AKS へデプロイ。

kubectl apply -f app.yaml

デプロイ後、下記のコマンドを実行して Pod の中に入ってみます。

kubectl exec -it app -- /bin/bash

バージョンを確認してみると…

root@app:/# uname -r
5.15.80.mshv2-hvl1.m2

こんな感じですね。

Sandbox で起動した Pod

下記のような yaml ファイルを用意しておきます。
先ほどとの違いは、runtimeClassName: kata-mshv-vm-isolation の追記だけです。

sandbox-app.yaml
kind: Pod
apiVersion: v1
metadata:
  name: sandbox-app
spec:
  runtimeClassName: kata-mshv-vm-isolation
  containers:
  - name: sandbox-app
    image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]

AKS へデプロイ。

kubectl apply -f sandbox-app.yaml

デプロイ後、こちらも下記のコマンドを実行して Pod の中に入ってみます。

kubectl exec -it sandbox-app -- /bin/bash

バージョンを確認してみると…

root@sandbox-app:/# uname -r
5.15.48.1-8.cm2

おー、変わっていますね!

まとめ

ということで、Pod Sandboxing 機能を使う = Kata Containers 上でコンテナを起動することができました。

「Microsoft Defender for Containers は非サポート」「IOPS のパフォーマンスに影響がある」などの制約があるとのことで、まだまだ発展途上だとは思いますが、コンテナセキュリティも重要になってきている昨今、ウォッチしていきたい機能ではありますね!

Discussion