kubernetes互動課程學習之2:Intro to kubernetes

kubernetes互動課程學習之2

標籤:kubernetes 實踐

因爲內容很多前文都學過了一遍,而且概念性的東西都比較簡單,就不贅述了。

2.1 Kubernetes簡介

k8s特性

這是從整體的角度來分析k8s的優點,或者說,特性。

Kubernetes是在容器層進行操作而不是硬件層。因此只要能夠在容器上部署的應用,就可以在Kubernetes上部署。

Kubernetes提供了很多PaaS都有的特性,如部署、彈性伸縮、負載均衡、日誌和監控,但這些並不是統一的,而是可選的插件。

  • automatic binpacking:自動將容器根據資源消耗和其他限制條件,在不犧牲可用性的前提下部署到節點上。儘可能提高資源的使用率。
  • self-healing:在容器失敗的時候重啓、重新調度。
  • horizontal scaling:水平拉伸。拉伸分爲垂直和水平兩種,垂直指的是分配給實例的資源增加,水平指的是分配更多的實例。
  • service discovery and load balancing:服務發現和負載均衡。如前文提到的,k8s中的服務發現主要是service進行的,而負載均衡是由kube-proxy完成的。
  • automated rollouts and rollbacks:k8s會漸進地roll out來更新應用,如果發生錯誤,會roll back,以避免服務掉線。
  • secret and configuration management。可以部署和升級Secret對象來應對服務器中需要加密的數據,而不需要重構鏡像,或者說在配置文件中暴露。
  • storage orchestration:自動掛載存儲系統,支持公有云服務商的文件存儲系統,或者網絡存儲系統。
  • batch execution:除了服務以外,k8s還可以管理批處理腳本和持續集成(CI,continuous integration)的負載壓力,替換失敗的容器。

k8s做不到什麼

  • 自動部署源代碼和編譯,CI/CD需要用戶自行完成。
  • 不支持應用級的服務,比如中間件、數據處理框架、數據庫等,需要用戶自己封裝完成。
  • 不提供日誌、監控或者警告模塊的解決方案,雖然有很多的第三方插件。
  • 不提供configuration language,提供了聲明式的API。

2.2 Kubernetes Architecture

Kubernetes的組件

K8s可以分爲3部分:Master組件、Node組件、Addons

Master組件提供了cluster的控制平面,進行關於cluster的全局決策(比如調度),檢測cluster的活動並作出迴應。Master組件可以在cluster的任意機器上運行,但爲了簡便處理,一般只在一臺機器上運行,並且不再這臺機器上分配容器,管這臺機器叫做Master節點(雖然實際上也可以讓它分配Pod)

Master組件包括:

  • kube-apiserver:暴露k8s的API,控制平面的前端。
  • etcd:key-value型的存儲器,使用raft一致性算法,存放着所有cluster中的數據。(記得備份)
  • kube-scheduler:負責調度Pod到節點上,調度操作的執行者。具體可以見這篇文章
  • kube-controller-manager:負責運行controller的組件。Controller會從api server監聽容器的當前狀態,並試圖將它變爲用戶的期望狀態。原則上,每個controller是分離的進程,但爲了減少複雜性,它們被編譯進了一個二進制文件中,並在一個進程上運行。Controller包括Node controller(負責提示和報告Node下線)、Replication Controller(副本管理器,負責維護Pod的副本數量)、Endpoints Controller(產生Endpoint對象,連接Service和Pod)、Service Account & Token Controller(爲新的命名空間創建賬戶和API訪問令牌)
  • cloud-controller-manager:負責運行和雲服務商相關的controller,通過調用它們提供的API來完成行爲。

Node組件在每一個節點上運行,維護Pod的運行和k8s的運行時環境。Node可以是虛擬機或是物理機。

  • kubelet:在cluster上每個節點都運行着的客戶端,負責維護Pod中容器的運行。kubelet拿到一個PodSpecs的集合,確保這個集合中的容器健康運行。
  • kube-proxy:kube-proxy具體實現service的功能,詳見前文,通過維護轉發表來實現,iptables在大流量下表現不好。
  • container runtime:容器運行時,負責運行容器的軟件,目前支持:docker,rkt,runc和所有符合OCI接口的實現。

Addons是實現其他非必須cluster特性的pod和service,例如DNS服務、互聯網看板、資源監控和日誌框架等等。

2.3 interacting with kubernetes

一般來說,用戶通過使用k8s的API對象來描述他所希望的集羣狀態。

k8s通過使用k8s object來完成系統狀態的抽象。一個k8s對象是目的的記錄,一旦你創建了一個對象,k8s系統會盡量去維護它。通過創建這個對象,你告訴k8s集羣你所希望的cluster狀態。

教程中使用了RESTful API來與api server進行交互,但是我幾次嘗試都失敗了,不知道原因。

實際上,官方提供的kubectl就是通過RESTful API和api server進行交互的,就像docker也是通過RESTful API和docker守護進程進行交互一樣。

  • kubectl apply,通過-f參數可以執行指定配置文件來配置資源,支持JSON和yaml.
  • kubectl get,通過kubectl get resources name拿到資源列表,瞭解資源的狀態
  • kubectl describe,通過kubectl describe name拿到詳細信息。
  • kubectl cluster-info,查看集羣信息

get和describe支持的參數基本一致,包括:

  • -n,–namespace,指定命名空間。
  • resource type/name,通過下劃線加名字可以指定特定名字的資源
  • -l參數,指明label,後跟一串key、value作爲篩選。

2.4 kubectl command

kubectl官方文檔

kubectl操作簡介

通用命令格式:kubectl [command] [TYPE] [NAME] [flags]

  • command指想要進行的狀態,如get、describe、delete、create等。
  • type和name指定了操作的目標對象。其中type爲資源類型,比如pod、service等,name爲實例的名字屬性。type是大小寫不敏感的,而且容錯率較高。支持的type類型。如果忽略name的話,會顯示type的所有實例。
  • 如果想要同時顯示多個對象,可以使用TYPE1 name1 name2 name<N>,即在後面羅列姓名。如果類型不一樣,可以使用斜槓,如TYPE1/name1 TYPE1/name2 TYPE<#>/name<#>

2.5 YAML file structure

參考:kubectl API reference doc

  • apiVersion:Kubernetes會使用多個版本的API,但一般都使用v1,如果不確定可以看這裏
  • kind:指定創建的對象類型
  • metadata:包含了可以唯一識別一個對象的數據,比如名字和命名空間。比較重要的屬性還有labels,一般用來幫助給對象歸類。
  • spec:對每個kind的對象來說這裏都不一樣,指定了創建的細節,

可以將多個對象放入同一個yaml文件中,每個對象之間換行,使用---進行分隔。

2.6 kubernetes self-healing mechanisms

複習一下Deployment的定義:爲Pods和ReplicaSets提供聲明式升級服務的controller。

ReplicationController負責根據Deployment的定義維護Pod的副本數,在副本數量不對的時候進行調整,同時提供滾動升級服務以及回滾。

比較重要的概念:系統間的連接是並行進行的,label是唯一確定連接的重要機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章