目錄
一、k8s了解
1.什么是k8s
2.為什么要k8s
(1)部署方式演變
(2)k8s作用
(3)Mesos,Swarm,K8S三大平臺對比
二、k8s架構、組件
1.k8s架構
2.k8s基礎組件
3.k8s附加組件
三、k8s基礎概念
1.服務的分類
(1)無狀態
(2)有狀態
2.資源的分類
(1)元數據型
*1)Horizontal Pod Autoscaler(HPA)
*2)Pod Template
*3)LimitRange
(2)集群級
*1)Namespace
*2)Node
*3)ClusterRole
*4)ClusterRoleBinding
(3)命名空間級pod型資源
*1)適用于無狀態服務的pod型資源
^1) 副本
^2)Replication Controller (RC)
^3)ReplicaSet(RS)
^4)Deployment controller
*2)適用于有狀態服務的pod型資源(StatefulSet )
^1) 主要特點
^2) Headless Service
^3)volumeClaimTemplate
^4)注意事項
*3)守護進程(DaemonSet)
*4)任務/定時任務
3.服務發現
(1)service
(2)Ingress
4.存儲
(1)Volume
(2)CSI
5.特殊類型配置
(1)ConfigMap
(2)Secret
(3)DownwardAPI
(4)Role
(5)RoleBinding
6.規約(spec)
7.狀態(Status)
四、感謝支持
前面我們有了解過一些k8s,但是那個版本比較老,因此會產生很多的bug和不兼容的問題以及依賴或者鏈接丟失的問題,我們用比較新的版本重頭學一遍k8s。
一、k8s了解
1.什么是k8s
k8s是管理容器化應用的平臺,且能夠管理云平臺多主機,能讓我們容器化部署更高效更容易。
2.為什么要k8s
(1)部署方式演變
傳統服務:
環境不隔離,并發修改,內存、cpu、帶寬資源爭搶
虛擬化部署:
虛擬機占用過多,擴展也不大好擴展
容器化部署:
大大縮短容器生命周期
(2)k8s作用
當容器生命周期大大縮短之后,ip、數據可能就會不穩定就需要k8s去管理他們:
- 自我監控,自我修復
- 彈性伸縮
- 自動部署和回滾
- 服務發現、負載均衡
- 配置管理
- 存儲編排:存儲資源抽象成虛擬磁盤,然后虛擬磁盤映射物理磁盤
- 批處理
(3)Mesos,Swarm,K8S三大平臺對比
Mesos:
主要用于資源管理,發布最早,能管理5W+機器。主要面向節點,而非面向容器。
Docker Swarm:
docker官方都不用了,無縫集成docker,用于節點不多,簡單的業務場景。
k8s:
復雜容器管理。
二、k8s架構、組件
1.k8s架構
一個kubernetes集群主要是由控制節點(master)、工作節點(node)構成,每個節點上都會安裝不同的組件。
master:集群的控制平面,負責集群的決策 ( 管理 )
- ApiServer : 資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、API注冊和發現等機制
- Scheduler : 負責集群資源調度,按照預定的調度策略將Pod調度到相應的node節點上
- ControllerManager : 負責維護集群的狀態,比如程序部署安排、故障檢測、自動擴展、滾動更新等。
- Etcd :負責存儲集群中各種資源對象的信息
node:集群的數據平面,負責為容器提供運行環境 ( 干活 )
- Kubelet : 負責維護容器的生命周期,即通過控制docker,來創建、更新、銷毀容器
- KubeProxy : 負責提供集群內部的服務發現和負載均衡
- Container runtime:負責鏡像管理以及 Pod 和容器的真正運行
下面,以部署一個nginx服務來說明kubernetes系統各個組件調用關系:
- 首先要明確,一旦kubernetes環境啟動之后,master和node都會將自身的信息存儲到etcd數據庫中
- 一個nginx服務的安裝請求會首先被發送到master節點的apiServer組件
- apiServer組件會調用scheduler組件來決定到底應該把這個服務安裝到哪個node節點上
- 在此時,它會從etcd中讀取各個node節點的信息,然后按照一定的算法進行選擇,并將結果告知apiServer
- apiServer調用controller-manager去調度Node節點安裝nginx服務
- kubelet接收到指令后,會通知docker,然后由docker來啟動一個nginx的pod
- pod是kubernetes的最小操作單元,容器必須跑在pod中
- 至此,一個nginx服務就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產生訪問的代理
- 這樣,外界用戶就可以訪問集群中的nginx服務了
2.k8s基礎組件
- Master:集群控制節點,每個集群需要至少一個master節點負責集群的管控
- Node:工作負載節點,由master分配容器到這些node工作節點上,然后node節點上的docker負責容器的運行
- Pod:kubernetes的最小控制單元,容器都是運行在pod中的,一個pod中可以有1個或者多個容器
- Controller:控制器,通過它來實現對pod的管理,比如啟動pod、停止pod、伸縮pod的數量等等
- Service:pod對外服務的統一入口,下面可以維護者同一類的多個pod
- Label:標簽,用于對pod進行分類,同一類pod會擁有相同的標簽
- NameSpace:命名空間,用來隔離pod的運行環境
3.k8s附加組件
- kube-dns:負責為整個集群提供 DNS 服務
- Ingress Controller: 為服務提供外網入口
- Prometheus :提供資源監控
- Dashboard :提供 GUI
- Federation :提供跨可用區的集群
- Fluentd-elasticsearch :提供集群日志采集、存儲與查詢
三、k8s基礎概念
1.服務的分類
(1)無狀態
代表應用:Nginx、Apache
優點:對客戶端透明,無依賴關系,可以高效實現擴容、遷移
缺點:不能存儲數據,需要額外的數據服務支撐
(2)有狀態
代表應用:MySQL、Redis
優點:可以獨立存儲數據,實現數據管理
缺點:集群環境下需要實現主從、數據同步、備份、水平擴容復雜
2.資源的分類
(1)元數據型
*1)Horizontal Pod Autoscaler(HPA)
用于Pod 自動擴容:可以根據 CPU 使用率或自定義指標(metrics)自動對 Pod 進行擴/縮容
- 每隔30s查詢metrics的資源使用情況
- 支持的metrics:預定義metrics、自定義的Pod metrics、自定義的object metrics
- metrics查詢方式:Heapster、自定義的REST API
*2)Pod Template
控制器通過 Pod Template 信息來創建 Pod。
*3)LimitRange
批量設置了某一個范圍內(某個命名空間)的 Pod 的資源使用限制
(2)集群級
*1)Namespace
用于實現多團隊/環境的資源隔離。
*2)Node
Node 本質上不是Kubernetes 來創建的,Kubernetes 只是管理 Node 上的資源。
*3)ClusterRole
ClusterRole 是一組權限的集合,可以進行鑒權。
*4)ClusterRoleBinding
將 Subject 綁定到 ClusterRole、使規則在所有命名空間中生效。
(3)命名空間級pod型資源
*1)適用于無狀態服務的pod型資源
^1) 副本
一個 Pod 可以被復制成多份,每一份可被稱之為一個副本
^2)Replication Controller (RC)
RC 可以保證在任意時間運行的 Pod 的副本數量總是可用的,它實現了 Pod 的高可用性。
^3)ReplicaSet(RS)
RS主要的作用就是用來確保容器應用的副本數始終保持在用戶定義的副本數。
注:?Kubernetes 官方建議使用 RS替代 RC進行部署
^4)Deployment controller
Deployment 為 Pod 和 RS 提供聲明式更新,你只需要在 Deployment 中描述你想要的目標狀態是什么,Deployment controller 就會幫你將 Pod 和 Replica Set 的實際狀態改變到你的目標狀態。
Deployment controller可以用來創建 Replica Set / Pod
*2)適用于有狀態服務的pod型資源(StatefulSet )
^1) 主要特點
-
穩定的持久化存儲
-
穩定的網絡標志
-
有序部署,有序擴展。有序收縮,有序刪除
^2) Headless Service
用于定義網絡標志(DNS domain)。
Domain Name Server:域名服務,將域名與 ip 綁定映射關系
?
^3)volumeClaimTemplate
用于創建 PersistentVolumes
^4)注意事項
- 有狀態的pod型,kubernetes v1.5 版本以上才支持
-
所有Pod的Volume必須使用PersistentVolume或者是管理員事先創建好
-
為了保證數據安全,刪除StatefulSet時不會刪除Volume
-
StatefulSet 需要一個 Headless Service 來定義 DNS domain,需要在 StatefulSet 之前創建好
*3)守護進程(DaemonSet)
DaemonSet 保證會在每個 Node 上都運行一個容器副本,常用來部署一些集群的日志、監控或者其他系統管理應用
*4)任務/定時任務
有一次性任務和定時任務。
3.服務發現
(1)service
Pod 不能直接提供給外網訪問,而是應該使用 service。Service 就是把 Pod 暴露出來提供服務
(2)Ingress
Ingress 可以提供外網訪問 Service 的能力。可以把某個請求地址映射、路由到特定的 service。
ingress 需要配合 ingress controller 一起使用才能發揮作用,ingress 只是相當于路由規則的集合而已,真正實現路由功能的,是 Ingress Controller,ingress controller 和其它 k8s 組件一樣,也是在 Pod 中運行。
4.存儲
(1)Volume
數據卷,共享 Pod 中容器使用的數據。用來放持久化的數據,比如數據庫數據。
(2)CSI
CSI 規范定義了存儲提供商實現 CSI 兼容的 Volume Plugin 的最小操作集和部署建議,是一種規范
5.特殊類型配置
(1)ConfigMap
用來放配置, ConfigMap 放的是明文的數據
(2)Secret
用來放配置, Secret放的是密文的數據
(3)DownwardAPI
讓 pod 里的容器能夠直接獲取到這個 pod 對象本身的一些信息。
(4)Role
Role 是一組權限的集合
(5)RoleBinding
Subject 綁定到 Role,RoleBinding 使規則在命名空間內生效。
6.規約(spec)
描述了對象的期望狀態(Desired State)—— 希望對象所具有的特征。當創建 Kubernetes 對象時,必須提供對象的規約,用來描述該對象的期望狀態,以及關于對象的一些基本信息
7.狀態(Status)
k8s 會通過一系列的控制器對對應對象進行管理,讓對象盡可能的讓實際狀態與期望狀態重合。
四、感謝支持
感謝各位大佬支持,如果覺得滿意可以請喝一杯咖啡嗎: