云其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > 云其它 > K8s内部实现安全的网络隔离

在K8s内部实现安全的网络隔离方式

作者:XMYX-0

Kubernetes网络策略通过定义Pod之间的流量规则,实现安全隔离和最小权限访问,本文详细介绍了网络策略的基本概念、工作原理、配置方法及最佳实践,帮助构建更加安全的集群网络环境

如何在 K8s 内部实现安全的网络隔离?

在生产环境中,随着微服务架构和多租户应用的普及,网络安全和流量控制成为 Kubernetes 集群中不可忽视的关键问题。Kubernetes 默认允许集群内所有 Pod 间自由通信,但这在安全要求高的场景下显然不够。通过引入网络策略(NetworkPolicy),我们可以对 Pod 之间甚至 Pod 与外部之间的网络流量进行精细化控制,从而实现安全隔离和最小权限访问。

本文将详细介绍 Kubernetes 网络策略的基本概念、工作原理、配置方法及实践中的陷阱与最佳实践,帮助你构建一个更加安全的集群网络环境。

网络策略简介

什么是 NetworkPolicy?

为什么需要网络隔离?

网络策略的工作原理

基本模型

标签选择器(podSelector / namespaceSelector):NetworkPolicy 使用标签选择器来确定哪些 Pod 受策略影响。可以针对单个 Pod、一个 Pod 集合或整个命名空间设置规则。

规则类型:网络策略分为两种方向的规则:

端口与协议:支持指定 TCP、UDP 和 SCTP 协议的端口范围(部分网络插件可能限制协议支持)。

白名单机制

网络插件支持

实现依赖:网络策略的实际执行依赖于 CNI 插件(如 Calico、Cilium、Weave Net、kube-router 等)。不同插件可能在细节上有差异,但基本原理一致。

插件选型指南

验证插件支持:通过部署测试策略并观察流量行为,或查阅插件官方文档确认功能支持。

常见配置示例

基础示例

以下策略对 default 命名空间中带有 role=db 标签的 Pod 进行隔离,规定仅允许来自以下来源的 TCP 流量访问 6379 端口:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:  # 注意:此规则隐含了同一命名空间下的 Pod
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

默认拒绝策略

设置命名空间内所有 Pod 默认拒绝所有入站流量:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default
spec:
  podSelector: {}  # 选中所有 Pod
  policyTypes:
  - Ingress
  # ingress 规则为空,表示拒绝所有入站

允许特定访问

仅允许带有 access: true 标签的 Pod 访问 nginx:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

关键场景扩展

允许 DNS 解析

Pod 通常需要访问集群 DNS(如 kube-dns)以解析服务名称。若出口策略限制严格,需显式放行 DNS 流量:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns
spec:
  podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system  # 假设 DNS 部署在 kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
      - protocol: UDP
        port: 53

允许访问外部服务

若 Pod 需访问特定外部 API(如 api.example.com:443),可通过 IP 块或域名(需插件支持)放行:

egress:
- to:
  - ipBlock:
      cidr: 203.0.113.0/24  # 替换为实际 IP 范围
  ports:
  - protocol: TCP
    port: 443

实践部署与注意事项

部署步骤

选择并配置网络插件

设计标签体系

渐进式策略部署

跨命名空间策略

使用 namespaceSelector 控制跨命名空间访问。

示例:允许 monitoring 命名空间下的 Prometheus Pod 拉取指标:

ingress:
- from:
  - namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: monitoring
    podSelector:
      matchLabels:
        app: prometheus

常见问题与排查

策略未生效的可能原因

  1. 网络插件未正确支持:执行 kubectl get networkpolicy 确认策略已创建,但插件可能未生效。
  2. 标签不匹配:检查 Pod 和命名空间的标签是否与策略中的选择器一致。
  3. 端口/协议不匹配:确保流量协议(TCP/UDP)和端口号与策略定义一致。
  4. 规则方向错误:入站流量需配置在 ingress,出站流量需 egress

测试工具

临时诊断 Pod:使用 nicolaka/netshootbusybox 镜像执行 curlnslookup

kubectl run tester --image=nicolaka/netshoot --rm -it --restart=Never -- curl http://nginx:80

策略模拟工具:Calico 提供 calicoctl 模拟策略效果。

高级技巧与最佳实践

复杂规则组合

联合选择器namespaceSelectorpodSelector 在同一个 from/to 块中时,需同时满足(“与”关系):

ingress:
- from:
  - namespaceSelector:
      matchLabels:
        env: prod
    podSelector:
      matchLabels:
        app: api

此规则仅允许来自 env=prod 命名空间且标签为 app=api 的 Pod。

性能优化

安全增强

默认拒绝出口:防止数据泄露,仅允许访问必要的外部服务。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
  - Egress

定期审计策略:使用 kubectl get networkpolicy --all-namespaces 检查冗余或过期规则。

总结

通过 Kubernetes 网络策略,可以实现从粗放式网络开放到精细化管控的转变。核心要点包括:

随着集群规模扩大,建议采用策略即代码(Policy as Code)工具(如 OPA Gatekeeper)自动化策略管理,确保安全性与合规性的同时降低运维负担。网络策略不仅是技术手段,更是构建云原生安全体系的核心基石。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文