你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在高级容器网络服务中为容器网络安全设置 FQDN 筛选功能

本文介绍如何在 AKS 群集中设置具有容器网络安全功能的高级容器网络服务。

先决条件

  • 具有活动订阅的 Azure 帐户。 如果还没有该订阅,可以在开始前创建一个免费帐户

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

安装 aks-preview Azure CLI 扩展

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

# 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

启用高级容器网络服务

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

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

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

  • 容器网络安全:提供 FQDN 筛选等安全功能。 若要了解详细信息,请访问容器网络安全

注意

从 Kubernetes 版本 1.29 开始,具有 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 \
    --max-pods 250 \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --node-count 2 \
    --pod-cidr 192.168.0.0/16 \
    --kubernetes-version 1.29 \
    --enable-acns

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

具有高级容器网络服务标志 --enable-acnsaz aks update 命令使用所有高级容器网络服务功能(包括容器网络可观测性容器网络安全功能)更新现有 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 群集安装和启用高级容器网络服务的安全功能。