AKS で Pod Sandboxing という機能がプレビュー提供
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 ファイルを用意しておきます。
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
の追記だけです。
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