練習 - 探索 Kubernetes 叢集的功能
您在本機執行 Kubernetes 時,有數個選項可供使用。 您可在實體機器、VM 上或使用雲端式解決方案 (例如 Azure Kubernetes Service (AKS)) 來安裝 Kubernetes。
您在本練習中目標是要探索具有單一節點叢集的 Kubernetes 安裝。 在此練習中,您會了解如何設定和安裝一個容易建立和拆除的 MicroK8s 環境。 然後,您會部署 Kubernetes 服務,並將其擴增為多個執行個體來裝載網站。
注意
本練習為選擇性項目,且包含示範如何刪除及解除安裝將在本練習中所使用軟體和資源的步驟。
請記住,在 Docker 中有其他選項 (例如 MiniKube 和 Kubernetes 支援) 可執行相同的動作。
什麼是 MicroK8s?
MicroK8s 是將單一節點 Kubernetes 叢集以單一套件形式部署至目標工作站和物聯網 (IoT) 裝置的選項。 Canonical (Ubuntu Linux 的建立者) 是 MicroK8s 的原始開發者且目前仍負責其維護。
您可在 Linux、Windows 及 macOS 上安裝 MicroK8s。 不過,每個作業系統的安裝指示稍有不同。 請選擇最適合您環境的選項。
在 Linux 上安裝 MicroK8s
Linux 其 MicroK8s 安裝是安裝步驟最少的安裝選項。 請切換至終端機視窗,然後執行下列指示中的命令:
安裝 MicroK8s Snap 應用程式。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。
sudo snap install microk8s --classic
安裝成功時會顯示下列訊息。
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
您現在已經準備好在叢集上安裝附加元件。
在 Windows 上安裝 MicroK8s
若要在 Windows 上執行 MicroK8s,請使用 Multipass。 Multipass 是適用於 Linux、Windows 及 macOS 的輕量 VM 管理員。
從 GitHub 下載並安裝適用於 Windows 的最新版 Multipass。
在命令主控台中,執行 Multipass 啟動命令以設定並執行 microk8s-vm 映像。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。
multipass launch --name microk8s-vm --memory 4G --disk 40G
在收到 microk8s-vm 的啟動確認之後,執行
multipass shell microk8s-vm
命令以存取 VM 執行個體。multipass shell microk8s-vm
Multipass 運作之後,您可以存取 Ubuntu VM 來裝載叢集並安裝 MicroK8s。
安裝 MicroK8s Snap 應用程式。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。
sudo snap install microk8s --classic
安裝成功時會顯示下列訊息:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
您現在已經準備好在叢集上安裝附加元件。
在 macOS 上安裝 MicroK8s
若要在 macOS 上執行 MicroK8s,請使用 Multipass。 Multipass 是適用於 Linux、Windows 及 macOS 的輕量 VM 管理員。
您有兩個選項可在 macOS 上安裝 Multipass。 從 GitHub 下載並安裝適用於 macOS 的最新版 Multipass,或使用 Homebrew 搭配
brew cask install multipass
命令來安裝 Multipass。brew install --cask multipass
在命令主控台中,執行 Multipass 啟動命令以設定並執行 microk8s-vm 映像。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。
multipass launch --name microk8s-vm --memory 4G --disk 40G
在收到 microk8s-vm 的啟動確認之後,執行
multipass shell microk8s-vm
命令以進入 VM 執行個體。multipass shell microk8s-vm
此時,即可存取 Ubuntu VM 以裝載叢集。 您仍然必須安裝 MicroK8s。 請遵循下列步驟。
安裝 MicroK8s Snap 應用程式。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。
sudo snap install microk8s --classic
安裝成功時會顯示下列訊息:
2020-03-16T12:50:59+02:00 INFO Waiting for restart... microk8s v1.17.3 from Canonical✓ installed
您現在已經準備好在叢集上安裝附加元件。
準備叢集
若要檢視叢集上已安裝附加元件的狀態,請在 MicroK8s 中執行 status
命令。 這些附加元件提供數個服務,其中有些您先前已討論過。 其中一個範例是 DNS 功能。
若要檢查安裝的狀態,請執行
microk8s.status --wait-ready
命令。sudo microk8s.status --wait-ready
請注意,叢集上有數個停用的附加元件。 無須擔心您無法辨識的附加元件。
microk8s is running addons: cilium: disabled dashboard: disabled dns: disabled fluentd: disabled gpu: disabled helm3: disabled helm: disabled ingress: disabled istio: disabled jaeger: disabled juju: disabled knative: disabled kubeflow: disabled linkerd: disabled metallb: disabled metrics-server: disabled prometheus: disabled rbac: disabled registry: disabled storage: disabled
從清單中,您需要啟用 DNS、儀表板和登錄附加元件。 以下是每個附加元件的目的:
附加元件 目的 DNS 部署 coreDNS
服務。儀表板 部署 kubernetes-dashboard
服務及數個其他支援其功能的服務。 這是適用於 Kubernetes 叢集的一般用途 Web 架構 UI。登錄 部署私人登錄及數個支援其功能的服務。 若要儲存私人容器,請使用此登錄。 若要安裝附加元件,請執行下列命令。
sudo microk8s.enable dns dashboard registry
您現在已準備好使用 kubectl
來存取您的叢集。
探索 Kubernetes 叢集
MicroK8s 提供可用來與新 Kubernetes 叢集互動的 kubectl
版本。 此 kubectl
複本可供以平行方式安裝另一個全系統 kubectl
執行個體,而不會影響其功能。
執行
snap alias
命令,將microk8s.kubectl
別名設為kubectl
。 此步驟可簡化使用方式。sudo snap alias microk8s.kubectl kubectl
當命令成功完成時,即會顯示下列輸出:
Added: - microk8s.kubectl as kubectl
顯示叢集節點資訊
回想一下先前所提到的,Kubernetes 叢集存在於控制平面與背景工作節點之外。 讓我們探索新叢集以了解安裝了哪些項目。
檢查在叢集中執行的節點。
您了解 MicroK8s 是單一節點叢集安裝,因此預期只會看到一個節點。 不過,請記住,此節點在叢集中既是控制平面,也是背景工作節點。 執行
kubectl get nodes
命令來確認此設定。 若要擷取叢集中所有資源的相關資訊,請執行kubectl get
命令:sudo kubectl get nodes
結果會類似下列範例,其中顯示叢集中只有一個名稱為
microk8s-vm
的節點。 請注意,該節點的狀態為就緒。 就緒狀態表示控制平面可在此節點上排程工作負載。NAME STATUS ROLES AGE VERSION microk8s-vm Ready <none> 35m v1.17.3
您可取得所要求特定資源的詳細資訊。 例如,假設需要尋找節點的 IP 位址。 若要從 API 伺服器擷取額外資訊,請執行
-o wide
參數:sudo kubectl get nodes -o wide
結果看起來會類似下列範例。 請注意,您現在可看到節點的內部 IP 位址、節點上執行的 OS、核心版本,以及容器執行階段。
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME microk8s-vm Ready <none> 36m v1.17.3 192.168.56.132 <none> Ubuntu 18.04.4 LTS 4.15.0-88-generic containerd://1.2.5
下一步是探索在您叢集上執行的服務。 與節點相同,若要尋找正在叢集上執行服務的相關資訊,請執行
kubectl get
命令。sudo kubectl get services -o wide
結果類似於下列範例,但請注意只有列出一個服務。 先前您已在叢集上安裝附加元件,且也預期會看到這些服務。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none>
單一服務清單的原因是 Kubernetes 使用稱為命名空間的概念,以邏輯方式將叢集分割成多個虛擬叢集。
若要擷取所有命名空間中的所有服務,請傳遞
--all-namespaces
參數:sudo kubectl get services -o wide --all-namespaces
結果看起來會類似下列範例。 請注意,您的叢集中有三個命名空間。 分別為預設、
container-registry
及kube-system
命名空間。 您可在這裡查看已安裝的registry
、kube-dns
及kubernetes-dashboard
執行個體。 也有與部分附加元件一起安裝的支援服務。NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR container-registry registry NodePort 10.152.183.36 <none> 5000:32000/TCP 28m app=registry default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 37m <none> kube-system dashboard-metrics-scraper ClusterIP 10.152.183.130 <none> 8000/TCP 28m k8s-app=dashboard-metrics-scraper kube-system heapster ClusterIP 10.152.183.115 <none> 80/TCP 28m k8s-app=heapster kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 28m k8s-app=kube-dns kube-system kubernetes-dashboard ClusterIP 10.152.183.132 <none> 443/TCP 28m k8s-app=kubernetes-dashboard kube-system monitoring-grafana ClusterIP 10.152.183.88 <none> 80/TCP 28m k8s-app=influxGrafana kube-system monitoring-influxdb ClusterIP 10.152.183.232 <none> 8083/TCP,8086/TCP 28m k8s-app=influxGrafana
既然您可看到在叢集上執行的服務,現在即可在背景工作節點上排程工作負載。
在叢集上安裝網頁伺服器
您想在叢集上排程網頁伺服器來為客戶提供網站服務。 您可從幾種選項中選擇。 針對此範例,您會使用 NGINX。
回想一下先前所提到的,您可使用 Pod 資訊清單檔案來描述 Pod、ReplicaSet 及部署,以定義工作負載。 因為您尚未詳細說明這些檔案,所以您會執行 kubectl
將資訊直接傳遞給 API 伺服器。
儘管使用 kubectl
很方便,但使用資訊清單檔案是最佳做法。 資訊清單檔案可供在叢集中輕鬆地向前或向後復原部署。 這些檔案也有助於記載叢集的設定。
若要建立 NGINX 部署,請執行
kubectl create deployment
命令。 指定部署名稱和容器映像,以建立單一 Pod 執行個體。sudo kubectl create deployment nginx --image=nginx
結果看起來會類似下列範例:
deployment.apps/nginx created
若要擷取部署的相關資訊,請執行
kubectl get deployments
:sudo kubectl get deployments
結果看起來會類似下列範例。 請注意,部署名稱會與所提供的名稱相同,且一個使用此名稱的部署已處於就緒狀態且可供使用。
NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 18s
部署已建立一個 Pod。 若要擷取叢集 Pod 的相關資訊,請執行
kubectl get pods
命令:sudo kubectl get pods
結果看起來會類似下列範例。 請注意,Pod 名稱是產生的值,前面會加上部署的名稱,且 Pod 的狀態為執行中。
NAME READY STATUS RESTARTS AGE nginx-86c57db685-dj6lz 1/1 Running 0 33s
測試網站安裝
透過 Pod IP 位址來連線到網頁伺服器,以測試 NGINX 安裝。
若要尋找 Pod 的位址,請傳遞
-o wide
參數:sudo kubectl get pods -o wide
結果看起來會類似下列範例。 請注意,此命令會傳回節點的 IP 位址,以及已排程工作負載的節點名稱。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 4m17s 10.1.83.10 microk8s-vm <none> <none>
若要存取網站,請在之前所列的 IP 上執行
wget
:wget <POD_IP>
結果看起來會類似下列範例:
--2020-03-16 13:34:17-- http://10.1.83.10/ Connecting to 10.1.83.10:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: 'index.html' index.html 100%[==============================================================================================>] 612 --.-KB/s in 0s 2020-03-16 13:34:17 (150 MB/s) - 'index.html' saved [612/612]
調整叢集上的網頁伺服器部署
假設您突然發現存取網站的使用者增加,且網站因負載而開始發生失敗。 您可在叢集中部署更多網站執行個體,並將負載分散到各個執行個體。
若要縮放部署中的複本數,請執行 kubectl scale
命令。 您可以指定所需的複本數目,以及部署的名稱。
若要將 NGINX Pod 的總數增加到三個,請執行
kubectl scale
命令:sudo kubectl scale --replicas=3 deployments/nginx
結果看起來會類似下列範例:
deployment.apps/nginx scaled
scale 命令可供相應增加或縮小執行個體計數。
若要檢查正在執行的 Pod 數目,請執行
kubectl get
命令,並再次傳遞-o wide
參數:sudo kubectl get pods -o wide
結果看起來會類似下列範例。 請注意,您現在會看到三個執行中的 Pod,每個都有其唯一的 IP 位址。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-86c57db685-dj6lz 1/1 Running 0 7m57s 10.1.83.10 microk8s-vm <none> <none> nginx-86c57db685-lzrwp 1/1 Running 0 9s 10.1.83.12 microk8s-vm <none> <none> nginx-86c57db685-m7vdd 1/1 Running 0 9s 10.1.83.11 microk8s-vm <none> <none> ubuntu@microk8s-vm:~$
您必須將數個其他設定套用至叢集,才能有效地將網站公開為公眾對應網站。 例如安裝負載平衡器和對應節點 IP 位址。 這類設定會構成未來將探索的部分進階層面。 在摘要中,如果您選擇解除安裝和清除 VM,則會提供指示。