Kubernetes(K8S)概述


 一、K8S概述

1、K8S的作用

2、K8S的由來

3、K8S的含義

4、為什么要用K8S

5、K8S解決了裸跑docker的若干痛點

6、K8S的特性

二、kubernetes集群架構

1、K8S節點

2、K8S核心組件

3、 K8S的工作流程

4、Service作用於哪些Pod是通過標簽選擇器來定義的

5、客戶端具體訪問流程

三、k8s核心概念

1、Pod

2、Pod控制器

3、Label

4、Label選擇器(Label selector)

5、Service

6、Ingress

7、Name

8、Namespace

一、K8S概述

1、K8S的作用

(1)K8S的全稱為Kubernetes。

(2)用於自動部署、不熟和管理“容器化(containerized)應用程序”的開源系統,可以理解成K8S是負責自動化運維管理多個容器化程序(比如Docker)的集群,是一個生態極其豐富的容器編排框架工具

2、K8S的由來

K8S由google的Brog系統(博格系統,google內部使用的大規模容器編排工具)作為原型,后經GO語言沿用Brog的思路重寫並捐獻給CNCF基金會開源

3、K8S的含義

詞根源於希臘語的舵手、飛行員
官網(官方文檔):
https://kubernetes.io
GitHub(軟件包):
https://github.com/kubernetes/kubernetes

4、為什么要用K8S

試想下傳統的后端部署辦法:把程序包(包括可執行二進制文件、配置文件等)放到服務器上,接着運行啟動腳本把程序跑起來,同時啟動守護腳本定期檢查程序運行狀態,必要的話重新拉起程序。

設想一下,如果服務的請求量上來,已部署的服務響應不過來怎么辦?傳統的做法往往是,如果請求量、內存、CPU超過閾值做了告警,運維人員馬上再加幾台服務器,部署好服務之后,接入負載均衡來分擔已有服務的壓力

這樣問題就出現了:從監控告警到不舒服無,中間需要人力介入。name,有沒有辦法自動完成服務的部署、更新、卸載和擴容和縮容呢

而這就是K8S要做的事情:自動化運維管理容器化(docker)程序

K8S的目標就是讓部署容器化應用簡單高效

5、K8S解決了裸跑docker的若干痛點

(1)單機使用,無法有效集群

(2)隨着容器數量的上升,管理成本攀升

(3)沒有有效的容災、自愈機制

(4)沒有預設編排模板,無法實現快速、大規模容器調度

(5)沒有統一的配置管理中心工具

(6)沒有容器生命周期的管理工具

(7)沒有圖形化運維管理工具

6、K8S的特性

K8S提供了容器編排、資源調度、彈性伸縮、部署管理、服務發現等一系列功能

(1)彈性伸縮

使用命令、UI或者基於CPU使用情況自動快速擴容或縮容應用程序,保證應用業務高峰並發時的高可用性:業務低峰時回收資源,以最小成本運行服務

(2)自我修復

在節點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數量,殺死健康檢查失敗的容器,並且在未准備好之前不會處理客戶端請求,確保線上服務不中斷

(3)服務發現和負載均衡

K8S為多個容器提供一個統一訪問入口(內部IP地址和一個DNS名稱),並且負載均衡關聯的所有容器,使得用戶無需考慮容器IP問題

(4)自動發布(默認滾動發布模式)和回滾

K8S采用回滾更新策略更新應用,一次更新一個pod,而不是同時刪除所有pod,如果更新過程中出現問題,將回滾更改,確保升級不影響業務

(5)集中化配置管理和密鑰管理

管理機密數據和應用程序配置,而不需要把敏感數據寶路在鏡像里,提高敏感數據安全性。並可以將一些常用的配置存儲在K8S中,方便應用程序使用

(6)存儲編排,支持外掛存儲並對外掛存儲資源進行編排

掛載外部存儲系統,無論是來自本地存儲,公有雲(如AWS),還是網絡存儲(如NFS、Glusterfs、Ceph)都作為集群資源的一部分使用,極大提高存儲使用靈活性

