次の方法で共有

为 Azure Kubernetes 服务启用基于 Istio 的服务网格加载项的 Istio CNI(预览版)

本文介绍如何在 Azure Kubernetes 服务(AKS)上为基于 Istio 的服务网格加载项启用 Istio CNI。 Istio CNI 通过消除服务网格应用负载中对特权网络能力的需求来提高安全性。

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

概述

默认情况下,Istio 服务网格在每个应用程序 Pod 中使用特权初始化容器(istio-init)来配置网络流量重定向到 Envoy sidecar 代理。 这些初始化容器需要 NET_ADMINNET_RAW 功能,这些容器通常被标记为企业环境中的安全问题。

Istio CNI 通过将网络配置责任从单个 Pod init 容器移动到群集级 CNI 插件来解决这一安全问题。 此方法:

  • 提高安全性:消除应用程序工作负载对特权网络功能的需求(NET_ADMINNET_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:

kubectl describe pod <pod-name> | grep -A 10 -B 5 "istio-validation"

输出应显示 istio-validation init 容器没有特权功能:

Init Containers:
  istio-validation:
    Container ID:  containerd://...
    Image:         mcr.azk8s.cn/oss/istio/proxyv2:...
    ...
    Security Context:
      capabilities:
        drop:
        - ALL
      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 后:

  1. 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
    
  2. 新的工作负载将使用具有网络功能的传统 istio-init init 容器。 重启所有已存在的部署以应用更改:

    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
    
  3. 验证初始化容器名称和功能:

    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        {"drop":["ALL"]}
    productpage-v1-7bb64f657c-jw6gs istio-init        {"drop":["ALL"]}
    ratings-v1-57d5594c75-4zd49     istio-init        {"drop":["ALL"]}
    reviews-v1-7fd8f9cd59-mdcf9     istio-init        {"drop":["ALL"]}
    reviews-v2-7b8bdc9cdf-k9qgb     istio-init        {"drop":["ALL"]}
    reviews-v3-588854d9d7-s2f7j     istio-init        {"drop":["ALL"]}
    

后续步骤