news 2026/9/30 7:23:51

K8s集群Calico网络安全深度加固实操

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8s集群Calico网络安全深度加固实操

K8s集群Calico网络安全深度加固实操

技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + Calico网络组件 + Containerd 1.7.x

操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案

K8s集群Calico网络安全深度加固实操

操作环境

  • K8s 集群 3 节点:k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12),K8s 版本 v1.32.13

  • 网络组件:Calico网络策略,已部署对应网络组件 Pod,CNI 插件已配置,容器运行时 Containerd 1.7.x

  • 操作系统 Rocky Linux 8.6,内核版本已适配网络需求,已加载必要内核模块(br_netfilter、vxlan、ip_tables 等)

  • 集群网络规划:Pod 网段、Service 网段、节点网络已规划完毕,无网段冲突,DNS 服务正常运行

  • 已配置监控告警体系(Prometheus + Grafana),网络指标可采集,具备日志归集和故障排查能力

对接原理

K8s集群Calico网络安全深度加固实操是 K8s 集群网络系统运维中的核心操作场景。K8s 网络体系通过 CNI(Container Network Interface)插件实现 Pod 网络的创建和管理,网络组件负责集群内 Pod 间通信、Pod 与 Service 间通信、以及集群内外网络互通。Calico网络策略作为具体的网络组件,为集群提供网络连通性、网络策略、负载均衡或入口路由能力。运维操作的核心目标是确保网络的可用性、性能、安全性和可管理性:通过规范化的网络配置确保 Pod 间通信正常,通过网络策略实现访问控制和安全隔离,通过负载均衡和 Ingress 实现流量分发和外部访问,通过监控告警和日志分析实现故障快速定位,通过自动化脚本和 SOP 提升运维效率。所有操作需遵循业务无感知原则,对生产网络的变更采用灰度和滚动方式,避免影响业务运行。

详细步骤

1. 网络现状盘点与连通性检查

# 1. 检查集群节点状态 kubectl get nodes -o wide kubectl get pods -n kube-system -o wide ​ # 2. 检查网络组件状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' kubectl get pods -A | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' ​ # 3. 检查网络连通性 # 节点间连通性 for node in k8s-master k8s-node1 k8s-node2; do echo "=== 检查 $node ===" kubectl get node $node -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' echo "" done ​ # Pod 间连通性测试 kubectl run net-test-1 --image=busybox --restart=Never -- sleep 3600 kubectl run net-test-2 --image=busybox --restart=Never -- sleep 3600 sleep 10 POD1_IP=$(kubectl get pod net-test-1 -o jsonpath='{.status.podIP}') POD2_IP=$(kubectl get pod net-test-2 -o jsonpath='{.status.podIP}') echo "Pod1 IP: $POD1_IP" echo "Pod2 IP: $POD2_IP" kubectl exec net-test-1 -- ping -c 3 $POD2_IP ​ # 4. 检查 DNS 解析 kubectl exec net-test-1 -- nslookup kubernetes.default.svc.cluster.local ​ # 5. 检查 Service 网络 kubectl get svc -A kubectl get endpoints -A ​ # 6. 导出网络配置 kubectl get pods -n kube-system -o yaml > /tmp/network_pods_backup_$(date +%Y%m%d).yaml kubectl get cm -n kube-system -o yaml > /tmp/network_cm_backup_$(date +%Y%m%d).yaml echo "网络配置已备份到 /tmp/" ​

2. 制定操作方案与备份防护

# 1. 备份当前网络配置(操作前必做) kubectl get pods -n kube-system -o yaml > /tmp/network_pods_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get cm -n kube-system -o yaml > /tmp/network_cm_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get svc -A -o yaml > /tmp/network_svc_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get ingress -A -o yaml > /tmp/network_ingress_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get networkpolicy -A -o yaml > /tmp/network_np_backup_$(date +%Y%m%d_%H%M%S).yaml ​ # 2. 记录当前网络状态 echo "=== 网络状态记录 $(date) ===" > /tmp/network_status_$(date +%Y%m%d).txt echo "--- 节点状态 ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get nodes -o wide >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- 网络组件 Pod ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get pods -n kube-system -o wide >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- Service ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get svc -A >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- Ingress ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get ingress -A >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- NetworkPolicy ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get networkpolicy -A >> /tmp/network_status_$(date +%Y%m%d).txt cat /tmp/network_status_$(date +%Y%m%d).txt ​ # 3. 制定操作方案 cat > /tmp/network_operation_plan.md << 'EOF' # 网络操作方案 ## 一、操作目标 ## 二、影响范围评估 ## 三、操作步骤与时间窗口 ## 四、回滚方案 ## 五、验证标准 ## 六、风险点与应对措施 EOF echo "操作方案模板已创建" ​ # 4. 确认业务窗口 echo "当前时间: $(date)" echo "建议在业务低峰期执行网络操作,避免影响业务" ​ # 5. 通知相关业务方 # echo "网络运维操作通知" | mail -s "网络运维通知" admin@example.com ​

3. 执行网络组件配置操作

# 1. 检查网络组件配置 # Flannel 配置 kubectl get cm kube-flannel-cfg -n kube-system -o yaml 2>/dev/null | head -50 # Calico 配置 kubectl get cm calico-config -n kube-system -o yaml 2>/dev/null | head -50 # kube-proxy 配置 kubectl get cm kube-proxy -n kube-system -o yaml 2>/dev/null | head -50 ​ # 2. 检查网络组件日志 # Flannel 日志 kubectl logs -n kube-system -l app=flannel --tail=50 2>/dev/null # Calico 日志 kubectl logs -n kube-system -l k8s-app=calico-node --tail=50 2>/dev/null # kube-proxy 日志 kubectl logs -n kube-system -l k8s-app=kube-proxy --tail=50 2>/dev/null ​ # 3. 检查网络接口和路由 # 在节点上执行(通过 kubectl debug 或 ssh) # ip addr show | grep -E 'flannel|cali|weave|cni0|docker0' # ip route show # iptables -t nat -L -n | head -50 ​ # 4. 执行具体网络配置操作(根据标题调整) echo "执行网络组件具体配置操作..." echo "请根据操作方案执行具体步骤" ​ # 5. 应用网络配置变更 # kubectl apply -f /tmp/network_config.yaml # kubectl rollout restart daemonset/flannel -n kube-system # kubectl rollout restart daemonset/calico-node -n kube-system # kubectl rollout restart daemonset/kube-proxy -n kube-system ​ # 6. 等待网络组件重启完成 kubectl rollout status daemonset/flannel -n kube-system --timeout=120s 2>/dev/null kubectl rollout status daemonset/calico-node -n kube-system --timeout=120s 2>/dev/null kubectl rollout status daemonset/kube-proxy -n kube-system --timeout=120s 2>/dev/null echo "网络组件重启完成" ​

4. 验证网络连通性与业务无感知

# 1. 验证节点网络状态 kubectl get nodes -o wide # 预期:所有节点 Ready,网络 IP 正确 ​ # 2. 验证网络组件 Pod 状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns' # 预期:所有网络组件 Pod Running,READY 1/1 ​ # 3. 验证 Pod 网络连通性 # 创建测试 Pod kubectl run net-test-a --image=busybox --restart=Never -- sleep 3600 2>/dev/null kubectl run net-test-b --image=busybox --restart=Never -- sleep 3600 2>/dev/null sleep 15 ​ # 获取 Pod IP POD_A_IP=$(kubectl get pod net-test-a -o jsonpath='{.status.podIP}' 2>/dev/null) POD_B_IP=$(kubectl get pod net-test-b -o jsonpath='{.status.podIP}' 2>/dev/null) echo "Pod A IP: $POD_A_IP" echo "Pod B IP: $POD_B_IP" ​ # 同节点 Pod 通信 kubectl exec net-test-a -- ping -c 3 $POD_B_IP 2>/dev/null # 预期:ping 成功,无丢包 ​ # 跨节点 Pod 通信(确保两个 Pod 在不同节点) # kubectl exec net-test-a -- ping -c 3 <其他节点Pod IP> ​ # 4. 验证 DNS 解析 kubectl exec net-test-a -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null # 预期:DNS 解析成功,返回 Service IP ​ # 5. 验证 Service 访问 kubectl exec net-test-a -- wget -q -O- http://kubernetes.default.svc.cluster.local 2>/dev/null | head -5 # 预期:Service 访问正常 ​ # 6. 验证网络策略(如果配置了) kubectl get networkpolicy -A # 预期:网络策略已应用,符合预期 ​ # 7. 清理测试 Pod kubectl delete pod net-test-a net-test-b --force --grace-period=0 2>/dev/null echo "测试 Pod 已清理" ​

5. 网络监控告警与巡检配置

# 1. 配置网络监控指标 # 检查 Prometheus 是否采集网络指标 kubectl get servicemonitor -A 2>/dev/null | grep -E 'flannel|calico|kube-proxy|ingress|metallb|traefik' kubectl get podmonitor -A 2>/dev/null | grep -E 'flannel|calico|kube-proxy|ingress|metallb|traefik' ​ # 2. 配置网络告警规则 cat > /tmp/network_alerts.yaml << 'EOF' groups: - name: network-alerts rules: - alert: NetworkComponentPodDown expr: kube_pod_status_phase{namespace="kube-system",phase="Running",pod=~"flannel.*|calico.*|kube-proxy.*|coredns.*"} == 0 for: 5m labels: severity: critical annotations: summary: "网络组件 Pod 异常" - alert: PodNetworkLatencyHigh expr: histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket[5m])) by (le)) > 1 for: 5m labels: severity: warning annotations: summary: "DNS 解析延迟过高" - alert: NetworkPolicyDenyHigh expr: rate(calico_denied_packets_total[5m]) > 100 for: 5m labels: severity: warning annotations: summary: "网络策略拒绝包数过高" EOF echo "告警规则模板已创建" ​ # 3. 配置网络日志归集 # 检查日志采集配置 kubectl get configmap -n kube-system | grep -i log # 配置 Fluentd/Filebeat 采集网络组件日志 ​ # 4. 配置网络巡检脚本 cat > /tmp/network_audit.sh << 'SCRIPT' #!/bin/bash echo "=== 网络巡检 $(date) ===" echo "--- 节点状态 ---" kubectl get nodes -o wide | grep -v Ready echo "--- 网络组件 Pod ---" kubectl get pods -n kube-system | grep -v Running | grep -v NAME echo "--- DNS 解析测试 ---" kubectl run dns-test --image=busybox --restart=Never --rm -it -- nslookup kubernetes.default 2>/dev/null | tail -3 echo "--- Service 异常 ---" kubectl get svc -A | grep -v ClusterIP | grep -v NodePort | grep -v LoadBalancer | grep -v TYPE echo "--- Ingress 异常 ---" kubectl get ingress -A 2>/dev/null | grep -v CLASS | grep -v '<none>' echo "=== 巡检完成 ===" SCRIPT chmod +x /tmp/network_audit.sh /tmp/network_audit.sh ​ # 5. 设置定时巡检 # crontab -e # 0 2 * * * /tmp/network_audit.sh >> /var/log/network_audit.log 2>&1 ​

6. 验证操作结果与生成报告

# 1. 验证网络组件状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' # 预期:所有网络组件 Pod Running,READY 正常 ​ # 2. 验证网络连通性 kubectl run net-verify --image=busybox --restart=Never --rm -it -- ping -c 3 kubernetes.default 2>/dev/null # 预期:网络连通正常 ​ # 3. 验证业务 Pod 状态 kubectl get pods -A | grep -v Running | grep -v NAME | head -20 # 预期:无因网络问题导致的异常 Pod ​ # 4. 验证 Service 访问 kubectl get svc -A -o wide | head -20 # 预期:Service 正常,Endpoints 有后端 IP ​ # 5. 验证 Ingress 访问(如果配置了) kubectl get ingress -A 2>/dev/null # 预期:Ingress 规则正常,地址已分配 ​ # 6. 验证网络策略(如果配置了) kubectl get networkpolicy -A 2>/dev/null # 预期:网络策略已应用 ​ # 7. 生成操作报告 echo "=== 网络操作报告 ===" > /tmp/network_operation_report.txt echo "操作时间: $(date)" >> /tmp/network_operation_report.txt echo "操作前网络组件 Pod 数: $(cat /tmp/network_pods_backup_*.yaml 2>/dev/null | grep -c 'kind: Pod')" >> /tmp/network_operation_report.txt echo "操作后网络组件 Pod 数: $(kubectl get pods -n kube-system --no-headers | wc -l)" >> /tmp/network_operation_report.txt echo "异常节点: $(kubectl get nodes | grep -v Ready | grep -v NAME | wc -l)" >> /tmp/network_operation_report.txt echo "异常 Pod: $(kubectl get pods -A | grep -v Running | grep -v NAME | wc -l)" >> /tmp/network_operation_report.txt echo "Service 数: $(kubectl get svc -A --no-headers | wc -l)" >> /tmp/network_operation_report.txt echo "Ingress 数: $(kubectl get ingress -A --no-headers 2>/dev/null | wc -l)" >> /tmp/network_operation_report.txt echo "NetworkPolicy 数: $(kubectl get networkpolicy -A --no-headers 2>/dev/null | wc -l)" >> /tmp/network_operation_report.txt cat /tmp/network_operation_report.txt ​

验证流程

# 1. 节点状态验证 kubectl get nodes -o wide # 预期:所有节点 Ready,网络 IP 正确 ​ # 2. 网络组件 Pod 验证 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' # 预期:所有网络组件 Pod Running,READY 正常 ​ # 3. Pod 网络连通性验证 kubectl run net-test --image=busybox --restart=Never --rm -it -- ping -c 3 kubernetes.default 2>/dev/null # 预期:ping 成功,无丢包 ​ # 4. DNS 解析验证 kubectl run dns-test --image=busybox --restart=Never --rm -it -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null # 预期:DNS 解析成功 ​ # 5. Service 访问验证 kubectl get svc -A -o wide kubectl get endpoints -A # 预期:Service 正常,Endpoints 有后端 IP ​ # 6. 业务 Pod 状态验证 kubectl get pods -A | grep -v Running | grep -v NAME | head -10 # 预期:无因网络问题导致的异常 Pod ​ # 7. 网络策略验证(如果配置了) kubectl get networkpolicy -A 2>/dev/null # 预期:网络策略已应用 ​ # 8. 操作报告验证 cat /tmp/network_operation_report.txt # 预期:报告包含操作前后对比,无异常状态 ​

排错方案

  • Calico 节点 NotReady:检查 calico-node Pod 状态、BGP 邻居、felix 日志、etcd/数据存储连通性

  • BGP 邻居建立失败:检查节点间网络连通性、BGP 配置、AS 号、peer 配置、防火墙端口(179)

  • Pod 跨节点通信阻断:检查 Calico 路由、BGP 路由传播、iptables 规则、felix 配置、网络策略

  • 网络策略不生效:检查 NetworkPolicy 标签选择器、策略方向、端口协议、Calico 支持的策略类型、felix 日志

  • 策略冲突:检查多条 NetworkPolicy 的叠加效果、默认拒绝策略、命名空间隔离、优先级

  • IPAM 地址耗尽:检查 IP 池配置、已分配 IP 数量、闲置 IP 回收、IP 池扩容

  • Calico 隧道中断:检查 VXLAN/IPIP 隧道状态、隧道接口、MTU 配置、节点间网络

  • 多租户网络隔离失效:检查租户命名空间标签、网络策略、全局网络策略、Profile 配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 7:22:30

【通信原理面试笔记 03】信道:分类、多径传播与衰落机制

第 3 章讲的是怎么用随机过程描述信号&#xff0c;第 4 章换了一个提问角度&#xff1a;信号从发送端走到接收端&#xff0c;中间那条路究竟对它做了什么&#xff1f; 把整章读下来&#xff0c;它的逻辑其实只有三环——先给信道分类&#xff08;谁在传、传得稳不稳&#xff09…

作者头像 李华
网站建设 2026/9/30 7:20:11

近期技术热点:从异常现象到根因定位的完整排查

本文摘要&#xff1a;线上推理精度从 95% 跌到 72%&#xff0c;同输入重放结果不稳定&#xff0c;常被误判为数据问题。分层排查确认预处理混用与推理未切 eval 叠加&#xff0c;归一化统计量被批次改写。 一、问题与结论 线上日志没有一条报错&#xff1a;推理入口用 torch.n…

作者头像 李华
网站建设 2026/9/30 7:19:55

远程桌面控制软件推荐 远程桌面连接是干什么的

很多人都好奇远程桌面控制是干什么的&#xff0c;简单来说&#xff0c;远程桌面控制就是通过网络跨设备、跨地域操控电脑&#xff0c;实现异地办公、远程协助等操作&#xff0c;彻底打破空间限制。日常居家办公、外出处理电脑文件&#xff0c;都离不开远程桌面控制。多款软件实…

作者头像 李华
网站建设 2026/9/30 7:17:39

dlib库在Python中实现人脸识别的完整过程

简介就是在开发的过程中, 借助dlib这样强大的第三方库, 我们能够让整个关于人脸识别的系统得到非常高效且准确的实现。本项目将会对dlib库所具备的核心功能进行详细的解释和介绍, 同时也会把关于人脸识别的基础原理拆解开来说明清楚。这里面具体就包含了HOG特征提取器是怎么工作…

作者头像 李华
网站建设 2026/9/30 7:16:40

小白程序员必看:AI智能体如何解决各种问题,带你入门大模型应用

AI智能体设计成类似人类的能力去解决问题&#xff0c;大语言模型因其优秀的自然语言处理能力在多个领域取得突破。文章介绍了AI智能体的主要应用场景&#xff0c;包括自然语言处理&#xff08;如情感分析、机器翻译&#xff09;、数据分析与预测、健康诊断与医疗辅助、教育领域…

作者头像 李华