介紹
Kubernetes 是一個開源工具,在 容器編排 中至關重要。Kubernetes 的工作原理是在各種雲端環境甚至本地伺服器上大規模編排和管理叢集。叢集是一組用於運行容器化應用程式和服務的主機。一個叢集至少需要兩個節點才能運作 – 一個 master 節點 以及一個 worker 節點。考慮到可擴充性,您可以根據需要擴充叢集,增加任意數量的 worker 節點。
Kubernetes 中的節點是指伺服器。Master 節點是管理叢集狀態的伺服器。Worker 節點是運行工作負載的伺服器 – 這些通常是 容器化的應用程式和服務.
本 指南將引導您完成在 Ubuntu 20.04 上安裝和部署由兩個節點組成的 Kubernetes 叢集的步驟。如前所述,在使用 Kubernetes 時,擁有兩個節點是最基本的配置。一旦您了解了基本原理,您還可以選擇添加更多 worker 節點。我們還將向您展示如何連結這兩台伺服器,以允許 master 節點控制 worker 節點。
為了測試我們的配置,我們將部署一個運行 Docker 容器,其中運行 Nginx 網頁伺服器 到叢集中。這是 Kubernetes 的一個典型實際應用。隨著我們的深入,您將了解更多關於 Kubernetes 的一些核心組件,例如 kubectl 和 kubeadm。同時,建議您先熟悉我們關於 了解 Kubernetes 工具包基礎知識 的教學,以熟悉 Kubernetes 平台的基礎知識。
現在,讓我們開始吧!
先決條件
您需要準備兩台運行在 Ubuntu 20.04 上的伺服器。為了獲得最佳效能,Kubernetes 的最低系統要求為 2GB 記憶體和 2 個 CPU。您可以按照此 逐步教學來幫助您設置您的 Ubuntu 伺服器(在 CloudSigma 上)。其中一台伺服器將作為 master 節點,另一台將作為 worker 節點。我們非常貼切地將這兩台伺服器命名為 kubernetes-master 和 kubernetes-worker。這使得跟隨教學變得更容易。但是,您可以自由選擇您喜歡的 主機名稱 。
-
請確保在兩個節點上都添加一個具有 sudo 權限的使用者,我們將使用該使用者來運行上述教學中概述的命令。請按照此 關於配置 Linux sudoers 檔案的教學以獲取說明.
-
網路連線能力 – 叢集中的伺服器應該要能夠相互通訊。當您從 CloudSigma 部署虛擬機器時,預設情況下它們將透過公共 IP 連接到網際網路。如果您是在本地網路中工作,您可能必須 編輯您的 /etc/hosts 檔案並適當地連結它們。
-
您將需要安裝並啟用 Docker。Kubernetes 依賴容器執行階段 (container runtime) 在 Pod 中運行容器。雖然還有其他容器平台可供選擇,但我們在本教學中將使用 Docker。Docker 將提供 Ubuntu 所需的執行環境。您可以按照我們 關於安裝和操作 Docker 的教學.
步驟 1:安裝 Kubernetes
在此步驟中,我們將安裝 Kubernetes。就像您在先決條件中所做的那樣,您必須在兩個節點中運行命令來安裝 Kubernetes。使用 ssh 登入這兩個節點並繼續。您將首先安裝 apt-transport-https 套件,該套件允許在 http 和 https 協定於 Ubuntu 的套件庫中運作。此外,安裝 curl,因為接下來的步驟將需要它。執行以下命令:
|
1 |
sudo apt install apt-transport-https curl |
然後,透過執行以下命令將 Kubernetes 簽署 金鑰 新增到兩個節點:
|
1 |
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add |
接下來,我們使用以下命令將 Kubernetes 套件庫 新增為兩個節點上的套件來源:
|
1 2 |
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list sudo mv ~/kubernetes.list /etc/apt/sources.list.d |
在此之後,更新節點:
|
1 |
sudo apt update |
- 安裝 Kubernetes 工具
更新完成後,我們將安裝 Kubernetes。這涉及安裝構成 Kubernetes 的各種工具: kubeadm, kubelet, kubectl,以及 kubernetes-cni。這些工具會安裝在兩個節點上。我們在下方定義每個工具:
-
kubelet – 運行在每個節點上的代理,負責與主節點進行通訊,以在容器運行時中啟動工作負載。輸入以下命令以安裝 kubelet:
|
1 |
sudo apt install kubelet |
-
kubeadm – Kubernetes 專案的一部分,有助於初始化 Kubernetes 集群。輸入以下命令以安裝 kubeadm:
|
1 |
sudo apt install kubeadm |
-
kubectl – Kubernetes 命令列工具,允許您在 Kubernetes 集群內運行命令。執行以下命令以安裝 kubectl:
|
1 |
sudo apt install kubectl |
-
kubernetes-cni – 啟用容器內的網路,確保容器可以進行通訊和交換數據。執行以下命令以進行安裝:
|
1 |
sudo apt-get install -y kubernetes-cni |
或者,您也可以使用單一命令安裝所有這四個工具:
|
1 |
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
步驟 2:停用 Swap 記憶體
Kubernetes 無法在正在使用 swap 記憶體的系統中運行。因此,必須在主節點和所有工作節點中停用它。執行以下命令以停用 swap 記憶體:
|
1 |
sudo swapoff -a |
此命令會停用 swap 記憶體,直到系統重新啟動。我們必須確保在重新啟動後它仍保持關閉狀態。這必須在主節點和所有工作節點上完成。我們可以透過編輯 fstab 檔案 並註解掉 /swapfile 行,使用 #。輸入以下命令,使用 nano 文字編輯器開啟該檔案:
|
1 |
sudo nano /etc/fstab |
在檔案內部,註解掉 swapfile 行,如下圖螢幕截圖所示:

