安装 Calico 网络策略引擎附加组件 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

安装 Calico 网络策略引擎附加组件

Project Calico 是一种适用于 Kubernetes 的网络策略引擎。通过强制实施 Calico 网络策略,您可以实现网络隔离和租户隔离。在必须隔离各个租户的多租户环境中,或者当您要针对开发、暂存和生产创建单独的环境时,这非常有用。网络策略类似于 Amazon 安全组的一点是,您可以创建网络传入和传出规则。您使用 pod 选择器和标签向 pods 分配网络策略,而不是向安全组分配实例。

注意事项
  • 当将 Fargate 与 Amazon EKS 一起使用时不支持 Calico。

  • Calico 将规则添加到节点上的 iptables,这些规则的优先级可能高于您已经在 Calico 之外实施的现有规则。考虑将现有 iptables 规则添加到您的 Calico 策略,以避免 Calico 策略之外的规则被 Calico 覆盖。

  • 如果您使用 Amazon VPC CNI 附加组件版本 1.10 或更早的版本,则分支网络接口上流入 pods 的 pods 安全组流量将不受 Calico 网络策略执行的约束,并且仅受到 Amazon EC2 安全组执行的限制。如果您使用的是 1.11.0 或更高版本的 Amazon VPC CNII 附加组件,如您为 Amazon VPC CNI 附加组件设置 POD_SECURITY_GROUP_ENFORCING_MODE=standard,则分支网络接口上流入 pods 的流量将受 Calico 网络策略执行的约束。

  • 集群的 IP 系列设置必须为 IPv4。如果您的集群是为使用 IPv6 系列而创建的,则无法使用 Calico 网络策略引擎附加组件。

先决条件
  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 您的设备或 Amazon CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.24,则可以将 kubectl1.231.241.25 版本与之配合使用。要安装或升级 kubectl,请参阅 安装或更新 kubectl

以下过程显示如何在 Amazon EKS 集群中的 Linux 节点上安装 Calico。要在 Windows 节点上安装 Calico,请参阅在 Amazon EKS Windows 容器上使用 Calico

在 Amazon EKS Linux 节点上安装 Calico

重要

Amazon EKS 不维护以下过程中使用的图表。在 Amazon EKS 上安装 Calico 的推荐方法是使用 Calico Operator。如果在安装和使用 Calico 过程中遇到问题,请直接将问题提交给 Calico OperatorCalico 项目。在将任何新的 Calico Operator 和 Calico 版本安装到集群之前,您应始终与 Tigera 联系以了解兼容性。

先决条件

在您的计算机上安装 Helm 版本 3.0 或更高版本。要安装或升级 Helm,请参阅 将 Helm 与 Amazon EKS 结合使用

使用 Helm 安装 Calico
  1. 使用 Tigera 说明安装 Calico 版本 3.25。有关更多信息,请参阅 Calico 文档中的安装 Calico

  2. tigera-operator 命名空间中查看资源。

    kubectl get all -n tigera-operator

    输出示例如下。

    NAME READY STATUS RESTARTS AGE pod/tigera-operator-768d489967-6cv58 1/1 Running 0 27m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/tigera-operator 1/1 1 1 27m NAME DESIRED CURRENT READY AGE replicaset.apps/tigera-operator-768d489967 1 1 1 27m

    replicasetDESIREDREADY 列中的值应该相一致。

  3. calico-system 命名空间中查看资源。

    kubectl get all -n calico-system

    输出示例如下。

    NAME READY STATUS RESTARTS AGE pod/calico-kube-controllers-55c98678-gh6cc 1/1 Running 0 4m29s pod/calico-node-khw4w 1/1 Running 0 4m29s pod/calico-node-rrz8k 1/1 Running 0 4m29s pod/calico-typha-696bcd55cb-49prr 1/1 Running 0 4m29s pod/csi-node-driver-6v2z5 2/2 Running 0 4m29s pod/csi-node-driver-wrw2d 2/2 Running 0 4m29s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/calico-kube-controllers-metrics ClusterIP None <none> 9094/TCP 4m23s service/calico-typha ClusterIP 10.100.67.39 <none> 5473/TCP 4m30s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/calico-node 2 2 2 2 2 kubernetes.io/os=linux 4m29s daemonset.apps/csi-node-driver 2 2 2 2 2 kubernetes.io/os=linux 4m29s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/calico-kube-controllers 1/1 1 1 4m29s deployment.apps/calico-typha 1/1 1 1 4m29s NAME DESIRED CURRENT READY AGE replicaset.apps/calico-kube-controllers-55c98678 1 1 1 4m29s replicaset.apps/calico-typha-696bcd55cb 1 1 1 4m29s

    calico-node daemonsetDESIREDREADY 列中的值应该相一致。两个 replicasetsDESIREDREADY 列中的值也应该一致。daemonset.apps/calico-nodeDESIRED 列中的数量因集群中的节点数量而异。

  4. 请确认其中一个 calico-nodecalico-typhatigera-operator pods 的日志不包含 ERROR。请将以下命令中的值替换为上一步的输出中返回的值。

    kubectl logs tigera-operator-768d489967-6cv58 -n tigera-operator | grep ERROR kubectl logs calico-node-khw4w -c calico-node -n calico-system | grep ERROR kubectl logs calico-typha-696bcd55cb-49prr -n calico-system | grep ERROR

    如果之前的命令没有返回任何输出,那么日志中不存在 ERROR,并且一切都应该正常运行。

  5. 如果您使用 Amazon VPC CNI plugin for Kubernetes 的版本 1.9.3 或更高版本,则启用插件以将容器组(pod)IP 地址添加到 calico-kube-controllers-55c98678-gh6cc 容器组(pod)规范中的注释中。有关此设置的更多信息,请参阅 GitHub 上的 ANNOTATE_POD_IP

    1. 可以使用以下命令查看集群上安装的插件版本。

      kubectl describe daemonset aws-node -n kube-system | grep amazon-k8s-cni: | cut -d ":" -f 3

      输出示例如下。

      v1.12.2-eksbuild.1
    2. 创建一个可以应用于集群的配置文件,以向 aws-node Kubernetes clusterrole 授予权限来修补 pods。

      cat << EOF > append.yaml - apiGroups: - "" resources: - pods verbs: - patch EOF
    3. 将更新权限应用于集群。

      kubectl apply -f <(cat <(kubectl get clusterrole aws-node -o yaml) append.yaml)
    4. 设置插件的环境变量。

      kubectl set env daemonset aws-node -n kube-system ANNOTATE_POD_IP=true
    5. 删除 calico-kube-controllers-55c98678-gh6cc

      kubectl delete pod calico-kube-controllers-55c98678-gh6cc -n calico-system
    6. 再次查看 calico-system 命名空间中的容器组以查看新 calico-kube-controllers 容器组的 ID,Kubernetes 会将您在上一步中删除的 calico-kube-controllers-55c98678-gh6cc 容器组替换为该内容。

      kubectl get pods -n calico-system
    7. 确认 vpc.amazonaws.com/pod-ips 注释已添加到新的 calico-kube-controllers 容器组。

      1. 5cd7d477df-2xqpd 替换为上一步中返回的容器组(pod)的 ID。

        kubectl describe pod calico-kube-controllers-5cd7d477df-2xqpd -n calico-system | grep vpc.amazonaws.com/pod-ips

        输出示例如下。

        vpc.amazonaws.com/pod-ips: 192.168.25.9

