002-k8s核心概念、Pod、網絡通訊方式、k8s中Node、Pod、container、service、deployment、rs關系及作用


一、概述

1.1、Pod概念

  

1.1.1、自主式

  自己定義管理

1.1.2、控制器管理的Pod

  ReplicationController& ReplicaSet &Deployment

    ReplicationController用來確保容器應用的副本數始終在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收。

    在新版的k8s中建議使用ReplicaSet來代替ReplicationController。

    ReplicaSet跟ReplicationController沒有本質不同,只是名稱不一樣,並且ReplicaSet支持集合式的selector

    雖然ReplicaSet可以獨立使用,但一般還是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update但Deployment支持)

    Deployment 不負責鏡像創建

    HPA(Horizontal Pod Auto Scale):僅適用於Deployment和ReplicaSet,在V1版本中僅支持根據Pod的cpu利用率縮容,在vlalpha版本中,支持根據內存和用戶自定義的metric擴縮容

      

  StatefullSet

    是為了解決有狀態服務的問題(對應Deployments和ReplicaSets是無狀態服務而設計),應用場景:

      穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基於PVC來實現

      穩定的網絡標志,即Pod重新調度后其PodName和HostName不變,基於Headless Service (即沒有ClusterIP的Service)來實現

      有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次進行(從0-N-1,在下一個Pod運行之前所有的Pod必須是Running和Ready狀態),基於init containers來實現

      有序收縮,有序刪除(即從N-1到0)

  DaemonSet

    確保全部或者一些Node上運行一個Pod副本。當有Node加入集群時,也會為他們新增一個Pod。當有Node從集群移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它創建的所有的Pod

    使用DaemonSet的一些用法

      運行集群存儲daemon,例如在每個Node上運行glusterd、ceph

      在每個Node上運行日志收集daemon,如fluentd、logstash

      在每個Node上運行監控daemon,如Prometheus Node Exporter      

  Job,Cronjob

    Job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束

    Cron Job管理基於時間的Job,即:1》在給定時間點只運行一次;2》周期性地在給定時間點運行

1.2、服務發現

  

 

   傳統方式改造成k8s部署

    

1.3、網絡通訊方式

  k8s的網絡模型假定了所有Pod都在一個可以直接連通的扁平的網絡空間中,這在GCE(Google Compute Engine)里面是現成的網絡模型,k8s假定這個網絡已經存在。

  而在私有雲里搭建k8s集群,就不能假定這個網絡已經存在,需要自己實現這個網絡假設,將不同節點上的docker容器之間的戶型訪問先打通,然后運行k8s

  扁平化:所有的Pod都可以直接訪問

1.3.1、同一個Pod內的多個容器之間:localhost

  共用容器pause的network,即同一個Pod共享同一個網絡命名空間,共享一個linux協議棧

    

1.3.2、各個Pod之間的通訊,即Pod1至Pod2:overlay network

  Flannel是CoreOS團隊針對k8s設計的一個網絡規划服務,簡單來說,他的功能是讓集群的不同節點創建的Docker容器都具有全集群唯一的虛擬Ip地址。而且他還能在這些Ip地址之間建立一個覆蓋網絡(Overlay network),通過這個覆蓋網絡,將數據包原封不動地傳遞到目標容器。

1.3.2.1、Flannel方案 整體方案

  

  ETCD與Flannel關系:存儲管理Flannel可分配的IP地址段資源;監控ECTD中每個Pod的實際地址,並在內存中建立維護Pod節點路由表

  1》Pod1與Pod2不在同一台主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個完全不同的ip網段,並且不同Node之間的通訊只能通過宿主機的物理網卡進行。將Pod的ip和所在Node的ip關聯起來,通過這個關聯可以讓Pod互相訪問。

  2》Pod1與Pod2在同一台主機,由docker0網橋直接轉發請求值Pod2,不需要經過Flannel

示例一、Pod1與Pod2不在同一台主機,跨節點通訊 過程

  

 

1.3.3、Pod與Service之間的通訊

  各節點的Iptables規則,新版本加入了LVS 

1.3.4、Pod到外網

  Pod向外網發送請求,查找路由表,轉發數據包到宿主機的網卡,宿主網卡完成路由選擇后,iptables執行masquerade,把源ip更改為宿主網卡的ip,然后轉向外網服務器發送請求

1.3.5、外網訪問Pod

  通過service訪問,NodePort映射

1.4、三層網絡

  

1.5、k8s中Node、Pod、container、service、deployment、rs關系及作用

 

 

Node:kubectl get node:一台物理機或虛擬機,內部可以有多個Pod

Pod:kubectl get pod -o wide:一個或多個容器的集合

rs:kubectl get rs:管理pod的控制器ReplicaSet

deployment:kubectl get deployment:管理rs,ReplicaSet

Service:kubectl get svc:用於管理不同pod里面的、具有相同label標簽的容器(把相同label的歸為一類service)

container:具體容器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM