Kubernetes 叢集的測試和實驗需要一個穩定的實驗室環境。本文將介紹如何使用 Minikube、Kubespray 等工具,以及虛擬機器、樹莓派等平台來建構 Kubernetes 實驗室環境。同時,我們也會探討 Ansible 在 Kubernetes 任務管理中的應用,OpenShift Local 的快速佈署方式,以及 K3s 輕量級 Kubernetes 的優勢。最後,文章將提供 Kubernetes 叢集升級策略和步驟,確保讀者能夠有效管理和維護 Kubernetes 環境。

建立Kubernetes實驗室環境

建立一個Kubernetes實驗室環境對於測試和實驗Kubernetes叢集是非常有用的。本文將介紹如何使用不同的工具和方法來建立這樣的環境。

使用Minikube或Kubespray佈署Kubernetes

Minikube是一個流行的工具,用於在本機上佈署單節點的Kubernetes叢集,非常適合用於開發和測試。Kubespray則是一個用於佈署多節點Kubernetes叢集的工具,支援多種平台,包括雲端供應商。

Minikube的優勢

  • 簡單易用:只需一條命令即可在本機上啟動一個Kubernetes叢集。
  • 快速佈署:Minikube支援多種虛擬機器驅動,如VirtualBox、VMware等。

Kubespray的優勢

  • 支援多節點叢集:可以佈署由多個節點組成的Kubernetes叢集。
  • 高度可定製:支援多種組態選項,可以根據需要自定義叢集。

使用虛擬機器建立叢集

在實驗室環境中,可以使用虛擬機器來模擬實際的叢集環境。有多種虛擬機器管理軟體可供選擇,如Microsoft Hyper-V、Oracle VirtualBox等。

虛擬機器管理的關鍵步驟

  1. 選擇虛擬機器管理軟體:根據需求選擇合適的虛擬機器管理軟體。
  2. 建立虛擬機器:根據所選軟體的,建立新的虛擬機器。
  3. 安裝作業系統:在虛擬機器上安裝所需的作業系統。
  4. 組態Kubernetes:在虛擬機器上安裝和組態Kubernetes。

使用樹莓派建立叢集

樹莓派是一種流行的單板電腦,可以用於建立低成本的叢集實驗環境。最新的樹莓派4型號B具備強大的處理能力和多種介面,非常適合用於實驗。

使用樹莓派建立叢集的優勢

  • 低成本:樹莓派相對便宜,非常適合用於建立低成本的實驗環境。
  • 靈活性:可以根據需要選擇不同型號和組態的樹莓派。
圖表翻譯:

此圖示展示了Type 1和Type 2 Hypervisor之間的區別。Type 1 Hypervisor直接執行在硬體之上,而Type 2 Hypervisor則執行在宿主作業系統之上。這兩種型別的Hypervisor各有其特點和適用場景。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes實驗室環境建構

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

Kubernetes叢集佈署工具比較

本文將比較幾種常用的Kubernetes叢集佈署工具,包括Minikube、Kubespray等,以幫助讀者選擇最適合自己需求的工具。

Minikube

Minikube是一個單節點的Kubernetes叢集佈署工具,非常適合用於開發和測試。它支援多種虛擬機器驅動,如VirtualBox、VMware等。

Minikube的主要特點

  • 簡單易用:只需一條命令即可在本機上啟動一個Kubernetes叢集。
  • 快速佈署:支援多種虛擬機器驅動,可以快速在本機上佈署Kubernetes叢集。

Kubespray

Kubespray是一個多節點的Kubernetes叢集佈署工具,支援多種平台,包括雲端供應商。它提供了高度的可定製性,可以根據需要自定義叢集組態。

Kubespray的主要特點

  • 支援多節點叢集:可以佈署由多個節點組成的Kubernetes叢集。
  • 高度可定製:支援多種組態選項,可以根據需要自定義叢集。

其他佈署工具

除了Minikube和Kubespray之外,還有多種其他的Kubernetes叢集佈署工具可供選擇,如K3s、RKE等。每種工具都有其特點和適用場景。

內容解密:

本文比較了幾種常用的Kubernetes叢集佈署工具,包括Minikube、Kubespray等。讀者可以根據自己的需求,選擇最適合自己的工具來佈署和管理Kubernetes叢集。每個工具都有其獨特之處,瞭解這些特點有助於做出更明智的選擇。

在Raspberry Pi上安裝Kubernetes

Jeff Geerling在YouTube上因測試和眾包叢集板專案而聞名。Raspberry Pi Compute Module可以用作叢集或伺服器叢集。安裝Kubernetes軟體通常是透過SSH終端介面進行。請記住,Raspberry Pi處理器使用ARM處理器架構,這可能與您主要電腦的不同。

有多種方法可以在單一Raspberry Pi或Raspberry Pi叢集上安裝Kubernetes。這取決於您使用Kubernetes的經驗,其中最簡單的是MicroK8s。它只需使用microk8s snap進行佈署,並使用microk8s命令列工具進行互動。您可以使用microk8s start和microk8s stop命令來啟動和停止叢集,以節省電池。您可以使用microk8s status命令來驗證狀態:正在執行或未執行。

您可以使用microk8s enable dashboard命令啟用一些Kubernetes功能,例如Kubernetes儀錶板。還有更多功能可用:rbac、dns、registry、istio、helm、ingress、prometheus、hostpath-storage等。啟用後,可以使用microk8s dashboard-proxy命令存取Kubernetes儀錶板。請記住,在/boot/firmware/cmdline.txt檔案中新增以下行,以在核心啟動時啟用cgroup,因為它在ARM平台上預設被停用:

cgroup_enable=memory cgroup_memory=1

Kubespray

Kubespray專案專注於在雲端提供者上佈署Kubernetes平台:Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platform(GCP)、OpenStack、VMWare vSphere、Equinix Metal、Oracle Cloud Infrastructure(實驗性)和裸機。當您想要佈署叢集且不想手動編譯整個Kubernetes生態系統時,Kubespray是首選。

Kubespray使用簡單的組態管理(由Ansible提供)、組態工具和平台知識來佈署Kubernetes叢集。其結果是:

  • 叢集高用性
  • 模組化(網路外掛程式之間的選擇)
  • 支援大多數流行的Linux發行版
  • 由CI/CD測試
  • Kubernetes版本1.22+,Ansible v2.11+,Jinja 2.11+和python-netaddr

安裝步驟

  1. 在inventory/mycluster檔案中設定叢集IP,如下所示:
node1 ip=10.3.0.1
node2 ip=10.3.0.2
node3 ip=10.3.0.3
[kube_control_plane]
node1
node2
[etcd]
node1
node2
[kube_node]
node2
node3
[k8s_cluster:children]
kube_node
kube_control_plane
  1. 使用以下檔案自定義Ansible群組all和k8s_cluster的變數:
    • inventory/mycluster/group_vars/all/all.yml
    • inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
  2. 執行playbook來設定節點:
$ ansible-playbook -i inventory/mycluster --become --become-user=root cluster.yml

OpenShift Local

OpenShift Local(前身為CodeReady Containers)是一種簡單快速的方式,可以在虛擬機器中佈署OpenShift叢集,用於實驗室測試。

其目的是僅供本地和實驗室測試,因為它旨在是短暫的。控制平面和工作節點嵌入在單節點虛擬機器中。它支援許多作業系統,包括Red Hat Enterprise Linux/CentOS x86_64(7、8和9)和最新的兩個穩定版Fedora、Windows 10 x86_64 Fall Creators Update(版本1709+)和macOS(BigSur 11+ Intel晶片x86_64或Apple Silicon arm64)。所需的最低資源是4個vCPU、8 GiB記憶體和35 GiB儲存空間。

安裝步驟

  1. 從官方Red Hat網站下載crc命令列工具。
  2. 在Windows和macOS上,提供了一個引導式安裝程式,具有簡單直接的流程。
  3. 成功安裝後,您可以從終端機執行crc命令列實用程式,並繼續進行OpenShift Local設定。
  4. 下載最新版本的OpenShift Local虛擬機器,並將其儲存在目前使用者的.crc目錄下。
  5. 使用以下命令啟動環境:
$ crc setup
$ crc start
  1. 您可以使用以下命令驗證OpenShift Local叢集的執行狀態:
$ crc status
  1. 您可以使用oc命令列實用程式(類別似於kubectl)透過命令列存取OpenShift Local叢集,並使用API端點https://api.crc.testing:6443或透過網頁控制檯https://console-openshift-console.apps-crc.testing。

使用OpenShift Local

您可以使用oc-env引數的oc命令與執行中的叢集一起組態所需的變數,以與OpenShift Local叢集和oc命令列實用程式的路徑互動。常見的做法是將其與eval終端表示式結合使用:

$ eval $(crc oc-env)

在設定過程中自動建立了兩個具有不同功能的使用者:

  • 管理員:使用者名稱:kubeadmin,密碼自動生成。
  • 標準使用者:使用者名稱:developer,密碼:developer。

使用Ansible管理Kubernetes任務

登入OpenShift Local叢集

要登入OpenShift Local叢集,只需提供所需的使用者名稱(-u 引數)和密碼(-p 引數):

$ oc login -u developer -p developer https://api.crc.testing:6443

或者,您可以使用從OpenShift控制檯檢索到的令牌:

$ oc login --token=sha256~xxxxxx --server=https://api.crc.testing:6443

您可以使用以下命令檢查您目前登入的使用者:

$ oc whoami

OpenShift Local叢集內部也有一個容器映像登入檔。使用相同的使用者,您可以透過網址存取OpenShift Local儀錶板(如圖4-7所示)。網址為 https://console-openshift-console.apps-crc.testing

圖表翻譯:

此圖示顯示了OpenShift Local控制檯的登入介面。

在Hetzner上佈署OpenShift Container Platform 4