(7)任務批處理運行

提供一次性任務,定時任務,滿足批量數據處理和分析的場景

二、kubernetes集群架構

1、K8S節點

K8S是屬於主從設備模型(master-slave架構),即有master節點負責集群的調度、管理和運維,slave節點是集群中的運算工作負載節點

在k8s中,主節點一般稱為master節點,而從節點則被稱為worker node節點,每個node都會被master分配一些工作負載

master組件可以在群集中的任何計算機上運行,但建議master節點占據一個獨立的服務器,因為master是整個集群的大腦,如果master所在節點宕機或不可用,那么所有的控制命令都將失效。除了master,在K8S急群眾的其他機器被稱為worker node節點,當某個node宕機時,其上的工作負載會被master自動轉移到其他節點上去。

2、K8S核心組件

(1)Master節點組件

kubi-apiserver:所有服務訪問的統一入口
controller-manager:維持集群處於預期的工作狀態(副本期望數目),管理資源控制器的控制器,負責在節點出現故障時進行通知和響應,負責對節點的pod狀態進行監控

這些控制器主要包括  :

      • Node controller(節點控制器):負責在節點出現故障時發現和響應

      • Replication Controller (副本控制器) :負責保證集群中一個RC (資源對 象Replication Controller) 所關聯的Pod,可以理解端點          是 一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道它的endpoint

     • Service Account & Token Controllers ( 服務帳戶和令牌控制器) :為新的命名空間創建默認帳戶和API訪問令牌
     • ResourceQuota Controller(資源配額控制器):確保指定的資源對象在任何時候都不會超量占用系統物理資源
     • Namespace Controller ( 命名空間控制器) :管理namespace的生命周期 
     • Service Controller (服務控制器) :屬於K8S集群與外部的雲平台之間的一個接口控制器


scheduler(死該就了):選擇合適的node節點調度pod
etcd(配置存儲中心):K8S的存儲服務。是分布式鍵值存儲系統

(2)Worker Node節點組件

Kubelet:監視node節點上的資源和服務狀態並匯報給APIServer,跟容器引擎交互實現容器的生命周期管理
kube-proxy:實現負載均衡,是service資源的載體,負責寫入規則值iptables、ipvs實現服務映射訪問的容器引擎:docker,docker用來創建、管理容器
docker或rocket:容器引擎,運行容器,負責本機的容器創建和管理工作

3、 K8S的工作流程

用戶通過客戶端發送請求給APIserver,APIserver會先將用戶的請求信息寫入到etcd存儲當中,然后API Server會讓Controller-manager去創建對應的pod。Controller-manager會通過APIServer去讀取etcd當中的用戶的請求信息按照模板創建pod,通過APIserver找Scheduler去調度pod,Scheduler通過預算策略和優選策略篩選出適合的Node節點,然后再把pod調度到篩選出的Node節點上,然后通知APIserver去找到對應Node節點上的kubelet,由kubelet創建pod,同時kubelet會監控node節點上的資源信息
包括pod狀態並存儲到etcd中,如果需要將pod發布出去,通過kube-proxy創建轉發規則,承載service把服務發布出去,供用戶訪問

4、Service作用於哪些Pod是通過標簽選擇器來定義的

在K8S集群中,Service可以看作一組提供相同服務的Pod的對外訪問接口。客戶端需要訪問的服務就是Service對象。每個Service都有一個固定的虛擬ip (這個ip也被稱為Cluster IP) ,自動並且動態地綁定后端的Pod, 所有的網絡請求直接訪問Service的虛擬ip,Service會自動向后端做轉發。通俗來說就是Service通過標簽選擇器選擇那些關聯了對應label的Pod,把Pod的IP加入到自己的endpoints當中,當service收到請求后根據endpoints里的ip進行轉發

5、客戶端具體訪問流程

