# Kubernetes簡介
## 來源
中文官網:https://kubernetes.io/zh
中文社區:https://www.kubernetes.org.cn/
## 介紹
K8S主要講的就是Kubernetes,首先Kubernetes首字母為K,末尾為s,中間一共有8個字母,所以簡稱K8s
## 前置知識
- Linux操作系統
- Docker
## 課程簡介
- K8s概念和架構
- 從零搭建K8s集群
- 基于客戶端工具kubeadm搭建(簡單,最多半小時)
- 基于二進制包方式(能看到內部的架構)
- K8s核心概念
- Pod:K8s管理的最小單位級,是所有業務類型的基礎
- Controller:控制器,有狀態,無狀態,一次任務,定時任務,守護進程
- Service Ingress:對外暴露端口
- RBAC:安全機制,權限模型
- Helm:下載機制
- 持久化存儲
- 搭建集群監控平臺系統
- 從零搭建高可用K8s集群
- 在集群環境部署項目
## K8S概念和特性
### 部署發展歷程
我們的項目部署也在經歷下面的這樣一個歷程
> 傳統部署 -> 虛擬化部署時代 -> 容器部署時代

- **傳統部署時代**:早期,組織在物理服務器上運行應用程序。無法為物理服務器中的應用程序定義資源邊界,這會導致資源分配問題。例如,如果在物理服務器上運行多個應用程序,則可能會出現-一個應用程序占用大部分資源的情況,結果可能導致其他應用程序的性能下降。--種解決方案是在不同的物理服務器上運行每個應用程序,但是由于資源利用不足而無法擴展,并且組織維護許多物理服務器的成本很高。
- **虛擬化部署時代**:作為解決方案,引入了虛擬化功能,它允許您在單個物理服務器的CPU.上運行多個虛擬機(VM)。虛擬化功能允許應用程序在VM之間隔離,并提供安全級別,因為一一個應用程序的信息不能被另一應用程序自由地訪問。因為虛擬化可以輕松地添加或更新應用程序、降低硬件成本等等,所以虛擬化可以更好地利用物理服務器中的資源,并可以實現更好的可伸縮性。每個VM是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。
- **容器部署時代**:容器類似于VM,但是它們具有輕量級的隔離屬性,可以在應用程序之間共享操作系統
(OS),因此,容器被認為是輕量級的。容器與VM類似,具有自己的文件系統、CPU、內存、進程空間等。由于它們與基礎架構分離,因此可以跨云和OS分發進行移植。
容器因具有許多優勢而變得流行起來。下面列出了容器的一些好處:
- 敏捷應用程序的創建和部署:與使用VM鏡像相比,提高了容器鏡像創建的簡便性和效率。
- 持續開發、集成和部署:通過簡單的回滾(由于鏡像不可變性),提供可靠且頻繁的容器鏡像構建和部署。
- 關注開發與運維的分離:在構建/時而不是在部署時創建應用程序容器鏡像,將應用程序與基礎架構分離。
- 可觀察性:不僅可以顯示操作系統級別的信息和指標,還可以顯示應用程序的運行狀況和其他指標信號。
- 跨開發、測試和生產的環境一致性:在便攜式計算機上與在云中相同地運行。
- 云和操作系統分發的可移植性:可在Ubuntu、RHEL、RHEL、CoreOS、本地、Google Kubernetes Engine和其它任何其它地方運行。
- 以應用程序為中心的管理:提高抽象級別,從在虛擬硬件上運行OS到使用邏輯資源在OS上運行應用程序。
- 松散耦合、分布式、彈性、解放的微服務:應用程序被分解成較小的獨立部分,并且可以動態部署和管理-而不是在一臺大型單機上器體運行。
- 資源隔離:可預測的應用程序性能。
### K8S概述
kubernetes,簡稱K8s,是用8 代替8 個字符“ubernete”而成的縮寫。是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes 的目標是讓部署容器化的應用簡單并且高效(powerful),Kubernetes 提供了應用部署,規劃,更新,維護的一種機制。
傳統的應用部署方式是通過插件或腳本來安裝應用。這樣做的缺點是應用的運行、配置、管理、所有生存周期將與當前操作系統綁定,這樣做并不利于應用的升級更新/回滾等操作,當然也可以通過創建虛擬機的方式來實現某些功能,但是虛擬機非常重,并不利于可移植性。
新的方式是通過部署容器方式實現,每個容器之間互相隔離,每個容器有自己的文件系統,容器之間進程不會相互影響,能區分計算資源。相對于虛擬機,容器能快速部署,由于容器與底層設施、機器文件系統解耦的。
> 總結:
>
> - K8s是谷歌在2014年發布的容器化集群管理系統
> - 使用k8s進行容器化應用部署
> - 使用k8s利于應用擴展
> - k8s目標實施讓部署容器化應用更加簡潔和高效
### K8S概述
Kubernetes 是一個輕便的和可擴展的開源平臺,用于管理容器化應用和服務。通過Kubernetes 能夠進行應用的自動化部署和擴縮容。在Kubernetes 中,會將組成應用的容器組合成一個邏輯單元以更易管理和發現。
Kubernetes 積累了作為Google 生產環境運行工作負載15 年的經驗,并吸收了來自于社區的最佳想法和實踐。
### K8S功能
#### 自動裝箱
基于容器對應用運行環境的資源配置要求自動部署應用容器
#### 自我修復(自愈能力)
當容器失敗時,會對容器進行重啟
當所部署的Node節點有問題時,會對容器進行重新部署和重新調度
當容器未通過監控檢查時,會關閉此容器直到容器正常運行時,才會對外提供服務

