Minikube 和 Kind 是兩種常用的本地 Kubernetes 叢集建立工具,適用於開發和測試環境。Minikube 支援多種驅動程式,可模擬多節點叢集,並透過 Profile 管理不同叢集。Kind 則使用 Docker 容器作為節點,透過 YAML 設定檔定義叢集架構。生產環境中,可選擇雲端服務商提供的受管理 Kubernetes 服務,例如 GKE、AKS 和 EKS,或使用 Kubernetes 發行版,例如 OpenShift、Rancher 和 Tanzu。此外,kubeadm、kops 和 Kubespray 等工具提供了更彈性的叢集安裝和管理方式,適合進階使用者根據需求自訂叢集組態。

使用Minikube與Kind建立Kubernetes叢集

Minikube多節點叢集的建立

Minikube是一個方便的工具,用於在本地建立Kubernetes叢集進行開發和測試。我們可以利用Minikube建立多節點叢集,以模擬更真實的生產環境。

建立多節點叢集的指令

$ minikube start --nodes 5 --ha true \
--cni calico \
--cpus=2 \
--memory=2g \
--kubernetes-version=v1.30.0 \
--container-runtime=containerd

驗證叢集節點狀態

$ kubectl get nodes
NAME           STATUS   ROLES           AGE     VERSION
minikube       Ready    control-plane   6m28s   v1.30.0
minikube-m02   Ready    control-plane   4m36s   v1.30.0
minikube-m03   Ready    control-plane   2m45s   v1.30.0
minikube-m04   Ready    <none>          112s    v1.30.0
minikube-m05   Ready    <none>          62s     v1.30.0

多節點叢集的特點

  • 使用--nodes 5引數建立五個節點的叢集
  • --ha true引數將前三個節點組態為控制平面節點,實作高用性
  • 需要確保本地工作站有足夠的資源來支援多節點叢集的運作

使用不同Profile建立多個Kubernetes叢集

Minikube允許我們使用不同的Profile名稱建立多個Kubernetes叢集:

# 使用VirtualBox驅動程式建立叢集
$ minikube start --driver=virtualbox --kubernetes-version=1.30.0 --profile cluster-vbox

# 使用Docker驅動程式建立另一個叢集
$ minikube start --driver=docker --kubernetes-version=1.30.0 --profile cluster-docker

管理多個叢集

# 列出所有Minikube叢集
$ minikube profile list

# 停止特定Profile的叢集
$ minikube stop --profile cluster-docker

# 刪除特定Profile的叢集
$ minikube delete --profile cluster-docker

使用Kind建立Kubernetes叢集

Kind(Kubernetes-in-Docker)是另一個用於在本地執行Kubernetes叢集的工具,它利用Docker容器作為Kubernetes節點。

Kind的工作原理

Kind使用Docker-in-Docker(DinD)的概念,在容器中執行容器引擎和kubelet,使其表現為Kubernetes工作節點。

安裝Kind

根據不同的作業系統,可以使用以下指令安裝Kind:

Linux安裝指令
$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
$ chmod +x ./kind
$ mv ./kind /usr/local/bin/kind
$ kind version
macOS安裝指令
$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-darwin-amd64
$ chmod +x ./kind
$ mv ./kind /usr/local/bin/kind
# 或者使用Homebrew安裝
$ brew install kind
Windows PowerShell安裝指令
$ curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.23.0/kind-windows-amd64
$ Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
# 或者使用Chocolatey安裝
$ choco install kind

建立Kubernetes叢集

使用Kind建立單節點叢集:

$ kind create cluster --name test-kind

建立多節點叢集

  1. 首先刪除預設建立的單節點叢集:
$ kind delete cluster
  1. 建立一個YAML格式的組態檔案(例如~/.kube/kind_cluster.yaml):
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
  1. 使用組態檔案建立多節點叢集:
$ kind create cluster --config ~/.kube/kind_cluster.yaml --name multi-node-kind-cluster

設定檔說明

  • 設定檔採用YAML格式定義叢集組態。
  • nodes陣列定義了叢集中的節點數量和角色(控制平面或工作節點)。
  • 可以根據需求自定義控制平面和工作節點的數量。

內容解密:

  1. YAML組態檔案的關鍵部分nodes陣列定義了Kind叢集中的節點數量和角色,支援設定多個控制平面和工作節點。
  2. Kind與Minikube的主要區別:Kind主要利用Docker容器作為Kubernetes節點,而Minikube則支援多種驅動程式。
  3. 資源需求:無論是使用Minikube還是Kind建立多節點叢集,都需要確保本地機器具備足夠的資源(CPU、記憶體等)。
  4. 適用場景:這兩個工具主要用於開發和測試環境,不建議在生產環境中使用。

使用Kind建立多節點Kubernetes叢集

根據所選擇的角色不同,將會建立不同的節點。讓我們使用組態檔案重新啟動kind create命令來建立多節點叢集。

對於給定的組態檔案,結果將是一個一主三從的Kubernetes叢集:

$ kind create cluster --config ~/.kube/kind_cluster

也可以透過使用適當的映像檔詳細資訊來建立特定版本的Kubernetes叢集,如下所示:

$ kind create cluster \
--name my-kind-cluster \
--config ~/.kube/kind_cluster \
--image kindest/node:v1.29.0@sha256:eaa1450915475849a73a9227b8f201df25e55e268e5d619312131292e324d570

一個新的Kubernetes叢集將由Kind佈署和組態,您將在最後收到有關叢集存取的訊息,如下所示:

Creating cluster "my-kind-cluster" ...
 Ensuring node image (kindest/node:v1.29.0) 
 Preparing nodes   
 Writing configuration  
 Starting control-plane  
 Installing CNI  
 Installing StorageClass  
 Joining worker nodes  
Set kubectl context to "kind-my-kind-cluster"
You can now use your cluster with:
kubectl cluster-info --context kind-my-kind-cluster
Thanks for using kind! 

之後,您應該會有四個新的Docker容器:一個執行為主節點,另外三個作為同一Kubernetes叢集的工作節點。

現在,與Kubernetes一樣,我們需要為Kubectl工具編寫一個kubeconfig檔案,以便能夠與新叢集互動。Kind已經生成了適當的組態並將其附加到我們的~/.kube/config檔案中。此外,Kind將當前上下文設定為我們的新叢集,因此基本上沒有其他事情需要做。我們可以立即開始查詢新叢集。

讓我們使用kubectl get nodes命令列出節點。如果一切正常,我們應該會看到四個節點:

$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-kind-cluster-control-plane Ready control-plane 4m v1.29.0
my-kind-cluster-worker Ready <none> 3m43s v1.29.0
my-kind-cluster-worker2 Ready <none> 3m42s v1.29.0

一切似乎都很完美。您的Kind叢集正在運作!

就像我們使用minikube一樣,您也可以使用以下命令檢查元件的狀態:

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:42547
CoreDNS is running at https://127.0.0.1:42547/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump':
$ kubectl get --raw='/readyz?verbose'
[+]ping ok
[+]log ok
[+]etcd ok
...<removed for brevity>...
[+]poststarthook/apiservice-openapiv3-controller ok
[+]shutdown ok
readyz check passed

停止和刪除本地Kind叢集

您可能希望停止或刪除Kind在本地系統上建立的所有內容,以清理環境。要做到這一點,您可以使用以下命令:

$ kind delete cluster

這個命令將刪除叢集及其狀態,從您的系統中移除它。您將無法還原該叢集。

其他Kubernetes學習環境

您還可以使用一些可用的零組態學習環境,旨在使您的Kubernetes學習之旅順暢和愉快。

Play with Kubernetes

這個互動式遊樂場(labs.play-with-k8s.com)由Docker和Tutorius提供,提供了一種簡單而有趣的方式來實驗Kubernetes。在幾秒鐘內,您將直接在Web瀏覽器中執行自己的Kubernetes叢集。

該環境具有以下特點:

  • 免費的Alpine Linux虛擬機器:在不離開瀏覽器的情況下體驗真實的虛擬機器環境。
  • DinD:該技術創造了多個虛擬機器的幻覺,使您能夠探索分散式系統的概念。

Killercoda Kubernetes遊樂場