當您的目標雲端提供商是Hetzner時,您可以使用RedHat-EMEA-SSA-Team的hetzner-ocp4專案(https://github.com/RedHat-EMEA-SSA-Team/hetzner-ocp4)。它在Hetzner的CentOS Root Server裸機伺服器上佈署並使用Red Hat OpenShift Container Platform 4環境作為沙箱。目前,它支援CentOS Stream 8和Red Hat Enterprise Linux 8和9。

內容解密:

hetzner-ocp4專案利用Ansible來組態、安裝、啟動、停止和刪除Red Hat OpenShift Container Platform 4叢集。它還使用“Let’s Encrypt”專案更新SSL憑證,並設定公用DNS記錄。目前的工具允許使用三種現成的DNS提供商(AWS Route53、Cloudflare、DigitalOcean和GCP DNS)或設定一些環境變數(Azure、CloudFlare、Gandi和TransIP)。

使用Minikube建立叢集

最小和最簡單的Kubernetes叢集僅包含一個節點。顯然,這種設定足夠用於工作站實驗室,但不適用於需要更多節點以保證高用性的生產環境。

Minikube是Kubernetes的一種Go實作,它在本地機器上建立一個虛擬機器並佈署一個單節點的簡單叢集。Minikube適用於最新的作業系統——Linux、macOS和Windows。

首先,您需要在本地機器上安裝Minikube命令列工具。成功安裝後,您可以透過輸入以下命令啟動Minikube:

$ minikube start

內容解密:

Minikube工具會下載最新的Kubernetes映像並設定虛擬機器,例如,使用VirtualBox,組態2個CPU、2GiB記憶體和20 GiB儲存空間。在虛擬機器內部,工具會下載Minikube ISO,設定虛擬IP地址,組態Docker容器執行時,下載kubelet和kubeadm,啟動Kubernetes叢集,組態叢集許可權,並驗證元件健康狀態。

您也可以透過指定記憶體引數和所需的CPU數量來啟動Minikube:

$ minikube start --memory=8192 --cpus 2

此命令將輸出如圖4-8所示的結果。

圖表翻譯:

此圖示顯示了Minikube啟動命令列輸出的結果。

Kubeadm

Kubeadm是一個用於建立Kubernetes叢集的工具,遵循最佳實踐的“快速路徑”,用於建立叢集生命週期管理、自我託管佈局、動態發現服務等的領域知識。

它提供了一個簡單的kubeadm命令列實用程式,具有以下選項:

  • init:設定初始Kubernetes控制平面節點。
  • join:設定額外的Kubernetes控制平面節點並將其加入叢集或工作節點。
  • upgrade:將Kubernetes叢集升級到更新版本。
  • reset:還原由initjoin對目前主機所做的任何更改。

Minikube還提供了一個儀錶板功能,可以透過以下命令啟用:

$ minikube dashboard

內容解密:

此命令將開啟Kubernetes儀錶板並傳回連線的URL,如圖4-9所示。

圖表翻譯:

此圖示顯示了Minikube Kubernetes儀錶板的介面。

K3s:輕量級Kubernetes的強大之處

K3s是一個由CNCF(雲原生計算基金會)沙盒專案,於2020年建立,最初由Rancher Labs開發並封裝成單一二進位制檔案,佔用空間極小(小於100 MB)。它建立了一個Kubernetes叢集,從Raspberry Pi到AWS a1.4x大型32 GB伺服器,都能簡單安裝、執行和自動更新。K3s非常適合物聯網(IoT)、邊緣運算和ARM處理器。其輕量級儲存後端根據sqlite3,並可擴充套件至etcd3、MySQL和PostgreSQL。K3s既可以在容器中執行,也可以作為原生Linux服務執行。結合Rancher和K3s,您可以使用GitOps持續交付管道管理超過1,000個邊緣叢集。

與K3s叢集互動

當叢集啟動並執行時,您可以使用簡單的命令與其互動。

$ export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

如同往常,您可以使用kubectl命令列工具與叢集互動。例如,以下命令顯示叢集中所有名稱空間中的所有Pod:

$ kubectl get pods --all-namespaces

內容解密:

此命令首先設定KUBECONFIG環境變數,指定K3s叢集的組態檔案路徑。接著,使用kubectl命令列工具取得叢集中所有名稱空間的Pod資訊。這是管理Kubernetes叢集的基本操作,能夠幫助管理員監控叢集狀態。

Kubernetes升級策略

Kubernetes擁有活躍的社群,每年發布四個版本,因此預計每三個月就會有一個新版本。在撰寫本文時,最新的Kubernetes版本是1.26.1。在Kubernetes術語中,版本號由Major、Minor和Patch組成。例如,1.26.1代表Major版本1,Minor版本26,Patch版本1。Major版本通常包含重大變更,可能會破壞與過去版本的相容性。Minor版本引入新功能並棄用某些API。Patch版本通常只是修復錯誤的版本,會由控制平面每月自動應用。

Kubernetes版本生命週期

Kubernetes版本的生命週期包括一般可用(Generally Available)、維護模式(Maintenance)和生命週期結束(End-of-Life)。例如,版本1.26於2022年12月9日正式發布,2023年12月28日進入維護模式,並將於2024年2月24日進入官方的生命週期結束階段。

升級Kubernetes叢集

升級Kubernetes叢集時,必須一次升級一個Minor版本,不能跳過版本。同時,也不能回復升級過程。始終需要計劃升級,仔細閱讀檔案、變更日誌和發布說明,以瞭解是否有API專案將被棄用。建立檢查清單並確定哪個團隊負責升級。通常,安全、維運和基礎設施團隊參與此操作。定義、測試和記錄升級程式,並制定回復/後備計劃。

升級步驟

  1. 升級控制平面節點:首先設定節點為不可排程狀態(cordon),然後驅逐節點上的工作負載(drain),升級kubelet和kubectl套件,重啟kubelet服務,最後將節點還原為可排程狀態(uncordon)。
  2. 升級工作節點:升級kubeadm工具,執行kubeadm upgrade node命令,將節點設為drain模式,升級kubelet和kubectl,重啟kubelet程式,然後將節點還原為uncordon狀態。

內容解密:

升級Kubernetes叢集需要謹慎規劃和執行。首先升級控制平面節點,確保其穩定後再升級工作節點。每一步都需要仔細檢查,以避免服務中斷。