安装 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.23
,则可以将kubectl
版本1.22
、1.23
或1.24
用于它。要安装或升级kubectl
,请参阅 安装或更新 kubectl。
以下过程显示如何在 Amazon EKS 集群中的 Linux 节点上安装 Calico。要在 Windows 节点上安装 Calico,请参阅在 Amazon EKS Windows 容器上使用 Calico
在 Amazon EKS Linux 节点上安装 Calico
Amazon EKS 不维护以下过程中使用的清单或图表。在 Amazon EKS 上安装 Calico 的推荐方法是使用 Calico Operator
-
您可以使用 Helm 或 Kubernetes 清单来安装 Calico。
-
在
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 27mreplicaset
的DESIRED
和READY
列中的值应该相一致。 -
在
calico-system
命名空间中查看资源。kubectl get all -n calico-system
输出示例如下。
NAME READY STATUS RESTARTS AGE pod/calico-kube-controllers-
5cd7d477df
-2xqpd
1/1 Running 0 40m pod/calico-node-bm5fb
1/1 Running 0 40m pod/calico-node-wfww4
1/1 Running 0 40m pod/calico-typha-86c697dbdc
-n7qff
1/1 Running 0 40m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/calico-kube-controllers-metrics ClusterIP 10.100.77.235 <none> 9094/TCP 40m service/calico-typha ClusterIP 10.100.164.91 <none> 5473/TCP 40m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/calico-node 2 2 2 2 2 kubernetes.io/os=linux 40m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/calico-kube-controllers 1/1 1 1 40m deployment.apps/calico-typha 1/1 1 1 40m NAME DESIRED CURRENT READY AGE replicaset.apps/calico-kube-controllers-5cd7d477df
1 1 1 40m replicaset.apps/calico-typha-86c697dbdc
1 1 1 40m输出略有不同,具体取决于您是使用 Helm 图表还是清单进行部署。
calico-node
daemonset
的DESIRED
和READY
列中的值应该相一致。两个replicasets
的DESIRED
和READY
列中的值也应该一致。daemonset.apps/calico-node
的DESIRED
列中的数量因集群中的节点数量而异。 -
请确认其中一个
calico-node
、calico-typha
和tigera-operator
pods 的日志不包含ERROR
。请将以下命令中的值替换为上一步的输出中返回的值。kubectl logs tigera-operator-
768d489967
-6cv58
-n tigera-operator | grep ERROR kubectl logs calico-node-bm5fb
-c calico-node -n calico-system | grep ERROR kubectl logs calico-typha-86c697dbdc
-n7qff
-n calico-system | grep ERROR如果之前的命令没有返回任何输出,那么日志中不存在
ERROR
,并且一切都应该正常运行。 -
如果您使用 Amazon VPC CNI plugin for Kubernetes 的版本
1.9.3
或更高版本,则启用插件以将容器组(pod)IP 地址添加到calico-kube-controllers-
容器组(pod)规范中的注释中。有关此设置的更多信息,请参阅 GitHub 上的579b45dcf
-z5tsf
ANNOTATE_POD_IP
。 -
可以使用以下命令查看集群上安装的插件版本。
kubectl describe daemonset aws-node -n kube-system | grep amazon-k8s-cni: | cut -d ":" -f 3
输出示例如下。
v1.10.4-eksbuild.1
-
创建一个可以应用于集群的配置文件,以向
aws-node
Kubernetesclusterrole
授予权限来修补 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-
pod。将5cd7d477df
-2xqpd
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。
列中的 podREADY
NAMES
和 pods 数量与以下输出中的不同。在看到具有相似名称的 pods 并且它们在STATUS
列中都具有Running
之前,请不要继续。NAMESPACE NAME READY STATUS RESTARTS AGE ... client client-
xlffc
1/1
Running 05m19s
... management-ui management-ui-qrb2g
1/1
Running 05m24s
stars backend-sz87q
1/1
Running 05m23s
stars frontend-cscnf
1/1
Running 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
使用安装 Calico 的方法删除 Calico。