Stars 策略演示

本部分介绍了 Project Calico 文档提供的 Stars 策略演示,它对于集群上的 Calico 功能并非必需。该演示在您的 Amazon EKS 集群上创建前端、后端和客户端服务。该演示还创建管理图形用户界面,用于显示各服务之间可用的传入和传出路径。我们建议您在不运行生产工作负载的集群上完成演示。

在您创建任何网络策略之前,所有服务可以双向通信。在应用网络策略后,您可以看到客户端只能与前端服务进行通信,而后端只能接受来自前端的流量。

运行 Stars 策略演示
  1. 应用前端、后端、客户端和管理用户界面服务:

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml
  2. 请查看集群上的所有 pods。

    kubectl get pods -A

    输出示例如下。

    在输出中,您应该会在以下输出中显示的命名空间中看到 pods。READY 列中的 pod NAMES 和 pods 数量与以下输出中的不同。在看到具有相似名称的 pods 并且它们在 STATUS 列中都具有 Running 之前,请不要继续。

    NAMESPACE NAME READY STATUS RESTARTS AGE ... client client-xlffc 1/1 Running 0 5m19s ... management-ui management-ui-qrb2g 1/1 Running 0 5m24s stars backend-sz87q 1/1 Running 0 5m23s stars frontend-cscnf 1/1 Running 0 5m21s ...
  3. 要连接到管理用户界面,请将您的本地端口 9001 转发至集群上运行的 management-ui 服务:

    kubectl port-forward service/management-ui -n management-ui 9001
  4. 在本地系统上打开浏览器,然后将其指向 http://localhost:9001/。您应该会看到管理用户界面。C 节点是客户端服务,F 节点是前端服务,B 节点是后端服务。每个节点都有到所有其他节点的完整通信访问权限(如粗体、彩色行所示)。

    
                        打开网络策略
  5. 应用以下网络策略以隔离各个服务:

    kubectl apply -n stars -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/default-deny.yaml kubectl apply -n client -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/default-deny.yaml
  6. 刷新您的浏览器。您可以看到管理用户界面不再能访问任何节点,因此它们不会显示在用户界面中。

  7. 应用以下网络策略以允许管理用户界面访问这些服务:

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/allow-ui.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/allow-ui-client.yaml
  8. 刷新您的浏览器。您可以看到管理用户界面可以再次访问节点,但各节点无法相互通信。

    
                        UI 访问网络策略
  9. 应用以下网络策略以允许流量从前端服务传到后端服务:

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/backend-policy.yaml
  10. 刷新您的浏览器。您将看到前端可以与后端进行通信。

    
                        前端到后端策略
  11. 应用以下网络策略以允许流量从客户端传到前端服务。

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/frontend-policy.yaml
  12. 刷新您的浏览器。您将看到客户端可以与前端服务进行通信。前端服务仍可以与后端服务进行通信。

    
                        最终网络策略
  13. (可选)完成该演示后,您可以删除其资源。

    kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml

    甚至在删除资源后,节点上仍然存在一些 iptables 规则,这些规则可能以意外方式干扰集群中的联网。删除 Calico 的唯一可靠方法是终止所有节点并将它们回收。要终止所有节点,请将 Auto Scaling 组所需计数设置为 0,然后创建所需数量的备份,或者仅终止节点。如果您无法回收节点,请参阅 Calico GitHub 存储库中的禁用和删除 Calico 策略以了解最后的解决方法。

删除 Calico

使用 Helm 从集群中移除 Calico。

helm uninstall calico