讀書系列 - 1: Kubernetes: Up and Running, 3rd Edition (1)

更新於 發佈於 閱讀時間約 14 分鐘

這次我們將介紹一本有關容器建置與應用的書籍 —— Kubernetes: Up and Running。本書詳細闡述了容器與映像的基本概念,並深入介紹了容器生態系統的運作。對於剛接觸虛擬化技術與容器的新手而言,這是一本十分友善且實用的入門書籍。接下來,我將依序介紹每一章節的重點,並分享一些我的歸納與心得。

Chapter 1. Creating and Running Containers

傳統上,我們將程式碼寫在本地環境中,讓所有程式共用相同的語言版本與套件版本,但這些依賴關係常會增加團隊協作的複雜性與耦合性,這就是容器技術的優勢所在。

容器大致可分為兩種:系統容器模擬虛擬機並運行完整的啟動過程,如 ssh、cron 和 syslog;而應用程式容器則通常運行單一程式。雖然每個容器運行單一程式看似限制,但這樣的設計使得應用程式之間的組合與調整變得更加靈活,並能夠有效地適應不同需求。

利用 Docker 建構映像(Image)

在映像建立過程中,雖然刪除的檔案看似消失,但它們實際上仍存在於映像中,只是變得較難訪問。而且每一層都是獨立的,因此對上一層的修改可能會導致下層重新構建與拉取檔案。

為了降低漏洞風險,應該讓每個映像專注於單一功能。舉例來說,可以透過使用許多小型、具高度耦合的小映像來避免映像暴露於無用的庫或過時的漏洞。

Dockerfile 範例:

FROM node:16
WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install
RUN npm install express

COPY . .
CMD [ "npm", "start" ]

多步驟建置

我們可以將映像建置拆分成多個階段,例如分為 build 與 deploy 兩個階段。這樣可以避免在部署階段包含不必要的建置工具,從而降低映像的大小並加快下載速度。

Dockerfile 範例:

# 第一階段:Build
FROM golang:1.17-alpine AS build

RUN apk update && apk upgrade && apk add --no-cache git nodejs bash npm
RUN go get -u github.com/jteeuwen/go-bindata/...
RUN go get github.com/tools/godep

WORKDIR /go/src/github.com/kubernetes-up-and-running/kuard
COPY . .

ENV VERBOSE=0
ENV PKG=github.com/kubernetes-up-and-running/kuard
ENV ARCH=amd64
ENV VERSION=test

RUN build/build.sh

# 第二階段:Deploy
FROM alpine

USER nobody:nobody
COPY --from=build /go/bin/kuard /kuard

CMD [ "/kuard" ]

此章總結

容器提供了一個乾淨的抽象環境,使應用程式更易於建置、部署與分發,並且能夠彼此隔離,從而簡化管理與運維。


Chapter 2. Deploying a Kubernetes Cluster

Kubernetes 叢集是一個完整、可靠且可擴展的分散式系統,也是容器管理的核心平台。

我們可以透過 kubectl 這個命令列工具來與 Kubernetes API 進行互動。kubectl 用於管理大多數 Kubernetes 物件,例如 Pod、ReplicaSet 和 Services 等。

常用指令來建置與確認 Kubernetes 叢集的狀態:

kubectl version
kubectl get componentstatuses
kubectl get nodes
kubectl describe nodes 節點名稱
kubectl get daemonSets --namespace=kube-system kube-proxy
kubectl get deployments --namespace=kube-system core-dns
kubectl get services --namespace=kube-system core-dns


Chapter 3. Common kubectl Commands

在管理 Kubernetes 叢集時,最常見的操作之一是封鎖與排空節點。封鎖節點會阻止新的 Pod 被調度到該節點上;而排空節點則會刪除當前在該節點上執行的所有 Pod。這些操作通常用於刪除機器進行維護或升級。

在這種情況下,可以使用 kubectl cordonkubectl drain 來安全地將節點從叢集中移除。當機器修復後,可以使用 kubectl uncordon 來重新啟用該節點的 Pod 調度。