如果某個服務器上的應用不響應了,Kubernetes會自動在其它的地方創建一個

#### 水平擴展
通過簡單的命令、用戶UI 界面或基于CPU 等資源使用情況,對應用容器進行規模擴大或規模剪裁
> 當我們有大量的請求來臨時,我們可以增加副本數量,從而達到水平擴展的效果
當黃色應用過度忙碌,會來擴展一個應用

#### 服務發現
用戶不需使用額外的服務發現機制,就能夠基于Kubernetes 自身能力實現服務發現和負載均衡
> 對外提供統一的入口,讓它來做節點的調度和負載均衡, 相當于微服務里面的網關?

#### 滾動更新
可以根據應用的變化,對應用容器運行的應用,進行一次性或批量式更新
> 添加應用的時候,不是加進去就馬上可以進行使用,而是需要判斷這個添加進去的應用是否能夠正常使用
#### 版本回退
可以根據應用部署情況,對應用容器運行的應用,進行歷史版本即時回退
> 類似于Git中的回滾
#### 密鑰和配置管理
在不需要重新構建鏡像的情況下,可以部署和更新密鑰和應用配置,類似熱部署。
#### 存儲編排
自動實現存儲系統掛載及應用,特別對有狀態應用實現數據持久化非常重要
存儲系統可以來自于本地目錄、網絡存儲(NFS、Gluster、Ceph 等)、公共云存儲服務
#### 批處理
提供一次性任務,定時任務;滿足批量數據處理和分析的場景
## K8S架構組件
### 完整架構圖


### 架構細節
K8S架構主要包含兩部分:Master(主控節點)和 node(工作節點)
master節點架構圖

Node節點架構圖