客戶端使用http/https通過url路徑訪問K8S集群里的Ingress接入層對外暴露的接口,Ingress層收到請求后找到對應是Service,Service根據標簽選擇器篩選查詢label對應的Pod,根據Pod的IP進行轉發獲取相應服務

三、k8s核心概念

Kubernetes包含多種類型的資源對象: Pod、 Label、 Service、 Replication Controller等
所有的資源對象都可以通過Kubernetes提供的kubectl工具進行增、刪、改、查等操作,並將其保存在etcd中持久化存儲
Kubernets其實是一個高度自動化的資源控制系統,通過跟蹤對比etcd存儲里保存的資源期望狀態與當前環境中的實際資源狀態的差異,來實現自動控制和自動糾錯等高級功能

1、Pod

(1)Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod 代表集群上正在運行的一個進程,可以把Pod理解成豌豆莢,而同一Pod內的每個容器是一顆顆豌豆
(2)一個Pod由一個或多個容器組成,Pod中容器共享網絡、存儲和計算資源,在同一台Docker主機上運行
(3)一個Pod里可以運行多個容器,又叫邊車模式(sideCara) 模式。而在生產環境中一般都是單個容器或者具有強關聯互補的多個容器組成一個Pod
(4)同一個Pod之間的容器可以通過localhost互相訪問,並且可以掛載Pod內所有的數據卷;但是不同的Pod之間的容器不能用localhost訪問,也不能掛載其他Pod的數據卷

2、Pod控制器

pod控制器是pod啟動的一種模板,用來保證在K8S里啟動的pod應始終按照用戶的預期運行(副本數、生命周期、健康狀態檢查等)

K8S內提供了眾多的Pod控制器,常用的有以下幾種:

(1)Deployment:無狀態應用部署。Deployment 的作用是管理和控制Pod和Replicaset, 管控它們運行在用戶期望的狀態中

(2)Replicaset:確保預期的Pod副本數量。Replicaset的作用就是管理和控制Pod,管控他們好好干活。但是,Replicaset受控於Deployment 可以理解成Deployment 就是總包工頭,主要負責監督底下的工人Pod干活,確保每時每刻有用戶要求數量的Pod在工作,如果一旦發現某個工人Pod不行了,就趕緊新拉一個Pod過來替換它。而ReplicaSet就是總包工頭手下的小包工頭。從K8S使用者角度來看,用戶會直接操作Deployment部署服務,而當Deployment被部署的時候,K8S會自動生成要求的ReplicaSet和Pod。用戶只需要關心Deployment而不操心ReplicaSet資源對象Replication Controller是ReplicaSet的前身,官方推薦用Deployment取代Replication Controller來部署服務

(3)Daemonset:確保所有節點運行同一類Pod,保證每個節點上都有一個此類Pod運行,通常用於實現系統級后台任務

(4)Statefulset:有狀態應用部署

(5)Job:一次性任務。根據用戶的設置,Job管理的Pod把任務成功完成就自動退出了

(6)ronjob:周期性計划性任務

3、Label

(1)標簽,是K8S特色的管理方式,便於分類管理資源對象

(2)Label可以附加到各種資源對象上,例如Node、Pod、Service、 RC等,用於關聯對象、查詢和篩選

(3)一個Label是一個key-value 的鍵值對,其中key 與value 由用戶自己指定

(4)一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象中,也可以在對象創建后動態添加或者刪除

(5)可以通過給指定的資源對象捆綁一個或多個不同的Label,來實現多維度的資源分組管理功能

(6)與Label類似的,還有Annotation (注釋)。區別在於有效的標簽值必須為63個字符或更少,並且必須為空或以字母數字字符([a-z0-9A-Z]) 開頭和結尾,中間可以包含橫杠(-)、下划線(_)、點(.)和字母或數字。注釋值則沒有字符長度限制

4、Label選擇器(Label selector)

(1)給某個資源對象定義一個Label, 就相當於給它打了一個標簽;隨后可以通過標簽選擇器(Label selector) 查詢和篩選擁有某些Label的資源對象
(2)標簽選擇器目前有兩種:基於等值關系(等於、不等於)和基於集合關系(屬於、不屬於、存在)

