为混合节点配置 Kubernetes 网络策略 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

为混合节点配置 Kubernetes 网络策略

如果将 Cilium 用作 EKS 混合节点的 CNI,则 Amazon 支持通过 Kubernetes 网络策略(第 3 层/第 4 层)来控制容器组(pod)的入口和出口流量。如果运行的 EKS 集群包含 Amazon 云中的节点,则 Amazon 支持使用 Amazon VPC CNI 来实现 Kubernetes 网络策略

本主题介绍如何通过 EKS 混合节点配置 Cilium 和 Kubernetes 网络策略。有关 Kubernetes 网络策略的详细信息,请参阅 Kubernetes 文档中的 Kubernetes Network Policies

配置网络策略

注意事项

  • Amazon 支持通过上游 Kubernetes 网络策略及其规范,控制容器组(pod)的入口和出口流量,但 Amazon 目前不支持 CiliumNetworkPolicyCiliumClusterwideNetworkPolicy

  • policyEnforcementMode Helm 可用于控制 Cilium 的默认策略执行行为。默认行为允许所有出口和入口流量。如果一个端点被某个网络策略选中,则会转换为默认拒绝状态,仅允许明确允许的流量。有关默认策略模式策略执行模式的更多信息,请参阅 Cilium 文档。

  • 如果要为现有的 Cilium 安装更改 policyEnforcementMode,则必须重启 Cilium 代理 DaemonSet,这样才能应用新的策略执行模式。

  • 使用 namespaceSelectorpodSelector 以允许或拒绝进出带有匹配标签的命名空间和容器组(pod)的流量。namespaceSelectorpodSelector 可与 matchLabelsmatchExpressions 结合使用,以根据标签选择命名空间和容器组(pod)。

  • 使用 ingress.portsegress.ports 以允许或拒绝进出端口和协议的流量。

  • ipBlock 字段不能用于选择性地允许或拒绝进出容器组(pod)IP 地址的流量(#9209)。对节点 IP 使用 ipBlock 选择器是 Cilium 中的一项测试功能,不受 Amazon 支持。

  • 有关 Kubernetes 网络策略可用字段的信息,请参阅 Kubernetes 文档中的 NetworkPolicy resource

先决条件

过程

以下过程为示例微服务应用程序设置了网络策略,使得各个组件只能与应用程序正常运行所需的其他组件通信。该过程使用 Istio Bookinfo 示例微服务应用程序。

Bookinfo 应用程序由四项独立的微服务组成,它们具有以下关系:

  • productpage。productpage 微服务会调用 details 和 reviews 微服务来填充页面。

  • details。details 微服务包含包含书籍信息。

  • reviews。reviews 微服务包含书评,还会调用 ratings 微服务。

  • ratings。ratings 微服务包含随书评附带的书籍排名信息。

    1. 创建示例应用程序。

      kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
    2. 确认应用程序成功运行,并记下 productpage 微服务的容器组(pod)IP 地址。您将在后续步骤中使用此容器组(pod)IP 地址查询每项微服务。

      kubectl get pods -o wide
      NAME READY STATUS RESTARTS AGE IP NODE details-v1-766844796b-9wff2 1/1 Running 0 7s 10.86.3.7 mi-0daa253999fe92daa productpage-v1-54bb874995-lwfgg 1/1 Running 0 7s 10.86.2.193 mi-082f73826a163626e ratings-v1-5dc79b6bcd-59njm 1/1 Running 0 7s 10.86.2.232 mi-082f73826a163626e reviews-v1-598b896c9d-p2289 1/1 Running 0 7s 10.86.2.47 mi-026d6a261e355fba7 reviews-v2-556d6457d-djktc 1/1 Running 0 7s 10.86.3.58 mi-0daa253999fe92daa reviews-v3-564544b4d6-g8hh4 1/1 Running 0 7s 10.86.2.69 mi-09183e8a3d755abf6
    3. 创建一个容器组(pod),用于全程测试网络策略。请注意,该容器组(pod)是在 default 命名空间中创建,带有 access: true 标签。

      kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
    4. 测试对 productpage 微服务的访问权限。在以下示例中,我们使用 productpage 容器组(pod)的容器组(pod)IP 地址 (10.86.2.193) 查询该微服务。请将其替换为环境中 productpage 容器组(pod)的容器组(pod)IP 地址。

      curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
      <title>Simple Bookstore App</title>
    5. 您可以通过输入 exit 来退出测试 curl 容器组(pod),也可以通过运行以下命令重新附加到该容器组(pod)。

      kubectl attach curl-pod -c curl-pod -i -t
    6. 为演示后续步骤中网络策略的效果,我们首先创建了一个拒绝所有流向 BookInfo 微服务之流量的网络策略。创建一个名为 network-policy-deny-bookinfo.yaml 的文件,用于定义拒绝网络策略。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-bookinfo namespace: default spec: podSelector: matchExpressions: - key: app operator: In values: ["productpage", "details", "reviews", "ratings"] policyTypes: - Ingress - Egress
    7. 将拒绝网络策略应用于集群。

      kubectl apply -f network-policy-default-deny-bookinfo.yaml
    8. 测试对 BookInfo 应用程序的访问权限。在以下示例中,我们使用 productpage 容器组(pod)的容器组(pod)IP 地址 (10.86.2.193) 查询该微服务。请将其替换为环境中 productpage 容器组(pod)的容器组(pod)IP 地址。

      curl http://10.86.2.193:9080/productpage --max-time 10
      curl: (28) Connection timed out after 10001 milliseconds
    9. 创建一个名为 network-policy-productpage.yaml 的文件,用于定义 productpage 网络策略。该策略具有以下规则:

      • 允许来自带有 access: true 标签的容器组(pod)[即上一步中创建的 curl 容器组(pod)] 的入口流量

      • 允许端口 9080 上的出口 TCP 流量流向 details、reviews 和 ratings 微服务

      • 允许端口 53 上的出口 TCP/UDP 流量流向在 kube-system 命名空间中运行的 CoreDNS

        apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: productpage-policy namespace: default spec: podSelector: matchLabels: app: productpage policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: access: "true" egress: - to: - podSelector: matchExpressions: - key: app operator: In values: ["details", "reviews", "ratings"] ports: - port: 9080 protocol: TCP - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
    10. 将 productpage 网络策略应用于集群。

      kubectl apply -f network-policy-productpage.yaml
    11. 连接到 curl 容器组(pod)并测试对 Bookinfo 应用程序的访问权限。现在允许访问 productpage 微服务,但其他微服务仍被拒绝,因为它们仍然受到拒绝网络策略的约束。在以下示例中,我们使用 productpage 容器组(pod)的容器组(pod)IP 地址 (10.86.2.193) 查询该微服务。请将其替换为环境中 productpage 容器组(pod)的容器组(pod)IP 地址。

      kubectl attach curl-pod -c curl-pod -i -t
      curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
      curl -s http://10.86.2.193:9080/api/v1/products/1 {"error": "Sorry, product details are currently unavailable for this book."}
      curl -s http://10.86.2.193:9080/api/v1/products/1/reviews {"error": "Sorry, product reviews are currently unavailable for this book."}
      curl -s http://10.86.2.193:9080/api/v1/products/1/ratings {"error": "Sorry, product ratings are currently unavailable for this book."}
    12. 创建一个名为 network-policy-details.yaml 的文件,用于定义 details 网络策略。该策略仅允许来自 productpage 微服务的入口流量。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: details-policy namespace: default spec: podSelector: matchLabels: app: details policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: productpage
    13. 创建一个名为 network-policy-reviews.yaml 的文件,用于定义 reviews 网络策略。该策略仅允许来自 productpage 微服务的入口流量,并且仅允许流向 ratings 微服务和 CoreDNS 的出口流量。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: reviews-policy namespace: default spec: podSelector: matchLabels: app: reviews policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: productpage egress: - to: - podSelector: matchLabels: app: ratings - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
    14. 创建一个名为 network-policy-ratings.yaml 的文件,用于定义 ratings 网络策略。该策略仅允许来自 productpage 和 reviews 微服务的入口流量。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ratings-policy namespace: default spec: podSelector: matchLabels: app: ratings policyTypes: - Ingress ingress: - from: - podSelector: matchExpressions: - key: app operator: In values: ["productpage", "reviews"]
    15. 将 details、reviews 和 ratings 网络策略应用于集群。

      kubectl apply -f network-policy-details.yaml kubectl apply -f network-policy-reviews.yaml kubectl apply -f network-policy-ratings.yaml
    16. 连接到 curl 容器组(pod)并测试对 Bookinfo 应用程序的访问权限。在以下示例中,我们使用 productpage 容器组(pod)的容器组(pod)IP 地址 (10.86.2.193) 查询该微服务。请将其替换为环境中 productpage 容器组(pod)的容器组(pod)IP 地址。

      kubectl attach curl-pod -c curl-pod -i -t

      测试 details 微服务。

      curl -s http://10.86.2.193:9080/api/v1/products/1
      {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}

      测试 reviews 微服务。

      curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
      {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}

      测试 ratings 微服务。

      curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
      {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
    17. 清理您在此过程中创建的资源。

      kubectl delete -f network-policy-deny-bookinfo.yaml kubectl delete -f network-policy-productpage.yaml kubectl delete -f network-policy-details.yaml kubectl delete -f network-policy-reviews.yaml kubectl delete -f network-policy-ratings.yaml kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml kubectl delete pod curl-pod