需要注意的是,Kubernetes 並沒有 undrain 指令,因為當 Pod 被創建時,它會自動調度到空閒的節點上。通常,快速影響節點(例如機器重啟)的狀況不需要封鎖或排空,只有當節點停止服務的時間較長,並且希望將 Pod 移動到其他節點時,才需要進行封鎖或排空操作。

另外,文中還介紹了一個有助於自動補全指令的工具:bash-completion

管理叢集時的常用指令:

kubectl config use-context my-context
kubectl get pods,services
kubectl explain pods

kubectl apply -f obj.yaml
kubectl apply -f myobj.yaml view-last-applied

kubectl delete -f obj.yaml
kubectl delete <resource-name> <obj-name>

kubectl label pods bar color=red
kubectl label pods bar color-

kubectl logs <pod-name>
kubectl exec -it <pod-name> -- bash
kubectl attach -it <pod-name>
kubectl cp <pod-name>:</path/to/remote/file> </path/to/local/file>

kubectl get events
kubectl top nodes


Chapter 4. Pods

設計 Pod

設計 Pod 時,最關鍵問題是:「如果這些容器運行在不同的機器上,它們能否正常協作?」若答案是否定的,則將容器放入同一個 Pod 是合理的;若答案是肯定的,則使用多個 Pod 可能更為合適。

舉個例子,WordPress 服務和資料庫是否應該放在同一個 Pod 裡?

首先,WordPress 和資料庫並不是緊密耦合的應用。即使 WordPress 容器和資料庫容器運行在不同的機器上,它們依然可以通過網路有效協作。

其次,您可能不希望將 WordPress 和資料庫作為一個單元進行擴展。WordPress 是無狀態的,擴展其前端非常簡單,只需新增更多的 WordPress Pod。然而,擴展 MySQL 資料庫會比較困難,並且您可能希望為 MySQL 提供專屬的 Pod 和資源。

若將 WordPress 和 MySQL 放在同一個 Pod 中,則兩者的擴展將受到相同策略的限制,這樣的設計通常不夠靈活。

Pod 清單(Pod Manifest)

Kubernetes API 伺服器接收並處理 Pod 清單,並將其儲存於持久化儲存(etcd)中。調度器會透過 Kubernetes API 查找尚未調度到節點的 Pod。

只要有足夠的資源,調度器可以將多個 Pod 部署在同一台機器上。然而,將同一應用程式的多個副本部署在同一機器上會降低可靠性,因為這仍然屬於單一故障域。因此,Kubernetes 調度器會盡可能將來自相同應用程式的 Pod 分散到不同的機器上,以提高系統的可靠性。

資源利用

操作一台機器(無論是虛擬機還是實體機)的基本成本是固定的,不論它是閒置還是滿載。

大多數人選擇使用 Kubernetes 等容器和編排工具,因為它們能有效提高資源利用率,並在鏡像打包與可靠部署方面提供根本性的改進。除了簡化分散式系統開發的應用程式導向語法外,這些工具的另一大優勢是能夠提升叢集中運算節點的整體效能。


Chapter 5. Labels and Annotations

標籤是附加於 Kubernetes 物件(如 Pod 和 ReplicaSet)的鍵值對,用來為物件分組提供基礎。標籤的內容可以是任意的,通常用於識別與組織物件。

註解則是一種類似標籤的儲存機制,用來保存工具和庫可以利用的非識別資訊,通常是鍵值對的形式。

標籤(Label)

標籤是由鍵和值組成的鍵值對,且均由字串表示。標籤的鍵可以分為兩部分:可選的前綴與名稱,兩者由斜線(/)分隔。鍵的前綴(若有)必須符合 253 字元的 DNS 子網域規範;鍵名稱則必須小於 63 個字元,且以字母或數字開頭和結尾,中間可以包含破折號(-)、底線(_)或點(.)。

合法的標籤鍵範例包括:appVerapp.versionac.com/app-version