5、Service

(1)在K8S的集群里,雖然每個Pod會被分配一個單獨的IP地址,但由於Pod是有生命周期的(它們可以被創建,而且銷毀之后不會再啟動),隨時可能會因為業務的變更,導致這個IP地址也會隨着Pod的銷毀而消失
(2)Service就是用來解決這個問題的核心概念:K8S中的Service並不是我們常說的“服務”的含義,而更像是網關層,可以看作一組提供相同服務的Pod的對外訪問接口、流量均衡器
(3)Service作用於哪些Pod是通過標簽選擇器來定義的:在K8S集群中,Service可以看作一組提供相同服務的Pod的對外訪問接口。客戶端需要訪問的服務就是Service對象。每個Service都有一個固定的虛擬ip (這個ip也被稱為Cluster IP) ,自動並且動態地綁定后端的Pod, 所有的網絡請求直接訪問Service的虛擬ip,Service會自動向后端做轉發。通俗來說就是Service通過標簽選擇器選擇那些關聯了對應label的Pod,把Pod的IP加入到自己的endpoints當中,當service收到請求后根據endpoints里的ip進行轉發
(4)Service除了提供穩定的對外訪問方式之外,還能起到負載均衡(Load Balance) 的功能,自動把請求流量分布到后端所有的服務上,service可以做到對客戶透明地進行水平擴展(scale),實現service這一功能的關鍵,就是kube-proxy。 kube -proxy運行在每個節點上,監聽API Server中服務對象的變化,可通過以下三種流量調度模式: userspace (廢棄)、iptables (瀕臨廢棄)、ipvs (推薦,性能最好)來實現網絡的轉發
(5)Service是K8S服務的核心,屏蔽了服務細節,統一對外暴露服務接口, 真正做到了“微服務”。比如我們的一個服務A,部署了3個副本,也就是3個Pod;對於用戶來說,只需要關注一個Service 的入口就可以,而不需要操心究競應該請求哪一個Pod。優勢非常明顯:一方面外部用戶不需要感知因為Pod. 上服務的意外崩潰、 K8S重新拉起Pod而造成的IP變更,外部用戶也不需要感知因升級、變更服務帶來的Pod替換而造成的IP變化

6、Ingress

Service主要負責K8S集群內部的網絡拓撲,那么集群外部怎么訪問集群內部呢?這個時候就需要Ingress了。Ingress是轉增個K8S集群的接入層,負責集群內外通訊 Ingress是K8S集群里工作在OSI網絡參考模型下,第7層的應用,對外暴露的接口,典型的訪問方式是http/https Service只能進行第四層的流量調度,表現形式是ip+port。Ingress則可以調度不同業務域、不同URL訪問路徑的業務流量 比如:客戶端請求http://www.123.com:port --->Ingress --->Service --->Pod

7、Name

(1)由於K8S內部,使用“資源”來定義每一種邏輯概念(功能),所以每種“資源”,都應該有自己的“名稱”

(2)“資源”有api版本(apiversion)、類別(kind)、元數據(metadata)、定義清單(spec)、狀態(status)等配置信息

(3)“名稱”通常定義在“資源”的“元數據”信息里。在同一個 namespace空間中必須是唯一的

8、Namespace

(1)隨着項目增多、人員增加、集群規模的擴大,需要一種能夠邏輯上隔離K8S 內各種“資源"的方法,這就是Namespace
(2)Namespace是為了把一個K8S集群划分為若千個資源不可共享的虛擬集群組而誕生的
(3)不同Namespace 內的“資源”名稱可以相同,相同Namespace 內的同種“資源”, “名稱”不能相同
(4)合理的使用K8S的Namespace,可以使得集群管理員能夠更好的對交付到K8S里的服務進行分類管理和瀏覽
(5)K8S里默認存在的Namespace 有: default、 kube-system、 kube-public 等
(6)查詢K8S里特定“資源”要帶上相應的Namespace


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM