k8s NetworkPolicy网络策略怎么使用

开发技术 作者:iii 2024-05-08 23:30:01
本篇内容主要讲解“k8s NetworkPolicy网络策略怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“k8...

本篇内容主要讲解“k8s NetworkPolicy网络策略怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“k8s NetworkPolicy网络策略怎么使用”吧!

    NetworkPolicy 可以实现什么

    NetworkPolicy 可被定义为 Pod 标签选择器、命名空间选择器或者两者的组合。它可以实现以下功能:

    • 限制 Pod 之间的流量:通过指定 Ingress 规则,可以阻止来自其他 Pod 的流量进入目标 Pod。

    • 允许 Pod 之间的流量:需要为目标 Pod 配置 Egress 规则,以便只允许来自特定 Pod 的流量进入。

    • 限制 Pod 与外部网络的通信:通过指定 Egress 规则,可以控制哪些类型的外部流量可以进入 Pod,并防止未经授权的访问。

    • 允许 Pod 与外部网络的通信:需要为目标 Pod 配置 Ingress 规则,以便只允许来自特定 IP 地址、端口或协议的流量进入。

    使用 NetworkPolicy 时,需要考虑什么

    使用 NetworkPolicy 时,需要考虑以下几个方面:

    • NetworkPolicy 只在支持它的网络插件中起作用,例如 Calico、Cilium 和 Weave Net 等。

    • 没有定义任何 NetworkPolicy 规则,则所有的流量都会被允许。

    • 定义 NetworkPolicy 后,它只适用于当前命名空间中的 Pod。

    • 在 NetworkPolicy 中指定标签选择器时,应保证其唯一性,以免给其他 Pod 带来影响。

    网络策略有哪些

    默认情况下,如果名字空间中不存在任何策略,则所有进出该名字空间中 Pod 的流量都被允许。

    Namespace 隔离流量

    默认情况下,所有 Pod 之间都是互通的。每个 Namespace 可以配置独立的网络策略,来隔离 Pod 之间的网络流量。

    由此,可以通过创建匹配 Pod 的 Network Policy 来作为默认的网络策略,比如默认拒绝所有 Pod 之间 Ingress 的通信,如下:

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

    默认拒绝 Pod 之间 Egress(出口) 通信的策略:

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

    甚至是默认拒绝 Pod 之间 Ingress(入口) 和 Egress(出口) 通信的策略:

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

    Pod 隔离

    Pod 隔离可以分为出口的隔离入口的隔离。其实这里的“隔离”不是绝对的,而是还有一些其它限制。

    比如可以通过使用标签选择器(这里可以是 namespaceSelector 和 podSelector)来控制 Pod 之间的流量。

    如下面的 Network Policy:

    • 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口

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

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

    另外一个同时开启 Ingress 和 Egress 通信的策略为:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: default
    spec:
      podSelector:
        matchLabels:
          role: mydb
      policyTypes:
        - Ingress
        - Egress
      ingress:
        - from:
            - ipBlock:
                cidr: 192.168.0.0/16
                except:
                  - 192.168.1.0/24
            - namespaceSelector:
                matchLabels:
                  project: myproject
            - podSelector:
                matchLabels:
                  role: myfront
          ports:
            - protocol: TCP
              port: 6379
      egress:
        - to:
            - ipBlock:
                cidr: 10.1.0.0/24
          ports:
            - protocol: TCP
              port: 5978

    它用来隔离 default namespace 中带有 role=mydb 标签的 Pod:

    • 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口

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

    • 允许 default namespace 中带有 role=mydb 标签的 Pod 访问 10.1.0.0/24 网段的 TCP 5987 端口

    使用场景

    禁止访问指定服务

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

    k8s NetworkPolicy网络策略怎么使用

    网络策略如下:

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

    只允许指定 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

    禁止 namespace 中所有 Pod 之间的相互访问

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

    禁止其他 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: {}

    此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许流出流量。 此策略不会更改任何 Pod 的入站流量隔离行为。

    只允许指定 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

    允许外网访问服务

    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: []

    有了这个策略,任何额外的策略都不会导致来自这些 Pod 的任何出站连接被拒绝。 此策略对进入任何 Pod 的隔离没有影响。

    到此,相信大家对“k8s NetworkPolicy网络策略怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是捷杰建站网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    原创声明
    本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    本文链接:http://www.jiecseo.com/news/show_25282.html
    k8s networkpolicy