Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
本文介绍如何在 Azure Kubernetes 服务(AKS)上为基于 Istio 的服务网格加载项启用 Istio CNI。 Istio CNI 通过消除服务网格应用负载中对特权网络能力的需求来提高安全性。
重要
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
概述
默认情况下,Istio 服务网格在每个应用程序 Pod 中使用特权初始化容器(istio-init)来配置网络流量重定向到 Envoy sidecar 代理。 这些初始化容器需要 NET_ADMIN 和 NET_RAW 功能,这些容器通常被标记为企业环境中的安全问题。
Istio CNI 通过将网络配置责任从单个 Pod init 容器移动到群集级 CNI 插件来解决这一安全问题。 此方法:
-
提高安全性:消除应用程序工作负载对特权网络功能的需求(
NET_ADMIN,NET_RAW) - 简化 Pod 安全策略:应用程序 Pod 只需要最少的功能
- 维护功能:提供与传统 init 容器方法相同的流量管理功能
启用 Istio CNI 后,应用程序 Pod 使用最小 istio-validation 初始化容器来删除所有功能,而不是特权 istio-init 容器。
注释
Istio CNI 不是 Azure CNI 的替代项,不会干扰正常的 AKS 网络。 它是一个单独的插件,旨在处理节点级别的 Istio 流量重定向设置,通过删除应用程序 Pod 中特权初始化容器的需求来提高安全性。
在您开始之前
安装 Azure CLI 2.77.0 或更高版本。 可以运行
az --version来验证版本。 若要安装或升级,请参阅安装 Azure CLI。aks-preview安装 Azure CLI 扩展版本 19.0.0b5 或更高版本:az extension add --name aks-preview如果已有
aks-preview扩展,请将其更新为最新版本:az extension update --name aks-preview请在 Azure 订阅上注册
IstioCNIPreview功能标志:az feature register --namespace "Microsoft.ContainerService" --name "IstioCNIPreview"使用以下命令检查注册状态:
az feature show --namespace "Microsoft.ContainerService" --name "IstioCNIPreview"注册该功能需要几分钟时间。 验证注册状态是否显示
Registered:{ "id": "/subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Features/providers/Microsoft.ContainerService/features/IstioCNIPreview", "name": "Microsoft.ContainerService/IstioCNIPreview", "properties": { "state": "Registered" }, "type": "Microsoft.Features/providers/features" }需要一个启用了基于 Istio 的服务网格附加组件的 AKS 集群。 如果没有此设置,请参阅 为 Azure Kubernetes 服务部署基于 Istio 的服务网格加载项。
确保 Istio 服务网格正在使用修订版
asm-1-25或更高版本。 可以使用以下方法检查当前修订:az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
注释
Istio CNI 与 Ubuntu 20.04 节点池不兼容。 确保群集使用 Ubuntu 22.04 或 Azure Linux 节点池。
设置环境变量。
export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>
启用 Istio CNI
使用以下命令在 AKS 群集上启用 Istio CNI:
az aks mesh enable-istio-cni --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
验证 Istio CNI 是否已启用
使用 az aks get-credentials 获取 AKS 群集的凭据:
az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
启用 Istio CNI 后,通过检查 CNI DaemonSet 是否正在运行来验证安装:
kubectl get daemonset -n aks-istio-system
应会看到 Istio CNI DaemonSet 正在运行:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
azure-service-mesh-istio-cni-addon-node 3 3 3 3 3 kubernetes.io/os=linux 94s
部署工作负载并验证行为
若要验证安全性改进,可以部署 bookinfo 示例应用程序,并检查工作负荷是否使用安全 istio-validation 初始化容器而不是特权 istio-init 容器。
部署示例应用程序
首先,为默认命名空间启用 Sidecar 注入:
# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)
# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}
部署 bookinfo 示例应用程序:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
验证安全初始化容器使用情况
请确认部署的 Pod 应使用安全的 istio-validation 初始化容器,而不是 istio-init。
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
预期输出应显示 istio-validation 作为具有被弃用功能的初始化容器:
details-v1-799dc5d847-7x9gl istio-validation {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj istio-validation {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42 istio-validation {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg istio-validation {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m istio-validation {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt istio-validation {"drop":["ALL"]}
还可以检查特定 Pod 的 YAML,以验证安全上下文:
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"
输出应显示 istio-validation init 容器没有特权功能:
initContainers:
- args:
…
name: istio-validation
…
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
runAsGroup: 1337
runAsNonRoot: true
runAsUser: 1337
禁用 Istio CNI
若要禁用 Istio CNI 并返回使用传统的 init 容器,请使用以下命令:
az aks mesh disable-istio-cni --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
禁用 Istio CNI 后:
CNI DaemonSet 将被删除:
kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-system预期输出(无 CNI DaemonSet):
Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found新的工作负载将使用具有网络功能的传统
istio-initinit 容器。 重启所有已存在的部署以应用更改:kubectl rollout restart deployment/details-v1 kubectl rollout restart deployment/productpage-v1 kubectl rollout restart deployment/ratings-v1 kubectl rollout restart deployment/reviews-v1 kubectl rollout restart deployment/reviews-v2 kubectl rollout restart deployment/reviews-v3验证初始化容器名称和功能:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'预期输出应显示为
istio-init,具有网络功能:details-v1-57bc58c559-722v8 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} productpage-v1-7bb64f657c-jw6gs istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} ratings-v1-57d5594c75-4zd49 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v1-7fd8f9cd59-mdcf9 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v2-7b8bdc9cdf-k9qgb istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v3-588854d9d7-s2f7j istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}