標籤的常用指令:

kubectl get deployments -L canary   # 列出標籤鍵值對
kubectl label deployments alpaca-test "canary-" # 移除標籤
kubectl get pods --show-labels # 列出標籤一覽表
kubectl get pods --selector="app=bandicoot,ver=2" # 列出指定標籤
kubectl get pods --selector="app in (alpaca,bandicoot)" # 列出指定標籤
kubectl get pods -l "ver=2,!canary" # 列出指定標籤

標籤除了幫助用戶組織基礎設施外,還在不同 Kubernetes 物件之間建立關聯。Kubernetes 是一個解耦的系統,沒有層次結構,所有元件獨立運作。但在某些情況下,物件間的關聯至關重要,這些關係通常由標籤和標籤選擇器來定義。

raw-image








附圖來源:Kubernetes: Up and Running, 3rd Edition 第五章節

註解(Annotations)

註解主要用於存儲工具本身或在外部系統間傳遞配置資訊。與標籤不同,註解並不用於識別和分組物件,而是提供有關物件來源、使用方式或相關策略的附加資訊。

註解的典型用途之一是在滾動部署期間,追蹤部署狀態並提供回滾所需的資訊。註解的鍵格式與標籤類似,但通常具有更強的「命名空間」意圖,例如:deployment.kubernetes.io/revisionkubernetes.io/changecause

此章總結

標籤用於識別並分組 Kubernetes 叢集中的物件,同時也用於進行選擇器查詢,靈活地將物件分組,例如 Pod。

註解則提供了物件範圍的非識別資訊,主要供自動化工具和客戶端庫使用,並可儲存外部工具(如第三方調度程序或監控工具)的配置資料。

標籤與註解是理解 Kubernetes 叢集如何協同工作的關鍵,能夠釋放 Kubernetes 的真正靈活性,並為建立自動化工具和部署流程奠定基礎。

參考資料

  1. https://github.com/kubernetes-up-and-running/kuard
  2. https://kind.sigs.k8s.io/
  3. https://github.com/bindrat/KUBERNETES/blob/main/Kubernetes_ Up and Running%2C 3rd Edition by Brendan Burns.epub
  4. https://docs.docker.com/reference/dockerfile/
留言
avatar-img
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
57內容數
test
林柏宇的沙龍的其他內容
2025/07/06
這篇文章詳細介紹了版本升級時的具體步驟與挑戰。透過逐步指導,包括檢查目標版本、參考官方文件及確認套件,讀者將能夠有效地處理升級過程中的問題,並且學會如何調整程式碼和容器設定。這不僅適用於 PHP 和 Laravel,也提供了對其他框架和語言升級的普遍性見解,幫助開發者減少升級過程中的不確定性。
Thumbnail
2025/07/06
這篇文章詳細介紹了版本升級時的具體步驟與挑戰。透過逐步指導,包括檢查目標版本、參考官方文件及確認套件,讀者將能夠有效地處理升級過程中的問題,並且學會如何調整程式碼和容器設定。這不僅適用於 PHP 和 Laravel,也提供了對其他框架和語言升級的普遍性見解,幫助開發者減少升級過程中的不確定性。
Thumbnail
2025/06/29
在本篇文章中,我將分享我在升級 PHP 版本過程中的經驗,並探討升級的重要性及其主要流程。升級不僅能修復漏洞,更能確保專案持續獲得支持。為了順利升級,我們需要確認目標版本、查閱官方文件、檢查套件相容性,並利用自動化測試來提高測試效率。本篇文章還將提供具體的升級步驟建議,幫助讀者有效地進行升級工作。
Thumbnail
2025/06/29
在本篇文章中,我將分享我在升級 PHP 版本過程中的經驗,並探討升級的重要性及其主要流程。升級不僅能修復漏洞,更能確保專案持續獲得支持。為了順利升級,我們需要確認目標版本、查閱官方文件、檢查套件相容性,並利用自動化測試來提高測試效率。本篇文章還將提供具體的升級步驟建議,幫助讀者有效地進行升級工作。
Thumbnail
2025/06/22
在當前的數位時代,安全性成為網頁設計與使用的關鍵。本篇文章將深入探討兩種常見的網頁攻擊手法:跨站請求偽造(CSRF)和跨站腳本攻擊(XSS)。CSRF 利用使用者對網站的信任,進行未經授權的操作,而 XSS 則是透過注入惡意腳本來偷取敏感資料。本文還提供了防範這些攻擊的實用措施,以提升網頁的安全性。
Thumbnail
2025/06/22
在當前的數位時代,安全性成為網頁設計與使用的關鍵。本篇文章將深入探討兩種常見的網頁攻擊手法:跨站請求偽造(CSRF)和跨站腳本攻擊(XSS)。CSRF 利用使用者對網站的信任,進行未經授權的操作,而 XSS 則是透過注入惡意腳本來偷取敏感資料。本文還提供了防範這些攻擊的實用措施,以提升網頁的安全性。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
這本書從 docker 的角度出發,介紹很多可重複使用的 pattern,除了翻譯某些地方有點怪之外,算是很有趣的一本書,後面很多的 pattern 可以想成是 sidecar 的進階使用方式,在不改變應用程式的情況下,增加不同的功能,相當實用。
Thumbnail
這本書從 docker 的角度出發,介紹很多可重複使用的 pattern,除了翻譯某些地方有點怪之外,算是很有趣的一本書,後面很多的 pattern 可以想成是 sidecar 的進階使用方式,在不改變應用程式的情況下,增加不同的功能,相當實用。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
引言 在當今的技術世界中,Kubernetes 已成為容器化應用的領導平台。作為一個高效的容器編排系統,它不僅管理著容器的部署和擴展,還提供了必要的自動化支持,以保證應用的高可用性和性能。在這個框架中,自動擴展功能起著至關重要的作用,特別是在面對不斷變化的負載和需求時。
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
前言 大家好在先前我們講了什麼是 Docker,Docker 好處有什麼以及怎麼安裝 Docker,今天我們要來開始初體驗 Docker 容器,使用後您會發現 Docker 非常的方便快速 Docker Hub 介紹 首先在開始學怎麼抓取 Docker Image 之前,我們要先來介紹 Doc
Thumbnail
本文將演示在安裝完 Kubernetes Cluster 後的基本元件安裝,包括 Calico/Calicoctl、Metric Server 和 Dashboard UI 的安裝方法以及相關問題與解決方式。
Thumbnail
本文將演示在安裝完 Kubernetes Cluster 後的基本元件安裝,包括 Calico/Calicoctl、Metric Server 和 Dashboard UI 的安裝方法以及相關問題與解決方式。
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
前言 上次我們講到 Docker 的功用與好處,今天我們要在講解,如何安裝 Docker 這個容器,讓我們在之後的教學應用更好的實作與練習,現在讓我們開始吧 Docker Engine 與 Docker Desktop 首先在講解怎麼安裝 Docker 時,我們先講解 Docker Engin
Thumbnail
這篇文章教你如何搭建Kubernetes Cluster,包括節點安裝前設定、軟體套件安裝、Control-Plane部署和加入運算節點等步驟。在建置之後,作者會分享一些基礎服務的安裝。希望這篇文章對你有所幫助。
Thumbnail
這篇文章教你如何搭建Kubernetes Cluster,包括節點安裝前設定、軟體套件安裝、Control-Plane部署和加入運算節點等步驟。在建置之後,作者會分享一些基礎服務的安裝。希望這篇文章對你有所幫助。
Thumbnail
本文章將說明如果您想要從頭建置一組具有Loadbalancer HA架構的Kubernetes Cluster時,你可能會需要做的事前準備工作。
Thumbnail
本文章將說明如果您想要從頭建置一組具有Loadbalancer HA架構的Kubernetes Cluster時,你可能會需要做的事前準備工作。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News