使用高级容器网络服务部署 Cilium mTLS 加密(预览版)

Important

使用高级群集网络服务的 Cilium mTLS 加密目前为预览版。 有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Azure 预览补充使用条款

本文介绍如何在 Azure Kubernetes 服务 (AKS) 群集中使用高级容器网络服务部署 Cilium mTLS 加密。

先决条件

  • 拥有有效订阅的 Azure 帐户。 如果没有订阅,请在开始之前创建一个试用帐户
  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用本地安装,请使用 az login 命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用

    • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade

  • 本文中的步骤所需的最低 Azure CLI 版本为 2.71.0。 若要查找版本,请运行 az --version。 如果需要进行安装或升级,请参阅安装 Azure CLI

  • Cilium mTLS 加密仅受由 Cilium 提供支持的 Azure CNI 支持。 如果使用任何其他网络插件,则不支持 Cilium mTLS 加密。 请参阅 由 Cilium 提供支持的 Azure CNI 的配置

  • 确保 AKS 群集正在运行 Kubernetes 版本 1.34.0 或更高版本。

  • 确保群集使用的是 Cilium 版本 1.18 或更高版本。

安装 aks-preview Azure CLI 扩展

Important

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

使用 az extension addaz extension update 命令安装或更新 Azure CLI 预览扩展。

aks-preview Azure CLI 扩展的最低版本为 14.0.0b6

# Install the aks-preview extension
az extension add --name aks-preview
# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

注册 AdvancedNetworkingmTLSPreview 功能标志

使用 AdvancedNetworkingmTLSPreview 命令注册 az feature register 功能标志。

az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingmTLSPreview"

使用 az feature show 命令验证注册是否成功。 只需几分钟时间即可完成注册。

az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingmTLSPreview"

在功能显示Registered后,使用Microsoft.ContainerService命令刷新az provider register资源提供程序的注册。

启用高级容器网络服务和 mTLS 加密

若要继续,必须有一个启用了高级容器网络服务的 AKS 群集。

具有高级容器网络服务标志 az aks create--enable-acns 命令创建一个新的 AKS 群集,它具有所有高级容器网络服务功能。 这些功能包括:

  • 容器网络可观测性:提供对您的网络流量的深入见解。 若要了解详细信息,请访问 容器网络可观测性

  • 容器网络安全: 提供完全限定域名(FQDN)筛选、L7 策略和传输中加密等安全功能。 若要了解详细信息,请访问 容器网络安全

注释

Cilium 数据平面群集支持从 Kubernetes 版本 1.29 开始的容器网络可观测性和容器网络安全。

注释

即使启用 ACNS,Cilium mTLS 加密也默认处于禁用状态。 若要启用 mTLS,请使用标志 --acns-transit-encryption-type mTLS设置加密类型。

# Set environment variables for the AKS cluster name and resource group. Make sure to replace the placeholders with your own values.
export CLUSTER_NAME="<aks-cluster-name>"
export RESOURCE_GROUP="<resourcegroup-name>"

# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --location eastus \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --enable-acns \
    --acns-transit-encryption-type mTLS \
    --generate-ssh-keys

在现有群集上启用高级容器网络服务和 mTLS 加密

运行具有高级容器网络服务标志az aks update--enable-acns命令,将现有的 AKS 群集更新为包含所有高级容器网络服务功能,这些功能包括容器网络可观测性容器网络安全

Important

在现有群集上启用 mTLS 加密会跨所有节点触发 Cilium 代理的推出重启。 对于大型群集,此过程可能需要一些时间,并可能会暂时影响工作负荷。 在维护时段或低流量时段规划更新,以最大程度地减少中断。

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type mTLS

获取群集凭据

使用 az aks get-credentials 命令获取群集凭据。

az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

注册命名空间

若要在 mTLS 中注册应用程序,请将 mTLS 标签应用于包含应用程序 Pod 的命名空间。

kubectl label namespace <namespace-name> io.cilium/mtls-enabled=true

已注册工作负载和非注册工作负荷之间的流量以纯文本形式继续,而不会造成连接问题或硬故障。

验证 mTLS 是否已启用

注册 Cilium mTLS 的命名空间后,可以使用以下方法验证身份验证和加密是否处于活动状态。

  1. 检查是否已启用 ztunnel:

    kubectl -n kube-system describe cm cilium-config | grep enable-ztunnel -A2
    

    应会看到指示已启用 ztunnel 加密的输出。

  2. 检查已注册的命名空间:

    kubectl get namespaces -l io.cilium/mtls-enabled=true
    

    这显示了标记为 ztunnel 注册的所有命名空间。

    若要验证这些命名空间是否已在 StateDB 表中实际注册:

    kubectl exec -n kube-system ds/cilium -- cilium-dbg statedb dump | jq '.["mtls-enrolled-namespaces"]'
    

    此查询的结果应显示注册协调程序已成功处理哪些命名空间。

  3. 验证 Pod 是否已在 SPIRE 中注册

    执行进入 SPIRE 服务器容器并列出条目:

    kubectl exec -n kube-system spire-server-0 -c spire-server -- \
    /opt/spire/bin/spire-server entry show
    

    此命令查询 SPIRE Server 数据存储并输出所有已注册的工作负荷标识。

    查找与 SPIFFE 格式匹配的条目:

    spiffe://<trust-domain>/ns/<namespace>/sa/<serviceaccount>
    
  4. 验证 ztunnel 中的 Pod 注册

    Ztunnel 公开一个本地管理员终结点,该终结点允许检查其活动配置,包括已注册的工作负载。

    选择 ztunnel Pod。

    kubectl get pods -n kube-system \
    -l app.kubernetes.io/name=ztunnel-cilium \
    -o wide
    

    对 ztunnel 管理终结点进行端口转发。 ztunnel 在端口 15000 上暴露管理员 API(默认情况下仅限 localhost)。

    kubectl port-forward -n kube-system <ZTUNNEL_POD> 15000:15000
    

    检查 ztunnel 配置数据转储。

    curl -s http://localhost:15000/config_dump | jq
    

    验证 Pod 是否已注册。 在配置转储文件中搜索您的工作负荷的 SPIFFE 身份或命名空间/服务帐户。 应会看到类似于以下输出的条目:

"workloads": [
    {
    "capacity": 1,
    "clusterId": "Kubernetes",
    "name": "test-server-5dc49df4cf-grr2f",
    "namespace": "ztunnel-test-enrolled",
    "networkMode": "Standard",
    "node": "10.224.0.5",
    "protocol": "HBONE",
    "serviceAccount": "default",
    "status": "Healthy",
    "trustDomain": "cluster.local",
    "uid": "30f37433-a83f-4e30-9946-f62cf5d10924",
    "workloadIps": [
        "192.168.0.50"
    ],
    "workloadType": "deployment"
    }
]

在现有群集上禁用 mTLS

建议在禁用 mTLS 之前,从 mTLS 中解除命名空间的注册。

kubectl label namespace <namespace-name> io.cilium/mtls-enabled-

可以独立禁用 mTLS 加密,而不会影响其他 ACNS 功能。 若要禁用它,请将标志 --acns-transit-encryption-type 设置为 none

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type none