Kubernetes网络策略

TOC

network policy网络策略

默认情况下,Kubernetes集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制,减少网络攻击面,提高安全性,这就会用到网络策略

网络策略需要通过网络插件来实现,也就是你K8S集群的CNI网络组件必须支持网络策略,当前flannel是不支持网络策略,calico是支持网络策略的

网络策略的实现需要基于namespace,只会作用于当前命名空间,限制分为两种(进站和出站):

  • ingress:定义允许访问目标Pod的入站白名单规则。
  • egress:定义目标Pod允许访问的“出站“白名单规则。

一个yaml文件事例如下所示:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: k8s-test  #起到作用的命名空间
spec:
  podSelector:     #用于定义该网络策略作用的Pod范围
    matchLabels:
      role: db
  policyTypes:     #网络策略的类型,包括ingress和egress两种
  - Ingress
  - Egress
  ingress:        #定义允许访问目标Pod的入站白名单规则
  - from:         #满足from 条件的客户端才能访问ports定义的目标Pod端口号。
    - ipBlock:    #限制该网段的IP
        cidr: 172.18.0.0/16
        except:   #排除该网段的IP
        - 172.18.1.0/24
    - namespaceSelector:  #命名空间限制
        matchLabels:
          project: myproject
    - podSelector:  # pod选择器限制
        matchLabels:
          role: db
    ports:     #允许访问的目标Pod监听的端口号。
    - protocol: TCP
      port: 6379
  egress:   #定义目标Pod允许访问的“出站”白名单规则
  - to:    #目标Pod仅允许访问满足to条件的服务端IP范围和ports定义的端口号
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:  #允许访问的服务端的端口号。
    - protocol: TCP
      port: 5978

具体限制方式分为三种:

  • 1.ip地址策略
  • 2.命名空间策略
  • 3.pod选择器策略

1.Namespace级别设置默认的网络策略

默认拒绝所有入站流量

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

默认允许所有入站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-ingress
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

默认拒绝所有出站流量

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

默认允许所有出站流量

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

默认拒绝所有入站和出站流量

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

2.ip地址策略

我们通过修改ip限制来演示网路策略,通过宿主机所在物理机访问。当设置指定网段可以访问,不是指定网段不可以访问
允许172.18.1.0/16网段的机器访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: k8s-test
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.18.1.0/16 #  只允许这个网段访问
    ports:
    - protocol: TCP
      port: 80

3.命名空间策略

设置只允许default命名空间的数据通过

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: k8s-test
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: default
    ports:
    - protocol: TCP
      port: 80

4.pod选择器策略

创建一个策略,只允许标签为run=testpod的pod访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: k8s-test
spec:
  podSelector:
    matchLabels:
      run: pod1
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          run: testpod
    ports:
    - protocol: TCP
      port: 80