1. 程式人生 > >Kubernetes(一)--簡介

Kubernetes(一)--簡介

命令行 命令操作 健康狀況 user 教訓 相關 src 均衡 rest

一、什麽是kubernetes(K8s)?

  Kubernetes作為容器編排生態圈中重要一員,是Google大規模容器管理系統borg的開源版本實現,吸收借鑒了google過去十年間在生產環境上所學到的經驗與教訓。 Kubernetes提供應用部署、維護、 擴展機制等功能,利用Kubernetes能方便地管理跨機器運行容器化的應用。當前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平臺,除此之外,也可以直接運行在物理機上.kubernetes是一個開放的容器調度管理平臺,不限定任何一種言語,支持java/C++/go/python等各類應用程序 。


  kubernetes是一個完備的分布式系統支持平臺,支持多層安全防護、準入機制、多租戶應用支撐、透明的服務註冊、服務發現、內建負載均衡、強大的故障發現和自我修復機制、服務滾動升級和在線擴容、可擴展的資源自動調度機制、多粒度的資源配額管理能力,完善的管理工具,包括開發、測試、部署、運維監控,一站式的完備的分布式系統開發和支撐平臺。

 使用Kubernetes可以:

  • 自動化容器的部署和復制
  • 隨時擴展或收縮容器規模
  • 將容器組織成組,並且提供容器間的負載均衡
  • 很容易地升級應用程序容器的新版本
  • 提供容器彈性,如果容器失效就替換它,等等...

 

 Kubernetes解決的問題:

  1. 調度 - 容器應該在哪個機器上運行
  2. 生命周期和健康狀況 - 容器在無錯的條件下運行
  3. 服務發現 - 容器在哪,怎樣與它通信
  4. 監控 - 容器是否運行正常
  5. 認證 - 誰能訪問容器
  6. 容器聚合 - 如何將多個容器合並成一個工程

實際上,使用Kubernetes只需一個部署文件,使用一條命令就可以部署多層容器(前端,後臺等)的完整集群

技術分享圖片

二、kubernetes角色  

  (1)Pod

  Pod是Kubernetes中最小部署單元,所有的容器均在Pod中運行,一個Pod可以承載一個或者多個相關的容器。Pod中容器共享存儲和網絡,同一個Pod中的容器會部署在同一個docker宿主機上並且能夠共享資源。

  (2)Service

  Service是一個應用服務抽象,定義了Pod邏輯集合和訪問這個pod集合的策略(比如訪問策略)。Service代理Pod集合對外表現為一個訪問入口,分配一個機器IP地址,來自這個IP的請求將負載均衡轉發到後端Pod中的容器。Service通過Lable Selector選擇一組Pod提供服務。

  (3)Volume

  數據卷

  • 可以用來共享Pod容器中使用的數據
  • 持久化數據

  (4)Namespace

  是kubernetes系統中的另一個重要的概念,通過將系統內部的對象“分配”到不同的Namespace中,形成邏輯上分組的不同項目、小組或用戶組,便於不同的分組在共享使用整個集群的資源的同時還能被分別管理。Kubernetes集群在啟動後,會創建一個名為“default”的Namespace,如果不特別指明Namespace,則用戶創建的Pod、RC、Service都被系統創建到“default”的Namespace中。

  (5)Label

  Label機制是K8S中一個重要設計,通過Label進行對象弱關聯,靈活地分類和選擇不同服務或業務,讓用戶根據自己特定的組織結構以松耦合方式進行服務部署。Label是一對KV,對用戶而言非常有意義的,但對K8S本身而言沒有直接意義的。Label可以在創建對象時指定,也可以在後期修改,每個對象可以擁有多個標簽,但key值必須是唯一的。

  (6)RC(Replication Controller)

  Replication Controller確保任何時候Kubernetes集群中有指定數量的pod副本(replicas)在運行, 如果少於指定數量的pod副本(replicas),Replication Controller會啟動新的Container,反之會殺死多余的以保證數量不變。Replication Controller使用預先定義的pod模板創建pods,一旦創建成功,pod 模板和創建的pods沒有任何關聯,可以修改pod 模板而不會對已創建pods有任何影響,也可以直接更新通過Replication Controller創建的pods。對於利用pod 模板創建的pods,Replication Controller根據label selector來關聯,通過修改pods的label可以刪除對應的pods。

  (7)Deployment

  Kubernetes Deployment提供了官方的用於更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment對象中只描述您所期望的理想狀態(預期的運行狀態),Deployment控制器為您將現在的實際狀態轉換成您期望的狀態,例如,您想將所有的webapp:v1.0.9升級成webapp:v1.1.0,您只需創建一個Deployment,Kubernetes會按照Deployment自動進行升級。現在,您可以通過Deployment來創建新的資源(pod,rs,rc),替換已經存在的資源等。

  Deployment集成了上線部署、滾動升級、創建副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實現無人值守的上線,大大降低我們的上線過程的復雜溝通、操作風險。

  (8)StatefulSet

  使用Deployment創建的Pod是無狀態的,當掛在Volume之後,如果該Pod掛了,Replication Controller會再run一個來保證可用性,但是由於是無狀態的,Pod掛了的時候與之前的Volume的關系就已經斷開了,新起來的Pod無法找到之前volume。StatefulSet 的目的就是給為數眾多的有狀態負載提供正確的控制器支持。

  當應用有以下任意要求時,StatefulSet的價值就體現出來了。
   ● 穩定的、唯一的網絡標識。
   ● 穩定的、持久化的存儲。
   ● 有序的、優雅的部署和擴展。
   ● 有序的、優雅的刪除和停止。

  (9)DaemonSet

  DaemonSet能夠讓所有(或者一些特定)的Node節點運行同一個pod。當節點加入到kubernetes集群中,pod會被(DaemonSet)調度到該節點上運行,當節點從kubernetes集群中被移除,被(DaemonSet)調度的pod會被移除,如果刪除DaemonSet,所有跟這個DaemonSet相關的pods都會被刪除。

  (10)Job

  在有些場景下,是想要運行一些容器執行某種特定的任務,任務一旦執行完成,容器也就沒有存在的必要了。在這種場景下,創建pod就顯得不那麽合適。於是就是了Job,Job指的就是那些一次性任務。通過Job運行一個容器,當其任務執行完以後,就自動退出,集群也不再重新將其喚醒。還可以執行定時任務。


三、kubernetes組件

  1.kubectl
    客戶端命令行工具,將接受的命令格式化後發送給kube-apiserver,作為整個系統的操作入口。

  2.kube-apiserver
    作為整個系統的控制入口,以REST API服務提供接口。

  3.kube-controller-manager
    用來執行整個系統中的後臺任務,包括節點狀態狀況、Pod個數、Pods和Service的關聯等。

  4.kube-scheduler
    負責節點資源管理,接受來自kube-apiserver創建Pods任務,並分配到某個節點。

  5.etcd
    負責節點間的服務發現和配置共享。

  6.kube-proxy
    運行在每個計算節點上,負責Pod網絡代理。定時從etcd獲取到service信息來做相應的策略。

  7.kubelet
    運行在每個計算節點上,作為agent,接受分配該節點的Pods任務及管理容器,周期性獲取容器狀態,反饋給kube-apiserver。

  8.DNS
    一個可選的DNS服務,用於為每個Service對象創建DNS記錄,這樣所有的Pod就可以通過DNS訪問服務了。

四、工作流程

  技術分享圖片

  1.Kubectl(user commands): k8s APIs客戶端工具,通過用戶輸入命令操作APIs資源

  2.認證,用戶輸入命令要通過APIs的認證

  3.認證通過之後,交由APIs中REST中對象處理(Kubernetes以RESTFul形式開放接口,用戶可操作的REST對象有三個Pod,service,controller)

  4.APIs中的操作處理都會持久化存儲到一個分布式存儲etcd

  5.Scheduler調度組件,會檢測REST對象中是否有新的動作產生,並將具體操作,根據算法下發到node節點中

  6.Controller通過API Server提供的接口實時監控整個集群的每個資源對象的當前狀態,當發生各種故障導致系統狀態發生變化時,會嘗試將系統狀態修復到“期望狀態”

  7.kubeletl類似於一個agent,處理AIPs下發的任務,如創建Pod、容器、獲取節點信息等

  8.proxy負責網絡代理,Service具體實現就是有proxy處理,維護網絡規則和四層負載均衡工作

Kubernetes(一)--簡介