你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何在 AKS 群集中设置具有容器网络安全功能的高级容器网络服务。
先决条件
- 具有活动订阅的 Azure 帐户。 如果还没有该订阅,可以在开始前创建一个免费帐户。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
本文中的步骤所需的最低 Azure CLI 版本为 2.71.0。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
启用高级容器网络服务
若要继续,必须有一个启用了高级容器网络服务的 AKS 群集。
具有高级容器网络服务标志 az aks create
的 --enable-acns
命令创建一个新的 AKS 群集,它具有所有高级容器网络服务功能。 这些功能包括:
- Cilium
- 非 Cilium
# Set an environment variable for the AKS cluster name. Make sure to replace the placeholder with your own value.
export CLUSTER_NAME="<aks-cluster-name>"
# Create an AKS cluster
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--generate-ssh-keys \
--location eastus \
--network-plugin azure \
--network-dataplane cilium \
--node-count 2 \
--enable-acns
在现有群集上启用高级容器网络服务
具有高级容器网络服务标志 az aks update
的 --enable-acns
命令会更新现有的 AKS 群集,使其具有所有高级容器网络服务功能,包括 容器网络可观测性 和 容器网络安全 功能。
注意
只有具有 Cilium 数据平面的群集才支持高级容器网络服务的容器网络安全功能。
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-acns
获取群集凭据
使用 az aks get-credentials
命令获取群集凭据。
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
使用策略测试连接
本节演示如何观察通过 Cilium 代理强制实施的策略。 向允许的 FQDN 和另一个请求会被阻止的情况发出 DNS 请求。
创建名为 demo-policy.yaml
的文件并粘贴以下 YAML 清单:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "allow-bing-fqdn"
spec:
endpointSelector:
matchLabels:
app: demo-container
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*.bing.com"
- toFQDNs:
- matchPattern: "*.bing.com"
指定 YAML 清单的名称并使用 [kubectl apply][kubectl-apply] 应用该名称:
kubectl apply –f demo-policy.yaml -n demo
创建演示 Pod
创建运行 Bash 的 client
Pod:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.43 --labels="app=demo-container" --command -- bash
具有用于测试 FQDN 的实用程序的 shell 应该会打开,并显示以下输出:
If you don't see a command prompt, try pressing enter.
bash-5.0#
在一个单独的窗口中,运行以下命令以获取正在运行的 Pod 的节点。
kubectl get po -n demo --sort-by="{spec.nodeName}" -o wide
输出应类似于以下示例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
client 1/1 Running 0 5m50s 192.168.0.139 aks-nodepool1-22058664-vmss000001 <none> <none>
该 Pod 在名为 aks-nodepool1-22058664-vmss000001
的节点上运行。 获取在该节点上运行的 Cilium 代理实例:
k get po -n kube-system -o wide --field-selector spec.nodeName="aks-nodepool1-22058664-vmss000001" | grep "cilium"
预期 cilium-s4x24
应该在输出中。
cilium-s4x24 1/1 Running 0 47m 10.224.0.4 aks-nodepool1-22058664-vmss000001 <none> <none>
检查 Cilium 代理
使用 cilium
CLI 监视被阻止的流量。
kubectl exec -it -n kube-system cilium-s4x24 -- sh
Defaulted container "cilium-agent" out of: cilium-agent, install-cni-binaries (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), block-wireserver (init)
#
在此 shell 中,运行 cilium monitor -t drop
:
Listening for events on 2 CPUs with 64x4096 of shared memory
Press Ctrl-C to quit
time="2024-10-08T17:48:27Z" level=info msg="Initializing dissection cache..." subsys=monitor
验证策略
从第一个 shell 中,如策略所指定,创建对允许的 FQDN *.bing.com
的请求。 这应该会成功并得到代理的允许。
bash-5.0# ./agnhost connect www.bing.com:80
然后,对一个预期请求会被阻止的 FQDN 创建另一个请求:
bash-5.0# ./agnhost connect www.example.com:80
Cilium 代理阻止该请求,并显示输出:
xx drop (Policy denied) flow 0xfddd76f6 to endpoint 0, ifindex 29, file bpf_lxc.c:1274, , identity 48447->world: 192.168.0.149:45830 -> 93.184.215.14:80 tcp SYN
清理资源
如果不打算使用此应用程序,请使用 az group delete
命令删除本文中创建的其他资源。
az group delete --name $RESOURCE_GROUP
后续步骤
本操作指南文章介绍了如何为 AKS 群集安装和启用高级容器网络服务的安全功能。
- 有关 Azure Kubernetes 服务 (AKS) 的高级容器网络服务的详细信息,请参阅什么是 Azure Kubernetes 服务 (AKS) 的高级容器网络服务。