网络安全

这里指的网络安全是 Pod 的网络隔离,利用 Kubernetes 的 NetworkPolicy 资源为 Pod 设置安全组,可限制能够 访问该 Pod从该 Pod 发出 的数据。

该资源需要网络插件的支持,用户可以使用 Calico 插件启用该功能,其底层使用 iptables 来进行网络隔离。

该资源可以从三层、四层进行数据识别并隔离。

🧟‍♂️ 在匹配数据流量时,有三个字段起作用,取并集,即满足其中任何一个字段指定的要求的流量,都会被匹配:

  • ipBlock:无视 NetworkPolicy 所在的命名空间,只根据数据流量的 IP 地址进行匹配;

  • podSelector:匹配 NetworkPolicy 所在命名空间 的满足标签信息的 Pod;

  • namespaceSelector:无视 NetworkPolicy 所在的命名空间,根据命名空间的标签进行匹配,匹配到的命名空间中的 所有 Pod 的流量均会被匹配;

限制访问 Pod 的流量

该类型的流量限制可以通过 networkpolicy.spec.podSelector 先指定需要限制访问的 Pod 的标签匹配,可以使用简单的 matchLabels 也可以使用 matchExpressions 进行复杂匹配;

然后在 networkpolicy.spec.ingress 中指定访问 Pod 所匹配的网络数据特性。

下面直接展示一个例子,在 default 命名空间中创建了一个 NetworkPolicy,该资源用于限制访问带有标签 app=database 的 Pod 的流量,只能访问该 Pod 的 2345 端口,且只要满足下面这些条件中的 任意一条 就可以访问:

  • ipBlock 中可见,来自 IP 地址为 192.168.28.100 的 Pod 的流量可以访问该 Pod 的指定端口;

  • podSelector 中可见,在 default 命名空间中,来自带有标签 app=webserver 的 Pod 的流量可以访问该 Pod 的指定端口;

  • namespaceSelector 中可见,来自带有标签 tenant=manning 的命名空间中的所有 Pod 的流量均可以访问该 Pod 的指定端口;

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
  namespace: default
spec:
  podSelector:    # 选择目标 Pod
    matchLabels:    # 根据标签匹配 Pod(也可以用 matchExpressions,可以更灵活的匹配 Pod 标签)
      app: database
  ingress:    # 限制访问目标 Pod 的流量
  - from:        # 流量的来源
    - ipBlock:    # IP 地址段,来自该 IP 地址段的可以访问(不受命名空间限制)
        cidr: 192.168.28.100/31
        except:
        - 192.168.28.101/32
    - podSelector:    # 被匹配的当前 NetworkPolicy 所在命名空间的源 Pod 可以访问
        matchLabels:    # 根据标签匹配 Pod(也可以用 matchExpressions,可以更灵活的匹配 Pod 标签)
          app: webserver
    - namespaceSelector:    # 被匹配的命名空间中的所有 Pod 可以访问(不受命名空间限制)
        matchLabels:    # 根据标签匹配命名空间(也可以用 matchExpressions,可以更灵活的匹配命名空间标签)
          tenant: manning
    ports:    # 只允许访问目标 Pod 的 2345 端口
    - port: 2345

限制出自 Pod 的流量

该类型的流量限制可以通过 networkpolicy.spec.podSelector 先指定需要限制流量出自的 Pod 的标签匹配,可以使用简单的 matchLabels 也可以使用 matchExpressions 进行复杂匹配;

然后在 networkpolicy.spec.egress 中指定访问 Pod 所匹配的网络数据特性。

下面直接展示一个例子,

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-net-policy
  namespace: default
spec:
  podSelector:    # 选择目标 Pod
    matchLabels:    # 根据标签匹配 Pod(也可以用 matchExpressions,可以更灵活的匹配 Pod 标签)
      app: webserver
  egress:    # 限制出自目标 Pod 的流量
  - to:    # 流量的目的
    - podSelector:    # 目标 Pod 可以发送流量至被匹配的当前 NetworkPolicy 所在命名空间的 Pod
        matchLabels:    # 根据标签匹配 Pod(也可以用 matchExpressions,可以更灵活的匹配 Pod 标签)
          app: database
    ports:    # 只允许发送目标端口为 2345 的流量
    - port: 2345

networkpolicy.spec.egress.to 中同样也包含与 ingress 中一样的 ipBlockpodSelectornamespaceSelector 字段,用法及注意点与后者中的一样,这里就不做更多解释。

Last updated

Was this helpful?