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

安装 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 网络策略执行的约束。

先决条件

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

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

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

在 Amazon EKS Linux 节点上安装 Calico

重要

Amazon EKS 不维护以下过程中使用的清单或图表。在 Amazon EKS 上安装 Calico 的推荐方法是使用 Calico Operator 而不是这些图表或清单。有关更多信息,请参阅 GitHub 上的重要公告:Amazon EKS 将不再维护和更新此存储库中的 Calico 图表。如果在安装和使用 Calico 过程中遇到问题,请直接将问题提交给 Calico OperatorCalico 项目。在将任何新的 Calico Operator 和 Calico 版本安装到集群之前,您应始终与 Tigera 联系以了解兼容性。

您可以使用 Helm 程序或清单来安装 Calico。

Helm

先决条件

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

要使用 Helm 安装 Calico

  1. 将 Project Calico 添加到 Helm 存储库中。

    helm repo add projectcalico https://docs.projectcalico.org/charts
  2. 如果您已经添加了 Calico,则可能需要更新它以获得最新发布的版本。

    helm repo update
  3. 请安装 3.21.4 或更高版本的 Tigera Calico Operator 和自定义资源定义。

    helm install calico projectcalico/tigera-operator --version v3.21.4
  4. tigera-operator 命名空间中查看资源。

    kubectl get all -n tigera-operator

    输出示例如下。

    replicasetDESIREDREADY 列中的值应该相一致。返回的值与以下输出中的 values 不同。

    NAME READY STATUS RESTARTS AGE pod/tigera-operator-c4b9549c7-h4zp5 1/1 Running 0 110m ... NAME DESIRED CURRENT READY AGE replicaset.apps/tigera-operator-c4b9549c7 1 1 1 2m35s
  5. calico-system 命名空间中查看资源。

    kubectl get all -n calico-system

    输出示例如下。

    calico-node DaemonSetDESIREDREADY 列中的值应该相一致。两个 replicasetsDESIREDREADY 列中的值也应该一致。返回的值与以下输出中的 values 不同。

    NAME READY STATUS RESTARTS AGE pod/calico-kube-controllers-579b45dcf-z5tsf 1/1 Running 0 100m pod/calico-node-v9dhf 1/1 Running 0 100m pod/calico-typha-6f9c6786d-f2mc7 1/1 Running 0 100m ... NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/calico-node 1 1 1 1 1 kubernetes.io/os=linux 100m ... NAME DESIRED CURRENT READY AGE replicaset.apps/calico-kube-controllers-579b45dcf 1 1 1 100m replicaset.apps/calico-typha-6f9c6786d 1 1 1 100m
  6. 请确认其中一个 calico-nodecalico-typhatigera-operator pods 的日志不包含 ERROR。请将以下命令中的值替换为上一步的输出中返回的值。

    kubectl logs tigera-operator-c4b9549c7-h4zp5 -n tigera-operator | grep ERROR kubectl logs calico-node-v9dhf -n calico-system | grep ERROR kubectl logs calico-typha-6f9c6786d-f2mc7 -n calico-system | grep ERROR

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

Manifests

要使用清单安装 Calico

  1. 将 Calico 清单应用于集群。这些清单将在 calico-system 命名空间中创建 DaemonSet。

    kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml
  2. calico-system 命名空间中查看资源。

    kubectl get daemonset calico-node --namespace calico-system

    输出示例如下。

    DESIREDREADY 列中的值应该相一致。返回的值与以下输出中的 values 不同。

    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE calico-node 1 1 1 1 1 kubernetes.io/os=linux 26m

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

使用安装 Calico 的方法删除 Calico。

Helm

从集群中删除 Calico。

helm uninstall calico
Manifests

从集群中删除 Calico。

kubectl delete -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml kubectl delete -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml