如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?

2026-05-16 02:321阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

先说说您需要确保您的Kubernetes集群已经安装并运行。接下来您的集群应具备网络策略能力, 这意味着您需要安装并配置一个支持网络策略的网络插件,如Calico、Cilium或Flannel,闹笑话。。

一、 前置准备:让系统像春天的土壤一样肥沃

在动手之前,请先检查以下几项:

如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?
  • 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 冲突而闹笑话。

如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?

三、 挑选合适的 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}

    六、 验证与排错:从小苗到大树,需要细心观察每一片叶子

    1. Kubectl describe networkpolicy: 确认 selector 与规则是否匹配实际 POD 标签。
    2. Kubectl exec -- curl –silent http://.default.svc.cluster.local: 测试内部 Service 连通性是否受限。
    3. CNI 日志查看: 大多数插件会把日志写入 /var/log/calico/… 或 /var/log/cilium/… , 用 dmesg | grep cni  捕获异常信息。有时候会出现 “iptables chain not found”, 这往往是主要原因是系统刚升级内核而未重启 CNI DaemonSet,需要重新 rollout:
    4. 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 网络策略时 一路顺风,一切安好; 白嫖。 也愿您的代码仓库如春天般繁花似锦,孩子们笑声盈盈,绿树成荫!🌳🌼🚀✨

标签:Ubuntu

先说说您需要确保您的Kubernetes集群已经安装并运行。接下来您的集群应具备网络策略能力, 这意味着您需要安装并配置一个支持网络策略的网络插件,如Calico、Cilium或Flannel,闹笑话。。

一、 前置准备:让系统像春天的土壤一样肥沃

在动手之前,请先检查以下几项:

如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?
  • 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 冲突而闹笑话。

如何配置Ubuntu Kubernetes网络策略,轻松实现高效安全访问?

三、 挑选合适的 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}

    六、 验证与排错:从小苗到大树,需要细心观察每一片叶子

    1. Kubectl describe networkpolicy: 确认 selector 与规则是否匹配实际 POD 标签。
    2. Kubectl exec -- curl –silent http://.default.svc.cluster.local: 测试内部 Service 连通性是否受限。
    3. CNI 日志查看: 大多数插件会把日志写入 /var/log/calico/… 或 /var/log/cilium/… , 用 dmesg | grep cni  捕获异常信息。有时候会出现 “iptables chain not found”, 这往往是主要原因是系统刚升级内核而未重启 CNI DaemonSet,需要重新 rollout:
    4. 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 网络策略时 一路顺风,一切安好; 白嫖。 也愿您的代码仓库如春天般繁花似锦,孩子们笑声盈盈,绿树成荫!🌳🌼🚀✨

标签:Ubuntu