如果您沒有看到 swapfile 行,請直接忽略它。編輯完成後儲存並關閉檔案。對兩個節點執行相同的程序。現在,即使在伺服器重新啟動後,swap 記憶體設定也將保持關閉狀態。
步驟 3:設定唯一的主機名稱
您的節點必須具有唯一的主機名稱,以便於識別。如果您正在部署包含許多節點的集群,您可以將其設定為識別工作節點的名稱,例如 node-1、node-2 等。正如我們之前提到的,我們已將節點命名為 kubernetes-master 和 kubernetes-worker。我們在建立伺服器時已對其進行了設定。但是,如果您尚未從命令列進行設定,則可以調整或設定您自己的名稱。要調整主節點上的主機名稱,請運行以下命令:
|
1 |
sudo hostnamectl set-hostname kubernetes-master |
在工作節點上,運行以下命令:
|
1 |
sudo hostnamectl set-hostname kubernetes-worker |
您可以關閉目前的終端機工作階段,並 ssh 回到伺服器以查看變更。
步驟 4:讓 Iptables 查看橋接流量
為了讓主節點 and 工作節點正確查看橋接流量,您應該確保 net.bridge.bridge-nf-call-iptables 在您的設定中設定為 1。首先,確保 br_netfilter 模組已載入。您可以透過發送以下命令來確認這一點:
|
1 |
lsmod | grep br_netfilter |
或者,您可以使用以下命令明確載入它:
|
1 |
sudo modprobe br_netfilter |
現在,您可以運行此命令將值設定為 1:
|
1 |
sudo sysctl net.bridge.bridge-nf-call-iptables=1 |
步驟 5:變更 Docker Cgroup 驅動程式
預設情況下,Docker 安裝時使用 “cgroupfs” 作為 cgroup 驅動程式。Kubernetes 建議 Docker 應該 執行 並以 “systemd” 作為驅動程式。如果您跳過此步驟並嘗試在下一步中初始化 kubeadm,您將在終端機中收到以下警告:
|
1 2 |
[preflight] 正在執行 預-檢 檢查 [警告 IsDockerSystemdCheck]: 偵測到 "cgroupfs" 作為 the Docker cgroup 驅動程式. The 推薦的 驅動程式 為 "systemd". 請 遵循 the 指南 於 https://kubernetes.io/docs/setup/cri/ |
在主節點(master)和工作節點(worker)上,更新 cgroupdriver,使用以下命令:
|
1 2 3 4 5 6 7 8 9 |
sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF |
然後,執行以下命令以在系統啟動時 重新啟動 並 啟用 Docker:
|
1 2 3 |
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker |
設定完成後,我們就可以開始進行有趣的部分:部署 Kubernetes 叢集!
步驟 6:初始化 Kubernetes 主節點
部署 Kubernetes 叢集的第一步是啟動主節點。在主節點的終端機中,執行以下命令以初始化 kubernetes-主節點:
|
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
如果您執行上述命令,而您的系統不符合預期要求(例如「先決條件」章節中所說明的最低 RAM 或 CPU),您將會收到警告,且叢集將無法啟動:

下方的螢幕截圖顯示初始化成功。我們還加入了一個旗標來指定 IP 為 10.244.0.0 的 Pod 網路,這是 kube-flannel 使用的預設 IP。我們將在下一步中詳細討論 Pod 網路。

在輸出中,您可以看到 kubeadm join 命令(我們已隱藏我們的 IP 位址)以及一個唯一的權杖(token),您將在工作節點以及您想要加入此叢集的所有其他工作節點上執行此命令。接下來,請複製並貼上此命令,因為您稍後會在工作節點中使用它。
在輸出中,Kubernetes 還顯示了一些額外的命令,在您開始使用叢集之前,您應該在主節點上以一般使用者身分執行這些命令。讓我們執行這些命令:
|
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
我們現在已經初始化了主節點。然而,在加入工作節點之前,我們還必須在主節點上設定 Pod 網路。
步驟 7:部署 Pod 網路
Pod 網路有助於伺服器之間的通訊,這對於 Kubernetes 叢集的正常運作是必需的。您可以從官方文件中閱讀更多關於 Kubernetes 叢集網路 的資訊。在本教學中,我們將使用 Flannel Pod 網路。Flannel 是一個滿足 Kubernetes 要求的簡單重疊網路(overlay network)。
在我們部署 pod 網路之前,我們需要檢查防火牆狀態。如果您在按照設定 Ubuntu 伺服器的教學 的第 5 步之後啟用了防火牆,您必須先新增一個 防火牆 規則 以為連接埠建立例外 6443 (Kubernetes 的預設連接埠)。在主節點和工作節點上執行以下 ufw 指令:
|
1 2 |
sudo ufw allow 6443 sudo ufw allow 6443/tcp |
之後,您可以執行以下兩個指令在主節點上部署 pod 網路:
|
1 2 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml |
載入 flannel 網路可能需要幾秒鐘到一分鐘的時間,具體取決於您的環境。執行以下指令以確認一切已啟動:
|
1 |
kubectl get pods --all-namespaces |
如果一切成功,該指令的輸出應該會顯示所有服務的狀態為執行中(running):

您也可以檢視元件的 健康狀態,使用 get component status 指令:
|
1 |
kubectl get componentstatus |

此指令有簡寫形式 cs:
|
1 |
kubectl get cs |

