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

安装 Calico 附加组件

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

注意事项

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

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

  • 如果您使用适用于 Pod 的安全组,则分支网络接口上流入 Pod 的流量将不受 Calico 网络策略执行的约束,并且仅受到 Amazon EC2 安全组执行的限制。社群正在努力消除这一限制。

先决条件

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

  • 计算机或 Amazon CloudShell 上安装的 kubectl 命令行工具。其版本必须与您的集群版本相同,或者最多高出两个版本。要安装或升级 kubectl,请参阅 安装 kubectl

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

在 Amazon EKS Linux 节点上安装 Calico

您可以使用 Helm 程序或清单来安装 Calico。Amazon EKS 不会更新清单,因此我们建议使用 Helm,因为图表将由 Tigera 维护。

Amazon EKS 不会在 Amazon EKS 集群上测试和验证新的 Tigera Operator 和 Calico 功能。如果在安装和使用 Calico 过程中遇到问题,请直接将问题提交给 Tigera OperatorCalico Project 支持人员。在将任何新的 Tigera Operator 和 Calico 版本安装到集群之前,您应始终与 Tigera 联系以了解兼容性。

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 列中的值应该相一致。返回的值与以下输出中的不同。

    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 列中的值也应该一致。返回的值与以下输出中的不同。

    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 容器的日志不包含 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
重要

将来不会维护这些图表。我们建议您改用 Helm 进行安装,因为 Helm 图表会得到维护。

使用清单安装 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 列中的值应该相一致。返回的值与以下输出中的不同。

    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. 查看集群上的所有容器。

    kubectl get pods --all-namespaces

    输出

    在输出中,您应该会在以下输出中显示的命名空间中看到容器。READY 列中的容器 NAMES 和容器数量与以下输出中的不同。在看到具有相似名称的容器并且它们在 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