k8s学习-网络策略NetworkPolicy(概念、模版、创建、删除等)
目錄
- 概念
- 前置條件
- k8s自帶的隔離
- 模版
- 實(shí)戰(zhàn)
- 創(chuàng)建
- 刪除
- 參考
概念
如果你希望在 IP 地址或端口層面(OSI 第 3 層或第 4 層)控制網(wǎng)絡(luò)流量, 則你可以考慮為集群中特定應(yīng)用使用 Kubernetes 網(wǎng)絡(luò)策略(NetworkPolicy)。
NetworkPolicy 是一種以應(yīng)用為中心的結(jié)構(gòu),允許你設(shè)置如何允許 Pod 與網(wǎng)絡(luò)上的各類網(wǎng)絡(luò)“實(shí)體” (我們這里使用實(shí)體以避免過度使用諸如“端點(diǎn)”和“服務(wù)”這類常用術(shù)語(yǔ), 這些術(shù)語(yǔ)在 Kubernetes 中有特定含義)通信。 NetworkPolicies 適用于一端或兩端與 Pod 的連接,與其他連接無關(guān)。
前置條件
網(wǎng)絡(luò)策略通過網(wǎng)絡(luò)插件(本文的k8s集群安裝時(shí)安裝了calico)來實(shí)現(xiàn)。 要使用網(wǎng)絡(luò)策略,你必須使用支持 NetworkPolicy 的網(wǎng)絡(luò)解決方案。
k8s自帶的隔離
k8s的命名空間是沒有強(qiáng)制隔離性的,訪問service時(shí)加上.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 規(guī)則)允許以下 Pod 連接到 “default” 名字空間下的帶有 “role=db” 標(biāo)簽的所有 Pod 的 6379 TCP 端口:
- “default” 名字空間下帶有 “role=frontend” 標(biāo)簽的所有 Pod
- 帶有 "project=myproject"標(biāo)簽的所有名字空間中的 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 規(guī)則)允許 “default” 命名空間中任何帶有標(biāo)簽 “role=db” 的 Pod 到 CIDR 10.0.0.0/24 下 5978 TCP 端口的連接。
選擇器有以下四個(gè):
-
podSelector:此選擇器將在與 NetworkPolicy 相同的名字空間中選擇特定的
Pod,應(yīng)將其允許作為入站流量來源或出站流量目的地。 -
namespaceSelector:此選擇器將選擇特定的名字空間,應(yīng)將所有 Pod 用作其入站流量來源或出站流量目的地。
-
namespaceSelector 和 podSelector:一個(gè)指定 namespaceSelector 和 podSelector
的 to/from 條目選擇特定名字空間中的特定 Pod。 -
ipBlock:此選擇器將選擇特定的 IP CIDR 范圍以用作入站流量來源或出站流量目的地。 這些應(yīng)該是集群外部 IP,因?yàn)?Pod IP 存在時(shí)間短暫的且隨機(jī)產(chǎn)生。
在設(shè)計(jì)一個(gè) Network Policy 的時(shí)候要做哪些事情?
- 第一件事是控制對(duì)象,就像這個(gè)實(shí)例里面 spec 的部分。spec 里面通過 podSelector 或者 namespace 的selector,可以選擇做特定的一組 pod 來接受我們的控制;
- 第二個(gè)就是對(duì)流向考慮清楚,需要控制入方向還是出方向?還是兩個(gè)方向都要控制?
- 第三個(gè),如果要對(duì)選擇出來的方向加上控制對(duì)象來對(duì)它進(jìn)行描述,具體哪一些 stream可以放進(jìn)來,或者放出去?類比這個(gè)流特征的五元組,可以通過一些選擇器來決定哪一些可以作為我的遠(yuǎn)端,這是對(duì)象的選擇;也可以通過 IPBlock這種機(jī)制來得到對(duì)哪些 IP 是可以放行的;最后就是哪些協(xié)議或哪些端口。其實(shí)流特征綜合起來就是一個(gè)五元組,會(huì)把特定的能夠接受的流選擇出來 。
實(shí)戰(zhàn)
創(chuàng)建
創(chuàng)建一個(gè)名字為all-port-from-namespace的NetworkPolicy。
這個(gè)NetworkPolicy允許internal命名空間下的Pod訪問該命名空間下的80端口。
不允許不是internal命令空間的下的Pod訪問
不允許訪問沒有監(jiān)聽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創(chuàng)建NetworkPolicy all-port-from-namespace
kubectl create -f all-port-from-namespace.yaml
搭建詳情請(qǐng)查看k8s學(xué)習(xí)-CKA真題-網(wǎng)絡(luò)策略NetworkPolicy
刪除
kubectl delete networkpolicy all-port-from-namespace -n internal參考
k8s - 網(wǎng)絡(luò)策略
CNCF x 阿里云 網(wǎng)絡(luò)概念及策略控制
總結(jié)
以上是生活随笔為你收集整理的k8s学习-网络策略NetworkPolicy(概念、模版、创建、删除等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于a:hover span和a spa
- 下一篇: Open Set Domain Adap