<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    K8S污點容忍度橫向主節點

    VSole2022-06-13 14:34:48


    污點 節點親和性 容忍度


    污點是K8s高級調度的特性,用于限制哪些Pod可以被調度到某一個節點。在普通節點橫向時我們可以使用污點容忍度創建惡意pod來對主節點進行橫向控制。


    kube-scheduler調度


    kube-schedulerKubernetes集群的默認調度器,并且是集群控制面(master)的一部分。對每一個新創建的Pod或者是未被調度的Pod,kube-scheduler會選擇一個最優的Node去運行這個Pod。

    然而,Pod內的每一個容器對資源都有不同的需求,而且Pod本身也有不同的資源需求。因此,Pod在被調度到Node上之前,根據這些特定的資源調度需求,需要對集群中的Node進行一次過濾。


    如下為在創建pod的流程中,調度器的作用


    當創建pod時候,會首先把創建的命令請求提交給apiserver,通過一系列認證授權,apiserver把pod數據存儲到etcd,創建deployment資源并初始化。

    然后再是scheduler通過進行list-watch機制進行監測,經過調度算法把pod調度到某個node節點上,最后信息更新到etcd,再后面就是kubelet接受信息到創建容器。      



    哪些因素影響調度










    1.pod資源限制


    當前調度器選擇適當的節點時,調度程序會檢查每個節點是否有足夠的資源滿足 Pod 調度,比如查看CPU和內存限制是否滿足:



    通過資源限制調度程序可確保由于過多 Pod 競爭消耗節點所有可用資源,從而導致節點資源耗盡引起其他系統異常。



    2.節點選擇器nodeSelector


    在創建pod的時候,節點選擇器可以約束pod在特定節點上運行。

    nodeSelector也是節點選擇約束的最簡單推薦形式,nodeSelector字段添加到 Pod 的規約中設置希望目標節點所具有的節點標簽。K8s 只會將 Pod 調度到擁有你所指定的每個標簽的節點上。



    例子, 比如多個節點需要調度時候,通過給1,2節點打上標簽,創建pod時候使用節點選擇器,那么pod會被按照節點選擇器希望的目標在相應節點調度。



    為節點打上標簽:

    kubectl label node nodename env_role=env



    查看節點的標簽:

    kubectl get nodes nodename --show-labels



    3.節點親和性nodeAffinity


    節點親和性概念上類似于nodeSelector, 它可以根據節點上的標簽來約束 Pod 可以調度到哪些節點上,這種方法比上面的nodeSelector更加靈活,它可以進行一些簡單的邏輯組合了,不只是簡單的相等匹配。



    節點親和性和節點選擇器相比功能更強大,比如還是剛才的圖,如果我使用節點選擇器env_role:dev1的話是找不到相應的節點的,就沒有辦法調度,會一直是一個等待的狀態:



    但我如果使用節點親和性,就算當前沒有這個節點,我還是可以根據調度調度策略進行調度,不只是簡單的相等匹配。



    調度策略





    調度可以分成軟策略(軟親和性)和硬策略(硬親和性)兩種方式:

    • 軟親和性(preferredDuringSchedulingIgnoredDuringExecution)就是如果你沒有滿足調度要求的節點的話,POD 就會忽略這條規則,繼續完成調度過程,說白了就是滿足條件最好了,沒有的話也無所謂了的策略;

    • 硬親和性(requiredDuringSchedulingIgnoredDuringExecution)表示當前的條件必須滿足,如果沒有滿足條件的節點的話,就不斷重試直到滿足條件為止,簡單說就是你必須滿足我的要求,不然我就不干的策略。

    如圖可以看到軟親和性和硬親和性的字段其實差不多,軟親和性多了一個weight字段,表權重:



    親和性操作符





    如上親和性還有一個字段是operator表匹配的邏輯操作符,可以使用descirbe命令查看具體的調度情況是否滿足我們的要求,K8s提供的操作符有下面的幾種:

    • In:label 的值在某個列表中

    • NotIn:label 的值不在某個列表中

    • Gt:label 的值大于某個值

    • Lt:label 的值小于某個值

    • Exists:某個 label 存在

    • DoesNotExist:某個 label 不存在

    如果nodeSelectorTerms下面有多個選項的話,滿足任何一個條件就可以了;如果matchExpressions有多個選項的話,則必須同時滿足這些條件才能正常調度 POD。



    污點(Taints)與容忍(tolerations)





    容忍度(Toleration)是應用于 Pod 上的,允許(但并不要求)Pod 調度到帶有與之匹配的污點的節點上。污點說白了就是不做普通的調度。

    對于節點親和性無論是軟親和性和硬親和性,都是調度 POD 到預期節點上,而污點(Taints)恰好與之相反,如果一個節點標記為 Taints除非 POD 也被標識為可以容忍污點節點,否則該 Taints 節點不會被調度pod。


    污點(Taints)





    查看污點情況:

    kubectl describe node nodename | grep Taint



    可以看到,默認污點也只有master有。

    污點里的值有三種:

    • NoSchedule:POD 不會被調度到標記為 taints 節點。

    • PreferNoSchedule:NoSchedule 的軟策略版本。

    • NoExecute:該選項意味著一旦 Taint 生效,如該節點內正在運行的 POD 沒有對應 Tolerate 設置,會直接被逐出。

    NoSchedule就是字面意思,不會被調度,PreferNoSchedule說白了是盡量不被調度,NoExecute是不會調度并且還會驅逐node已有的pod

    創建一個pod:



    如果不加污點,可以看到這個pod會隨機調度到節點1或者節點2:



    這時候把pod刪除了,重新創建pod并且給node加上污點:

    給節點打污點:

    kubectl taint node nodename key=value:NoSchedule



    重新創建pod并且deployment多個:



    可以發現全部被調度在節點2上,節點1的污點NoSchedule起了作用。

    刪除污點:



    污點容忍度(tolerations)





    容忍度tolerations是定義在Pod對象上的鍵值型屬性數據,用于配置其可容忍的節點污點,而且調度器僅能將Pod對象調度至其能夠容忍該節點污點的節點之上。

    污點定義在節點的node Spec中,而容忍度則定義在PodpodSpec中,它們都是鍵值型數據。

    Pod對象上定義容忍度時,它支持兩種操作符:一種是等值比較Equal,表示容忍度與污點必須在keyvalueeffect三者之上完全匹配;另一種是存在性判斷Exists,表示二者的keyeffect必須完全匹配,而容忍度中的value字段要使用空值。

    這里的key和value對應的值都是你自己設置的key和value:



    說白了就是:

    • 如果operatorExists(此時容忍度不能指定 value)

    • 如果operatorEqual,則它們的value應該相等

    而污點容忍的作用舉個例子,如果像上面污點一樣設置了NoSchedule污點的節點,那么創建pod的時候是必不被調度到的,但是如果我使用污點容忍,那這個節點可以在設置NoSchedule污點的情況下可能又被調度,類似于親和性那種作用。


    污點橫向滲透










    污點和污點容忍度的作用也就是獲取主節點的shell,因為像常見或者節點shell的流程是創建pod--》分配到正常node---》通過常規掛載目錄拿到節點的shell,而默認主節點是不被調度的,所以只有使用污點容忍度,創建一個能夠被調度到master節點的pod,然后通過掛載之類的手法來拿到主節點的shell。

    通過創建一個具有node-role.kubernetes.io/master:NoSchedule的容忍度讓Pod被Kubernetes Master所調度。



    apiVersion: v1kind: Podmetadata:  name: nginx  labels:    env: testspec:  containers:  - name: nginx    image: nginx    imagePullPolicy: IfNotPresent  tolerations:  - key: "node-role.kubernetes.io/master"    operator: "Exists"    effect: "NoSchedule"
    


    如上的Pod中將宿主機的根目錄掛載到容器中(volumes與volumeMounts)即可逃逸至Kubernetes Master中接管集群。

    查看節點,當前是在普通節點:



    多次創建可以發現在master節點上了:



    可以通過掛載操作master節點母機shell:



    k8spod
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    K8s 的API Server未授權命令執行
    本文將引入一個思路:“在 Kubernetes 集群發生網絡異常時如何排查”。文章將引入 Kubernetes 集群中網絡排查的思路,包含網絡異常模型,常用工具,并且提出一些案例以供學習。其可能原因為Pod 的 DNS 配置不正確DNS 服務異常pod 與 DNS 服務通訊異常大數據包丟包:主要現象為基礎網絡和端口均可以連通,小數據包收發無異常,大數據包丟包。
    攻擊者進入Pod后,通過未授權訪問或漏洞攻擊第三方組件,并利用這些組件的高權限賬戶操縱K8s集群。反入侵對于底層資產的監控趨于復雜的同時,UEBA技術將在業務層發揮更重要的作用。事實上身份認證、鑒權、UEBA以及數據安全是一個整體設計,這一點零信任架構的已經給出了實踐。
    恰巧近期有一枚和容器逃逸相關的漏洞:CVE-2022-0492 Linux內核權限提升漏洞可導致容器意外逃逸。
    最近這log4j熱度很高。好久沒寫文章了,而且目前市面有些文章里面的內容信息已經有些過時缺少最新信息迭代,借此機會我劍指系列基于國內外的關于此漏洞的研究我進行了總結和歸納,并且將我自己目前發現的小眾的技巧方法分享給各位,希望能給各位帶來幫助不會讓各位失望。
    K8s組件和架構
    2022-12-29 16:51:34
    K8s常見組件和架構
    K8s 安全策略最佳實踐
    2022-04-02 16:42:33
    隨著K8s在生產和測試環境中用的越來越多,對安全性的關注也會越來越多~
    云環境網絡流量采集和分析解決方案
    從云的虛擬化管理平臺和云網絡構架的一般性知識入手,以 Clos 云網絡架構和 Kubernetes管理平臺為例,俯瞰了當前云計算環境的全貌和細節,宏觀上總覽了云網絡架構和 Kubernetes 管理平臺,微觀上深入連接 fabrics 和容器的細節。
    隨著數字經濟時代到來,云計算、大數據、物聯網等新興技術在關鍵信息基礎設施領域深度應用,數字技術已經成為企業轉型和發展的關鍵要素,而云是企業數字化轉型的基礎支柱,也是企業的首要技術重點
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类