終於要來好好深入探討 Kubernetes ,因為 Kubernetes 是基於 golang 這門語言開發的,所以在稍早已經先針對 golang 深度研究了,不過對於 Docker 與 container 技術有經有深入研究過了,小弟就就不針對 Docker 技術展開了,如果也想看的話,歡迎敲碗,接下來就會好好的針對 Kubernetes 有一系列的文章介紹。
Kubernetes
甚麼是 Kubernetes (k8s)? K8s 是 Kubernetes 的縮寫,因為 K 到 s 中間有八個字母,所以稱為 Kubernetes ,它是 Google 的開源容器集群管理系統,是 Google 多年大規模容器管理技術 Borg 的開源版本,主要功能包括:
- 基於容器的應用佈署、維護和滾動升級。
- 附載均衡和服務發現。
- 跨機器與跨地區的集群調度。
- 自動擴展。
- 無狀態服務和有狀態服務。
- 插件機制保證擴展性。
Imperative VS Declarative
- Imperative : 命令式系統,是寫出解決某個問題、完成某個任務或者達到某個目標的明確步驟。此方法明確寫出系統應該執行某個指令,並且期待系統返回期望結果。像是電視機遙控器對電視的命令。
- Declarative : 聲明式系統,關注的是做甚麼,而不是怎麼做。僅限於描述要達到甚麼目的,如何達到該目的就交給系統處理就好。像是冷氣遙控器對冷氣操作。
聰明的你應該會覺得很奇怪,我不是要學習 Kubernetes 嗎?幹嘛跟我說這個?會在這邊說是因為 Kubernetes 是基於聲明式的方式而打造出來的系統,那命令式與聲明式的優缺點,這邊就不深入探討各自的優缺點了,有興趣的同學可以自己深入探討。
核心物件
- Pod : 用來描述應用的實例,包括鏡像地址、資源需求等。Kubernetes 中最核心的物件,也是打通應用和基礎架構的秘密武器。
- Namespace : 資源隔離的基本單位,可以理解為文件系統中的目錄結構或者程式語言中的 namespace 。
- Node : 計算節點的抽象,用來描述計算節點的資源抽象、健康狀態等。
- Service : 服務如何將應用發布成為服務,實質上是附載均衡與域名服務的聲明。
Pod
Pod 本身的意思是豆莢,為什麼會取名為這個呢?因為豆莢會把很多個豆子包覆在一起,使得這些豆子成為一體。
- Pod 是一組緊密關聯的容器集合,他們共享 PID 、 IPC 、 Network 和 UTS namespace ,是 Kubernetes 調度的基本單位。
- Pod 的設計裡面是支持多個容器在一個 Pod 中共享網路和文件系統,可以通過進程之間通信和文件共享,簡單又高效的方式組合完成服務。
- 同一個 Pod 中不同容器可以共享資源
- 共享網路 namespace
- 通過掛載 Volumn 共享儲存
- 共享 Security Context
Namespace
Namespace 是對一組資源和物件的抽象集合,可以用來將系統內部的物件劃分不同的群組或用戶組。
常見的 pods 、 services 、 replication controllers 和 deployments 都是屬於某一個 namespace 的 (默認 default),而 Node 、 persistentVolumes 等則不屬於任何 Namespace。
Node
在 Kubernetes 的世界中,Node 通常就代表著一台實體機或者虛擬機,用來運行 Pod,為了管理 Pod ,每個 Node 至少需要運行 container runtime 、 kubelet 和 kube-proxy。Node 可以分為 master node 跟 worker node。
- master node : Kubernetes 的指揮中心,負責管理所以的 node,這個主節點還有以下較為重要的組件。
- kube-apiserver
- 管理整個 kubernetes 所需要的 API 。
- 負責跟 node 之間的溝通橋樑。
- 負責跟 kubernetes 中的請求身分認證和授權。
- etcd
- 一個強大的、穩定的、高可用的 key/value 存儲庫,被 kubernetes 用於長久儲存所有的 API 物件。
- kube-controller-manager
- 運行著著所以處理 cluster 日常任務的控制器,包括 Node Controller、Replication Controller 等等。
- controller manager 的監視與嘗試更新,都蓄要通過訪問 kube-apiserver。
- kube-scheduler
- scheduler 會監控新建的 pods,並且將其分配給 node。
- kube-apiserver
- worker node :
- kubelet
- 該 node 的管理員,負責管理該 node 上的所有 Pods 的狀態,並且與 master 溝通。
- kube-proxy
- 該 Node 的傳訊員,負責更新該 Node 的 iptables ,讓 Kubernetes 中部在該 Node 上的其他物件,可以得知該 Node 上所以 Pods 的最新狀態。
- Container Runtime
- 可以運行 container 的執行程式,例如 : Docker 。
- kubelet
Service
Service 是應用服務的抽象,通過 labels 為應用提供附載均衡和服務發現。match labels 的 Pods IP 和 port 列表組成 endpoints ,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoint 上。
每一個 Service 都會自動分配一個 cluster IP (僅只能在 Cluster 內部訪問的虛擬地址) 和 DNS 名,其他容器可以通過該地址或者 DNS 來訪問服務,而不需要了解背後容器的運行。
總結
今天先初步分享 kubernetes 的基礎組件與一些知識,如果有興趣的同學可以自己安裝 kubernetes ,之後會再展開一系列的文章,就讓我們繼續看下去。
歡迎到我的 Facebook Alan 的筆記本 留言,順手給我個讚吧!你的讚將成為我持續更新的動力,感謝你的閱讀,讓我們一起學習成為更好的自己。