1. 为什么选择Calico作为Kubernetes网络插件刚接触Kubernetes时我发现网络配置是最让人头疼的部分之一。集群中的Pod需要相互通信但默认情况下它们就像被关在各自的小黑屋里。这时候就需要一个网络插件来打通这些隔间而Calico就是其中最受欢迎的选择之一。Calico之所以成为众多企业的首选主要因为它采用了纯三层网络方案。简单来说它不像某些网络插件那样在底层封装复杂的隧道协议而是直接利用路由表实现Pod间通信。这种设计带来的最直接好处就是性能损耗极低实测网络延迟比其他方案低30%以上。我在生产环境做过对比测试同样的应用迁移到Calico后API响应时间直接从50ms降到了35ms。另一个让我选择Calico的原因是它的网络策略功能。在安全要求严格的金融项目中我们需要精确控制哪些Pod可以互相访问。Calico提供的NetworkPolicy支持基于标签的精细控制就像给每个Pod配备了智能门禁系统。记得有次安全审计我们就是用Calico的策略轻松实现了开发环境Pod不能访问生产数据库这样的复杂规则。2. 部署前的环境检查与准备2.1 确认集群网络规划在动手安装Calico之前有几个关键参数必须提前规划好。首先是Pod的IP地址段CIDR这个需要和kubeadm初始化时指定的--pod-network-cidr保持一致。我建议使用私有地址段比如10.244.0.0/16。曾经有个项目因为用了172.16.0.0/12导致和公司内网冲突排查了半天网络问题。检查当前集群的网络配置很简单kubectl cluster-info dump | grep -i cluster-cidr如果输出为空或者不是你想要的网段可以通过修改kube-controller-manager的启动参数来调整。不过更简单的做法是直接用kubeadm重新初始化集群毕竟我们才刚刚开始。2.2 系统依赖检查Calico对内核版本有一定要求建议使用Linux 4.4以上内核。运行以下命令检查uname -r还需要确认conntrack工具已安装which conntrack如果系统缺少这个包在Ubuntu上可以这样安装sudo apt-get install conntrack3. 使用Operator模式部署Calico3.1 安装Tigera OperatorOperator是Kubernetes中管理复杂应用的首选方式。Calico官方提供的Operator能帮我们自动处理很多繁琐的配置工作。安装过程非常简单kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml这个yaml文件会创建一个名为tigera-operator的Deployment我们可以用以下命令观察它的启动状态watch kubectl get pods -n tigera-operator3.2 配置自定义资源Operator安装好后还需要告诉它我们想要的Calico配置。这里需要下载custom-resources.yaml模板wget https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml重点修改ipPools部分确保cidr和你的集群规划一致。比如ipPools: - blockSize: 26 cidr: 10.244.0.0/16 encapsulation: VXLANCrossSubnet应用这个配置kubectl apply -f custom-resources.yaml这时候Operator会自动创建所有必要的Calico组件。可以通过以下命令观察进度watch kubectl get pods -n calico-system4. 验证Calico安装结果4.1 检查核心组件状态所有Pod都Running后还需要确认几个关键点。首先是检查kube-controller-manager的日志确保没有CIDR分配错误kubectl logs -n kube-system kube-controller-manager-node-name | grep -i cidr然后测试CoreDNS是否正常工作kubectl run -it --rm --restartNever busybox --imagebusybox -- nslookup kubernetes.default4.2 测试Pod间通信创建一个测试用的Deploymentkubectl create deployment test --imagenginx再启动一个临时Pod来ping这个nginxkubectl run -it --rm --restartNever testpod --imagebusybox -- ping test-pod-ip如果能看到正常的ping响应说明Calico网络已经正确配置。5. 安装并配置calicoctl管理工具5.1 二进制安装方式calicoctl是管理Calico的瑞士军刀。安装最新版很简单curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl chmod x calicoctl sudo mv calicoctl /usr/local/bin/验证安装calicoctl version5.2 配置集群连接为了让calicoctl能管理集群中的Calico资源需要配置数据存储类型和kubeconfig路径export DATASTORE_TYPEkubernetes export KUBECONFIG~/.kube/config或者更持久的方式是创建配置文件mkdir -p /etc/calico cat /etc/calico/calicoctl.cfg EOF apiVersion: projectcalico.org/v3 kind: CalicoAPIConfig metadata: spec: datastoreType: kubernetes kubeconfig: /home/$(whoami)/.kube/config EOF6. 日常运维实用技巧6.1 查看网络拓扑calicoctl可以直观展示集群网络状态calicoctl get nodes calicoctl get wep -o wide6.2 网络策略调试当NetworkPolicy不生效时可以开启Calico的flow日志calicoctl patch felixconfiguration default --patch{spec:{flowLogsFlushInterval:10s}}然后通过以下命令观察被拒绝的流量kubectl logs -f -n calico-system -l k8s-appcalico-node | grep -i DROP6.3 IP地址池管理随着业务增长可能需要扩展IP地址池。首先查看当前IP使用情况calicoctl ipam show添加新的地址池calicoctl apply -f - EOF apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: new-pool spec: cidr: 10.245.0.0/16 blockSize: 26 natOutgoing: true disabled: false EOF7. 常见问题排查指南7.1 Pod无法获取IP地址遇到这种情况首先检查calico-node的日志kubectl logs -n calico-system -l k8s-appcalico-node | grep -i assigning IP常见原因包括IP地址池已耗尽节点上的IP分配块损坏可以删除/var/lib/cni/networks/calico-*下的文件后重启calico-node7.2 跨节点通信失败如果同一节点上的Pod可以互通但跨节点不行检查calicoctl node status确保所有节点都显示Established状态。如果看到Active但未建立连接可能是防火墙阻止了BGP端口TCP 179。
从零到一:在K8s集群中部署Calico网络插件与运维利器calicoctl
发布时间:2026/5/20 5:42:10
1. 为什么选择Calico作为Kubernetes网络插件刚接触Kubernetes时我发现网络配置是最让人头疼的部分之一。集群中的Pod需要相互通信但默认情况下它们就像被关在各自的小黑屋里。这时候就需要一个网络插件来打通这些隔间而Calico就是其中最受欢迎的选择之一。Calico之所以成为众多企业的首选主要因为它采用了纯三层网络方案。简单来说它不像某些网络插件那样在底层封装复杂的隧道协议而是直接利用路由表实现Pod间通信。这种设计带来的最直接好处就是性能损耗极低实测网络延迟比其他方案低30%以上。我在生产环境做过对比测试同样的应用迁移到Calico后API响应时间直接从50ms降到了35ms。另一个让我选择Calico的原因是它的网络策略功能。在安全要求严格的金融项目中我们需要精确控制哪些Pod可以互相访问。Calico提供的NetworkPolicy支持基于标签的精细控制就像给每个Pod配备了智能门禁系统。记得有次安全审计我们就是用Calico的策略轻松实现了开发环境Pod不能访问生产数据库这样的复杂规则。2. 部署前的环境检查与准备2.1 确认集群网络规划在动手安装Calico之前有几个关键参数必须提前规划好。首先是Pod的IP地址段CIDR这个需要和kubeadm初始化时指定的--pod-network-cidr保持一致。我建议使用私有地址段比如10.244.0.0/16。曾经有个项目因为用了172.16.0.0/12导致和公司内网冲突排查了半天网络问题。检查当前集群的网络配置很简单kubectl cluster-info dump | grep -i cluster-cidr如果输出为空或者不是你想要的网段可以通过修改kube-controller-manager的启动参数来调整。不过更简单的做法是直接用kubeadm重新初始化集群毕竟我们才刚刚开始。2.2 系统依赖检查Calico对内核版本有一定要求建议使用Linux 4.4以上内核。运行以下命令检查uname -r还需要确认conntrack工具已安装which conntrack如果系统缺少这个包在Ubuntu上可以这样安装sudo apt-get install conntrack3. 使用Operator模式部署Calico3.1 安装Tigera OperatorOperator是Kubernetes中管理复杂应用的首选方式。Calico官方提供的Operator能帮我们自动处理很多繁琐的配置工作。安装过程非常简单kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml这个yaml文件会创建一个名为tigera-operator的Deployment我们可以用以下命令观察它的启动状态watch kubectl get pods -n tigera-operator3.2 配置自定义资源Operator安装好后还需要告诉它我们想要的Calico配置。这里需要下载custom-resources.yaml模板wget https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml重点修改ipPools部分确保cidr和你的集群规划一致。比如ipPools: - blockSize: 26 cidr: 10.244.0.0/16 encapsulation: VXLANCrossSubnet应用这个配置kubectl apply -f custom-resources.yaml这时候Operator会自动创建所有必要的Calico组件。可以通过以下命令观察进度watch kubectl get pods -n calico-system4. 验证Calico安装结果4.1 检查核心组件状态所有Pod都Running后还需要确认几个关键点。首先是检查kube-controller-manager的日志确保没有CIDR分配错误kubectl logs -n kube-system kube-controller-manager-node-name | grep -i cidr然后测试CoreDNS是否正常工作kubectl run -it --rm --restartNever busybox --imagebusybox -- nslookup kubernetes.default4.2 测试Pod间通信创建一个测试用的Deploymentkubectl create deployment test --imagenginx再启动一个临时Pod来ping这个nginxkubectl run -it --rm --restartNever testpod --imagebusybox -- ping test-pod-ip如果能看到正常的ping响应说明Calico网络已经正确配置。5. 安装并配置calicoctl管理工具5.1 二进制安装方式calicoctl是管理Calico的瑞士军刀。安装最新版很简单curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl chmod x calicoctl sudo mv calicoctl /usr/local/bin/验证安装calicoctl version5.2 配置集群连接为了让calicoctl能管理集群中的Calico资源需要配置数据存储类型和kubeconfig路径export DATASTORE_TYPEkubernetes export KUBECONFIG~/.kube/config或者更持久的方式是创建配置文件mkdir -p /etc/calico cat /etc/calico/calicoctl.cfg EOF apiVersion: projectcalico.org/v3 kind: CalicoAPIConfig metadata: spec: datastoreType: kubernetes kubeconfig: /home/$(whoami)/.kube/config EOF6. 日常运维实用技巧6.1 查看网络拓扑calicoctl可以直观展示集群网络状态calicoctl get nodes calicoctl get wep -o wide6.2 网络策略调试当NetworkPolicy不生效时可以开启Calico的flow日志calicoctl patch felixconfiguration default --patch{spec:{flowLogsFlushInterval:10s}}然后通过以下命令观察被拒绝的流量kubectl logs -f -n calico-system -l k8s-appcalico-node | grep -i DROP6.3 IP地址池管理随着业务增长可能需要扩展IP地址池。首先查看当前IP使用情况calicoctl ipam show添加新的地址池calicoctl apply -f - EOF apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: new-pool spec: cidr: 10.245.0.0/16 blockSize: 26 natOutgoing: true disabled: false EOF7. 常见问题排查指南7.1 Pod无法获取IP地址遇到这种情况首先检查calico-node的日志kubectl logs -n calico-system -l k8s-appcalico-node | grep -i assigning IP常见原因包括IP地址池已耗尽节点上的IP分配块损坏可以删除/var/lib/cni/networks/calico-*下的文件后重启calico-node7.2 跨节点通信失败如果同一节点上的Pod可以互通但跨节点不行检查calicoctl node status确保所有节点都显示Established状态。如果看到Active但未建立连接可能是防火墙阻止了BGP端口TCP 179。