天天看點

k8s學習-網絡政策NetworkPolicy(概念、模版、建立、删除等)

目錄

  • ​​概念​​
  • ​​前置條件​​
  • ​​k8s自帶的隔離​​
  • ​​模版​​
  • ​​實戰​​
  • ​​建立​​
  • ​​删除​​
  • ​​參考​​

概念

如果你希望在 IP 位址或端口層面(OSI 第 3 層或第 4 層)控制網絡流量, 則你可以考慮為叢集中特定應用使用 Kubernetes 網絡政策(NetworkPolicy)。

NetworkPolicy 是一種以應用為中心的結構,允許你設定如何允許 Pod 與網絡上的各類網絡“實體” (我們這裡使用實體以避免過度使用諸如“端點”和“服務”這類常用術語, 這些術語在 Kubernetes 中有特定含義)通信。 NetworkPolicies 适用于一端或兩端與 Pod 的連接配接,與其他連接配接無關。

前置條件

網絡政策通過網絡插件(本文的k8s叢集安裝時安裝了calico)來實作。 要使用網絡政策,你必須使用支援 NetworkPolicy 的網絡解決方案。

k8s自帶的隔離

k8s的命名空間是沒有強制隔離性的,通路service時加上.namespace的名稱即可。

k8s的Pod是沒有隔離行的,任意命名空間下的Pod可以通路任意命名空間下的Pod。

模版

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

以上模版的含義如下:

1.隔離 “default” 名字空間下 “role=db” 的 Pod 。

2.(Ingress 規則)允許以下 Pod 連接配接到 “default” 名字空間下的帶有 “role=db” 标簽的所有 Pod 的 6379 TCP 端口:

  • “default” 名字空間下帶有 “role=frontend” 标簽的所有 Pod
  • 帶有 "project=myproject"标簽的所有名字空間中的 Pod
  • IP 位址範圍為 172.17.0.0–172.17.0.255 和172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)

3.(Egress 規則)允許 “default” 命名空間中任何帶有标簽 “role=db” 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的連接配接。

選擇器有以下四個:

  • podSelector:此選擇器将在與 NetworkPolicy 相同的名字空間中選擇特定的

    Pod,應将其允許作為入站流量來源或出站流量目的地。

  • namespaceSelector:此選擇器将選擇特定的名字空間,應将所有 Pod 用作其入站流量來源或出站流量目的地。
  • namespaceSelector 和 podSelector:一個指定 namespaceSelector 和 podSelector

    的 to/from 條目選擇特定名字空間中的特定 Pod。

  • ipBlock:此選擇器将選擇特定的 IP CIDR 範圍以用作入站流量來源或出站流量目的地。 這些應該是叢集外部 IP,因為 Pod IP 存在時間短暫的且随機産生。

在設計一個 Network Policy 的時候要做哪些事情?

  • 第一件事是控制對象,就像這個執行個體裡面 spec 的部分。spec 裡面通過 podSelector 或者 namespace 的selector,可以選擇做特定的一組 pod 來接受我們的控制;
  • 第二個就是對流向考慮清楚,需要控制入方向還是出方向?還是兩個方向都要控制?
  • 第三個,如果要對選擇出來的方向加上控制對象來對它進行描述,具體哪一些 stream可以放進來,或者放出去?類比這個流特征的五元組,可以通過一些選擇器來決定哪一些可以作為我的遠端,這是對象的選擇;也可以通過 IPBlock這種機制來得到對哪些 IP 是可以放行的;最後就是哪些協定或哪些端口。其實流特征綜合起來就是一個五元組,會把特定的能夠接受的流選擇出來 。

實戰

建立

建立一個名字為all-port-from-namespace的NetworkPolicy。

這個NetworkPolicy允許internal命名空間下的Pod通路該命名空間下的80端口。

不允許不是internal指令空間的下的Pod通路

不允許通路沒有監聽80端口的Pod。

all-port-from-namespace.yaml如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: all-port-from-namespace
  namespace: internal
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
      - podSelector: {}
      ports:
      - port: 80
        protocal:      

建立NetworkPolicy all-port-from-namespace

kubectl create -f all-port-from-namespace.yaml      
k8s學習-網絡政策NetworkPolicy(概念、模版、建立、删除等)

搭建詳情請檢視k8s學習-CKA真題-網絡政策NetworkPolicy

删除

kubectl delete networkpolicy all-port-from-namespace -n internal      

參考

繼續閱讀