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 add 或 az 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 的命名空间后,可以使用以下方法验证身份验证和加密是否处于活动状态。
检查是否已启用 ztunnel:
kubectl -n kube-system describe cm cilium-config | grep enable-ztunnel -A2应会看到指示已启用 ztunnel 加密的输出。
检查已注册的命名空间:
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"]'此查询的结果应显示注册协调程序已成功处理哪些命名空间。
验证 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>验证 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