0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

k8s與pod之間是如何進(jìn)行網(wǎng)絡(luò)隔離的?

阿銘linux ? 來(lái)源:阿銘linux ? 2023-05-11 09:35 ? 次閱讀

0c1332b2-ef9a-11ed-90ce-dac502259ad0.png

NetworkPolicy用來(lái)控制Pod與Pod之間的網(wǎng)絡(luò)通信,它也支持針對(duì)Namespace進(jìn)行限制。基于白名單模式,符合規(guī)則的對(duì)象通過(guò),不符合的拒絕。 應(yīng)用場(chǎng)景舉例:

Pod A不能訪問(wèn)Pod B;

開(kāi)發(fā)環(huán)境所有Pod不能訪問(wèn)測(cè)試命名空間;

提供對(duì)外訪問(wèn)時(shí),限制外部IP;

官方NetworkPolicy YAML示例:

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
說(shuō)明:必需字段:apiVersion、 kind 和 metadata 字段。

podSelector:定義目標(biāo)Pod的匹配標(biāo)簽,即哪些Pod會(huì)生效此策略;

policyTypes:表示給定的策略是應(yīng)用于目標(biāo)Pod的入站流量(Ingress)還是出站流量(Egress),或兩者兼有。如果NetworkPolicy未指定policyTypes則默認(rèn)情況下始終設(shè)置Ingress。

ingress:定義入流量限制規(guī)則,from用來(lái)定義白名單對(duì)象,比如網(wǎng)段、命名空間、Pod標(biāo)簽,Ports定義目標(biāo)端口。

egress:定義出流量限制規(guī)則,定義可以訪問(wèn)哪些IP和端口

案例一: 需求:aming命名空間下所有Pod可以互相訪問(wèn),也可以訪問(wèn)其他命名空間Pod,但其他命名空間不能訪問(wèn)aming命名空間Pod。 首先創(chuàng)建幾個(gè)Pod:

kubectl run busybox --image=busybox -- sleep 3600  ## default命名空間里創(chuàng)建busybox Pod
kubectl run busybox --image=busybox -n aming -- sleep 3600    ## aming命名空間里創(chuàng)建busybox Pod
kubectl run web --image=nginx:1.23.2 -n aming  ## aming命名空間里創(chuàng)建web pod
在沒(méi)有創(chuàng)建NetworkPolicy的情況下測(cè)試
kubectl exec busybox -n aming -- ping 10.18.235.161  ##aming命名空間的busybox ping default命名空間的busybox IP 
kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空間的busybox ping aming命名空間的web IP
kubectl exec busybox -- ping 10.18.235.162 ##default命名空間的busybox ping aming命名空間的web IP
創(chuàng)建networkpolicy的YAML
vi  deny-all-namespaces.yaml  ##內(nèi)容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-namespaces
  namespace: aming
spec:
  podSelector: {} # 為空,表示匹配本命名空間所有Pod
  policyTypes:
  - Ingress
  ingress:
    - from:
      - podSelector: {} # 為空,表示匹配該命名空間所有Pod,即允許該命名空間所有Pod訪問(wèn),沒(méi)有定義namespaceSelector,也就是說(shuō)不允許其它namespace的Pod訪問(wèn)。
應(yīng)用YAML
kubectl apply -f deny-all-namespaces.yaml
測(cè)試:
kubectl exec busybox -n aming -- ping 10.18.235.161  ##aming命名空間的busybox ping default命名空間的busybox IP
kubectl exec busybox -n aming -- ping 10.18.235.162 ##aming命名空間的busybox ping aming命名空間的web IP
kubectl exec busybox -- ping 10.18.235.162 ##default命名空間的busybox ping aming命名空間的web IP
將剛剛創(chuàng)建的所有資源刪除:
kubectl delete po busybox  --force
kubectl delete po busybox -n aming --force
kubectl delete po web -n aming
kubectl delete -f deny-all-namespaces.yaml
案例二: 通過(guò)PodSelector限制
vipod-selector.yaml##內(nèi)容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
  namespace: aming
