其他分享
首页 > 其他分享> > 【 Kubernetes 】Networkpolicy

【 Kubernetes 】Networkpolicy

作者:互联网

⭐️欢迎关注⭐️

参考文档 :
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
https://docs.projectcalico.org/v3.10/getting-started/kubernetes/installation/flannel
https://github.com/ahmetb/kubernetes-network-policy-recipes
https://www.cnblogs.com/ssgeek/p/11714487.html

一、Networkpolicy简介

为了实现细粒度的容器间网络访问隔离策略(防火墙), Kubernetes从1.3版本开始,由SIG-Network小组主导研发了Network Policy机制,目前已升级为networking.k8s.io/v1稳定版本。

二、NetworkPolicy策略模型

三、网络策略配置说明

官方 demo

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector: #用于定义该网络策略作用的Pod范围
    matchLabels:
      role: db
  policyTypes: #网络策略的类型,包括ingress和egress两种
  - Ingress
  - Egress
  ingress: #定义允许访问目标Pod的入站白名单规则
  - from: #满足from 条件的客户端才能访问ports定义的目标Pod端口号。
    - ipBlock: # IP限制
        cidr: 172.17.0.0/16
        except:  #排除那些IP
        - 172.17.1.0/24
    - namespaceSelector:  #命名空间限制
        matchLabels:
          project: myproject
    - podSelector:  # pod选择器限制
        matchLabels:
          role: frontend
    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

四、NetworkPolicy默认策略

4.1、默认拒绝所有入口流量

通过创建选择所有容器但不允许任何进入这些容器的入口流量的$ NetworkPolicy$ 来为名称空间创建$ default$ 隔离策略。这样可以确保即使容器没有选择其他任何$ NetworkPolicy$ ,也仍然可以被隔离。此策略不会更改默认的出口隔离行为。

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

4.2、默认允许所有入口流量

如果要允许所有流量进入某个命名空间中的所有Pod(即使添加了导致某些Pod被视为“隔离”的策略),则可以创建一个策略来明确允许该命名空间中的所有流量。

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

4.3、默认拒绝所有出口流量

通过创建选择所有容器但不允许来自这些容器的任何出口流量的NetworkPolicy来为名称空间创建default egress隔离策略。这样可以确保即使没有被其他任何NetworkPolicy选择的Pod也不会被允许流出流量。此策略不会更改默认的ingress隔离行为。

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

4.4、默认允许所有出口流量

如果要允许来自命名空间中所有Pod的所有流量(即使添加了导致某些Pod被视为“隔离”的策略),则可以创建一个策略,该策略明确允许该命名空间中的所有出口流量。

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

4.5、默认拒绝所有入口和所有出口流量

为名称空间创建default策略,以通过在该名称空间中创建以下NetworkPolicy来阻止所有入站和出站流量。这样可以确保即使没有被其他任何NetworkPolicy选择的Pod也不会被允许进入或流出流量。

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

4.6、实战 :仅允许流量出向 ingress

为 test 名称空间创建仅允许 该名称空间服务 8080 出向 ingress-controller的流量策略;

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-only-igress
  namespace: test
spec:
  podSelector: {}   # 匹配 test ns下的所有Pod
  policyTypes:
  - Ingress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          app.kubernetes.io/name: ingress-nginx-main
      podSelector:
        matchLabels:
         "app.kubernetes.io/name": ingress-nginx-main
    ports:
    - protocol: TCP
      port: 8080

4.7、实战 : redis 流量限制示例

允许default namespace中带有role=frontend标签的Pod访问default namespace中带有role=db标签Pod的6379端口

允许带有project=myprojects标签的namespace中所有Pod访问default namespace中带有role=db标签Pod的6379端口

# apiVersion: extensions/v1beta1
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: tcp
      port: 6379

4.8、实战 :允许带有access=true的Pod访问nginx的网络策略

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

4.9、实战 :禁止访问指定服务

# kubectl run web --image=nginx --labels app=web,env=prod --expose --port 80

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-deny-all
spec:
  podSelector:
    matchLabels:
      app: web
      env: prod

4.10、实战 :只允许指定pod访问服务

# kubectl run apiserver --image=nginx --labels app=bookstore,role=api --expose --port 80

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: api-allow
spec:
  podSelector:
    matchLabels:
      app: bookstore
      role: api
  ingress:
  - from:
      - podSelector:
          matchLabels:
            app: bookstore

4.11、实战 :禁止 namespace 中所有 Pod 之间的相互访问

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

4.12、实战 :禁止其他 namespace 访问服务

# kubectl create namespace secondary
# kubectl run web --namespace secondary --image=nginx --labels=app=web --expose --port 80

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: secondary
  name: web-deny-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

4.13、实战 :只允许指定namespace访问服务

# kubectl run web --image=nginx --labels=app=web --expose --port 80

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-prod
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: production

4.14、实战 :允许外网访问服务

# kubectl run web --image=nginx --labels=app=web --port 80
# kubectl expose deployment/web --type=LoadBalancer

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: web
  ingress:
  - ports:
    - port: 80
    from: []

五、使用flannel+canal实现k8s的NetworkPolicy

标签:networking,Networkpolicy,Kubernetes,--,podSelector,io,Pod,NetworkPolicy
来源: https://blog.csdn.net/weixin_41989934/article/details/122838726