如果您看到不健康的狀態(unhealthy),請修改以下檔案並刪除 (spec->containers->command) 中包含此字詞的行 - --port=0 :
|
1 |
sudo nano /etc/kubernetes/manifests/kube-scheduler.yaml |
對此檔案執行相同的操作:
|
1 |
sudo nano /etc/kubernetes/manifests/kube-controller-manager.yaml |
最後,重新啟動 Kubernetes 服務:
|
1 |
sudo systemctl restart kubelet.service |
步驟 8:將工作節點加入 Kubernetes 叢集
隨著 kubernetes-master 節點已啟動且 pod 網路已就緒,我們可以將工作節點加入叢集。在本教學中,我們只有一個工作節點,因此我們將使用該節點。如果您有更多工作節點,您可以隨時按照我們下面說明的相同步驟加入叢集。
首先,在獨立的終端機工作階段中登入您的工作節點。您將使用在 kubeadm join 指令,該指令是在我們於 步驟 6 初始化主節點時顯示在您的終端機中。執行該指令:
|
1 |
sudo kubeadm join 127.0.0.188:6443 --token u81y02.91gqwkxx6rnhnnly --discovery-token-ca-cert-hash sha256:4482ab1c66bf17992ea02c1ba580f4af9f3ad4cc37b24f189db34d6e3fe95c2d |
完成加入叢集後,您應該會看到類似下圖的輸出:

加入程序完成後,切換到主節點終端機並執行以下指令,以確認您的工作節點已加入叢集:
|
1 |
kubectl get nodes |
在上方指令輸出的螢幕截圖中,我們可以看到工作節點已加入叢集:

步驟 9:將應用程式部署到 Kubernetes 叢集
至此,您已成功設定 Kubernetes 叢集。讓我們透過向其部署服務來使該叢集可用。Nginx 是一款熱門的網頁伺服器,即使在有數千個連線的情況下也能擁有令人難以置信的速度。我們將把 Nginx 網頁伺服器部署到叢集中,以證明您可以在實際應用中使用此設定。
在主節點上執行以下指令,以為 Nginx 建立 Kubernetes 部署:
|
1 |
kubectl create deployment nginx --image=nginx |
您可以使用 部署,透過使用 describe deployment 指令來檢視:
|
1 |
kubectl describe deployment nginx |

若要使 nginx 服務 可透過網際網路存取,請執行以下命令:
|
1 |
kubectl create service nodeport nginx --tcp=80:80 |

上述命令將為 Nginx 部署建立一個面向公眾的服務。由於這是一個 nodeport 部署,Kubernetes 會為該服務分配一個範圍在 內的連接埠32000+.
您可以透過執行以下命令來獲取目前的服務:
|
1 |
kubectl get svc |

您可以看到我們被分配的連接埠是 32264。請記下終端機中顯示的連接埠,以便在下一步中使用。
要驗證 Nginx 服務部署是否成功,請從 master 向 worker 節點發送一個 curl 呼叫。請替換您的 worker 節點 IP 以及您從上述命令中獲取的連接埠:
|
1 |
curl your-kubernetes-worker-ip:32264 |
您應該會看到預設 Nginx index.html:

或者,您也可以在瀏覽器中造訪 worker 節點的 IP 位址與連接埠組合,並查看預設的 Nginx 首頁:

您可以 刪除 部署,只需指定該部署的名稱即可。例如,此命令將刪除我們的部署:
|
1 |
kubectl delete deployment nginx |
我們現在已成功測試了我們的叢集!
結論
在本教學中,您已學習如何在 Ubuntu 20.04 上安裝 Kubernetes 叢集。您設定了一個由 master 和 worker 節點組成的叢集。您成功安裝了 Kubernetes 工具集、建立了 pod 網路,並將 worker 節點加入到 master 節點。我們還透過在叢集上進行 Nginx 網頁伺服器的基本部署來測試我們的概念。這應該可以作為在 Ubuntu 上使用 Kubernetes 叢集的基礎。
雖然我們只使用了一個 worker 節點,但您可以根據需要將叢集擴充至任意多個節點。如果您想使用自動化工具(如 Ansible)深入了解 DevOps,我們有一篇教學深入探討了 使用 Ansible 和 Kubeadm 部署 Kubernetes 叢集,歡迎前往閱讀。如果您想學習 如何在 Kubernetes 叢集上部署 PHP 應用程式,請參考本教學.
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。