spec:
  podSelector:
    matchLabels:
      app: test
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: dev
      ports:
        - protocol: TCP
          port: 80
應(yīng)用YAML
kubectl apply -f pod-selector.yaml
創(chuàng)建測(cè)試pod
kubectl run web01 --image=nginx:1.23.2 -n aming -l 'app=test'  #創(chuàng)建Pod時(shí),指定label
kubectl get pod web01 -n aming --show-labels # 查看label
# 如果label創(chuàng)建錯(cuò)了,也可以修改,在本實(shí)驗(yàn)中不需要做如下操作
# kubectl label pod busybox app=test123 --overwrite 
kubectl run app01 --image=nginx:1.23.2 -n aming -l 'app=dev' 
kubectl run app02 --image=nginx:1.23.2 -n aming
查看web01的IP
kubectl describe po web01 -n aming |grep -i ip
測(cè)試
kubectl exec -n aming app01 -- curl 10.18.235.170
kubectl exec -n aming app02 -- curl 10.18.235.170
測(cè)試成功后,刪除掉剛剛創(chuàng)建的資源
kubectl delete po app01 -n aming
kubectl delete po app02 -n aming
kubectl delete po web01 -n aming
kubectl delete -f pod-selector.yaml
案例三: 限制namespace
viallow-ns.yaml#內(nèi)容如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ns
  namespace: aming
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: test
      ports:
        - protocol: TCP
          port: 80
應(yīng)用YAML
kubectl apply -f allow-ns.yaml
創(chuàng)建測(cè)試ns
kubectl create ns test
創(chuàng)建測(cè)試pod
kubectl run web01 --image=nginx:1.23.2 -n aming
kubectl run web02 --image=nginx:1.23.2 -n test
kubectl run web03 --image=nginx:1.23.2 
kubectl run web04 --image=nginx:1.23.2 -n aming
查看web01的IP
kubectl describe po web01 -n aming |grep -i ip
查看ns label
kubectl get ns --show-labels
給ns設(shè)置標(biāo)簽
kubectl label namespace test name=test
測(cè)試:
kubectl -n test exec web02 -- curl 10.18.235.172  #可以訪問(wèn)
kubectl exec web03 -- curl 10.18.235.172 #不可以訪問(wèn)
kubectl -n aming exec web04 -- curl 10.18.235.172  #不可以訪問(wèn),即使同一個(gè)命名空間也無(wú)法訪問(wèn)

以上為NetworkPolicy的主要內(nèi)容,你看明白了嗎?






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • YAML
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    2306
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4184

