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

內容解密:

  1. 使用curl命令下載最新版本的kubectl工具。
  2. chmod +x ./kubectl賦予下載的kubectl檔案執行許可權。
  3. 將kubectl移動到/usr/local/bin/目錄下,以便於在任何地方呼叫。
  4. 執行kubectl version以驗證安裝是否成功。

請注意,如果您的系統中/usr/local/bin/不在PATH環境變數中,您需要將其新增至PATH,或將kubectl安裝到其他已包含在PATH中的目錄。

在macOS上安裝kubectl

macOS使用者的安裝步驟與Linux類別似,但需要根據macOS的特定路徑進行調整。

# macOS安裝範例(假設使用Homebrew)
$ brew install kubectl

內容解密:

  1. 使用Homebrew套件管理器安裝kubectl。
  2. 安裝完成後,可以直接使用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

內容解密:

  1. 根據硬體架構下載kubectl:使用curl命令下載適合你macOS系統的kubectl版本。
  2. 賦予執行許可權:使用chmod +x ./kubectl命令使下載的kubectl檔案具有執行許可權。
  3. 移動到系統路徑:將kubectl移動到/usr/local/bin/目錄下,以便在任何地方都能呼叫它。
  4. 更改所有權:使用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環境變數中。

內容解密:

  1. 下載kubectl.exe:使用curl.exe命令下載Windows版本的kubectl
  2. 更新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叢集互動,包括讀取和更新叢集狀態,以及最終在工作節點上管理容器。

內容解密:

  1. kubectl傳送HTTP請求:根據使用者輸入的命令,kubectl建構並傳送HTTP請求給kube-apiserver
  2. kube-apiserver處理請求:接收到請求後,kube-apiserver會根據請求內容讀取或更新儲存在etcd中的叢集狀態。
  3. etcd儲存叢集狀態:作為Kubernetes的資料函式庫,etcd儲存了叢集的當前狀態和組態。
  4. 工作節點執行指令:根據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

內容解密:

  1. clusters:定義了叢集的資訊,包括API伺服器的URL。
  2. users:定義了用於認證的使用者資訊,如客戶端憑證和金鑰。
  3. contexts:定義了使用者與叢集之間的對映關係,即哪個使用者應該用於哪個叢集。
  4. 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 為例,可以透過以下步驟啟用自動補全:

  1. 安裝 Bash Completion(如果尚未安裝)

    $ sudo yum install bash-completion # 適用於根據 RPM 的系統
    $ sudo apt install bash-completion # 適用於根據 Debian/Ubuntu 的系統
    
  2. 將自動補全設定新增到 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 路徑:

  1. 設定環境變數 KUBECONFIG
    $ export KUBECONFIG="/custom/path/.kube/config" 
    
  2. 使用 --kubeconfig 引數呼叫 kubectl
    $ kubectl --kubeconfig="/custom/path/.kube/config" 
    

kubectl 載入組態檔案的順序

每次執行 kubectl 命令時,它都會按照以下順序尋找 kubeconfig 檔案來載入組態:

  1. 首先檢查是否傳遞了 --kubeconfig 引數,並載入指定的組態檔案。
  2. 如果未找到組態檔案,則檢查是否存在 KUBECONFIG 環境變數。
  3. 最終,如果以上兩者都未設定,則預設載入 $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 

宣告式語法便於版本控制和重複佈署,因此更適合生產環境的管理。