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 [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
- apiVersion:Kubernetes會使用多個版本的API,但一般都使用v1,如果不確定可以看這裏
- kind:指定創建的對象類型
- metadata:包含了可以唯一識別一個對象的數據,比如名字和命名空間。比較重要的屬性還有labels,一般用來幫助給對象歸類。
- spec:對每個kind的對象來說這裏都不一樣,指定了創建的細節,
可以將多個對象放入同一個yaml文件中,每個對象之間換行,使用---
進行分隔。
2.6 kubernetes self-healing mechanisms
複習一下Deployment的定義:爲Pods和ReplicaSets提供聲明式升級服務的controller。
ReplicationController負責根據Deployment的定義維護Pod的副本數,在副本數量不對的時候進行調整,同時提供滾動升級服務以及回滾。
比較重要的概念:系統間的連接是並行進行的,label是唯一確定連接的重要機制。