antony@notes:~/kubernetes$ cat "Kubernetes-Overview.md"
Kubernetes Overview
Kubernetes Overview
- Kubernetes 是由 Google 公司設計的一個開源的系統,用來管理實體電腦或虛擬電腦裡面的多個 containerized applications.
- Kubernetes 這個名字源自於希臘語,意思是舵手或飛行員。 K8s 是 K 和 s 之間八個字母的縮寫。
Going back in time

- Traditional deployment 時代: 早期,企業在實體伺服器上運行應用程式。 沒有辦法為實體伺服器上的應用程式定義資源邊界,這就造成了資源分配問題。 例如,如果一個實體伺服器上執行多個應用程序,可能會出現一個應用程式佔用大部分資源的情況,結果導致其他應用程式效能不佳。 解決的辦法是在不同的實體伺服器上運行每個應用程式。 但這並不能擴大規模,因為資源未充分利用,而且企業維護許多實體伺服器的成本很高。
- Virtualized deployment 時代: 作為一種解決方案,虛擬化技術應運而生。 它允許在單一實體伺服器的 CPU 上運行多個虛擬機器(VM)。 虛擬化允許在虛擬機之間隔離應用程序,並提供一定程度的安全性,因為一個應用程式的資訊不能被另一個應用程式隨意存取。虛擬化可以更好地利用實體伺服器中的資源,提高可擴展性(因為應用程式可以輕鬆添加或更新),降低硬體成本等等。 利用虛擬化技術,你可以將一組實體資源顯示為一個由一次性虛擬機器組成的叢集。每個虛擬機器都是一個完整的機器,在虛擬化硬體上運行所有組件,包括自己的作業系統。
- Container deployment 時代: 由於 Cintainer 技術是把 Process 和 process 的相依檔透過 Linux Namepsace 來隔離,因此可以跨雲端和跨作業系統部屬,還可以透過 CGroup 來控制 Application Container 的 CPU、記憶體…等硬體資源,但是 Container 之間會共用 OS 的 Kernel。
Kubernetes 目標
:::danger 幫企業 run Application ( 應用系統 ) run 的長長久久、穩穩當當 :::
Kubernetes 的功能介紹
- Replication of components (Pod)
- 同樣的 pod 可以複製很多台出來 (本尊與分身的概念,分身也會做事)
- 叢集,同一個服務會有好幾個 pod 來提供服務,避免單點損毀的情況,提高可用性 (HA) 與容錯
- Auto-scaling
- 自動橫向擴充,可以依照暴漲的流量擴充 pod
- 一開始只做一個本尊和一個分身的 pod (兩個相同的應用系統再跑),當偵測到同一時間有大量連線時,會自動長出一樣的應用系統出來一起作業,連線恢復正常時,多的分身會消失
- Load balancing
- 平衡負載,讓每個 pod 都能平均分工
- Replication of components + Auto-scaling + Load balancing 能達到隨需擴增
- Rolling updates
- 滾動式更新,專門給程式設計師使用,因增加或修改功能會更新程式版本,也就是進版或退版
- 當 Application 部屬到測試環境的 K8S Cluster 時,可檢查程式碼有無死邏輯,當服務發現有異常時,程式會退版,確認都無問題後,再部屬到 Production 環境
- Example: 藍綠部屬、金絲雀部屬
- Logging across components
- 每台 pod 運作的 log 檔都會記錄下來
- grafana ( 發音 : 寡發哪 ) : 透過儀錶板來監控所有的 Container
- Monitoring and health checking
- 透過 log 來監控 pod 的狀態和對 pod 進行健康檢查,一旦 Container 的狀態 failed 了,會重啟 Container,讓他浴火重生。
- 由於在整個 K8S Cluster 上面會跑多個應用系統,所以需要 Logging across components + Monitoring and health checking 來幫助我們維運
- Service discovery (DNS Server)
- DNS Server 的功能 : 將人看得懂的網站網址 (URL),變成 IP 位址
- 由 CoreDNS System 得知,你的 Service 會對到哪一個 pod,會將 Service 的 Domain name 轉成綁在 Service 上的 pod 的 IP 位址。
- Domain name wiki link
- Authentication
- 身分認證,透過憑證 ( 公鑰 and 私鑰 ) 作業
- 在 K8s 中沒人在打帳號密碼,全靠憑證作業。
Google has given a combined solution for that which is Kubernetes, or how it’s shortly called – K8s.
甚麼時候會需要用到隨需擴充?
- 網站伺服器,遇到多人大量同時連線時會需要,例如 : 演唱會訂票系統, 台鐵在節慶時的訂票系統
- 擴充的方式 : 金絲雀 ( 之後會學的 )…等
雲原生作業系統 - Kubernetes 大架構

這張圖中,有3台虛擬電腦
- kubernetes master 的 hostname : m1
- Worker node 的 hostname : w1 和 w2
- 可以視 Application 的複雜程度新增 Worker node 主機
- kubernetes 最小的運作單位為 pod ( 豆莢 )
- pod 由一台或以上的 Container 組成
- 同一個 pod 裡的多台 Container 會共用同一張網路卡,網路卡對內透過記憶體溝通(localhost),對外有同一個 Pod 的 IP 位址 。
- 一個 pod 裡面 3 台 Container 跑的 Application(舉例,Container 1 跑 nginx 的網站; Container 2 跑 MYSQL 資料庫; Container 3 跑 log Server )= > 可以理解為 3 個 Container 跑企業用的 Application 在一個 pod 裡面。
Master node
- Master node 裡一定會有 4 個 pod 分別是
API Server、Secheduler、Controller-Manager和etcd API Server- 負責接受前端管理者透過 CLI ( Command Line Interface, 命令模式 ) 下達的命令,例如 :
kubectl、kubeadm…等 - 也接受 Web UI ,在瀏覽器的網頁上點點選選,對
API Server下達命令,例如 : RancherRancher 這家公司還有推出 K3s ( 無肥肉、身材好、精實型的 K8s )
- Authentication 身分認證,你是誰
- Authorization 授權,你有什麼權限,可以做什麼事情
- 負責接受前端管理者透過 CLI ( Command Line Interface, 命令模式 ) 下達的命令,例如 :
Secheduler- 負責安排 pod ( 企業的 application ) 要在哪一台工作主機上 run
- 安排的方式不只看記憶體,會有更複雜的演算法,溝通的對象為該工作主機的
kubelet
Controller-Manager- 會負責照顧 node 裡面的 pod ,如果一台 node 裡面的 pod 掛了,它會去請
Scheduler幫我們把 pod 建立回來,但是不一定會在原來的 node 把 pod 建立回來。 ( Kubernetes 內建的容錯功能 ) - 會監控 pod 的狀態,如果發現很多 connection 連到 pod ,它就會請
Sechedular, 幫忙把 pod 複製出來,也就是隨需擴增。
- 會負責照顧 node 裡面的 pod ,如果一台 node 裡面的 pod 掛了,它會去請
etcd- Etcd 之所以如此命名,是因為它的功能類似於 Linux 系統上的
/etc目錄。在 Linux 中,大多數設定檔和已安裝的應用程式會駐留在/etc下的各個子目錄和檔案中。同樣,在 Kubernetes 中,叢集的設定資料以及追蹤叢集狀態的資料都位於 etcd 中。 - etcd 本質上是
/etc的分散式版本。與儲存單一伺服器資料的/etc目錄不同,etcd 在分散式環境中運作,因此 etcd 中的「d」。 - 一個資料庫。
- 存放整個 K8S 系統運作的重要資料,e.g., node 裡面會存/跑什麼 application, pod 叫什麼名字 …等。
- Etcd 之所以如此命名,是因為它的功能類似於 Linux 系統上的
Worker node
kubelet- 在背景執行的程序
- 把 Container-Runtime-Engine (Podman, Docker, CRI-O) 做出來的一個或多個 Container 包成一個 pod
- 實際上 Podman, Docker, CRI-O 會透過 runc/crun (有人根據 OCI 組織制定的 Runtime spec 寫出來的程式) 來將 Container 建立出來。
- Docker 用的是 runc 來建立 Container,Podman 用的是 crun ,CRI-O 預設是用 runc
- runc/crun 在建立 Container 時,一定會需要 bundle ( runtime 設定檔 + rootfs 檔案系統目錄 )
Kube-proxy( 哭 ㄅ ㄆㄨㄚ seeˇ )- 一個 pod
- 負責在節點上維護網絡規則。這些網絡規則允許來自叢集內部或外部的網絡與 Pod 進行網絡通訊
- 在我們的環境中,
kube-proxy會透過 Flannel 網路套件,來讓 Pods 跨主機互通有無
m1 只要執行
kubelet,其實也可以扮演 worker 的角色
情境敘述
我們 ( 前端管理者 ) 打
kubectl這個命令告訴API Server,我有一個 pod 要 run,API Server接收到後,會去找Scheduler,請他安排,Secheduler會去找看哪一台 node 最閒,然後會去通知那台 node 裡面的kubelet,叫他去請 Container-Runtime-Engine 幫我們產生 Container 。K8s 的 pod 在外面工作,我們稱它為 Solution ( 解決方案 ) ,注意 ! 它不能稱為一台電腦,因為 pod 是由一台或多台 Container 組成, Container 是一台電腦,pod 就是很多台電腦堆疊起來的一整個機櫃,舉例 : 應用系統由一個或多個 process 組成,而 pod 就是一個企業所需的應用系統,pod 裡面的 Container 就是 process 和 process 的相依檔。