原文標(biāo)題:來(lái)看看k8s里pod之間是如何進(jìn)行網(wǎng)絡(luò)隔離的

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    等能力,同時(shí)提供了網(wǎng)絡(luò)、文件系統(tǒng)的抽象與管理,所以對(duì)于已有應(yīng)用上k8s或者基于k8s部署應(yīng)用十分便捷。但這里有一部分令開(kāi)發(fā)和運(yùn)維人員比較頭疼--日志采集。難點(diǎn)分析基于VM或者物理機(jī)部署的應(yīng)用,日志采集
    發(fā)表于 02-28 12:49

    K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解

    ,不同的地方在于 terway 支持 Pod 彈性網(wǎng)卡,以及 NetworkPolicy 功能。本文中,作者基于當(dāng)前的 1.12.6 版本,以 flannel 為例,深入分析阿里云 K8S 集群網(wǎng)絡(luò)的實(shí)現(xiàn)方法
    發(fā)表于 10-14 15:06

    從零開(kāi)始入門 K8s | 應(yīng)用存儲(chǔ)和持久化數(shù)據(jù)卷:核心知識(shí)

    的常見(jiàn)類型:本地存儲(chǔ),常用的有 emptydir/hostpath;網(wǎng)絡(luò)存儲(chǔ):網(wǎng)絡(luò)存儲(chǔ)當(dāng)前的實(shí)現(xiàn)方式有兩種,一種是 in-tree,它的實(shí)現(xiàn)代碼是放在 K8s 代碼倉(cāng)庫(kù)中的,隨著 K8s
    發(fā)表于 10-15 14:55

    從零開(kāi)始入門 K8s | 應(yīng)用存儲(chǔ)和持久化數(shù)據(jù)卷:核心知識(shí)

    首先看一下 Pod Volumes 的常見(jiàn)類型:本地存儲(chǔ),常用的有 emptydir/hostpath;網(wǎng)絡(luò)存儲(chǔ):網(wǎng)絡(luò)存儲(chǔ)當(dāng)前的實(shí)現(xiàn)方式有兩種,一種是 in-tree,它的實(shí)現(xiàn)代碼是放在 K8
    發(fā)表于 10-16 10:10

    k8s volume中的本地存儲(chǔ)和網(wǎng)絡(luò)存儲(chǔ)

    八 、 k8s volume 本地存儲(chǔ)和網(wǎng)絡(luò)存儲(chǔ)
    發(fā)表于 03-25 08:44

    OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。一是K8S部署在OpenStack平臺(tái)之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.7w次閱讀

    關(guān)于K8s最詳細(xì)的解析

    一個(gè)目標(biāo):容器操作;兩地三中心;四層服務(wù)發(fā)現(xiàn);五種Pod共享資源;六個(gè)CNI常用插件;七層負(fù)載均衡;八種隔離維度;九個(gè)網(wǎng)絡(luò)模型原則;十類IP地址;百級(jí)產(chǎn)品線;千級(jí)物理機(jī);萬(wàn)級(jí)容器;相如無(wú)億,K
    的頭像 發(fā)表于 04-08 13:55 ?7093次閱讀
    關(guān)于<b class='flag-5'>K8s</b>最詳細(xì)的解析

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3338次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱k8sks
    的頭像 發(fā)表于 06-24 15:48 ?3260次閱讀

    K8S集群服務(wù)訪問(wèn)失敗怎么辦 K8S故障處理集錦

    問(wèn)題1:K8S集群服務(wù)訪問(wèn)失?。?? ? 原因分析:證書(shū)不能被識(shí)別,其原因?yàn)椋鹤远x證書(shū),過(guò)期等。 解決方法:更新證書(shū)即可。 問(wèn)題2:K8S集群服務(wù)訪問(wèn)失??? curl: (7) Failed
    的頭像 發(fā)表于 09-01 11:11 ?1.5w次閱讀
    <b class='flag-5'>K8S</b>集群服務(wù)訪問(wèn)失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    K8S(kubernetes)學(xué)習(xí)指南

    K8S(kubernetes)學(xué)習(xí)指南
    發(fā)表于 06-29 14:14 ?0次下載

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    ),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。 在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。 kubernetes(
    發(fā)表于 07-19 13:14 ?1006次閱讀

    k8s生態(tài)鏈包含哪些技術(shù)

    去監(jiān)聽(tīng) K8s 中的 Ingress 資源,并對(duì)這些資源進(jìn)行相應(yīng)規(guī)則的解析和實(shí)際承載流量。在當(dāng)下趨勢(shì)中,像 Kubernetes Ingress Nginx 就是使用最廣泛的 Ingress
    的頭像 發(fā)表于 08-07 10:56 ?1028次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術(shù)

    K8S落地實(shí)踐經(jīng)驗(yàn)分享

    k8s 即 Kubernetes,是一個(gè)開(kāi)源的容器編排引擎,用來(lái)對(duì)容器化應(yīng)用進(jìn)行自動(dòng)化部署、 擴(kuò)縮和管理。
    的頭像 發(fā)表于 01-02 11:45 ?897次閱讀
    <b class='flag-5'>K8S</b>落地實(shí)踐經(jīng)驗(yàn)分享

    常用的k8s容器網(wǎng)絡(luò)模式有哪些?

    常用的k8s容器網(wǎng)絡(luò)模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器網(wǎng)絡(luò)
    的頭像 發(fā)表于 09-19 11:29 ?60次閱讀