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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon EKS 上安装 Calico

Project Calico 是一种适用于 Kubernetes 的网络策略引擎。通过强制实施 Calico 网络策略,您可以实现网络隔离和租户隔离。在必须隔离各个租户的多租户环境中,或者当您要针对开发、暂存和生产创建单独的环境时,这非常有用。网络策略类似于 Amazon 安全组的一点是,您可以创建网络传入和传出规则。您使用 Pod 选择器和标签向 Pod 分配网络策略,而不是向安全组分配实例。以下过程介绍了如何在 Amazon EKS 集群的 Linux 节点上安装 Calico。若要在 Windows 节点上安装印 Calico,请参阅在亚马逊 EKS 窗口容器上使用印花布

注意
  • 将 Fargate 与 Amazon EKS 一起使用时不支持印花布。

  • 印花布添加了规则iptables,该节点的优先级可能高于您已经在 Calico 之外实施的现有规则。考虑添加现有iptables规则添加到您的印花布政策,以避免印花布利克政策之外的规则被覆盖。

  • 如果您使用的是窗格的安全组,分支网络接口上流入容器的流量不受 Calico 网络策略强制执行的约束,仅限于 Amazon EC2 安全组强制执行。社区正在努力消除这一限制。

在 Amazon EKS Linux 节点上安装 Calico

  1. 下载、修改 Calico 清单并将其应用到您的集群。

    1. 使用下面的命令下载 Calico 清单。

      curl -o calico-operator.yaml https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml curl -o calico-crs.yaml https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml
    2. 修改清单。

      1. 查看您下载的一个或多个清单文件,并记下图像的名称。使用以下命令在本地下载映像。

        docker pull quay.io/tigera/operator:v1.13.2 docker pull quay.io/calico/node:v3.17.1 docker pull quay.io/calico/typha:v3.17.1
      2. 使用以下命令标记要推送到中国亚马逊弹性容器注册存储库的图片。

        docker tag image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com.cn/image:<tag>
      3. 使用以下命令将图像推送到中国亚马逊 ECR 存储库。

        docker push image:<tag> <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com.cn/image:<tag>
      4. 更新calico-operator.yaml文件以引用您所在地区的亚马逊 ECR 图片 URL。

      5. 更新calico-crs.yaml文件来引用您所在地区的 Amazon ECR 映像存储库,方法是将以下内容添加到规范中。

        registry: <aws_account_id>.dkr.ecr.<cn-north-1>.amazonaws.com.cn
    3. 应用 Calico 清单。这些 DaemonSets 在calico-system命名空间。

      kubectl apply -f calico-operator.yaml kubectl apply -f calico-crs.yaml
  2. 查看 calico-system 守护程序集并等待 calico-node 守护程序集让DESIRED 数量的 pod 处于 READY 状态。出现这种情况时,Calico 正在运行。

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

    输出:

    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE calico-node 3 3 3 3 3 <none> 38s

从 Amazon EKS 集群中删除 Calico

如果您在 Amazon EKS 集群中使用完 Calico,可使用以下命令将其删除:

kubectl delete -f calico-crs.yaml kubectl delete -f calico-operator.yaml

Stars 策略演示

本部分演示了 Project Calico 文档提供的 Stars 策略演示。该演示在您的 Amazon EKS 集群上创建前端、后端和客户端服务。该演示还创建管理 GUI,用于显示各服务之间可用的传入和传出路径。

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

运行 Stars 策略演示

  1. 应用前端、后端、客户端和管理 UI 服务:

    kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml
  2. 等待所有 Pod 达到 Running 状态:

    kubectl get pods --all-namespaces --watch
  3. 要连接到管理 UI,请将您的本地端口 9001 转发至集群上运行的 management-ui 服务:

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

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

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

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

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

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

    kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/policies/backend-policy.yaml
  10. 应用以下网络策略以允许流量从 client 命名空间传到前端服务:

    kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/tutorials/stars-policy/policies/frontend-policy.yaml
    
                        最终网络策略
  11. (可选)在完成该演示后,您可以使用以下命令删除其资源:

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

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