k8s 集群控制節點,對集群進行調度管理,接受集群外用戶去集群操作請求;
- **master**:主控節點
- API Server:集群統一入口,以restful風格進行操作,同時交給etcd存儲
- 提供認證、授權、訪問控制、API注冊和發現等機制
- scheduler:節點的調度,選擇node節點應用部署
- controller-manager:處理集群中常規后臺任務,一個資源對應一個控制器
- etcd:存儲系統,用于保存集群中的相關數據
- **Work node**:工作節點
- Kubelet:master派到node節點代表,管理本機容器
- 一個集群中每個節點上運行的代理,它保證容器都運行在Pod中
- 負責維護容器的生命周期,同時也負責Volume(CSI) 和 網絡(CNI)的管理
- kube-proxy:提供網絡代理,負載均衡等操作
- 容器運行環境【**Container Runtime**】
- 容器運行環境是負責運行容器的軟件
- Kubernetes支持多個容器運行環境:Docker、containerd、cri-o、rktlet以及任何實現Kubernetes CRI (容器運行環境接口) 的軟件。
- fluentd:是一個守護進程,它有助于提升 集群層面日志
## K8S核心概念
### Pod
- Pod是K8s中最小的單元
- 一組容器的集合
- 共享網絡【一個Pod中的所有容器共享同一網絡】
- 生命周期是短暫的(服務器重啟后,就找不到了)
### Volume
- 聲明在Pod容器中可訪問的文件目錄
- 可以被掛載到Pod中一個或多個容器指定路徑下
- 支持多種后端存儲抽象【本地存儲、分布式存儲、云存儲】
### Controller
- 確保預期的pod副本數量【ReplicaSet】
- 無狀態應用部署【Deployment】
- 無狀態就是指,不需要依賴于網絡或者ip
- 有狀態應用部署【StatefulSet】
- 有狀態需要特定的條件
- 確保所有的node運行同一個pod 【DaemonSet】
- 一次性任務和定時任務【Job和CronJob】
### Deployment
- 定義一組Pod副本數目,版本等
- 通過控制器【Controller】維持Pod數目【自動回復失敗的Pod】
- 通過控制器以指定的策略控制版本【滾動升級、回滾等】

### Service
- 定義一組pod的訪問規則
- Pod的負載均衡,提供一個或多個Pod的穩定訪問地址
- 支持多種方式【ClusterIP、NodePort、LoadBalancer】

可以用來組合pod,同時對外提供服務
### Label
label:標簽,用于對象資源查詢,篩選

### Namespace
命名空間,邏輯隔離
- 一個集群內部的邏輯隔離機制【鑒權、資源】
- 每個資源都屬于一個namespace
- 同一個namespace所有資源不能重復
- 不同namespace可以資源名重復
### API
我們通過Kubernetes的API來操作整個集群
同時我們可以通過 kubectl 、ui、curl 最終發送 http + json/yaml 方式的請求給API Server,然后控制整個K8S集群,K8S中所有的資源對象都可以采用 yaml 或 json 格式的文件定義或描述
如下:使用yaml部署一個nginx的pod

## 完整流程

- 通過Kubectl提交一個創建RC(Replication Controller)的請求,該請求通過APlserver寫入etcd
- 此時Controller Manager通過API Server的監聽資源變化的接口監聽到此RC事件
- 分析之后,發現當前集群中還沒有它所對應的Pod實例
- 于是根據RC里的Pod模板定義一個生成Pod對象,通過APIServer寫入etcd
- 此事件被Scheduler發現,它立即執行執行一個復雜的調度流程,為這個新的Pod選定一個落戶的Node,然后通過API Server講這一結果寫入etcd中
- 目標Node上運行的Kubelet進程通過APiserver監測到這個"新生的Pod.并按照它的定義,啟動該Pod并任勞任怨地負責它的下半生,直到Pod的生命結束
- 隨后,我們通過Kubectl提交一個新的映射到該Pod的Service的創建請求
- ControllerManager通過Label標簽查詢到關聯的Pod實例,然后生成Service的Endpoints信息,并通過APIServer寫入到etod中,
- 接下來,所有Node上運行的Proxy進程通過APIServer查詢并監聽Service對象與其對應的Endponts信息,建立一個軟件方式的負載均衡器來實現Service訪問到后端Pod的流量轉發功能
- Kubernetes簡介
- 搭建K8S集群前置知識
- 使用kubeadm方式搭建K8S集群
- 使用二進制方式搭建K8S集群
- Kubeadm和二進制方式對比
- Kubernetes集群管理工具kubectl
- Kubernetes集群YAML文件詳解
- Kubernetes核心技術Pod
- Kubernetes核心技術Controller
- Kubernetes核心技術Service
- Kubernetes控制器Controller詳解
- Kubernetes配置管理
- Kubernetes集群安全機制
- Kubernetes核心技術Ingress
- Kubernetes核心技術Helm
- Kubernetes持久化存儲
- Kubernetes集群資源監控
- Kubernetes搭建高可用集群
- Kubernetes容器交付介紹
- 使用kubeadm-ha腳本一鍵安裝K8S
- Kubernetes可視化界面kubesphere
- Kubernetes配置默認存儲類
- 使用Rancher搭建Kubernetes集群
- Kubernetes中的CRI