溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

k8s?NetworkPolicy網(wǎng)絡策略怎么使用

發(fā)布時間:2023-05-08 15:18:02 來源:億速云 閱讀:154 作者:iii 欄目:開發(fā)技術

本篇內(nèi)容主要講解“k8s NetworkPolicy網(wǎng)絡策略怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“k8s NetworkPolicy網(wǎng)絡策略怎么使用”吧!

    NetworkPolicy 可以實現(xiàn)什么

    NetworkPolicy 可被定義為 Pod 標簽選擇器、命名空間選擇器或者兩者的組合。它可以實現(xiàn)以下功能:

    • 限制 Pod 之間的流量:通過指定 Ingress 規(guī)則,可以阻止來自其他 Pod 的流量進入目標 Pod。

    • 允許 Pod 之間的流量:需要為目標 Pod 配置 Egress 規(guī)則,以便只允許來自特定 Pod 的流量進入。

    • 限制 Pod 與外部網(wǎng)絡的通信:通過指定 Egress 規(guī)則,可以控制哪些類型的外部流量可以進入 Pod,并防止未經(jīng)授權的訪問。

    • 允許 Pod 與外部網(wǎng)絡的通信:需要為目標 Pod 配置 Ingress 規(guī)則,以便只允許來自特定 IP 地址、端口或協(xié)議的流量進入。

    使用 NetworkPolicy 時,需要考慮什么

    使用 NetworkPolicy 時,需要考慮以下幾個方面:

    • NetworkPolicy 只在支持它的網(wǎng)絡插件中起作用,例如 Calico、Cilium 和 Weave Net 等。

    • 沒有定義任何 NetworkPolicy 規(guī)則,則所有的流量都會被允許。

    • 定義 NetworkPolicy 后,它只適用于當前命名空間中的 Pod。

    • 在 NetworkPolicy 中指定標簽選擇器時,應保證其唯一性,以免給其他 Pod 帶來影響。

    網(wǎng)絡策略有哪些

    默認情況下,如果名字空間中不存在任何策略,則所有進出該名字空間中 Pod 的流量都被允許。

    Namespace 隔離流量

    默認情況下,所有 Pod 之間都是互通的。每個 Namespace 可以配置獨立的網(wǎng)絡策略,來隔離 Pod 之間的網(wǎng)絡流量。

    由此,可以通過創(chuàng)建匹配 Pod 的 Network Policy 來作為默認的網(wǎng)絡策略,比如默認拒絕所有 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 網(wǎng)段的 TCP 5987 端口

    使用場景

    禁止訪問指定服務

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

    k8s?NetworkPolicy網(wǎng)絡策略怎么使用

    網(wǎng)絡策略如下:

    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

    網(wǎng)絡策略如下:

    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

    網(wǎng)絡策略配置如下:

    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

    網(wǎng)絡策略如下:

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

    允許外網(wǎng)訪問服務

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

    網(wǎng)絡策略如下:

    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網(wǎng)絡策略怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI