Kubernetes 的 kubectl 命令列工具是與叢集互動的核心,而 kubeconfig 檔案則儲存了連線叢集所需的資訊。理解這兩個元件對於管理 Kubernetes 至關重要。kubectl 簡化了與 Kubernetes API 的互動,透過它可以執行各種操作,例如建立、檢視、更新和刪除資源。kubeconfig 檔案包含了叢集的連線資訊、使用者憑證和上下文,讓 kubectl 知道如何連線到正確的叢集。透過設定 kubeconfig,可以輕鬆管理多個叢集和不同使用者許可權。kubectl 支援指令式和宣告式兩種語法,指令式語法直接指示 Kubernetes 執行特定動作,而宣告式語法則描述期望的叢集狀態,讓 Kubernetes 自動調整資源以符合預期。此外,kubectl 還提供自動補全功能,提升操作效率。
Kubernetes架構深度解析:從容器映像檔到運作中的Pod
kube-proxy元件的重要性
Kubernetes的網路功能是其核心特色之一。未來我們將探討網路相關議題,但首先需要了解Kubernetes如何將Pod暴露給外部世界或在叢集內部互相通訊。這些機制主要由kube-proxy元件實作;也就是說,每個工作節點都需要執行一個kube-proxy例項,以確保在其上執行的Pod可被存取。我們將探討Kubernetes中的Service功能,它是在kube-proxy元件層級實作的。與kubelet類別似,kube-proxy元件也與kube-apiserver元件進行通訊。
除了kube-proxy之外,還有其他子元件或擴充套件功能在計算節點層級運作,例如cAdvisor或容器網路介面(CNI)。然而,這些屬於進階主題,將在後續章節中討論。
探索kubectl命令列工具與YAML語法
kubectl是官方提供的命令列工具,用於管理Kubernetes平台。它是一個針對Kubernetes API進行最佳化的HTTP客戶端,能夠向Kubernetes叢集發出命令。
安裝kubectl命令列工具
kubectl可以安裝在Linux、Windows或macOS工作站上。為了保持最佳相容性,需要確保kubectl客戶端版本與Kubernetes叢集版本之間的差異不超過一個次要版本。例如,v1.30版本的kubectl可以管理v1.29、v1.30和v1.31版本的叢集。保持在最新的相容版本有助於避免潛在問題。
Kubernetes與Linux基礎學習環境
對於容器和相關主題的學習,使用Linux作業系統的工作站或實驗機是最有效的。具備Linux基礎知識對於使用容器和Kubernetes至關重要。在Linux環境下工作可以使學習體驗更佳。您可以選擇喜歡的Linux發行版,如Fedora、Ubuntu等。然而,並非強制要求使用Linux作業系統來學習Kubernetes;Windows使用者可以使用Windows Subsystem for Linux(WSL)等替代方案。
重大變更:Kubernetes套件倉函式庫更新
自2024年1月起,舊有的Linux套件倉函式庫(apt.kubernetes.io和yum.kubernetes.io)已被凍結,並不再可用。使用者應遷移到新的由社群維護的套件倉函式庫(pkgs.k8s.io)。這一變更影響直接安裝上游Kubernetes版本的使用者,以及使用舊有套件倉函式庫安裝kubectl的使用者。
在Linux上安裝kubectl
要在Linux上安裝kubectl,需要下載kubectl工具並將其複製到可執行路徑:
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ kubectl version
內容解密:
- 使用
curl命令下載最新版本的kubectl工具。 chmod +x ./kubectl賦予下載的kubectl檔案執行許可權。- 將kubectl移動到
/usr/local/bin/目錄下,以便於在任何地方呼叫。 - 執行
kubectl version以驗證安裝是否成功。
請注意,如果您的系統中/usr/local/bin/不在PATH環境變數中,您需要將其新增至PATH,或將kubectl安裝到其他已包含在PATH中的目錄。
在macOS上安裝kubectl
macOS使用者的安裝步驟與Linux類別似,但需要根據macOS的特定路徑進行調整。
# macOS安裝範例(假設使用Homebrew)
$ brew install kubectl
內容解密:
- 使用Homebrew套件管理器安裝kubectl。
- 安裝完成後,可以直接使用
kubectl version檢查版本。
版本控制與相容性考量
選擇適合的kubectl版本對於確保與Kubernetes叢集的相容性至關重要。務必參考官方檔案以取得最新資訊。
Kubernetes架構:從容器映像檔到運作中的Pod - 安裝kubectl與其重要性
Kubernetes的管理與操作,離不開一個重要的命令列工具:kubectl。在本文中,我們將探討如何在不同作業系統上安裝kubectl,以及它在Kubernetes架構中的角色。
在macOS上安裝kubectl
在macOS上安裝kubectl需要根據你的硬體架構(Intel或Apple Silicon)選擇適當的安裝包。以下是具體步驟:
# 針對Intel處理器
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
# 針對Apple Silicon
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ sudo chown root: /usr/local/bin/kubectl
內容解密:
- 根據硬體架構下載kubectl:使用
curl命令下載適合你macOS系統的kubectl版本。 - 賦予執行許可權:使用
chmod +x ./kubectl命令使下載的kubectl檔案具有執行許可權。 - 移動到系統路徑:將
kubectl移動到/usr/local/bin/目錄下,以便在任何地方都能呼叫它。 - 更改所有權:使用
sudo chown root: /usr/local/bin/kubectl確保kubectl的所有權正確。
在Windows上安裝kubectl
在Windows上,你可以透過下載kubectl.exe檔案並將其路徑加入到環境變數中來安裝。
$ curl.exe -LO https://dl.k8s.io/release/v1.28.4/bin/windows/amd64/kubectl.exe
下載完成後,請確保將kubectl.exe所在的資料夾加入到你的PATH環境變數中。
內容解密:
- 下載kubectl.exe:使用
curl.exe命令下載Windows版本的kubectl。 - 更新PATH環境變數:將包含
kubectl.exe的資料夾加入PATH變數,使其能在命令提示字元或PowerShell中直接呼叫。
kubectl的角色
由於kube-apiserver本質上是一個HTTP API,理論上任何HTTP客戶端都可以與Kubernetes叢集互動。然而,直接使用curl等工具來管理叢集不僅繁瑣,而且難以記住每個資源的URL路徑和正確的HTTP請求格式。kubectl正是為瞭解決這些問題而設計的,它簡化了與Kubernetes叢集的互動過程。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title kubectl的角色
rectangle "HTTP請求" as node1
rectangle "讀取/更新狀態" as node2
rectangle "儲存叢集狀態" as node3
rectangle "傳送指令" as node4
rectangle "管理容器" as node5
node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5
@enduml此圖示展示了kubectl如何透過kube-apiserver與Kubernetes叢集互動,包括讀取和更新叢集狀態,以及最終在工作節點上管理容器。
內容解密:
kubectl傳送HTTP請求:根據使用者輸入的命令,kubectl建構並傳送HTTP請求給kube-apiserver。kube-apiserver處理請求:接收到請求後,kube-apiserver會根據請求內容讀取或更新儲存在etcd中的叢集狀態。etcd儲存叢集狀態:作為Kubernetes的資料函式庫,etcd儲存了叢集的當前狀態和組態。- 工作節點執行指令:根據
kube-apiserver的指示,工作節點上的元件會執行相應的操作,如啟動或更新容器。
kubectl的工作原理
當你執行kubectl命令時,它會嘗試從預設位置(通常是 $HOME/.kube/config)讀取一個名為 kubeconfig 的組態檔案。這個檔案包含了連線到Kubernetes叢集所需的認證資訊和叢集細節。
kubeconfig檔案的結構
apiVersion: v1
kind: Config
clusters:
- name: my-cluster
cluster:
server: https://my-cluster.example.com
users:
- name: my-user
user:
client-certificate: /path/to/cert.crt
client-key: /path/to/cert.key
contexts:
- name: my-context
context:
cluster: my-cluster
user: my-user
current-context: my-context
內容解密:
clusters:定義了叢集的資訊,包括API伺服器的URL。users:定義了用於認證的使用者資訊,如客戶端憑證和金鑰。contexts:定義了使用者與叢集之間的對映關係,即哪個使用者應該用於哪個叢集。current-context:指定了當前使用的上下文,即目前操作的叢集和使用者組合。
綜上所述,掌握 kubectl 的使用對於有效管理Kubernetes叢集至關重要。透過瞭解其安裝、組態及工作原理,你可以更加高效地與Kubernetes叢集互動,實作自動化佈署、擴充套件和管理容器化應用。
Kubernetes 組態與管理:深入理解 kubeconfig 與 kubectl
Kubernetes 的組態與管理是其操作的核心部分,而 kubeconfig 檔案與 kubectl 命令列工具則是實作這些功能的重要元件。本章將探討 kubeconfig 的結構、kubectl 的使用方法,以及如何透過指令式和宣告式語法來管理 Kubernetes 叢集。
kubeconfig 檔案結構
kubeconfig 檔案是用於儲存 Kubernetes 叢集的組態資訊,包括叢集位址、使用者憑證以及上下文環境等。該檔案通常位於 $HOME/.kube/config,但也可以透過設定 KUBECONFIG 環境變數或使用 --kubeconfig 引數來指定其他路徑。
叢集(Clusters)、使用者(Users)與上下文(Contexts)
- 叢集:定義了 Kubernetes 叢集的相關資訊,如伺服器位址、API 版本和憑證授權單位的詳細資訊,使
kubectl能夠連線並向叢集傳送命令。 - 使用者:儲存用於存取 Kubernetes 叢集的使用者憑證,通常包括使用者名稱和用於與 API 伺服器進行身份驗證的秘密(如令牌或客戶端憑證)。
- 上下文:作為叢集與使用者之間的橋樑,每個上下文參考一個特定的叢集和該叢集中的特定使用者。透過選擇上下文,可以定義
kubectl在後續命令中使用的叢集和使用者憑證。
使用 kubectl 管理 Kubernetes 叢集
kubectl 是 Kubernetes 的命令列工具,用於與叢集進行互動。以下是一些基本操作:
檢視目前使用的 kubeconfig 檔案
$ kubectl config view
列出 Pod 資源
$ kubectl get pods
這個命令會向 kube-apiserver 傳送 GET 請求,以檢索叢集上的 Pod 清單。
建立 Pod
$ kubectl run nginx --restart Never --image nginx
這條命令會傳送 POST 請求到 kube-apiserver,根據 nginx 映像建立一個名為 nginx 的 Pod。
kubectl 自動補全
kubectl 提供內建的自動補全功能,支援多種 shell,如 Bash、Zsh、Fish 和 PowerShell。以 Linux Bash 為例,可以透過以下步驟啟用自動補全:
安裝 Bash Completion(如果尚未安裝)
$ sudo yum install bash-completion # 適用於根據 RPM 的系統 $ sudo apt install bash-completion # 適用於根據 Debian/Ubuntu 的系統將自動補全設定新增到 shell 組態檔案中
$ echo 'source <(kubectl completion bash)' >> ~/.bashrc
啟用後,當輸入 kubectl 命令時,按下 Tab 鍵即可觸發自動補全。
指令式語法與宣告式語法
Kubernetes 支援兩種語法:指令式和宣告式。
指令式語法
指令式語法直接修改叢集狀態,適用於快速執行特定操作,如建立、列出或刪除資源。
# 建立 Pod
$ kubectl run my-pod --restart Never --image busybox:latest
# 列出 ReplicaSet 資源
$ kubectl get rs -n my-namespace
# 刪除 Pod
$ kubectl delete pods my-pod
雖然指令式語法操作簡單快捷,但難以記錄和管理對叢集所做的變更。
宣告式語法
宣告式語法則是定義期望的叢集狀態,由 Kubernetes 自動建立或調整資源以達成該狀態。YAML 是宣告式組態的常用格式。
# 示例 YAML 組態檔案內容
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox:latest
restartPolicy: Never
宣告式語法便於版本控制和重複佈署,適合用於生產環境的管理。
Kubernetes 組態與管理:深入理解 kubeconfig 與 kubectl
Kubernetes 組態檔案 kubeconfig 詳解
Kubernetes 的組態檔案通常稱為 kubeconfig,它是用來儲存存取 Kubernetes 叢集所需的組態資訊。此檔案通常位於 $HOME/.kube/config,但也可以透過環境變數 KUBECONFIG 或 --kubeconfig 引數來指定其他路徑。
kubeconfig 結構詳解
在前面的圖表中,有多個叢集、使用者和上下文被組態其中:
- 叢集 (Clusters):此部分定義了可以與之互動的 Kubernetes 叢集。它包含每個叢集的伺服器位址、API 版本以及憑證授權單位 (CA) 的詳細資訊,使
kubectl能夠連線並向這些叢集傳送命令。 - 使用者 (Users):此部分儲存了用於存取 Kubernetes 叢集的使用者憑證。通常包括使用者名稱和用於身份驗證的秘密(如令牌或客戶端憑證)。
- 上下文 (Contexts):作為叢集與使用者之間的橋樑,每個上下文參考一個特定的叢集和該叢集中的特定使用者。透過選擇上下文,可以定義
kubectl在後續命令中使用的叢集和使用者憑證。
kubeconfig 管理多個叢集與使用者
透過在 kubeconfig 檔案中組態多個叢集、使用者和上下文,可以輕鬆地在不同的 Kubernetes 叢集之間切換,並使用不同的使用者憑證。
設定 kubeconfig 路徑
可以透過以下兩種方式覆寫系統上的 kubeconfig 路徑:
- 設定環境變數
KUBECONFIG$ export KUBECONFIG="/custom/path/.kube/config" - 使用
--kubeconfig引數呼叫kubectl$ kubectl --kubeconfig="/custom/path/.kube/config"
kubectl 載入組態檔案的順序
每次執行 kubectl 命令時,它都會按照以下順序尋找 kubeconfig 檔案來載入組態:
- 首先檢查是否傳遞了
--kubeconfig引數,並載入指定的組態檔案。 - 如果未找到組態檔案,則檢查是否存在
KUBECONFIG環境變數。 - 最終,如果以上兩者都未設定,則預設載入
$HOME/.kube/config檔案。
檢視當前使用的 kubeconfig 組態檔案
要檢視當前本地 kubectl 安裝使用的組態檔案,可以執行以下命令:
$ kubectl config view
然後,HTTP 請求將被傳送到 kube-apiserver,它會產生一個 HTTP 回應,kubectl 將其重新格式化為人類可讀的格式並輸出到終端。
常用的 kubectl 命令
以下是使用 Kubernetes 時每天可能會輸入的命令:
$ kubectl get pods
該命令列出了 Pods。它本質上會向 kube-apiserver 發出 GET 請求,以檢索叢集上的容器(Pods)列表。在內部,kubectl 將傳遞給命令的 Pods 引數關聯到 /api/v1/pods URL 路徑,這是 kube-apiserver 用來公開 Pod 資源的路徑。
再來看另一個例子:
$ kubectl run nginx --restart Never --image nginx
這個命令稍微複雜一些,因為 run 不是 HTTP 方法。此命令將對 kube-apiserver 元件發出 POST 請求,從而建立一個名為 nginx 的容器,該容器根據託管在容器登入檔(例如 Docker Hub 或 quay.io)上的 nginx 映象。
從容器映像到執行中的 Pods
我們將在第4章《在 Kubernetes 中執行您的容器》中詳細討論 Pod 資源。目前只需知道,這個命令實際上建立了一個 Pod,而不是單純的容器。
kubectl 自動補全功能
為了節省時間並減少挫敗感,kubectl 提供了一個內建的自動補全功能,支援多種 shell,包括 Bash、Zsh、Fish 和 PowerShell。以 Linux Bash 為例,可以透過以下步驟啟用自動補全:
# 安裝 Bash Completion(如果需要)
$ sudo yum install bash-completion # 適用於根據 RPM 的系統
$ sudo apt install bash-completion # 適用於根據 Debian/Ubuntu 的系統
# 將 source 行新增到 shell 組態檔案中
$ echo 'source <(kubectl completion bash)' >> ~/.bashrc
現在,當開始輸入 kubectl 命令時,只需按下 Tab 鍵,kubectl 就會根據可用的資源和選項提供補全建議。
使用指令式語法管理 Kubernetes 資源
幾乎每條透過 kubectl 傳送到 kube-apiserver 的指令都可以使用兩種語法來編寫:指令式和宣告式。指令式語法專注於發出直接修改叢集狀態的命令,這些命令根據傳遞給 kubectl 命令的引數和選項。
以下是一些指令式操作的例子:
# 根據 busybox:latest 容器映像建立一個名為 my-pod 的 Pod
$ kubectl run my-pod --restart Never --image busybox:latest
# 列出 my-namespace 名稱空間中建立的所有 ReplicaSet 資源
$ kubectl get rs -n my-namespace
# 刪除 default 名稱空間中的名為 my-pod 的 Pod
$ kubectl delete pods my-pod
指令式語法的優點包括操作簡單快捷。然而,它的缺點是難以記錄和管理對叢集所做的變更。如果因某些原因丟失了叢集的狀態,並需要從頭開始重建,將很難記住之前輸入的所有指令式命令。
使用宣告式語法管理 Kubernetes 資源
宣告式語法允許使用者宣告期望的叢集狀態,然後由 Kubernetes 自動建立或調整資源以達成該狀態。Kubernetes 使用 YAML 或 JSON 格式來定義這些組態,其中 YAML 因其簡潔性而更受歡迎。
YAML 示例組態:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox:latest
restartPolicy: Never
宣告式語法便於版本控制和重複佈署,因此更適合生產環境的管理。