練習 - 探索 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 安裝是安裝步驟最少的安裝選項。 請切換至終端機視窗,然後執行下列指示中的命令:

  1. 安裝 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 管理員。

  1. GitHub 下載並安裝適用於 Windows 的最新版 Multipass。

  2. 在命令主控台中,執行 Multipass 啟動命令以設定並執行 microk8s-vm 映像。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. 在收到 microk8s-vm 的啟動確認之後,執行 multipass shell microk8s-vm 命令以存取 VM 執行個體。

    multipass shell microk8s-vm
    

    Multipass 運作之後,您可以存取 Ubuntu VM 來裝載叢集並安裝 MicroK8s。

  4. 安裝 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 管理員。

  1. 您有兩個選項可在 macOS 上安裝 Multipass。 從 GitHub 下載並安裝適用於 macOS 的最新版 Multipass,或使用 Homebrew 搭配 brew cask install multipass 命令來安裝 Multipass。

    brew install --cask multipass
    
  2. 在命令主控台中,執行 Multipass 啟動命令以設定並執行 microk8s-vm 映像。 視網際網路連線與電腦的速度而定,此步驟可能需要幾分鐘的時間才能完成。

    multipass launch --name microk8s-vm --memory 4G --disk 40G
    
  3. 在收到 microk8s-vm 的啟動確認之後,執行 multipass shell microk8s-vm 命令以進入 VM 執行個體。

    multipass shell microk8s-vm
    

    此時,即可存取 Ubuntu VM 以裝載叢集。 您仍然必須安裝 MicroK8s。 請遵循下列步驟。

  4. 安裝 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 功能。

  1. 若要檢查安裝的狀態,請執行 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
    
  2. 從清單中,您需要啟用 DNS、儀表板和登錄附加元件。 以下是每個附加元件的目的:

    附加元件 目的
    DNS 部署 coreDNS 服務。
    儀表板 部署 kubernetes-dashboard 服務及數個其他支援其功能的服務。 這是適用於 Kubernetes 叢集的一般用途 Web 架構 UI。
    登錄 部署私人登錄及數個支援其功能的服務。 若要儲存私人容器,請使用此登錄。

    若要安裝附加元件,請執行下列命令。

    sudo microk8s.enable dns dashboard registry
    

您現在已準備好使用 kubectl 來存取您的叢集。

探索 Kubernetes 叢集

MicroK8s 提供可用來與新 Kubernetes 叢集互動的 kubectl 版本。 此 kubectl 複本可供以平行方式安裝另一個全系統 kubectl 執行個體,而不會影響其功能。

  1. 執行 snap alias 命令,將 microk8s.kubectl 別名設為 kubectl。 此步驟可簡化使用方式。

    sudo snap alias microk8s.kubectl kubectl
    

    當命令成功完成時,即會顯示下列輸出:

    Added:
      - microk8s.kubectl as kubectl
    

顯示叢集節點資訊

回想一下先前所提到的,Kubernetes 叢集存在於控制平面與背景工作節點之外。 讓我們探索新叢集以了解安裝了哪些項目。

  1. 檢查在叢集中執行的節點。

    您了解 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
    
  2. 下一步是探索在您叢集上執行的服務。 與節點相同,若要尋找正在叢集上執行服務的相關資訊,請執行 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-registrykube-system 命名空間。 您可在這裡查看已安裝的 registrykube-dnskubernetes-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 很方便,但使用資訊清單檔案是最佳做法。 資訊清單檔案可供在叢集中輕鬆地向前或向後復原部署。 這些檔案也有助於記載叢集的設定。

  1. 若要建立 NGINX 部署,請執行 kubectl create deployment 命令。 指定部署名稱和容器映像,以建立單一 Pod 執行個體。

    sudo kubectl create deployment nginx --image=nginx
    

    結果看起來會類似下列範例:

    deployment.apps/nginx created
    
  2. 若要擷取部署的相關資訊,請執行 kubectl get deployments

    sudo kubectl get deployments
    

    結果看起來會類似下列範例。 請注意,部署名稱會與所提供的名稱相同,且一個使用此名稱的部署已處於就緒狀態且可供使用。

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18s
    
  3. 部署已建立一個 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 安裝。

  1. 若要尋找 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>
    
  2. 若要存取網站,請在之前所列的 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 命令。 您可以指定所需的複本數目,以及部署的名稱。

  1. 若要將 NGINX Pod 的總數增加到三個,請執行 kubectl scale 命令:

    sudo kubectl scale --replicas=3 deployments/nginx
    

    結果看起來會類似下列範例:

    deployment.apps/nginx scaled
    

    scale 命令可供相應增加或縮小執行個體計數。

  2. 若要檢查正在執行的 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,則會提供指示。