Kubernetes概述
一、什麼是K8S(Kubernetes)?
1.k8s全稱kubernetes,這個名字大家應該都不陌生,k8s是爲容器服務而生的一個可移植容器的編排管理工具,越來越多的公司正在擁抱k8s,並且當前k8s已經主導了雲業務流程,推動了微服務架構等熱門技術的普及和落地,正在如火如荼的發展。那麼稱霸容器領域的k8s究竟是有什麼魔力呢?
2.首先,我們從容器技術談起,在容器技術之前,大家開發用虛擬機比較多,比如vmware和openstack,我們可以使用虛擬機在我們的操作系統中模擬出多臺子電腦(Linux),子電腦之間是相互隔離的,但是虛擬機對於開發和運維人員而言,存在啓動慢,佔用空間大,不易遷移的缺點。舉一個我親身經歷過的場景吧,之前在vmware中開發了一個線下平臺,爲了保證每次能夠順利使用,我們就把這個虛擬機導出爲OVF,然後隨身攜帶,用的時候在服務器中部署,這裏就充分體現了虛擬機的缺點。
接着,容器化技術應運而生,它不需要虛擬出整個操作系統,只需要虛擬一個小規模的環境即可,而且啓動速度很快,除了運行其中應用以外,基本不消耗額外的系統資源。Docker是應用最爲廣泛的容器技術,通過打包鏡像,啓動容器來創建一個服務。但是隨着應用越來越複雜,容器的數量也越來越多,由此衍生了管理運維容器的重大問題,而且隨着雲計算的發展,雲端最大的挑戰,容器在漂移。在此業務驅動下,k8s問世,提出了一套全新的基於容器技術的分佈式架構領先方案,在整個容器技術領域的發展是一個重大突破與創新。
那麼,K8S實現了什麼?
從架構設計層面,我們關注的可用性,伸縮性都可以結合k8s得到很好的解決,如果你想使用微服務架構,搭配k8s,真的是完美,再從部署運維層面,服務部署,服務監控,應用擴容和故障處理,k8s都提供了很好的解決方案。
總而言之,k8s可以使我們應用的部署和運維更加方便。
二、kubernetes特性
1.自我修復
在節點故障時可以刪除失效容器,重新創建新的容器,替換和重新部署,保證預期的副本數量,kill掉健康檢查失敗的容器,並且在容器未準備好之前不會處理客戶端情況,確保線上服務不會中斷
2.彈性伸縮
使用命令、UI或者k8s基於cpu使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峯併發時的高可用性,業務低峯時回收資源,以最小成本運行服務
3.自動部署和回滾
k8s採用滾動更新策略更新應用,一次更新一個pod,而不是同時刪除所有pod,如果更新過程中出現問題,將回滾恢復,確保升級不影響業務
4.服務發現和負載均衡
k8s爲多個容器提供一個統一訪問入口(內部IP地址和一個dns名稱)並且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題
5.機密和配置管理
管理機密數據和應用程序配置,而不需要把敏感數據暴露在徑向力,提高敏感數據安全性,並可以將一些常用的配置存儲在k8s中,方便應用程序調用
6.存儲編排
掛載外部存儲系統,無論時來自本地存儲、公有云(aws)、還是網絡存儲(nfs、GFS、ceph),都作爲集羣資源的一部分使用,極大提高存儲使用靈活性
7.批處理
提供一次性任務,定時任務:滿足批量數據處理和分析的場景
三、kubernetes集羣架構與組件
kubernetes集羣架構拓補圖
注:
- API server是所有請求的唯一入口
- api server管理所有的事務,並把信息記錄到etcd數據庫中
- etcd有一個自動服務發現的特性機制,etcd會搭建有三個節點的集羣,實現三副本
- scheduler 調度器用來調度資源,查看業務節點的資源情況,確定在哪個node上創建pod,把指令告知給api server
- 控制管理器controller-manager管理pod
- pod可以分爲有狀態和無狀態的pod,一個pod裏最好只放一個容器
- api server 把任務下發給業務節點的kubelet去執行
- 客戶訪問通過kube-proxy去訪問pod
- pod下面的不一定是docker,還有別的容器
- 一般pod中只包含一個容器,除了一種情況除外,那就是elk
- elk會在pod內多放一個logstash去收集日誌
用戶訪問kubernetes過程示意圖
kubernetes各個組件及功能
1.master組件 - kube-apiserver
kubernetes api,集羣的統一入口,各組件之間的協調者,以restful api提供接口服務,所有對象資源的增刪改查和監聽操作都交給apiserver處理後在提交給etcd存儲記錄 - kube-controller-manager
處理集羣中常規的後臺任務,一種資源對應一個控制器,controller-manager就是負責管理這些控制器的 - kube-scheduler
根據調度算法爲新創建的pod選擇一個node節點,可以任意部署,可以部署在同一個節點上,也可以部署在不同節點上 - etcd
分佈式鍵值存儲系統,用戶保存集羣狀態數據,比如pod、service等對象信息
2.node組件 - kubelet
kubelet時master在node節點上的代理agent,管理本node運行容器的生命週期
比如創建容器、pod掛載數據卷、下載sercet、獲取容器和節點狀態等工作,kubelet將每個pod轉換成一組容器 - kube-proxy
在node節點上實現pod的網絡代理,維護網絡規則和四層的負載均衡工作 - docker或rockert
容器引擎,運行容器
kubernetes核心概念 -
pod
最小部署單元
一組容器的集合
一個pod中的容器共享網絡命名空間
pod是短暫的 -
controllers
replicaset:確保預期的pod副本數量
deployment:無狀態應用部署,比如nginx、apache,一定程度上的增減不會影響客戶體驗
statefulset:有狀態應用部署,是獨一無二型的,會影響到客戶的體驗
daemonset:確保所有node運行同一個pod,確保pod在統一命名空間
job:一次性任務
cronjob:定時任務
更高級層次對象:部署和管理pod -
service
防止pod失聯
定義一組pod的訪問策略確保了每個pod的獨立性和安全性
- storage
volumes
persistent volumes - pollcies策略
resource quotas - other
label:標籤,附加到某個資源上,用戶關聯對象、查詢和篩選
namespaces:命名空間,將對象從邏輯上隔離
annotations:註釋