Killercoda(https://killercoda.com/playgrounds/scenario/kubernetes)是一個零組態遊樂場,提供了一個臨時的Kubernetes環境,可透過Web瀏覽器存取。

該環境具有以下特點:

  • 臨時環境:快速啟動一個預先組態的叢集,當您完成時,該叢集就會消失。這使得它非常適合快速實驗而無需承諾。
  • 空的kubeadm叢集,具有兩個節點:深入瞭解Kubernetes的核心功能,使用一個現成的雙節點叢集。
  • 控制平面節點,具有排程能力:與某些遊樂場不同,這個遊樂場允許您在控制平面節點上排程工作負載,為測試目的提供了更大的靈活性。

生產級Kubernetes叢集的安裝與佈署

在前面的章節中,我們討論了用於開發和學習目的Kubernetes環境。現在,我們將探討如何建立符合特定需求的生產級Kubernetes環境。

使用雲端服務管理Kubernetes叢集

如果您偏好使用受管理的服務來佈署Kubernetes環境,有多種選擇可供考慮,例如GKE、AKS、EKS等:

  • Google Kubernetes Engine(GKE):由Google Cloud Platform(GCP)提供,GKE是一項完全託管的Kubernetes服務。它負責叢集生命週期的所有事務,從資源組態、組態到擴充套件和維護。GKE與其他GCP服務無縫整合,使其成為現有GCP使用者的最佳選擇。
  • Azure Kubernetes Service(AKS):作為Microsoft Azure的一部分,AKS是另一項受管理的Kubernetes服務。與GKE類別似,AKS處理叢集管理的所有方面,讓您可以專注於佈署和管理容器化應用程式。AKS與其他Azure服務良好整合,使其成為Azure使用者的自然選擇。
  • Amazon Elastic Kubernetes Service(EKS):由Amazon Web Services(AWS)提供,EKS在AWS生態系統中提供受管理的Kubernetes服務。與GKE和AKS一樣,EKS負責叢集管理,讓您可以專注於應用程式。EKS與其他AWS服務整合,使其成為AWS使用者的有力選擇。

這些受管理的Kubernetes服務提供了一種便捷且可擴充套件的方式來佈署和管理容器化應用程式,而無需自行管理Kubernetes叢集的複雜性。

Kubernetes發行版

Kubernetes發行版本質上是預先包裝的Kubernetes版本,除了核心Kubernetes功能外,還包含額外的功能和特性。它們就像增值包一樣,能夠滿足特定的需求並簡化使用者的佈署。為了獲得更豐富的功能體驗,請考慮以下Kubernetes發行版:

  • Red Hat OpenShift:這是一個企業級的發行版,透過開發工具(映像構建和CI/CD管道)、多叢集管理、安全功能(RBAC和SCC)和內建的複雜佈署擴充套件功能,擴充套件了Kubernetes的功能。
  • Rancher:一個完整的容器管理平台,Rancher的功能超出了Kubernetes。它提供了跨多樣化環境的多叢集管理、各種協調平台的工作負載管理,以及預先組態應用程式的市場。
  • VMware Tanzu:為VMware生態系統設計,Tanzu無縫整合,用於基礎設施資源組態、安全性和混合雲佈署。它為VMware環境中的容器化應用程式提供了生命週期管理工具。

請注意,上述某些Kubernetes發行版是根據訂閱或許可證的產品,並非免費提供。

Kubernetes安裝工具

以下工具提供了對Kubernetes叢集設定的彈性和控制。當然,您需要使用其他第三方工具和平台新增更多的自動化,以管理您的Kubernetes環境:

  • kubeadm:這是官方的Kubernetes工具,提供了一種使用者友好的方式來設定Kubernetes叢集,使其適合測試和生產環境。其簡單性允許快速佈署叢集,但可能需要額外的組態來實作生產級功能,如高用性。
  • kops:為了在生產中管理強大的Kubernetes叢集,kops是一個官方的Kubernetes專案,提供命令列控制。它簡化了高用性叢集的建立、升級和維護,確保容器化應用程式的可靠運作。
  • Kubespray:想要在裸機或虛擬機器上佈署Kubernetes?Kubespray利用了Ansible自動化的強大功能。它將Ansible playbooks與Kubernetes資源結合起來,允許在您首選的基礎設施上自動佈署叢集。

內容解密:

上述三種工具皆為官方或官方背書的專案,能夠提供不錯的 Kubernetes 叢集安裝體驗。

  1. kubeadm 簡單易用,但需要額外組態來實作高用性。
  2. kops 提供了命令列控制,簡化了高用性叢集的管理。
  3. Kubespray 利用 Ansible 自動化,能夠在裸機或虛擬機器上自動佈署叢集。

這些工具各有其特點和優勢,可以根據具體需求選擇適合的工具來佈署和管理Kubernetes叢集。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes叢集建立Minikube與Kind實戰

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叢集的不同路徑,包括使用雲端服務和自行安裝兩種主要方式。