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-policynamespace: default spec:podSelector:matchLabels:role: dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr: 172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project: myproject- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 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-namespacenamespace: internal spec:podSelector: {}policyTypes:- Ingressingress:- from:- podSelector: {}ports:- port: 80protocal: TCP創建NetworkPolicy all-port-from-namespace
kubectl create -f all-port-from-namespace.yaml
搭建詳情請查看k8s學習-CKA真題-網絡策略NetworkPolicy
刪除
kubectl delete networkpolicy all-port-from-namespace -n internal參考
k8s - 網絡策略
CNCF x 阿里云 網絡概念及策略控制
總結
以上是生活随笔為你收集整理的k8s学习-网络策略NetworkPolicy(概念、模版、创建、删除等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于a:hover span和a spa
- 下一篇: Open Set Domain Adap