安装 Calico 网络策略引擎附加组件
Project Calico
注意事项
-
当将 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,则可以将kubectl的1.23、1.24或1.25版本与之配合使用。要安装或升级kubectl,请参阅 安装或更新 kubectl。
以下过程显示如何在 Amazon EKS 集群中的 Linux 节点上安装 Calico。要在 Windows 节点上安装 Calico,请参阅在 Amazon EKS Windows 容器上使用 Calico
在 Amazon EKS Linux 节点上安装 Calico
重要
Amazon EKS 不维护以下过程中使用的图表。在 Amazon EKS 上安装 Calico 的推荐方法是使用 Calico Operator
先决条件
在您的计算机上安装 Helm 版本 3.0 或更高版本。要安装或升级 Helm,请参阅 将 Helm 与 Amazon EKS 结合使用。
使用 Helm 安装 Calico
-
使用 Tigera 说明安装 Calico 版本
3.25。有关更多信息,请参阅 Calico 文档中的安装 Calico。 -
在
tigera-operator命名空间中查看资源。kubectl get all -n tigera-operator输出示例如下。
NAME READY STATUS RESTARTS AGE pod/tigera-operator-768d489967-6cv581/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-768d4899671 1 1 27mreplicaset的DESIRED和READY列中的值应该相一致。 -
在
calico-system命名空间中查看资源。kubectl get all -n calico-system输出示例如下。
NAME READY STATUS RESTARTS AGE pod/calico-kube-controllers-55c98678-gh6cc1/1 Running 0 4m29s pod/calico-node-khw4w1/1 Running 0 4m29s pod/calico-node-rrz8k1/1 Running 0 4m29s pod/calico-typha-696bcd55cb-49prr1/1 Running 0 4m29s pod/csi-node-driver-6v2z52/2 Running 0 4m29s pod/csi-node-driver-wrw2d2/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-55c986781 1 1 4m29s replicaset.apps/calico-typha-696bcd55cb1 1 1 4m29scalico-nodedaemonset的DESIRED和READY列中的值应该相一致。两个replicasets的DESIRED和READY列中的值也应该一致。daemonset.apps/calico-node的DESIRED列中的数量因集群中的节点数量而异。 -
请确认其中一个
calico-node、calico-typha和tigera-operatorpods 的日志不包含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,并且一切都应该正常运行。 -
如果您使用 Amazon VPC CNI plugin for Kubernetes 的版本
1.9.3或更高版本,则启用插件以将容器组(pod)IP 地址添加到calico-kube-controllers-容器组(pod)规范中的注释中。有关此设置的更多信息,请参阅 GitHub 上的55c98678-gh6ccANNOTATE_POD_IP。 -
可以使用以下命令查看集群上安装的插件版本。
kubectl describe daemonset aws-node -n kube-system | grep amazon-k8s-cni: | cut -d ":" -f 3输出示例如下。
v1.12.2-eksbuild.1 -
创建一个可以应用于集群的配置文件,以向
aws-nodeKubernetesclusterrole授予权限来修补 pods。cat << EOF > append.yaml - apiGroups: - "" resources: - pods verbs: - patch EOF -
将更新权限应用于集群。
kubectl apply -f <(cat <(kubectl get clusterrole aws-node -o yaml) append.yaml) -
设置插件的环境变量。
kubectl set env daemonset aws-node -n kube-system ANNOTATE_POD_IP=true 删除
calico-kube-controllers-55c98678-gh6cckubectl delete pod calico-kube-controllers-55c98678-gh6cc-n calico-system再次查看
calico-system命名空间中的容器组以查看新calico-kube-controllers容器组的 ID,Kubernetes 会将您在上一步中删除的calico-kube-controllers-容器组替换为该内容。55c98678-gh6cckubectl get pods -n calico-system-
确认
vpc.amazonaws.com/pod-ips注释已添加到新的calico-kube-controllers容器组。将
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 策略演示
在您创建任何网络策略之前,所有服务可以双向通信。在应用网络策略后,您可以看到客户端只能与前端服务进行通信,而后端只能接受来自前端的流量。
运行 Stars 策略演示
-
应用前端、后端、客户端和管理用户界面服务:
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 -
请查看集群上的所有 pods。
kubectl get pods -A输出示例如下。
在输出中,您应该会在以下输出中显示的命名空间中看到 pods。
列中的 podREADYNAMES和 pods 数量与以下输出中的不同。在看到具有相似名称的 pods 并且它们在STATUS列中都具有Running之前,请不要继续。NAMESPACE NAME READY STATUS RESTARTS AGE ... client client-xlffc1/1Running 05m19s... management-ui management-ui-qrb2g1/1Running 05m24sstars backend-sz87q1/1Running 05m23sstars frontend-cscnf1/1Running 05m21s... -
要连接到管理用户界面,请将您的本地端口 9001 转发至集群上运行的
management-ui服务:kubectl port-forward service/management-ui -n management-ui 9001 -
在本地系统上打开浏览器,然后将其指向 http://localhost:9001/
。您应该会看到管理用户界面。C 节点是客户端服务,F 节点是前端服务,B 节点是后端服务。每个节点都有到所有其他节点的完整通信访问权限(如粗体、彩色行所示)。
-
应用以下网络策略以隔离各个服务:
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 -
刷新您的浏览器。您可以看到管理用户界面不再能访问任何节点,因此它们不会显示在用户界面中。
-
应用以下网络策略以允许管理用户界面访问这些服务:
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 -
刷新您的浏览器。您可以看到管理用户界面可以再次访问节点,但各节点无法相互通信。
-
应用以下网络策略以允许流量从前端服务传到后端服务:
kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/backend-policy.yaml -
刷新您的浏览器。您将看到前端可以与后端进行通信。
-
应用以下网络策略以允许流量从客户端传到前端服务。
kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/frontend-policy.yaml -
刷新您的浏览器。您将看到客户端可以与前端服务进行通信。前端服务仍可以与后端服务进行通信。
-
(可选)完成该演示后,您可以删除其资源。
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