「緯育 2026-0516」修訂間的差異
(建立內容為「本次系列講座首先介紹了 Docker 中兩種備份與遷移機制:docker save/docker load(用於映像檔)與 docker export/docker import(用於容…」的新頁面) |
|||
| 行 81: | 行 81: | ||
* 檔案傳輸: 使用 scp 指令在本地與遠端主機間安全地複製檔案,是必備技能。語法:scp [本地檔案] [使用者]@[遠端主機]:[遠端路徑]。 | * 檔案傳輸: 使用 scp 指令在本地與遠端主機間安全地複製檔案,是必備技能。語法:scp [本地檔案] [使用者]@[遠端主機]:[遠端路徑]。 | ||
[[檔案:2026-0516-01.png|800px]] | [[檔案:2026-0516-01.png|800px]] | ||
=== MiniKube 與版本策略 === | |||
* MiniKube 用途與取態 | |||
** 本機快速建立單一節點 K8s,適合練習上層應用部署;核心操作與正式環境相似,但部分設定與原生 K8s 不一致,故僅使用基本功能以避免非標準行為。 | |||
** 過往以 KVM2 驅動,現場改用 Docker driver,降低學習門檻與卡關機率。 | |||
* 版本選擇 | |||
** 強調使用已驗證版本而非追新:MiniKube v1.38.1 搭配 K8s 1.28.3;最新功能非必要,穩定安裝為優先。 | |||
* Addons 與常用操作 | |||
** minikube addons list/enable 可快速啟用 Ingress、Dashboard、EFK、Istio、Metrics 等;但版本差異可能造成落差,示範不過度延伸。 | |||
** 基本指令:start/stop、dashboard(需先安裝對應套件),清理可移除家目錄下 .minikube。 | |||
* 安裝與驗證實作 | |||
** 下載執行檔至 /usr/local/bin;以 Docker driver 啟動時若為 root 需加允許參數(強制執行)。 | |||
** 啟動過程自動拉取 K8s 映像,容器配置約 2G RAM/2 vCPU;部署完成以 kubectl get nodes 驗證 Ready 節點(minikube,v1.28.3)。 | |||
* kubectl 安裝與倉庫設定 | |||
** 於等待鏡像期間,於 Master 節點設定 K8s 官方套件倉庫(新格式),再用套件管理器安裝 kubectl;未設倉庫將出現找不到套件的錯誤。 | |||
=== Kind(Kubernetes in Docker) === | |||
* 工具定位與優劣 | |||
** 基於容器建立多節點叢集,更貼近原生語義;適合對齊後續三台 VM 的教學架構。 | |||
** 無開箱 Addons,需自行部署元件(如 Ingress),較貼近正式環境作法。 | |||
* 示範流程 | |||
** 安裝執行檔至 /usr/local/bin;以 YAML 宣告三節點拓撲,執行後自動拉取鏡像並部署。 | |||
** 以 kubectl 檢查預期三節點出現。 | |||
* 注意事項 | |||
** 下載鏡像受網路影響大、體積偏大;容器中跑容器(nesting)效能較差但便於練習。 | |||
=== 原生 K8s 與企業生態 === | |||
* 原生與商業版比較 | |||
** 開源版彈性高、成本低但安裝辛苦;商業版(如 Red Hat OpenShift、VMware 等)整合完善且有技術支持,但費用高昂(動輒數百萬至數千萬/年)。 | |||
** 教學採開源路線以保有彈性與可學性;正式企業常因保險與支援需求選擇商業版。 | |||
* 職場角色與分工 | |||
** DevOps 介於 Infra 與開發之間,目標是讓開發者幾乎感受不到 K8s(Git 驅動 CI/CD 自動打包與部署)。 | |||
** 台灣常見分工不清與「打雜」現象;職缺描述與實務落差大,需審慎評估職涯路線(DevOps/SRE/Infra/K8s 管理)。 | |||
=== 三節點原生安裝(K8s 1.24) === | |||
* 自動化與原生指令 | |||
** 以 Ansible 指令(RAW ENV 1.24/RAW K8S 1.24)與腳本(k8s-1.24.sh)在 master 上執行,完成前置到初始化與節點加入。 | |||
** 原生流程:kubeadm init(帶 --service-cidr/--pod-network-cidr 等參數)後以 kubeadm join 將 node1、node2 加入。 | |||
* Linux 前置作業 | |||
** 停用 swap、按需處理 SELinux 與防火牆、啟用 IP Forward、載入必要模組與安裝套件;Ansible 已自動化多數步驟。 | |||
* CNI 選型 | |||
** 以 Calico 為主(支持 Network Policy);亦提及 Flannel、Cilium 等可選方案。 | |||
* 一致性與故障排查 | |||
** 僅在 master 執行;維持三節點一致密碼(root/085)以便 Ansible 連線。 | |||
** 常見問題:相依套件缺失、OS 未更新、磁碟空間不足、密碼變更致不通、鏡像下載卡住(網路不穩);若畫面出現紅色 ignore屬正常,其餘失敗需重試與修正。 | |||
** 若目錄被刪需以 SCP 等方式補齊;確認三節點可互通與登入。 | |||
=== 容器運行時演進(Dockershim 移除後) === | |||
* 版本與路線 | |||
** K8s 1.24 起移除 Dockershim,主流改用 Containerd 或 CRI-O;若堅持 Docker 需加 cri-dockerd 作橋接,疊層複雜不建議。 | |||
* 操作工具 | |||
** Containerd 原生用 ctr;為保留 docker 操作手感可用 nerdctl(約 80–90% 相似度),並留意 Namespace(default/k8s.io)。 | |||
** 建議在整合環境中以 nerdctl --namespace k8s.io 操作,避免資源看不到或誤域。 | |||
* 管理視角轉換 | |||
** K8s 管理聚焦 Pod/Deployment/Service 等資源;容器層指令僅於特殊除錯使用。 | |||
** 教材已將過往 docker 指令示例改寫為 nerdctl 等價操作。 | |||
=== 後續課程與操作對比 === | |||
* 應用部署路徑 | |||
** 已演示以系統套件與 Docker 部署 Nginx;下一步將以 K8s 部署 Nginx,對比三種方法的差異與適用情境。 | |||
[[檔案:2026-0516-02.png|800px]] | |||
於 2026年5月18日 (一) 12:10 的最新修訂
本次系列講座首先介紹了 Docker 中兩種備份與遷移機制:docker save/docker load(用於映像檔)與 docker export/docker import(用於容器)。講師強調了兩者在處理對象、檔案大小及匯入命名上的差異。接著比較了 docker commit 與 docker export/import 兩種建立映像檔的方式,指出 commit 會增加不必要的映像檔層數,建議優先使用 export。課程實作部分,指導學員使用 scp 將檔案傳輸至 Linux 虛擬機,並編寫 Dockerfile 建立一個包含 Tomcat 的 Web Server 映像檔,涵蓋 FROM、RUN、ADD、EXPOSE、ENTRYPOINT 等指令。
隨後,講座深入探討了 Dockerfile 中 ENTRYPOINT 與 CMD 的核心差異,建議初學者使用 ENTRYPOINT 以確保容器穩定啟動。課程進而延伸至 Kubernetes (K8s) 的學習,將其比喻為多引擎飛機,強調其叢集備援與高可用性的優勢。講師介紹了學習 K8s 的重要資源網站(kubernetes.io, cncf.io)及相關專業認證(CKA, CKAD, CKS),並闡述了容器化技術相較於傳統虛擬機部署的核心優勢,如免安裝、避免人為錯誤、跨平台及實現應用與底層作業系統的解耦,這正是雲原生(Cloud Native)的核心精神。
講座接著深入探討了雲原生領域的知識,包括 IT 認證的類型(選擇題 vs. 實務操作型)、CNCF 基金會的宗旨與專案成熟度分級。最後,詳細闡述了 Kubernetes 的起源、架構(Master 與 Worker 節點及其組件如 API Server、Scheduler、etcd、Kubelet、Kube-proxy)以及其核心功能,如資源調度、自我修復、服務發現和自動擴展/縮減。講師特別強調了「聲明式配置」作為 K8s 的重要核心觀念,以及內建 DNS(CoreDNS)在服務發現機制中的關鍵作用,並解釋了 Control Manager 如何監控並維持系統的預期狀態,實現自動化管理與故障恢復。
Docker 映像檔與容器的備份、遷移與客製化
- 映像檔的備份與還原 (docker save / docker load)
- 用途: docker save 將一個或多個映像檔 (Image) 儲存成 .tar 檔案;docker load 則從檔案中載入映像檔。
- 特性: 載入後的映像檔名稱與原始名稱完全相同。
- 應用情境: 適用於無網路或無倉庫 (Registry) 環境下的備份、還原及主機間遷移。
- 容器的匯出與匯入 (docker export / docker import)
- 用途: docker export 匯出一個容器 (Container) 的檔案系統成為 .tar 檔案;docker import 則將該檔案匯入並建立成一個新的「映像檔」。
- 特性:
- 處理對象是容器而非映像檔。
- 匯入時可以為新映像檔指定全新名稱。
- 可用於建立客製化映像檔:啟動基礎容器 -> 修改 -> 匯出 -> 匯入成新映像檔。
- docker commit vs docker export/import
- 目的: 兩者皆可基於容器變更建立新映像檔。
- 主要差異: commit 會在原有映像檔上疊加新層 (Layer),增加層數,可能影響載入速度;而 export/import 產生的映像檔只有一個基礎層。
- 最佳實踐:
- 建議使用 export/import 來基於容器變動建立映像檔。
- 建議使用 save/load 來交換或備份完整的映像檔。
- Dockerfile 指令 (ENTRYPOINT vs. CMD)
- ENTRYPOINT: 定義的指令在容器啟動時一定會被執行,不會被 docker run 後附加的指令覆蓋。
- CMD: 定義的指令會被 docker run 後附加的指令覆蓋。
- 建議: 初學者建議優先使用 ENTRYPOINT,以避免因意外附加指令導致容器啟動失敗。
Docker 映像檔的建立與執行 (Web Server 實例)
- Dockerfile 常用指令
- FROM rockylinux:9: 指定基礎映像檔。
- WORKDIR /root: 設定容器內的工作目錄。
- RUN ...: 在建構過程中執行指令,如安裝套件。
- ADD jdk-8u191-linux-x64.tar.gz /: 將主機檔案加入映像檔並自動解壓縮。
- EXPOSE 8080: 宣告容器將開放的連接埠。
- ENV JAVA_HOME ...: 設定環境變數。
- ENTRYPOINT [...]: 設定容器啟動時執行的命令。
- 建置與執行流程
1. 準備檔案: 使用 scp 將 Dockerfile 及所需檔案(如 JDK)傳輸至伺服器。 2. 建置映像檔: docker build -t webserver . 3. 執行容器: docker run --name my-web-server -p 8080:8080 webserver 4. 驗證: 透過瀏覽器訪問主機 IP 的 8080 連接埠。
Docker 容器化技術的優勢與雲原生精神
- Image 的核心價值
- 簡化部署: 將應用程式與其所有依賴(套件、函式庫、設定)打包在一起,如同「綠色軟體」,免安裝即可執行。
- 避免人為錯誤: 標準化的 Image 確保了環境的一致性。
- 跨平台與可移植性: 「一次打包,到處部署」,不受底層作業系統發行版差異的影響。
- 解耦(Decoupling)與雲原生(Cloud Native)
- 核心目標是實現應用程式與作業系統的解耦,讓應用程式擺脫對特定環境的強依賴性,提升靈活性與可移植性。
- 持久卷掛載(Persistent Volume)
- 將主機節點的資料夾掛載到容器內部,實現資料持久化。即使容器被刪除,資料依然保留在主機上。
Kubernetes (K8s) 基礎概念
- 從單機到叢集管理
- Docker 是單機管理工具,存在單點故障風險。
- K8s 是叢集管理工具,跨多台主機管理容器,提供備援 (HA, High Availability)。講師以多引擎飛機比喻其叢集備援特性。
- 操作模型:指令型 vs. 聲明型
- 指令型 (Imperative): 告訴系統「如何做」(How)。
- 聲明型 (Declarative): 宣告想要的「最終狀態」(What),系統會自動完成部署。這是 K8s 的核心理念,也是未來趨勢。
- 起源與命名: 源自 Google 內部專案 Borg,K8s 是其簡稱。100% 由 Go 語言撰寫。
- 學習資源與認證
- 官方網站: kubernetes.io (官方文件) 和 cncf.io (雲原生運算基金會)。
- 專業認證: CKA (Administrator), CKAD (Developer), CKS (Security Specialist) 是含金量較高的實務操作型認證。
Kubernetes (K8s) 架構與核心組件
- Master Node (管理節點): 負責整個叢集的管理。
- API Server: 所有操作的統一入口,預設透過安全的 6443 連接埠進行認證與授權 (RBAC) 存取。
- etcd: 儲存叢集所有狀態與設定的分佈式鍵值資料庫,極為重要。
- Scheduler: 負責將 Pod 調度到最合適的 Worker Node 上。
- Control Manager: 自動化管理中心,監控並維持系統的預期狀態,執行自我修復。
- Worker Node (工作節點): 負責運行應用程式。
- Kubelet: 負責管理 Pod 的完整生命週期,並向 Master 回報節點狀態。
- Kube-proxy: 負責節點內的網路通訊與負載平衡,底層基於 IPtables 或 IPVS 實現。
- Container Runtime: 容器執行環境,如 ContainerD。
Kubernetes (K8s) 核心功能
- 服務發現 (Service Discovery)
- 內建 DNS 服務(新版為 CoreDNS),當建立 Service 時,會自動為其創建 DNS 紀錄。
- FQDN 格式為 服務名稱.命名空間名稱.svc.cluster.local,其中 服務名稱.命名空間名稱 必須記住。
- Pod 內的 DNS 設定會被 K8s 自動覆寫,指向內部 DNS。
- 主要功能特性
- 資源調度 (Scheduling): 自動選擇節點部署應用。
- 自我修復 (Self-healing): 當應用異常時,自動恢復到正常狀態。
- 擴展與縮減 (Scaling): 可手動或自動(Auto-scaling)增減應用實例數量以應對負載變化。
Linux 相關知識
- 套件管理工具: apk (Alpine), apt (Ubuntu), yum (Red Hat/Rocky), zypper (openSUSE)。
- 檔案傳輸: 使用 scp 指令在本地與遠端主機間安全地複製檔案,是必備技能。語法:scp [本地檔案] [使用者]@[遠端主機]:[遠端路徑]。
MiniKube 與版本策略
- MiniKube 用途與取態
- 本機快速建立單一節點 K8s,適合練習上層應用部署;核心操作與正式環境相似,但部分設定與原生 K8s 不一致,故僅使用基本功能以避免非標準行為。
- 過往以 KVM2 驅動,現場改用 Docker driver,降低學習門檻與卡關機率。
- 版本選擇
- 強調使用已驗證版本而非追新:MiniKube v1.38.1 搭配 K8s 1.28.3;最新功能非必要,穩定安裝為優先。
- Addons 與常用操作
- minikube addons list/enable 可快速啟用 Ingress、Dashboard、EFK、Istio、Metrics 等;但版本差異可能造成落差,示範不過度延伸。
- 基本指令:start/stop、dashboard(需先安裝對應套件),清理可移除家目錄下 .minikube。
- 安裝與驗證實作
- 下載執行檔至 /usr/local/bin;以 Docker driver 啟動時若為 root 需加允許參數(強制執行)。
- 啟動過程自動拉取 K8s 映像,容器配置約 2G RAM/2 vCPU;部署完成以 kubectl get nodes 驗證 Ready 節點(minikube,v1.28.3)。
- kubectl 安裝與倉庫設定
- 於等待鏡像期間,於 Master 節點設定 K8s 官方套件倉庫(新格式),再用套件管理器安裝 kubectl;未設倉庫將出現找不到套件的錯誤。
Kind(Kubernetes in Docker)
- 工具定位與優劣
- 基於容器建立多節點叢集,更貼近原生語義;適合對齊後續三台 VM 的教學架構。
- 無開箱 Addons,需自行部署元件(如 Ingress),較貼近正式環境作法。
- 示範流程
- 安裝執行檔至 /usr/local/bin;以 YAML 宣告三節點拓撲,執行後自動拉取鏡像並部署。
- 以 kubectl 檢查預期三節點出現。
- 注意事項
- 下載鏡像受網路影響大、體積偏大;容器中跑容器(nesting)效能較差但便於練習。
原生 K8s 與企業生態
- 原生與商業版比較
- 開源版彈性高、成本低但安裝辛苦;商業版(如 Red Hat OpenShift、VMware 等)整合完善且有技術支持,但費用高昂(動輒數百萬至數千萬/年)。
- 教學採開源路線以保有彈性與可學性;正式企業常因保險與支援需求選擇商業版。
- 職場角色與分工
- DevOps 介於 Infra 與開發之間,目標是讓開發者幾乎感受不到 K8s(Git 驅動 CI/CD 自動打包與部署)。
- 台灣常見分工不清與「打雜」現象;職缺描述與實務落差大,需審慎評估職涯路線(DevOps/SRE/Infra/K8s 管理)。
三節點原生安裝(K8s 1.24)
- 自動化與原生指令
- 以 Ansible 指令(RAW ENV 1.24/RAW K8S 1.24)與腳本(k8s-1.24.sh)在 master 上執行,完成前置到初始化與節點加入。
- 原生流程:kubeadm init(帶 --service-cidr/--pod-network-cidr 等參數)後以 kubeadm join 將 node1、node2 加入。
- Linux 前置作業
- 停用 swap、按需處理 SELinux 與防火牆、啟用 IP Forward、載入必要模組與安裝套件;Ansible 已自動化多數步驟。
- CNI 選型
- 以 Calico 為主(支持 Network Policy);亦提及 Flannel、Cilium 等可選方案。
- 一致性與故障排查
- 僅在 master 執行;維持三節點一致密碼(root/085)以便 Ansible 連線。
- 常見問題:相依套件缺失、OS 未更新、磁碟空間不足、密碼變更致不通、鏡像下載卡住(網路不穩);若畫面出現紅色 ignore屬正常,其餘失敗需重試與修正。
- 若目錄被刪需以 SCP 等方式補齊;確認三節點可互通與登入。
容器運行時演進(Dockershim 移除後)
- 版本與路線
- K8s 1.24 起移除 Dockershim,主流改用 Containerd 或 CRI-O;若堅持 Docker 需加 cri-dockerd 作橋接,疊層複雜不建議。
- 操作工具
- Containerd 原生用 ctr;為保留 docker 操作手感可用 nerdctl(約 80–90% 相似度),並留意 Namespace(default/k8s.io)。
- 建議在整合環境中以 nerdctl --namespace k8s.io 操作,避免資源看不到或誤域。
- 管理視角轉換
- K8s 管理聚焦 Pod/Deployment/Service 等資源;容器層指令僅於特殊除錯使用。
- 教材已將過往 docker 指令示例改寫為 nerdctl 等價操作。
後續課程與操作對比
- 應用部署路徑
- 已演示以系統套件與 Docker 部署 Nginx;下一步將以 K8s 部署 Nginx,對比三種方法的差異與適用情境。