如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?
- 内容介绍
- 文章标签
- 相关推荐
先说说您需要确保您的Kubernetes集群已经安装并运行。接下来您的集群应具备网络策略能力, 这意味着您需要安装并配置一个支持网络策略的网络插件,如Calico、Cilium或Flannel,闹笑话。。
一、 前置准备:让系统像春天的土壤一样肥沃
在动手之前,请先检查以下几项:
- Ubuntu 20.04+已完成系统更新。
sudo apt update && sudo apt upgrade -y - Kubelet、 kubeadm、kubectl 已就位。 建议使用官方 apt 源进行安装,保持版本一致。
- 关闭 Swap 与防火墙。 Kubernetes 对 swap 敏感,防火墙会拦截 CNI 的底层流量。
- 内核参数调优。 编辑
/etc/sysctl.d/k8s.conf加入:
net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.ipv6.conf.all.disable_ipv6 = 1
施行 sudo sysctl --system 让它们生效。 何不... 就像给小苗浇水,让根系更健康。
二、 基础网络配置:静态 IP 与网卡调度的艺术
对,就这个意思。 如果你的节点在同一局域网,建议使用静态 IP,避免 Pod 间“漂流”。编辑 /etc/netplan/01‑k8s.yaml
network:
version: 2
ernets:
ens3:
addresses:
gateway4: 192.168.10.1
nameservers:
addresses:
那必须的! 保存后施行 sudo netplan apply。这一步做好了后面的通信才不会主要原因是 IP 冲突而闹笑话。
三、 挑选合适的 CNI 插件:让流量像微风一样自由,却又不失平安屏障
| CNI 插件 | 主要特性 | 适用场景 | 学习成本 |
|---|---|---|---|
| Calico | - 支持 NetworkPolicy - 原生 BGP 路由 - 可选 IPIP/VXLAN 隧道 | 对平安要求高的企业级应用 | 中等 |
| Cilium | - 基于 eBPF - 支持 L7 策略 - 高性能、低延迟 | 需要细粒度流量监控和服务网格的场景 | 略高 |
| Flannel | - 简单 Overlay 网络 - 默认 VXLAN 模式 - 不原生支持 NetworkPolicy | 小型实验或学习环境 | 低 |
| Kube‑Router | - 路由 + 防火墙 + Service LB - 较轻量 | 希望统一路由和防火墙功能的团队 | 中等 |
*以上信息基于公开文档整理,仅供参考,实际选型请结合业务需求与团队技术栈。
3.1 安装 Calico
sudo kubectl apply -f /opt/calico/manifests/calico.yaml # 等待所有 pod Ready 后继续 watch sudo kubectl get pods -n kube-system
3.2 安装 Cilium
sudo kubectl apply -f /opt/cilium/manifests/cilium.yaml # 检查 DaemonSet 状态 kubectl -n kube-system get daemonset cilium-node-init
四、 编写首个 NetworkPolicy:让访问像春风拂面只留必要路径
A “NetworkPolicy” 就像是给每个 Pod 挂上一把钥匙, 恳请大家... 只允许拥有相同标签或特定命名空间的伙伴打开门。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend # 限制只作用于标记为 backend 的 Pod
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
tier: frontend # 来自 frontend 命名空间的请求可进入
- podSelector:
matchLabels:
role: api # 同命名空间内标记为 api 的 Pod 可访问
ports:
- protocol: TCP
port: 3306 # MySQL 默认端口, 仅此端口开放
egress:
- to:
- ipBlock:
cidr: 10.96.0.0/12 # 集群内部 Service CIDR,可自由出站
ports:
- protocol: TCP
port: 443 # 对外 HTTPS 通信保留通道
- protocol: UDP
port: 53 # DNS 查询必不可少
温馨提示:如果没有任何 Ingress/Egress 定义,则默认拒绝所有流量; 精辟。 如果只写了 Ingress,则 Egress 保持开放状态。
4.1 实战示例:限制前端只能访问数据库, 不准直接调用外部 API
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-api-from-frontend
spec:
podSelector:
matchLabels:
tier: frontend # 锁定前端 Pod
policyTypes:
- Egress # 我们只管出站
egress:
- to:
- podSelector:
matchLabels:
app: database # 唯一允许去往 database
ports:
- protocol: TCP
port: 5432 # PostgreSQL
# 未匹配到上述规则的任何请求都会被丢弃
看,这样就把“前端跑到外部乱逛”的风险降到最低,就像在田里种树时给每棵树划定了专属阳光区域。
五、 最佳实践:让平安与效率共舞,像孩子们在草坪上奔跑般自然
- 细粒度标签管理:tag 应该统一规范,比方说
{app:web, tier:frontend}, 避免随意拼写导致策略失效。 - A/B 测试策略:先在非生产命名空间部署策略, 用
wget --spider http://service.default.svc.cluster.local/ping验证连通性,再逐步推广。 - POD 重启不影响策略:Kubernetes 会自动把已有 Policy 挂载到新创建的 POD 上,无需手动干预。
- L7 策略配合 Service Mesh:Cilium + Envoy 可以实现基于 HTTP 方法、 路径甚至 Header 的细致控制,让 API 防火墙真正落地。
- 定期审计: 每月使用
Kubectl get networkpolicy –all-namespaces –output wide | grep -i deprecated清理过期规则,防止“老树根”阻塞新枝芽成长。 - 🌱 多种树木共生—— 多种 CNI 可以共存,比方说核心使用 Calico 做平安,辅以 Flannel 提供简易跨节点 Overlay;但务必确保 CIDR 不冲突,否则会出现“路由迷路”。🌲
- ❤️ 多子多福——当你把平安写进代码, 也是在为未来团队培养更多“小孩”,他们将继承这套稳固的网络基石,一起去拥抱更大的云原生世界!❤️ \end{ul}
- Kubectl describe networkpolicy: 确认 selector 与规则是否匹配实际 POD 标签。
- Kubectl exec
-- curl –silent http:// 测试内部 Service 连通性是否受限。.default.svc.cluster.local: - CNI 日志查看: 大多数插件会把日志写入
/var/log/calico/… 或 /var/log/cilium/…, 用dmesg | grep cni捕获异常信息。有时候会出现 “iptables chain not found”, 这往往是主要原因是系统刚升级内核而未重启 CNI DaemonSet,需要重新 rollout:
六、 验证与排错:从小苗到大树,需要细心观察每一片叶子
kubectl rollout restart daemonset calico-node -n kube-system kubectl rollout status daemonset calico-node -n kube-system
小技巧:开启 KUBE_LOG_LEVEL=5 可以看到更详细的数据包追踪, 图啥呢? 但别忘了事后关掉,否则日志会淹没其他重要信息,就像春雨太大把花瓣冲走一样!☼
七、 收官感言:让技术与自然共生,让平安成为生活的一部分
Kubernetes 每一次网络改动都值得细致对待,主要原因是它关系着业务的数据血脉,也关系着团队成员日后成长的舞台。愿你在 Ubuntu 的草坪上, 不仅收获稳定可靠的服务,更收获满园春色——多子多孙、多树成林,共创美好未来!🌺🌱
| 常见故障速查表
标题已隐藏, 为避免误导,请自行阅读左侧列名。
︎︎︎︎︎️️️️️️️️✏✏✏✏✏✏✏ ✍ ✍ ✍ ✍ 💬💬💬💬💬💬💬🛠🛠🛠🛠🛠🛠🛠🪙🪙🪙🥇🥈🥉🏆🏅👑👑👑⏰⏰⏰⏰⏰⟶⟶⟶⟶🔧🔧🔧🔧🔧🚦🚦🚦🚦⚙⚙⚙⚙✅✅✅✅❎❎❎❎❓❓❓❓🌱🌱🌱🌱🍃🍃🍃🍂🍂🍂🍁🌿🌾📈📉📊📚📖🎯🎯🎯🎯🎉🎉🎉🎊🐞🐞🐞🐜🐝🐞🐝🤖🤖🤝🤝🙌🙌🙋🙋👩👨👧👦🌍🌐☁☀☔☁☔☔😅😆😂🤣😉😁😊🙂🙃😐😑🙄😲🤔🤭🥱😴🙈🙊 🙈 🙊 🙉 🙈 🙊 🙉 🙈 🙊 🙉 🕵 🕵 🕵 📢 📣 🎤 🔔 🔕 🗣 🎙 📜 📄 💼 🔒 🔓 ✅ ❎ ❓ ❗ ⭕ ⚪ ⚫ ▶ ◀ ▲ ▼ ♻ ⭕ ✔ ☑ ➜ ➤ ➥ ➦ ↗ ↘ ↙ ↖ ⬆ ⬇ ◾ ◽ □ ■ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ☆ ★ ☾ ☽ ✨ ⭐ 🌟 ⚡ ⚔ 🔥 🌈 🌊 🌋 🌀 🌍 🌐
---|---|---|---
症状 | 常见原因 | 快速定位 | 推荐解决方案
Pod 无法互通 | NetworkPolicy 阻断 | `kubectl describe np` 检查 selector | 调整 podSelector 或 namespaceSelector
IPIP/VXLAN 隧道未建立 | CNI 配置错误 | 查看 cni‑conf JSON 中 “type” 字段 | 确认对应 kernel 模块已加载
iptables 链缺失 | 插件升级后未刷新规则 | `iptables-save` 检查 `CALICO‑*` 链是否存在 | 重启 DaemonSet 并等待同步
日志爆炸导致性能下降 | log level 设置过高 | `grep 'level=' /var/log/calico/*.log` | 将 `logLevel` 调回 INFO
*表格仅作参考,请根据实际环境进行排查。* |
|---|
祝您在 Ubuntu 上玩转 Kubernetes 网络策略时 一路顺风,一切安好; 白嫖。 也愿您的代码仓库如春天般繁花似锦,孩子们笑声盈盈,绿树成荫!🌳🌼🚀✨
先说说您需要确保您的Kubernetes集群已经安装并运行。接下来您的集群应具备网络策略能力, 这意味着您需要安装并配置一个支持网络策略的网络插件,如Calico、Cilium或Flannel,闹笑话。。
一、 前置准备:让系统像春天的土壤一样肥沃
在动手之前,请先检查以下几项:
- Ubuntu 20.04+已完成系统更新。
sudo apt update && sudo apt upgrade -y - Kubelet、 kubeadm、kubectl 已就位。 建议使用官方 apt 源进行安装,保持版本一致。
- 关闭 Swap 与防火墙。 Kubernetes 对 swap 敏感,防火墙会拦截 CNI 的底层流量。
- 内核参数调优。 编辑
/etc/sysctl.d/k8s.conf加入:
net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.ipv6.conf.all.disable_ipv6 = 1
施行 sudo sysctl --system 让它们生效。 何不... 就像给小苗浇水,让根系更健康。
二、 基础网络配置:静态 IP 与网卡调度的艺术
对,就这个意思。 如果你的节点在同一局域网,建议使用静态 IP,避免 Pod 间“漂流”。编辑 /etc/netplan/01‑k8s.yaml
network:
version: 2
ernets:
ens3:
addresses:
gateway4: 192.168.10.1
nameservers:
addresses:
那必须的! 保存后施行 sudo netplan apply。这一步做好了后面的通信才不会主要原因是 IP 冲突而闹笑话。
三、 挑选合适的 CNI 插件:让流量像微风一样自由,却又不失平安屏障
| CNI 插件 | 主要特性 | 适用场景 | 学习成本 |
|---|---|---|---|
| Calico | - 支持 NetworkPolicy - 原生 BGP 路由 - 可选 IPIP/VXLAN 隧道 | 对平安要求高的企业级应用 | 中等 |
| Cilium | - 基于 eBPF - 支持 L7 策略 - 高性能、低延迟 | 需要细粒度流量监控和服务网格的场景 | 略高 |
| Flannel | - 简单 Overlay 网络 - 默认 VXLAN 模式 - 不原生支持 NetworkPolicy | 小型实验或学习环境 | 低 |
| Kube‑Router | - 路由 + 防火墙 + Service LB - 较轻量 | 希望统一路由和防火墙功能的团队 | 中等 |
*以上信息基于公开文档整理,仅供参考,实际选型请结合业务需求与团队技术栈。
3.1 安装 Calico
sudo kubectl apply -f /opt/calico/manifests/calico.yaml # 等待所有 pod Ready 后继续 watch sudo kubectl get pods -n kube-system
3.2 安装 Cilium
sudo kubectl apply -f /opt/cilium/manifests/cilium.yaml # 检查 DaemonSet 状态 kubectl -n kube-system get daemonset cilium-node-init
四、 编写首个 NetworkPolicy:让访问像春风拂面只留必要路径
A “NetworkPolicy” 就像是给每个 Pod 挂上一把钥匙, 恳请大家... 只允许拥有相同标签或特定命名空间的伙伴打开门。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend # 限制只作用于标记为 backend 的 Pod
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
tier: frontend # 来自 frontend 命名空间的请求可进入
- podSelector:
matchLabels:
role: api # 同命名空间内标记为 api 的 Pod 可访问
ports:
- protocol: TCP
port: 3306 # MySQL 默认端口, 仅此端口开放
egress:
- to:
- ipBlock:
cidr: 10.96.0.0/12 # 集群内部 Service CIDR,可自由出站
ports:
- protocol: TCP
port: 443 # 对外 HTTPS 通信保留通道
- protocol: UDP
port: 53 # DNS 查询必不可少
温馨提示:如果没有任何 Ingress/Egress 定义,则默认拒绝所有流量; 精辟。 如果只写了 Ingress,则 Egress 保持开放状态。
4.1 实战示例:限制前端只能访问数据库, 不准直接调用外部 API
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-api-from-frontend
spec:
podSelector:
matchLabels:
tier: frontend # 锁定前端 Pod
policyTypes:
- Egress # 我们只管出站
egress:
- to:
- podSelector:
matchLabels:
app: database # 唯一允许去往 database
ports:
- protocol: TCP
port: 5432 # PostgreSQL
# 未匹配到上述规则的任何请求都会被丢弃
看,这样就把“前端跑到外部乱逛”的风险降到最低,就像在田里种树时给每棵树划定了专属阳光区域。
五、 最佳实践:让平安与效率共舞,像孩子们在草坪上奔跑般自然
- 细粒度标签管理:tag 应该统一规范,比方说
{app:web, tier:frontend}, 避免随意拼写导致策略失效。 - A/B 测试策略:先在非生产命名空间部署策略, 用
wget --spider http://service.default.svc.cluster.local/ping验证连通性,再逐步推广。 - POD 重启不影响策略:Kubernetes 会自动把已有 Policy 挂载到新创建的 POD 上,无需手动干预。
- L7 策略配合 Service Mesh:Cilium + Envoy 可以实现基于 HTTP 方法、 路径甚至 Header 的细致控制,让 API 防火墙真正落地。
- 定期审计: 每月使用
Kubectl get networkpolicy –all-namespaces –output wide | grep -i deprecated清理过期规则,防止“老树根”阻塞新枝芽成长。 - 🌱 多种树木共生—— 多种 CNI 可以共存,比方说核心使用 Calico 做平安,辅以 Flannel 提供简易跨节点 Overlay;但务必确保 CIDR 不冲突,否则会出现“路由迷路”。🌲
- ❤️ 多子多福——当你把平安写进代码, 也是在为未来团队培养更多“小孩”,他们将继承这套稳固的网络基石,一起去拥抱更大的云原生世界!❤️ \end{ul}
- Kubectl describe networkpolicy: 确认 selector 与规则是否匹配实际 POD 标签。
- Kubectl exec
-- curl –silent http:// 测试内部 Service 连通性是否受限。.default.svc.cluster.local: - CNI 日志查看: 大多数插件会把日志写入
/var/log/calico/… 或 /var/log/cilium/…, 用dmesg | grep cni捕获异常信息。有时候会出现 “iptables chain not found”, 这往往是主要原因是系统刚升级内核而未重启 CNI DaemonSet,需要重新 rollout:
六、 验证与排错:从小苗到大树,需要细心观察每一片叶子
kubectl rollout restart daemonset calico-node -n kube-system kubectl rollout status daemonset calico-node -n kube-system
小技巧:开启 KUBE_LOG_LEVEL=5 可以看到更详细的数据包追踪, 图啥呢? 但别忘了事后关掉,否则日志会淹没其他重要信息,就像春雨太大把花瓣冲走一样!☼
七、 收官感言:让技术与自然共生,让平安成为生活的一部分
Kubernetes 每一次网络改动都值得细致对待,主要原因是它关系着业务的数据血脉,也关系着团队成员日后成长的舞台。愿你在 Ubuntu 的草坪上, 不仅收获稳定可靠的服务,更收获满园春色——多子多孙、多树成林,共创美好未来!🌺🌱
| 常见故障速查表
标题已隐藏, 为避免误导,请自行阅读左侧列名。
︎︎︎︎︎️️️️️️️️✏✏✏✏✏✏✏ ✍ ✍ ✍ ✍ 💬💬💬💬💬💬💬🛠🛠🛠🛠🛠🛠🛠🪙🪙🪙🥇🥈🥉🏆🏅👑👑👑⏰⏰⏰⏰⏰⟶⟶⟶⟶🔧🔧🔧🔧🔧🚦🚦🚦🚦⚙⚙⚙⚙✅✅✅✅❎❎❎❎❓❓❓❓🌱🌱🌱🌱🍃🍃🍃🍂🍂🍂🍁🌿🌾📈📉📊📚📖🎯🎯🎯🎯🎉🎉🎉🎊🐞🐞🐞🐜🐝🐞🐝🤖🤖🤝🤝🙌🙌🙋🙋👩👨👧👦🌍🌐☁☀☔☁☔☔😅😆😂🤣😉😁😊🙂🙃😐😑🙄😲🤔🤭🥱😴🙈🙊 🙈 🙊 🙉 🙈 🙊 🙉 🙈 🙊 🙉 🕵 🕵 🕵 📢 📣 🎤 🔔 🔕 🗣 🎙 📜 📄 💼 🔒 🔓 ✅ ❎ ❓ ❗ ⭕ ⚪ ⚫ ▶ ◀ ▲ ▼ ♻ ⭕ ✔ ☑ ➜ ➤ ➥ ➦ ↗ ↘ ↙ ↖ ⬆ ⬇ ◾ ◽ □ ■ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ☆ ★ ☾ ☽ ✨ ⭐ 🌟 ⚡ ⚔ 🔥 🌈 🌊 🌋 🌀 🌍 🌐
---|---|---|---
症状 | 常见原因 | 快速定位 | 推荐解决方案
Pod 无法互通 | NetworkPolicy 阻断 | `kubectl describe np` 检查 selector | 调整 podSelector 或 namespaceSelector
IPIP/VXLAN 隧道未建立 | CNI 配置错误 | 查看 cni‑conf JSON 中 “type” 字段 | 确认对应 kernel 模块已加载
iptables 链缺失 | 插件升级后未刷新规则 | `iptables-save` 检查 `CALICO‑*` 链是否存在 | 重启 DaemonSet 并等待同步
日志爆炸导致性能下降 | log level 设置过高 | `grep 'level=' /var/log/calico/*.log` | 将 `logLevel` 调回 INFO
*表格仅作参考,请根据实际环境进行排查。* |
|---|
祝您在 Ubuntu 上玩转 Kubernetes 网络策略时 一路顺风,一切安好; 白嫖。 也愿您的代码仓库如春天般繁花似锦,孩子们笑声盈盈,绿树成荫!🌳🌼🚀✨

