網(wǎng)絡(luò)策略-NetworkPolicy

1,NetworkPolicy

簡介
為了實現(xiàn)細粒度的容器間往來訪問隔離策略之斯,Kubernetes 從 1.3 版本開始齐唆,由 SIG-Network 小組主導(dǎo)研發(fā)了 Network Policy 機制,目前已升級為 networking.k8s.io/v1 穩(wěn)定版本爬橡。Network Policy 的主導(dǎo)功能是對 Pod 間的網(wǎng)絡(luò)通信進行限制和準入控制治唤,設(shè)置方式為將 Pod 的 Label 作為查詢條件,設(shè)置允許訪問或禁止訪問的客戶端 Pod 列表糙申。目前查詢條件可以作用于 Pod 和 Namespace 級別宾添。

為了使用 Network Policy,Kubernetes 引入了一個新的資源對象 NetworkPolicy柜裸,供用戶設(shè)置 Pod 間網(wǎng)絡(luò)訪問的策略缕陕。但僅定義一個網(wǎng)絡(luò)策略是無法完成實際的網(wǎng)絡(luò)隔離的,還需要一個策略控制器(Policy Controller)進行策略的實現(xiàn)疙挺。策略控制器由第三方網(wǎng)絡(luò)組建提供扛邑,目前 Calico、Cilium铐然、Kube-router蔬崩、Romana、Weave Net 等開源項目均支持網(wǎng)絡(luò)策略的實現(xiàn)搀暑。

Policy Controller 需要實現(xiàn)一個 API Listener沥阳,監(jiān)聽用戶設(shè)置的 NetworkPolicy 定義,并將網(wǎng)絡(luò)訪問規(guī)則通過各 Node 的 Agent 進行實際設(shè)置(Agent 則需要通過 CNI 網(wǎng)絡(luò)插件實現(xiàn))自点。

隔離和非隔離的 Pod

默認情況下桐罕,Pod 是非隔離的,它們接受任何來源的流量。

Pod 在被某 NetworkPolicy 選中時進入被隔離狀態(tài)冈绊。 一旦名稱空間中有 NetworkPolicy 選擇了特定的 Pod侠鳄,該 Pod 會拒絕該 NetworkPolicy 所不允許的連接。 (名稱空間下其他未被 NetworkPolicy 所選擇的 Pod 會繼續(xù)接受所有的流量)

網(wǎng)絡(luò)策略不會沖突死宣,它們是累積的伟恶。 如果任何一個或多個策略選擇了一個 Pod, 則該 Pod 受限于這些策略的 入站(Ingress)/出站(Egress)規(guī)則的并集。因此評估的順序并不會影響策略的結(jié)果毅该。

為了允許兩個 Pods 之間的網(wǎng)絡(luò)數(shù)據(jù)流博秫,源端 Pod 上的出站(Egress)規(guī)則和 目標端 Pod 上的入站(Ingress)規(guī)則都需要允許該流量。 如果源端的出站(Egress)規(guī)則或目標端的入站(Ingress)規(guī)則拒絕該流量眶掌, 則流量將被拒絕挡育。
 

部署calic網(wǎng)絡(luò)

wget https://docs.projectcalico.org/v3.9/manifests/calico.yaml
kubectl apply -f calico.yaml

[root@master ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5fbfc9dfb6-jhddm   1/1     Running   0          16m
calico-node-2d28h                          1/1     Running   0          16m
calico-node-77rx5                          1/1     Running   0          16m
calico-node-xzrdh                          1/1     Running   0          16m
coredns-7ff77c879f-p4smr                   1/1     Running   0          18m
coredns-7ff77c879f-tn7w9                   1/1     Running   0          18m
etcd-master                                1/1     Running   0          18m
kube-apiserver-master                      1/1     Running   0          18m
kube-controller-manager-master             1/1     Running   0          18m
kube-proxy-8h5gh                           1/1     Running   0          18m
kube-proxy-97dzz                           1/1     Running   0          18m
kube-proxy-986fs                           1/1     Running   0          18m
kube-scheduler-master                      1/1     Running   0          18m

NetworkPolicy示例

參數(shù)說明:

podSelector:用于定義該網(wǎng)絡(luò)策略作用的 Pod 方位,本例的選擇條件為包含 "role=db" 標簽的 Pod朴爬。

policyTypes:網(wǎng)絡(luò)策略的類型即寒,包括 ingress 和 egress 兩種,用于設(shè)置目標 Pod 的入站和出站的網(wǎng)絡(luò)限制召噩。

ingress:定義允許訪問目標 Pod 的入站白名單規(guī)則母赵,滿足 from 條件的客戶端才能訪問 ports 定義的目標 Pod 端口號。

- from:對符合條件的客戶端 Pod 進行網(wǎng)絡(luò)放行具滴,規(guī)則包括基于客戶端 Pod 的 Label凹嘲、基于客戶端 Pod 所在的 Namespace 的 Label 或者客戶端的 IP 范圍。

- ports:允許訪問的目標 Pod 監(jiān)聽的端口號构韵。

egress:定義目標 Pod 允許訪問的 "出站" 白名單規(guī)則周蹭,目標 Pod 僅允許訪問滿足 to 條件的服務(wù)端 IP 范圍和 ports 定義的端口號。

- to: 允許訪問的服務(wù)端信息疲恢,可以基于服務(wù)端 Pod 的Label凶朗、基于服務(wù)端 Pod 所在的 Namespace 的 Label 或者服務(wù)端 IP 范圍。

- ports:允許訪問的服務(wù)端的端口號冈闭。
創(chuàng)建兩個名稱空間
[root@master ~]# kubectl create namespace dev 
namespace/dev created
[root@master ~]# kubectl create namespace prod
namespace/prod created

[root@master ~]# cat pods.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: myapp 
    image: ikubernetes/myapp:v1
[root@master ~]# kubectl apply -f pods.yaml -n dev 
[root@master ~]# kubectl get pods -n dev -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          57s   192.168.196.131   node01   <none>           <none>
[root@master ~]# cat ingres-def.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: 
  name: ingres
  namespace: dev
spec:
  podSelector: {}
  policyTypes: 
  - Ingress

測試:


image.png
將pod創(chuàng)建在prod中

[root@master ~]# kubectl apply -f pods.yaml -n prod
pod/pod1 created
[root@master ~]# kubectl get pods -n prod -owide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          14s   192.168.140.69   node02   <none>           
<none>

測試:
[root@master ~]# curl  192.168.140.69 
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


上面的networkpolicy中定義了ingress要生效但是ingress沒有定義規(guī)則就表示默認不允許任何人訪問俱尼,egress沒有定義默認所有的都可以訪問

定義所有訪問
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: 
  name: ingres
  namespace: dev
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes: 
  - Ingress
  
[root@master ~]# kubectl apply  -f ingres-def.yaml 
networkpolicy.networking.k8s.io/ingres configured

測試:
[root@master ~]# curl 192.168.196.131
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

允許別人來放著這組pod
給pod打個標簽
[root@master ~]# kubectl label pods pod1 app=myapp -n dev 
pod/pod1 labeled

vim allow-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy 
metadata: 
  name: allow-ingress
spec:
  podSelector:
    matchLabels:
      app: myapp
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.0.0/16
        except:
        - 192.168.1.12/32
    ports:
    - protocol: TCP
      port: 80

[root@master ~]# kubectl apply -f allow-ingress.yaml -n dev
[root@master ~]# kubectl get netpol -n dev
NAME            POD-SELECTOR   AGE
allow-ingress   app=myapp      65s
ingres          <none>         45m

官方文檔:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萎攒,隨后出現(xiàn)的幾起案子遇八,更是在濱河造成了極大的恐慌,老刑警劉巖耍休,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃永,死亡現(xiàn)場離奇詭異,居然都是意外死亡羊精,警方通過查閱死者的電腦和手機斯够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人读规,你說我怎么就攤上這事抓督。” “怎么了束亏?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵铃在,是天一觀的道長。 經(jīng)常有香客問我碍遍,道長定铜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任怕敬,我火速辦了婚禮揣炕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘东跪。我一直安慰自己畸陡,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布越庇。 她就那樣靜靜地躺著罩锐,像睡著了一般奉狈。 火紅的嫁衣襯著肌膚如雪卤唉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天仁期,我揣著相機與錄音桑驱,去河邊找鬼。 笑死跛蛋,一個胖子當著我的面吹牛熬的,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赊级,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼押框,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了理逊?” 一聲冷哼從身側(cè)響起橡伞,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晋被,沒想到半個月后兑徘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡羡洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年挂脑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡崭闲,死狀恐怖肋联,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刁俭,我是刑警寧澤牺蹄,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站薄翅,受9級特大地震影響沙兰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翘魄,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一鼎天、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暑竟,春花似錦斋射、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腹躁,卻和暖如春桑包,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纺非。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工哑了, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烧颖。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓弱左,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炕淮。 傳聞我的和親對象是個殘疾皇子拆火,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容