## 備用 [麒安學長的簡報](https://docs.google.com/presentation/d/1coSX-QffzGUGru1lQ1fwVWcZkIJWdtzy/edit?usp=sharing&ouid=117949446977532476327&rtpof=true&sd=true) ### kubernetes 的由來 Kubernetes 舵手的希臘文 K8s: K (8個字母) s Google 公司開發用來管理貨櫃化(containerized)應用程式的開源專案 ### 部屬方式 #### 傳統的部屬方式: 多個 application 部屬在同一個硬體的同一個 OS 之中 沒有做到隔離及資源分配 #### 虛擬化部屬方式: 會在硬體及 OS 上多一層虛擬化技術 先分配好該虛擬機的資源如 CPU 和記憶體 灌OS之後分別部屬對應的 application 各 application 之間有 OS 做隔離 也不會影響到本機的其他硬體資源 #### container 部署方式: 作業系統裡面會再建立一個 container runtime (containerd) 透過 Linux Namespace 來做到 applaction 之間的隔離 也能限制該 container 可使用的 CPU 及記憶體等資源等 好處: - Container 的 Image 只要被 build,可以在雲端及地端的不同的OS上建立 Container - Container 之間不會互相影響 - 會共用 host 主機的 kernel 資源 ### kubernetes 的功能 目的:幫企業能長長久久、穩穩當當地運行 Application #### 隨需擴增 - Replication of components 可以在k8s裡面可以複製多個 pod 來提供服務,可以分散的跑在 k8s 多個 node 上,避免單點毀損影響服務,來提高容錯 - Auto-scaling pod 可以因應增長的流量來橫向擴充 (Scale Out),建置新的 pod 應付所需的硬體資源 在增長的流量減緩後,會再刪除擴充的 Pod (Scale In) - Load balancing 讓每個 pod 可以平均分工 #### 版本管理 - Rolling updates 滾動式更新,提供程式進版和退版的功能 若有測試及實際運行的不同環境,可以先在測試環境進版測試、有問題也可退版 待測試完成後再到實際運行的環境進版 #### 故障排除 - Logging across components 跑在 k8s 的每個 pod 的 log 都會被記錄下來,可以透過 Grafana 來搜集 k8s 叢集的 Log 並透過 Web UI 呈現 - Monitoring and health checking 可以透過 Log 來追蹤 Pod 的狀態,如果 Pod fail,可以自動重啟該 Pod 讓他浴火重生 #### 其他 - Service discovery(coreDNS) 就是 DNS server 的功能,將看得懂的 Services 的網址換成對應的 pod 的 IP 位置 - Authentication 身分認證,在 k8s 裡面都是透過憑證在作業而非使用帳號密碼 ### 雲原生作業系統 Kubernetes ![CleanShot 2024-04-06 at 15.50.21@2x](https://hackmd.io/_uploads/SyJ00dAJ0.png) 如圖深灰色的是 Master 節點、右邊則是兩個 Worker 節點 kubernetes 中的最小運行單位是 pod(豆莢),Pod 組成是由一台或多台Container(豆仁) Pod 內,Container 會共用一個網卡、共用 Pod 的 IP 位址,Container 之間則透過記憶體溝通(Localhost) 假如一個 Pod 內有三個 Container,其中兩個 Container 運行服務,剩下的一個 Container 負責蒐集其他兩個 Container 運行時產生的 Log。這樣一個 Pod 就能完整地運行一個企業的服務 #### Master Node Master Node 會包含四個主要的 Pod - API server 使用者會透過 UI 或 CLI 來對 API Server 下達命令 常用的有 kubectl、kubeadm、Minikube 等工具 也有 rancher 可使用 Web UI 來操作 API Server 也負責對使用者進行身分驗證及授權,先驗證身分後在檢查該使用者可以進行什麼樣的操作(授權) - Scheduler 檢查哪一台 worker node 比較閒,就會呼叫該 worker node 上的 kubelet 在該 node 上建立 Pod 來承擔負載 前面提到隨需擴增的功能會由 Scheduler 及 Controller-Manager 負責 - Controller-Manager 照顧 pod 的健康,在不健康的時候呼叫 Scheduler 重新建立 pod 讓他浴火重生,但重建的 Pod 不一定會在原先的 Node 上 前面提到隨需擴增的功能會由 Scheduler 及 Controller-Manager 負責 - etcd 在原本的 Linux 系統中 /etc 底下主要是放作業系統及應用的設定檔,d 則是代表分散式(distributed) etcd 這個 Pod 主要是存放 k8s cluster 的重要資料,像是 pod 的名字、在哪個 Node 位置及使用哪個 Image 等等 Pod 的資訊 #### worker node - kubelet > kubelet 存在的目的是存在和管理 Pod > 如何建立 Pod:依照不同的 container runtime,使用 runc 或 crun > -松林老師 是一個 daemon 而非 Pod,主要確保由 container runtime 如 podman、docker、Cri-O、containerd 建立的多個 Container 會建立在同一個 pod 裡面 - container runtime 底層會透過 runc(Docker、cri-O、containerd) 或 crun(Podman) 來建立 Container - runc 或 crun 依照OCIspec 規範,會需要 bundle - bundle 是包含 config.json 及根檔案系統的目錄 - kube-proxy 是一個 pod 在節點上維護網路規則,讓 K8s 叢集內部或外部可以透過網路來與 pod 溝通。讓不同主機的 pod 可以透過網路互相溝通則需要 CNI 網路套件 在 k8s 節點上一定會有 kubelet、kube-proxy ### Open Interface of Kubernetes 主要包含三種標準,這三種標準會衍生出多個專案,多個專案也會衍生出不同架構的 Kubernetes #### CRI(Container Runtime Interface) - docker - cri-o - rocket 是 Kubernetes 建置 Container 的標準 #### CNI(container Network Interface) - Flannel - Calico - Cilium 是 Container 網路的標準。讓 container 之間可以互通有無,也可以讓外面的網路能連接到我們的服務 #### CSI(container Storage Interface) 是 K8s 之中 Container 用到的儲存系統的標準。Container 的檔案系統主要是 Overlay2,無法永存資料。故需要 by pass overlay2 來達到資料永存 ### Kubernetes Pods (CRI) - Pod 是無法跨主機的,一個 Pod 無法分散在不同的節點上運作 ### Kubernetes Pods (CNI) - 不同 Node 的 Pod 是無法透過 Localhost 互相連接的 一個 Pod 會含一個網路卡及一個 IP 位置,Pod 內的多個 Container 才是透過 Localhost 來溝通;不同 Pod 之間則是透過該 Pod 的 IP 來溝通 ### Kubernetes Pods (CSI) 假設某一個 NFS 有一個大空間的硬碟,做成目錄區後,這些目錄區可以透過網路分享並 mount 到各個的 pod, 這樣 pod 產生的資料就會儲存在 NFS server 上。假設 Pod 當機重建,對應的目錄區會重新 mount 給這個 Pod,這樣先前儲存的資料就能重新在 NFS 裡找到 container 原本是使用 overlayer,如果面對大量的資料新增或修改的話會掛掉,所以會需要 by pass overlay 給 NFS 來達到資料永存。 如果 NFS 使用 linux 系統的話,他儲存會使用 ext4 檔案系統。 ### Kubernetes Pods (Scheduling) Pod 可以被指定部屬到指定的 Nodes 上,Nodes 可以被標記(Labels) 假設某一個 Node 的標籤是: ``` env=prod zone=az1 ``` Pod 可以指定到 `env=prod` 的 Nodes 上 Pod 也可以被標記,相關應用先不提 ### Kubernetes Pods (High Availability) pod 可以很輕易地做到高可用性,依照需求擴充 pod 來承擔負載。但若擴增的 pod 超出實體機器的規格,還是會造成該 Node 當機,仍需要注意實體機器資源的分配。