kubernetes(k8s)理論
時間 2020-12-21
標籤
docker
kubernetes
運維
容器雲
kubernetes(k8s)理論
前言
- kubernetes,簡稱K8s,是用8代替8個字符「ubernete」而成的縮寫。是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。
- 傳統的應用部署方式是通過插件或腳本來安裝應用。這樣做的缺點是應用的運行、配置、管理、所有生存週期將與當前操作系統綁定,這樣做並不利於應用的升級更新/回滾等操作,當然也可以通過創建虛擬機的方式來實現某些功能,但是虛擬機非常重,並不利於可移植性。
- 新的方式是通過部署容器方式實現,每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。相對於虛擬機,容器能快速部署,由於容器與底層設施、機器文件系統解耦的,所以它能在不同雲、不同版本操作系統間進行遷移。
- 容器佔用資源少、部署快,每個應用可以被打包成一個容器鏡像,每個應用與容器間成一對一關係也使容器有更大優勢,使用容器可以在build或release 的階段,爲應用創建容器鏡像,因爲每個應用不需要與其餘的應用堆棧組合,也不依賴於生產環境基礎結構,這使得從研發到測試、生產能提供一致環境。類似地,容器比虛擬機輕量、更「透明」,這更便於監控和管理。
1.kubernetes概述
- Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
- 在Kubernetes中,我們可以創建多個容器,每個容器裏面運行一個應用實例,然後通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。
2.kubernetes特點
- 可移植: 支持公有云,私有云,混合雲,多重雲(multi-cloud)
- 可擴展: 模塊化,插件化,可掛載,可組合
- 自動化: 自動部署,自動重啓,自動複製,自動伸縮/擴展
3.kubernetes組件
- 1.Master組件
- kube-apierver
- kube-apiserver用於暴露Kubernetes API。任何的資源請求/調用操作都是通過kube-apiserver提供的接口進行。請參閱構建高可用羣集。
- ETCD
- etcd是Kubernetes提供默認的存儲系統,保存所有集羣數據,使用時需要爲etcd數據提供備份計劃。
- kube-controller-manager
- kube-controller-manager運行管理控制器,它們是集羣中處理常規任務的後臺線程。邏輯上,每個控制器是一個單獨的進程,但爲了降低複雜性,它們都被編譯成單個二進制文件,並在單個進程中運行。
- 節點(Node)控制器。
- 副本(Replication)控制器:負責維護系統中每個副本中的pod。
- 端點(Endpoints)控制器:填充Endpoints對象(即連接Services&Pods)。
- Service Account和Token控制器:爲新的Namespace創建默認帳戶訪問API Token。
- cloud-controller-manager
- 雲控制器管理器負責與底層雲提供商的平臺交互。雲控制器管理器是Kubernetes版本1.6中引入的,還是Alpha的功能。
- 雲控制器管理器僅運行雲提供商特定的(controller loops)控制器循環。可以通過將–cloud-providerflag設置爲external啓動kube-controller-manager ,來禁用控制器循環。
- 節點(Node)控制器
- 路由(Route)控制器
- Service控制器
- 卷(Volume)控制器
- kube-scheduler
- kube-scheduler監視新創建沒有分配到Node的Pod,爲Pod選擇一個Node。
- 插件addons
- 插件(addon)是實現集羣pod和Services功能的。Pod由Deployments,ReplicationController等進行管理。Namespace 插件對象是在kube-system Namespace中創建。
- DNS
- 雖然不嚴格要求使用插件,但Kubernetes集羣都應該具有集羣 DNS。
- 羣集 DNS是一個DNS服務器,能夠爲 Kubernetes services提供 DNS記錄。
- 由Kubernetes啓動的容器自動將這個DNS服務器包含在他們的DNS searches中。
- 用戶界面
- 容器資源監測
- Cluster-level Logging
- Cluster-level logging,負責保存容器日誌,搜索/查看日誌。
- 2.節點(Node)組件
- 節點組件運行在Node,提供Kubernetes運行時環境,以及維護Pod。
- kubelet
- kubelet是主要的節點代理,它會監視已分配給節點的pod,具體功能:
- 安裝Pod所需的volume。
- 下載Pod的Secrets。
- Pod中運行的 docker(或experimentally,rkt)容器。
- 定期執行容器健康檢查。
- Reports the status of the pod back to the rest of the system, by creating amirror podif necessary
- Reports the status of the node back to the rest of the system.
- kube-proxy
- kube-proxy通過在主機上維護網絡規則並執行連接轉發來實現Kubernetes服務抽象。
- docker
- RKT
- supervisord
- supervisord是一個輕量級的監控系統,用於保障kubelet和docker運行。
- fluentd
- fluentd是一個守護進程,可提供cluster-level logging.。
4.kubernetes的特性
- 自我修復
- 在節點故障時重新啓動失敗的容器,替換和重新部署,保證預期的副本數量;殺死健康檢查失敗的容器,並且在未準備好之前不會處理客戶端請求,確保線上服務不中斷。
- 彈性伸縮
- 使用命令、U|或者基於CPU使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峯併發時的高可用性;業務低峯時回收資源,以最小成本運行服務。
- 自動部署和回滾
- K8S採用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不受影響業務。
- 服務發現和負載均衡
- K8S爲多個容器提供一一個統一-訪問入口(內部IP地址和-一個DNS名稱),並且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題。
- 機密和配置管理
- 管理機密數據和應用程序配置,而不需要把敏感數據暴露在鏡像裏,提高敏感數據安全性。並可以將一些常用的配置存儲在K8S中,方便應用程序使用。
- 存儲編排
- 掛載外部存儲系統,無論是來自本地存儲,公有云( 如AWS),還是網絡存儲( 如NFS、GlusterFS、 Ceph) 都作爲集羣資源的一部 分使用,極大提高存儲使用靈活性。
- 批處理
- 提供一次性任務,定時任務;滿足批量數據處理和分析的場景。
5.kubernetes集羣架構與組件
6.kubernetes工作流程
7.kubernetes的核心概念
- pod
- 最小部署單元
- 一組容器的集合
- 一個pod中的容器共享網絡命名空間
- pod是短暫的
- controllers
- replicaset:確保預期的pod副本數量
- deployment:無狀態應用部署
- statefulset:有狀態應用部署
- daemonset:確保所有node運行同一個pod
- job:一次性任務
- cronjob:定時任務
- 更高級層次對象,部署和管理pod
- service
- label:標籤,附加到某個資源上,用於關聯對象、查詢和篩選
- namespaces:命名空間,將對象邏輯上隔離
- annotations:註釋
8.kubernetes的部署方式
- minikube
- minikube是一個工具,可以在本地快速運行一個單點的kubernetes,僅用於嘗試kubernetes或日常開發的用戶使用。
- kubeadm
- kubeadm也是一個工具,提供kubeadm init和kuneadm join,用於快速部署kubernetes。
- 二進制包
- 推薦,從官方下載發行版的二進制包,手動部署每個組件,組成kubernetes集羣。
9.kubernetes環境規劃