Pod 沙箱功能 (預覽版) 與 Azure Kubernetes Service (AKS)
為了協助保護容器工作負載不受不受信任或潛在惡意程式碼的影響,AKS 現在包含稱為 Pod 沙箱功能 (預覽版) 的機制。 Pod 沙箱功能提供容器應用程式與容器主機的共用核心和計算資源之間的隔離界限。 例如,CPU、記憶體和網路功能。 Pod 沙箱功能藉由整體架構補強其他安全性措施或資料保護控制措施,有助於您符合適用於保護敏感性資訊的法規、產業或治理合規性需求。
本文可協助您了解這項新功能,以及如何實作這項功能。
必要條件
Azure CLI 2.44.1 版或更新版本。 執行
az --version
以尋找版本,然後執行az upgrade
以升級版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。aks-preview
Azure CLI 延伸模組 0.5.123 版或更新版本。在 Azure 訂用帳戶中註冊
KataVMIsolationPreview
功能。AKS 支援全部 AKS 網路外掛程式 1.24.0 版和更新版本的 Pod 沙箱功能 (預覽版)。
若要管理 Kubernetes 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 Azure Cloud Shell 隨附於
kubectl
。 您可以使用 az aks install-cli 命令將其安裝於本地。
安裝 aks-preview Azure CLI 延伸模組
重要
AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
若要安裝 aks-preview 延伸模組,請執行下列命令:
az extension add --name aks-preview
執行下列命令,以更新為發行的最新版延伸模組:
az extension update --name aks-preview
註冊 KataVMIsolationPreview 功能旗標
使用 az feature register 命令以註冊 KataVMIsolationPreview
功能旗標,如下列範例所示:
az feature register --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"
狀態需要幾分鐘的時間才會顯示「已註冊」。 使用 az feature show 命令以驗證註冊狀態:
az feature show --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"
當狀態顯示為 [已註冊] 時,請使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊:
az provider register --namespace "Microsoft.ContainerService"
限制
以下是 Pod 沙箱功能 (預覽版) 預覽的條件約束:
Kata 容器可能無法達到傳統容器在 Azure 檔案記憶體和高效能本地 SSD 上可達到的 IOPS 效能限制。
適用於容器的 Microsoft Defender 不支援評估 Kata 執行階段 Pod。
不支援 Kata 主機網路。
AKS 在此預覽本中不支援容器儲存體介面驅動程式和祕密存放區 CSI 驅動程式。
運作方式
為了在 AKS 上達成這項功能,在適用於 AKS 堆疊的 Azure Linux 容器主機上執行的 Kata 容器會提供硬體強制執行的隔離。 Pod 沙箱可擴充硬體隔離的優點,例如每個 Kata Pod 的個別核心。 硬體隔離會為每個 Pod 配置資源,而且不會與在相同主機上執行的其他 Kata 容器或命名空間容器共用資源。
解決方案架構是以下列元件為基礎:
- 適用於 AKS 的 Azure Linux 容器主機
- Microsoft Hyper-V Hypervisor
- Azure 微調的 Dom0 Linux 核心
- 開放原始碼 Cloud-Hypervisor 虛擬機器監視器 (VMM)
- 與 Kata 容器架構整合
使用 Kata 容器部署 Pod 沙箱,類似於部署容器的標準容器工作流程。 部署包含您可以在 Pod 範本中定義的 kata-runtime 選項。
若要搭配 Pod 使用這項功能,唯一的差異在於將 runtimeClassName kata-mshv-vm-isolation 新增至 Pod 規格。
Pod 使用 kata-mshv-vm-isolation runtimeClass 時,這會建立 VM 做為 Pod 沙箱來裝載容器。 如果容器資源資訊清單 (containers[].resources.limits
) 未指定 CPU 和記憶體的限制,VM 的預設記憶體為 2 GB,而且預設 CPU 是一個核心。 當您在容器資源指令清單中指定 CPU 或記憶體的限制時,VM 具有 1
自變數 containers[].resources.limits.cpu
,以使用一個 + xCPU ,並使用 2
自變數 containers[].resources.limits.memory
來指定 2 GB + yMemory。 容器只能使用 CPU 和記憶體來限制容器。 在此預覽中會忽略 containers[].resources.requests
,同時我們努力減少 CPU 和記憶體額外負荷。
部署新的叢集
執行下列步驟,以使用 Azure CLI 部署 Azure Linux AKS 叢集。
使用 az aks create 命令建立 AKS 叢集,並指定下列參數:
- --workload-runtime:指定 KataMshvVmIsolation 在節點集區上啟用 Pod 沙箱功能。 使用此參數時,其他這些參數應滿足下列需求。 否則,命令會失敗,並回報對應參數的問題。
- --os-sku:AzureLinux. 在此預覽版本中,只有 Azure Linux os-sku 支援這項功能。
- --node-vm-size:屬於第 2 代 VM 且支援巢狀虛擬化的任何 Azure VM 大小。 例如,Dsv3 VM。
下列範例會建立名稱為 myAKSCluster 的叢集,其在 myResourceGroup 中包含一個節點:
az aks create --name myAKSCluster \ --resource-group myResourceGroup \ --os-sku AzureLinux \ --workload-runtime KataMshvVmIsolation \ --node-vm-size Standard_D4s_v3 \ --node-count 1 \ --generate-ssh-keys
執行下列命令,取得 Kube 叢集的存取認證。 使用 az aks get-credentials 命令,並取代叢集名稱和資源群組名稱的值。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
使用 kubectl get pods 命令列出全部命名空間中的全部 Pod。
kubectl get pods --all-namespaces
部署至現有的叢集
若要將這項功能與現有的 AKS 叢集搭配使用,必須符合下列需求:
- 遵循步驟註冊 KataVMIsolationPreview 功能旗標。
- 驗證 AKS 叢集執行 Kubernetes 1.24.0 版和更新版本。
使用下列命令來建立節點集區來裝載 Pod 沙箱功能 (預覽版)。
使用 az aks nodepool add 命令,將節點集區新增至 AKS 叢集。 指定下列參數:
- --resource-group:輸入現有資源群組的名稱,以建立 AKS 叢集。
- --cluster-name:AKS 叢集的唯一名稱,例如 myAKSCluster。
- --name:輸入叢集節點集區的唯一名稱,例如 nodepool2。
- --workload-runtime:指定 KataMshvVmIsolation 在節點集區上啟用 Pod 沙箱功能。 除了
--workload-runtime
參數之外,其他這些參數應滿足下列需求。 否則,命令會失敗,並回報對應參數的問題。- --os-sku:AzureLinux. 在此預覽本中,只有 Azure Linux os-sku 支援這項功能。
- --node-vm-size:屬於第 2 代 VM 且支援巢狀虛擬化的任何 Azure VM 大小。 例如,Dsv3 VM。
下列範例會將節點集區新增至 myAKSCluster,其中一個節點位於 myResourceGroup 中的 nodepool2:
az aks nodepool add --cluster-name myAKSCluster --resource-group myResourceGroup --name nodepool2 --os-sku AzureLinux --workload-runtime KataMshvVmIsolation --node-vm-size Standard_D4s_v3
執行 az aks update 命令,以便在叢集上啟用 Pod 沙箱功能 (預覽版)。
az aks update --name myAKSCluster --resource-group myResourceGroup
部署信任的應用程式
若要示範在 AKS 叢集中的共用核心上部署信任的應用程式,請執行下列步驟。
建立名為 trusted-app.yaml 的檔案來描述信任的 Pod,然後貼上下列資訊清單。
kind: Pod apiVersion: v1 metadata: name: trusted spec: containers: - name: trusted image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
執行 kubectl apply 命令並指定 trusted-app.yaml 檔案,以部署 Kube Pod:
kubectl apply -f trusted-app.yaml
此命令的輸出與下列範例類似:
pod/trusted created
部署不信任的應用程式
若要示範將不信任的應用程式部署至 AKS 叢集上的 Pod 沙箱,請執行下列步驟。
建立名為 untrusted-app.yaml 的檔案來描述不信任的 Pod,然後貼上下列資訊清單。
kind: Pod apiVersion: v1 metadata: name: untrusted spec: runtimeClassName: kata-mshv-vm-isolation containers: - name: untrusted image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
runtimeClassNameSpec 的值是
kata-mhsv-vm-isolation
。執行 kubectl apply 命令並指定 untrusted-app.yaml 檔案,以部署 Kube Pod:
kubectl apply -f untrusted-app.yaml
此命令的輸出與下列範例類似:
pod/untrusted created
驗證核心隔離設定
若要存取 AKS 叢集內的容器,請執行 kubectl exec 命令來啟動殼層工作階段。 在此範例中,您會存取不信任的 Pod 內的容器。
kubectl exec -it untrusted -- /bin/bash
Kubectl 會連線到您的叢集、在不信任的 Pod 內的第一個容器內執行
/bin/sh
,並將終端的輸入和輸出資料串流傳送至容器的流程。 您也可以對於信任的 Pod 裝載在其中的容器啟動殼層工作階段。對於不信任的 Pod 容器啟動殼層工作階段之後,您可以執行命令來驗證不信任的容器正在 Pod 沙箱中執行。 您會發現,與沙箱外部信任的容器相比,其核心版本不同。
若要查看核心版本,請執行下列命令:
uname -r
下列範例類似於 Pod 沙箱核心的輸出:
root@untrusted:/# uname -r 5.15.48.1-8.cm2
對於信任的 Pod 容器啟動殼層工作階段,以驗證核心輸出:
kubectl exec -it trusted -- /bin/bash
若要查看核心版本,請執行下列命令:
uname -r
下列範例類似於信任的 Pod 正在執行的 VM 輸出,其核心與在 Pod 沙箱中執行而且不信任的 Pod 不同:
5.15.80.mshv2-hvl1.m2
清理
您完成評估這項功能時,若要避免 Azure 費用,請清除不必要的資源。 如果您在評估或測試中部署了新的叢集,您可以使用 az aks delete 命令來刪除叢集。
az aks delete --resource-group myResourceGroup --name myAKSCluster
如果您在現有的叢集上啟用 Pod 沙箱功能 (預覽版),您可以使用 kubectl delete pod 命令來移除 Pod。
kubectl delete pod pod-name
下一步
深入了解具有 AKS 叢集之節點的 Azure 專用主機,以使用硬體隔離和控制 Azure 平台維護事件。