Kubernetes 已成為現代化基礎設施的根本,其應用範圍已深入各個產業。本文並非 Kubernetes 的入門教材,而是導向已有一定 Kubernetes 基礎的 DevOps 工程師,旨在提供更進階的實戰技巧。本文內容涵蓋服務、負載平衡、外部 DNS、RBAC 策略、安全稽核、備份還原、自動化平台搭建等企業級應用所需的核心技術,並以例項說明如何應對生產環境的挑戰。透過本文,讀者能深入理解 Kubernetes 的架構和運作機制,掌握構建高用性、高安全性、可擴充套件的容器化應用平台的最佳實踐。
Kubernetes 與 Docker 企業:容器化應用程式、整合企業系統及擴充套件企業應用
在快速變化的科技產業中,創新步伐從未減緩。容器和 Kubernetes 社群正是這種現象的最佳體現。自 2014 年中首次發布以來,Kubernetes 不僅以指數級速度成長,更徹底改變了軟體開發、基礎設施、安全性和持續交付等產業。短短幾年間,Kubernetes 及其相關概念已經改變了未來 10 年乃至更長時間內我們交付技術的方式。
瞭解 Kubernetes 的基本概念
在與客戶交流的過程中,我們發現保持與時俱進是利用容器和 Kubernetes 的一大挑戰。要應對這種持續的變化,最有用的工具是對基本概念和工具的深入瞭解。如果能夠理解 Kubernetes 的運作原理,那麼 Kubernetes 生態系統中的頻繁成長和變化就會變成可被利用的工具,而不是令人煩惱的變化。然而,要對像 Kubernetes 這樣複雜的系統有深入的瞭解,唯一的途徑就是在多種場景中累積使用經驗。
本文的價值
Marc 和 Scott 在 Kubernetes 和 Docker 方面擁有豐富的經驗。《Kubernetes 和 Docker 企業》中的例項正是根據他們的經驗,能夠幫助讀者從雜亂的資訊中篩選出有用的知識,掌握基本技能。當讀者瞭解了構成 Kubernetes 的各個元件之間的關係、容器執行環境(如 Docker)以及主機作業系統之間的關係時,就開始培養出使容器成為革命性技術的技能。
閱讀與實踐
在閱讀本文各章節並在自己的環境中實踐例子的過程中,請花一點時間思考一下你所做的事情如何能夠帶來實際價值,並幫助解決你所面臨的挑戰。Kubernetes 和容器已經改變了我們的產業格局,因為它們提供了一種更有效的方式來為我們的終端使用者創造價值。專注於這種價值將有助於你將其融入自己的解決方案中,並為自己的終端使用者實作這一承諾。
內容解密:
本文的前言強調了理解 Kubernetes 基本概念的重要性,並介紹了作者的經驗和本文的價值。讀者將透過本文獲得實用的知識和技能,以應對容器和 Kubernetes 帶來的挑戰。
為何選擇容器和 Kubernetes?
容器和 Kubernetes 的興起並非偶然。它們解決了傳統軟體開發和佈署過程中的許多問題,如環境不一致、佈署困難和資源利用率低等。透過容器化技術,開發者能夠將應用程式及其依賴項封裝成一個標準化的單元,從而實作跨環境的一致性和可移植性。
Kubernetes 的核心優勢
Kubernetes 作為一個容器協調平台,能夠自動化容器的佈署、擴充套件和管理。它提供了以下核心優勢:
- 自動化佈署和回復:Kubernetes 能夠自動化佈署新版本,並在必要時回復到之前的版本。
- 自我修復:當容器失敗時,Kubernetes 能夠自動重新啟動它們。
- 資源管理:Kubernetes 能夠有效地管理和分配叢集資源。
- 可擴充套件性:Kubernetes 支援橫向擴充套件,能夠根據需求增加或減少容器數量。
隨著 Kubernetes 和容器技術的不斷成熟,我們可以預見它們將在未來的軟體開發和佈署中扮演越來越重要的角色。企業需要能夠有效地利用這些技術,以保持競爭力。
內容解密:
本文介紹了容器和 Kubernetes 的優勢,以及它們如何改變軟體開發和佈署的方式。透過瞭解這些技術的核心價值,企業能夠更好地利用它們來推動創新和成長。
深入理解容器化技術與 Kubernetes 基礎
容器化技術的必要性與 Docker 介紹
隨著現代軟體開發和佈署需求的不斷演變,容器化技術已成為提升開發效率和系統穩定性的重要工具。容器化技術允許開發者將應用程式及其依賴封裝成一個獨立的單元,從而實作跨環境的一致性執行。Docker 是目前最流行的容器化平台之一,它透過提供輕量級的虛擬化技術,使應用程式能夠在不同的環境中快速佈署和執行。
Docker 的核心概念
容器是短暫的:Docker 容器是臨時性的,當容器被刪除時,其內部的資料也會丟失。因此,需要持久化資料時,必須使用 Docker 卷或繫結掛載。
Docker 映象:Docker 映象是建立容器的基礎,它包含了執行應用程式所需的全部檔案和組態。映象由多個層組成,每一層代表了映象構建過程中的一步。
持久化資料:為了在容器重新啟動或刪除後保留資料,Docker 提供了卷(Volume)、繫結掛載(Bind Mount)和 tmpfs 掛載等多種持久化資料的方法。
存取容器內服務:透過將容器的埠對映到主機的埠,可以從外部存取容器內執行的服務。
Docker 的安裝與使用
安裝 Docker:在 Ubuntu 系統上安裝 Docker 需要更新軟體包列表、安裝必要的依賴,並新增 Docker 的官方 GPG 金鑰和軟體源。
Docker CLI:Docker 提供了豐富的命令列工具,用於管理容器、映象和卷。常用的命令包括
docker run、docker ps、docker exec和docker logs等。
Kubernetes 基礎與 KinD
Kubernetes 是一個開源的容器協調平台,用於自動佈署、擴充套件和管理容器化應用程式。KinD(Kubernetes-in-Docker)是一種在 Docker 容器中執行 Kubernetes 叢集的工具,非常適合用於開發和測試環境。
Kubernetes 的核心元件
控制平面:控制平面是 Kubernetes 的核心,負責管理叢集的狀態。它包括 API 伺服器、Etcd 資料函式庫、排程器和控制器管理器等元件。
工作節點:工作節點是執行應用程式容器的機器。每個工作節點上都執行著 kubelet、kube-proxy 和容器執行時等元件。
使用 KinD 佈署 Kubernetes 叢集
安裝 KinD:安裝 KinD 需要先滿足其前置條件,然後下載並安裝 KinD 二進位制檔案。
建立 KinD 叢集:透過 KinD,可以建立單節點或多節點的 Kubernetes 叢集。KinD 支援自定義叢集組態,包括控制平面和工作節點的設定。
安裝 Calico 和 Ingress 控制器:在 KinD 叢集中,可以安裝 Calico 作為網路外掛,以及 Ingress 控制器來管理外部流量進入叢集。
內容解密:
本文全面介紹了容器化技術的重要性以及 Docker 和 Kubernetes 的基礎知識。首先,解釋了容器化技術如何提升開發效率和系統穩定性。接著,詳細說明瞭 Docker 的核心概念,如容器的短暫性、Docker 映象的層級結構、以及持久化資料的方法。同時,介紹了 Docker 的安裝步驟和常用的命令列工具。然後,轉向 Kubernetes 的介紹,涵蓋了其核心元件,如控制平面和工作節點,以及使用 KinD 佈署 Kubernetes 叢集的方法,包括安裝 KinD、建立叢集和安裝必要的外掛。最後,總結了本文的主要內容,以幫助讀者更好地理解和應用這些技術。
Kubernetes企業級應用實戰
第6章:服務、負載平衡和外部DNS
技術需求與工作負載暴露
在現代的雲原生應用中,將工作負載暴露給外部請求是一個基本需求。本章將探討Kubernetes中的服務(Service)概念、不同型別的服務、以及如何使用負載平衡器(Load Balancer)和外部DNS來實作高效的流量管理。
瞭解服務的工作原理
在Kubernetes中,服務是一種抽象,用於定義一組Pod的存取策略。服務透過標籤選擇器(Label Selector)來確定其所管理的Pod。當建立一個服務時,Kubernetes會為其分配一個虛擬IP(ClusterIP),該IP用於在叢集內部存取服務。
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example-app
ports:
- name: http
port: 80
targetPort: 8080
type: ClusterIP
內容解密:
此YAML檔案定義了一個名為example-service的服務,它選擇標籤為app: example-app的Pod,並將80埠的流量轉發到Pod的8080埠。服務的型別被設定為ClusterIP,表示該服務僅在叢集內部可存取。
不同型別的服務
Kubernetes支援多種型別的服務,包括:
- ClusterIP:預設型別,僅在叢集內部可存取。
- NodePort:透過每個節點的特定埠暴露服務。
- LoadBalancer:在支援的雲平台上建立一個負載平衡器來暴露服務。
- ExternalName:將服務對映到一個DNS名稱。
負載平衡器簡介
負載平衡器用於將外部流量分配到後端的多個Pod上,從而提高應用的可用性和可擴充套件性。Kubernetes支援多種負載平衡器,包括Layer 4和Layer 7負載平衡器。
Layer 7負載平衡器
Layer 7負載平衡器工作在應用層,能夠根據HTTP請求的內容進行路由決策。Kubernetes中的Ingress資源用於組態Layer 7負載平衡器。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
內容解密:
此Ingress資源定義了一個規則,將對example.com的請求路由到example-service服務的80埠。
使用MetalLB作為Layer 4負載平衡器
MetalLB是一個用於裸機Kubernetes叢集的負載平衡器實作。它提供了Layer 4的負載平衡功能。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
內容解密:
此ConfigMap組態了MetalLB使用Layer 2模式,並分配了一個IP地址池。
前言
Kubernetes 已成為開發維運(DevOps)團隊開發、測試和執行應用的標準基礎設施,全球大多數企業要麼已經採用它,要麼計劃在未來一年內實施。從各大徵才網站的職位發布來看,幾乎每家知名企業都有 Kubernetes 相關職位的需求。過去四年中,Kubernetes 相關職位的增長速度超過 2000%,顯示出這一技術的快速普及。
然而,企業在面對 Kubernetes 的採用時,普遍面臨的一個挑戰是缺乏相關的專業知識。由於 Kubernetes 技術相對較新,尤其是在生產環境中的應用經驗更為有限,因此企業在組建可靠維運團隊時遭遇困難。雖然具備基礎 Kubernetes 技能的人才越來越容易找到,但具備企業級叢集所需的高階知識的人才仍屬稀缺。
本文讀者
本文旨在幫助 DevOps 團隊擴充套件其在 Kubernetes 之外的技能,內容源自我們在多個企業環境中管理叢集的豐富經驗。
目前市面上有許多介紹 Kubernetes 基礎知識的書籍,包括叢集安裝、佈署建立和 Kubernetes 物件的使用等。然而,我們希望創造一本能夠超越基礎叢集建設的書籍,並避免重複介紹 Kubernetes 的基礎知識。因此,我們假設讀者已經具備一定的 Kubernetes 使用經驗。
雖然本文的主要重點是擴充套件叢集的企業級功能,但第一部分仍會複習關鍵的 Docker 主題和 Kubernetes 物件。深入理解 Kubernetes 物件對於充分掌握後續更進階章節的內容至關重要。
本文涵蓋內容
第一章:理解 Docker 和容器基礎
本章將介紹 Docker 和 Kubernetes 如何解決開發人員面臨的問題,並探討 Docker 的不同方面,包括 Docker 守護程式、資料、安裝和使用 Docker CLI。
第二章:使用 Docker 資料
本章討論容器如何儲存資料,不同使用場景對資料永續性的需求,以及如何使用 Docker 的資料卷、繫結掛載和 tmpfs 儲存資料。
第三章:理解 Docker 網路
本章介紹 Docker 中的網路功能,包括建立不同型別的網路、新增和移除容器網路,以及暴露容器服務。
第四章:使用 KinD 佈署 Kubernetes
本章展示 KinD 如何成為建立 Kubernetes 叢集的有力工具,從單節點叢集到完整的多節點叢集,並詳細說明如何使用 HAproxy 負載平衡器來負載平衡工作節點。
第五章:Kubernetes 入門
本章涵蓋叢集中包含的大多數物件,無論是需要複習 Kubernetes 基礎知識還是剛剛接觸該平台。本章旨在作為物件的快速參考,而非每個物件的詳盡。
第六章:服務、負載平衡和外部 DNS
本章教導如何使用服務暴露 Kubernetes 佈署,每種服務型別的示例,以及如何透過 Layer-7 和 Layer-4 負載平衡器暴露服務。
第七章:將身份驗證整合到叢集中
本章討論使用者如何存取已構建的叢集,詳細介紹 OpenID Connect 的工作原理及其在叢集存取中的重要性,並闡述應避免的反模式。
第八章:RBAC 策略和稽核
本章演示如何在使用者存取叢集後限制其許可權,詳細介紹如何設計 RBAC 策略、除錯策略以及多租戶的不同策略。
第九章:保護 Kubernetes 控制檯
本章探討 Kubernetes 控制檯的安全架構、正確的安全組態方法,以及不當佈署的示例和原因。
第十章:建立 Pod 安全策略
本章討論如何安全地設計容器以防止濫用,並建立策略以限制容器存取不需要的資源,同時介紹 PodSecurityPolicy API 的棄用及其處理方法。
第十一章:使用 Open Policy Agent 擴充套件安全性
本章指導如何佈署 OpenPolicyAgent 和 GateKeeper 以啟用無法透過 RBAC 或 PodSecurityPolicies 實作的策略,並介紹如何編寫 Rego 策略以及使用 OPA 的內建測試框架測試策略。
第十二章:使用 Falco 和 EFK 進行稽核
本章討論 Kubernetes 的事件日誌記錄功能,並介紹如何使用 Falco 和 EFK(ElasticSearch、FluentD 和 Kibana)堆積疊捕捉和分析事件。
第十三章:備份工作負載
本章教導如何使用 Velero 為叢集工作負載建立備份,以實作災難還原或叢集遷移,並透過示例進行實際操作演示。
第十四章:組態平台
本章指導如何使用 GitLab、Tekton、ArgoCD 和 OpenUnison 自動化多租戶叢集的平台搭建,並探索如何自動建立Pipeline以及建立自助式工作流程以自動化Pipeline的佈署。
如何充分利用本文
要充分利用本文,您應該具備Linux的基本知識、基本命令以及Git和文字編輯器(如vi)的使用經驗。
本文的章節包含了理論和實作練習。我們認為這些練習有助於加強對理論的理解,但它們並不是理解每個主題的必要條件。如果您想進行本文中的練習,您需要滿足下表中列出的要求:
所有練習都是使用Ubuntu進行的,但大多數練習在其他Linux發行版上也能正常運作。Falco章節有一些特定的步驟是針對Ubuntu的,在其他Linux發行版上佈署可能會失敗。
如果您使用的是本文的電子版,我們建議您自己輸入程式碼或透過GitHub儲存函式庫(連結在下一節中提供)存取程式碼。這樣可以幫助您避免因複製和貼上程式碼而導致的潛在錯誤。
下載示例程式碼檔案
下載程式碼檔案的步驟如下:
- 登入或註冊www.packt.com。
- 選擇“Support”選項卡。
- 點選“Code Downloads”。
- 在搜尋框中輸入書名,並按照螢幕上的指示進行操作。
下載檔案後,請確保使用最新版本的以下軟體解壓或提取資料夾:
- Windows:WinRAR/7-Zip
- Mac:Zipeg/iZip/UnRarX
- Linux:7-Zip/PeaZip
程式碼實作影片
本文的程式碼實作影片可以在http://bit.ly/2OQfDum上觀看。
下載彩色圖片
本文使用的慣例
本文中使用了多種文字慣例。
程式碼在文字中
在文字中表示程式碼詞、資料函式庫表名、資料夾名稱、檔名、副檔名、路徑名、虛擬URL、使用者輸入和Twitter控制程式碼。例如:“要識別的最後一個元件是apiGroups。這是URL模型中不一致性的另一個方面。”
程式碼區塊
程式碼區塊如下所示:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-pod-and-pod-logs-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
重點程式碼行
當我們希望引起您對程式碼區塊的特定部分的注意時,相關的行或專案將以粗體顯示:
- hostPath:
path: /usr/share/ca-certificates
type: DirectoryOrCreate
name: usr-share-ca-certificates
- hostPath:
path: /var/log/k8s
type: DirectoryOrCreate
name: var-log-k8s
- hostPath:
path: /etc/kubernetes/audit
type: DirectoryOrCreate
name: etc-kubernetes-audit
命令列輸入或輸出
命令列輸入或輸出如下所示:
PS C:\Users\mlb> kubectl create ns not-going-to-work
namespace/not-going-to-work created
粗體文字
粗體文字表示新術語、重要詞語或您在螢幕上看到的詞語。例如,選單或對話方塊中的詞語會以這種方式出現在文字中。下面是一個例子:“點選螢幕底部的Finish Login按鈕。”
提示或重要說明
提示或重要說明會以這種方式出現。
聯絡我們
我們始終歡迎讀者的反饋。
一般反饋
如果您對本文的任何方面有疑問,請在郵件主題中提及書名,然後傳送電子郵件至customercare@packtpub.com。