天天看點

使用Docker Desktop建立一個Kubernetes叢集

作者:吉祥莊鋼鐵俠
使用Docker Desktop建立一個Kubernetes叢集

先決條件。

  1. 安裝了Docker桌面
  2. 基本的Kubernetes知識
  3. 代碼編輯器

目标。

  1. 在Docker桌面上啟用Kubernetes
  2. 建立Redis YAML檔案來部署4個pod
  3. 建立Apache YAML檔案來部署10個pod
  4. 使用YAML檔案部署Redis和Apache pods
  5. 在pod之間進行交流

簡介

Kubernetes是一個高度複雜的容器協調工具,允許你自動進行軟體部署、擴充和管理。它就像類固醇的Docker Compose,有更多的規範選項,這可能使它更難學習和使用。在本教程中,我們将建立一個Kubernetes叢集,并部署4個Redis莢和10個Apache莢。在我們開始之前,有一些重要的關鍵詞,你應該熟悉一下。

控制平面由做決策的主節點組成。控制平面必須至少有一個主節點,但可以有更多的主節點。在主節點内部,你會發現API伺服器、排程器、控制器管理器、etcd等等。這裡有幾個關鍵術語。

  1. kube-apiserver - Kubernetes控制平原的前端。
  2. 排程器 - 控制你的容器如何以及在哪裡被放置在稱為pod的對象的節點上。
  3. 控制器管理器 - 使用API來确定叢集的狀态,并確定它處于YAML規範所定義的狀态;負責維護指定數量的複制,并在失敗時重新啟動pod。
  4. etcd - 資料庫後端,是一個分布式的鍵值檔案系統
  5. coreDNS - 控制DNS記錄
使用Docker Desktop建立一個Kubernetes叢集

一個節點是指K8叢集中的單個伺服器(執行個體)。請注意,Docker Desktop上的Kubernetes是不可配置的,隻支援單節點叢集。我們在Docker Desktop中建立的服務(4個Redis,10個Apache)都将在主(控制面)節點上運作。理想情況下,你希望一個主節點有兩個工作節點,但這在Docker Desktop中是不可能的。盡管如此,本教程将有助于告訴你如何建立你的Kubernetes YAML檔案。

莢是Kubernetes的基本部署機關。它就像你的容器的一個容器。你可以在一個pod中擁有多個容器,在一個節點中擁有多個pod。

叢集是一組節點,但也可以是一個單節點。一個單節點叢集将隻由控制平面組成。一個多節點叢集将由任何數量的主節點和任何數量的工作節點組成。上圖是一個多節點叢集的例子。

Kubectl是配置K8s和管理應用程式的CLI,并自動與Docker Desktop一起安裝。

Kubelet是運作在節點上的K8s代理。它是一個API引擎,與本地運作時對話,并傳回到控制平面。Kubelet也會随Docker Desktop自動安裝。

Kube-proxy控制網絡并維護節點上的網絡規則。

現在你知道了一些基本術語,讓我們開始使用Docker Desktop。如果你已經安裝了Docker Desktop,請跳過下一節。

安裝Docker桌面

要安裝Docker Desktop,請遵循以下說明。

Docker Desktop for Windows

Docker Desktop for Mac

Linux的Docker桌面

在Docker桌面上啟用Kubernetes

要在Docker Desktop上啟用Kubernetes,首先打開Docker Desktop,點選設定圖示。在左邊的菜單上選擇Kubernetes,然後點選啟用Kubernetes。在右下方,點選應用和重新開機(我的是灰色的,因為我已經完成了這些步驟)。現在你已經準備好在你的CLI中開始使用Kubernetes了。

使用Docker Desktop建立一個Kubernetes叢集

Kubernetes對象

Kubernetes對象是你在Kubernetes系統中建立的持續或持久的實體。對象的例子包括莢、服務、卷、命名空間、部署、複制集、作業等等。對象是在YAML或JSON檔案中定義的,随後從該檔案中建立。在本教程中,我将使用YAML。每個檔案都包含一個或多個資源描述,這些描述被稱為清單。每個清單描述一個對象。每個清單至少有四個必要條目,這些條目包括:。

apiVersion:
kind:
metadata:
  name: 
spec:
           

apiVersion: - 你想使用哪個Kubernetes API版本

kind: - 你想建立什麼類型或種類的對象

中繼資料: - 用于唯一識别對象的資料

name: - 所需的中繼資料為字元串格式

規格。- 對象的期望狀态

API版本、種類和中繼資料

在建立YAML檔案時,我們如何知道這些所需的條目下有哪些選項可供嵌套?我們可以使用下面的指令來擷取一個叢集所支援的所有資源以及它所需要的API版本的清單。

kubectl api-resources
           

你将得到一個你可以建立的對象的廣泛清單。注意這個清單包括你需要在YAML檔案中指明的API版本,以及Kind名稱。API版本的不同取決于你所建立的對象的種類。例如,如果你想建立一個部署,你将需要在你的YAML檔案中使用apps/v1作為API版本,并使用Deployment作為Kind。

一些常見的 Kind 對象是 Pod、部署和服務。一個Pod Kind部署了一個單獨的pod。在本教程中,我們想部署4個Redis pod和10個Apache pod,是以我們将使用Deployment Kind。在部署類型中,我們将能夠指定我們想要的複制數量。

使用Docker Desktop建立一個Kubernetes叢集

中繼資料字段是必需的,必須包括一個指定的名稱。要檢視中繼資料的所有關鍵選項,請使用以下指令。

kubectl explain deployments --recursive
           
使用Docker Desktop建立一個Kubernetes叢集

規格

規範是你定義你想要建立的對象的所有細節的地方。我們知道,我們将使用部署類型來建立具有多個副本的莢。在spec中包含大量的選項,你可以通過使用上一節中的相同指令,看到部署類型支援的所有不同的可用資源鍵。

kubectl explain deployments --recursive
           
使用Docker Desktop建立一個Kubernetes叢集

還有更多的部署規格選項,但太多了,無法用一張截圖來記錄。

要獲得每個規格選項的解釋,以确定是否要在YAML檔案中包含它,請使用以下指令。

kubectl explain deployments.spec
           

當建構你的YAML檔案時,你基本上是在嵌套選項。你可以使用上述指令來檢視有哪些選項。你可以通過添加.<option>來進一步定義你的選項,你想加多少次就加多少次,沿着選項樹往下加。這有點難以解釋,但這裡有一個例子。如果我想看deployments.spec的選項,我運作上述指令,得到的輸出如下。

使用Docker Desktop建立一個Kubernetes叢集

這告訴我在YAML檔案的deployment.spec下可以嵌套的所有選項。我知道我想使用副本,因為我想建立4個Redis的副本和10個Apache的副本。最好的做法是把這些服務分别放在自己的pod中,是以我們将建立兩個YAML檔案。讓我們開始處理Redis檔案。

首先建立一個新的目錄,用來存放你的YAML檔案。然後建立一個新檔案(我把我的檔案命名為k8s_redis.yml)。在CLI中通過VIM或你喜歡的文本編輯器打開該檔案。我使用的是VS Code。

早些時候,我們發現部署的API版本,并注意到它是app/V1。類型是部署。對于中繼資料,需要一個名稱,我們将把這個pod稱為redis-deploy。我們将使用一些可選的标簽,你可以在這裡了解一下。名稱是中繼資料的唯一要求,而且你不能在名稱中使用下劃線(_)。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
           

現在讓我們進入規範。在這裡,我們将定義我們想要建立的對象的所有細節。通過上面的截圖,我們知道我們要包括複制,以表明我們想要的複制數量,選擇器,以用于我們的标簽,以及模闆,以描述将被建立的莢。讓我們把這些添加到我們的YAML檔案中,嵌套在spec下面。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas:
    selector:
    template:
           

在Redis YAML檔案中添加副本

複制(Replicas)可能是最容易正确的一項。隻需添加你想要建立的副本數量。我們想要4個Redis的副本。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
    template:
           

在Redis YAML檔案中添加标簽選擇器

标簽是連接配接到對象(如pod或部署)的鍵:值對。标簽是可有可無的,但如果你以後需要搜尋一個特定的pod,那麼包含标簽是很好的做法。一個标簽選擇器可以幫助使用者識别一組對象。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
           

在Redis YAML檔案中添加模闆

模闆是肉的所在。這是我們在pod中定義我們的容器的地方。要檢視有哪些可用的選項,請使用以下指令。

kubectl explain deployments.spec.template
           

你可以看到,我們在這裡唯一的選擇是中繼資料和規格。

使用Docker Desktop建立一個Kubernetes叢集

因為我們使用的是标簽,是以我們需要在中繼資料下包含這個内容。要看在中繼資料下會有哪些選項,請在前面的指令中添加.metadata擴充名。中繼資料有很多選項,是以我隻附上了幾個選項的螢幕截圖。

使用Docker Desktop建立一個Kubernetes叢集

如果你滾動浏覽中繼資料,你會發現标簽是一個選項。讓我們繼續前進,開始添加到我們的YAML檔案。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
           

要看我們可以在标簽下嵌套哪些選項,請在前面的指令中加入.labels。希望這開始有意義了,你可以通過.<option>來确定你的解釋指令的選項。

使用Docker Desktop建立一個Kubernetes叢集
apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
                app: redis
                           

添加完中繼資料後,我們要開始添加模闆的規格資訊。使用下面的指令來檢視模闆下要嵌套的規格選項。

kubectl explain deployments.spec.template.spec
           

有大量的選項,我們将使用容器來定義我們想要建立的容器。下面是完成的Redis YAML檔案。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis-deploy
    labels:
        app: redis
        spec:
    replicas: 4
    selector:
        matchLabels:
            app: redis
                template:
        metadata:
            labels:
                app: redis
                        spec:
            containers:
            - name: redis
                          image: redis:7.0.9
              ports:
              - containerPort: 6379
           

使用我們上面使用的相同的樹形擴充方法來解釋可用的選項。注意,在容器下,你确實需要在name和containerPort前加上-。縮進是YAML的關鍵。你可以有兩個或四個空格用于嵌套。請注意,在你包含-的地方,它是直接在上面的字下面,總縮進為兩個而不是四個。在容器部分,你給你的容器起一個名字,并确定鏡像的名稱和版本,這可以從Docker Hub獲得。你可以選擇性地确定要在pod的IP位址上公開的端口。

建立Apache YAML檔案

要建立Apache(httpd)YAML檔案,請使用建立Redis檔案的相同步驟和技術。首先在與前一個檔案相同的目錄下建立一個新檔案,并命名為k8s_httpd.yml之類的。apiVersion和種類是一樣的。改變中繼資料标簽以反映httpd。把副本改成10個。改變容器和鏡像的名稱,以反映你想使用的httpd鏡像和版本。将容器端口改為80。

apiVersion: apps/v1
kind: Deployment
metadata:
    name: httpd-deploy
    labels:
        app: httpd
        spec:
    replicas: 10
    selector:
        matchLabels:
            app: httpd
                template:
        metadata:
            labels:
                app: httpd
                        spec:
            containers:
            - name: httpd
                          image: httpd:2.4.56
              ports:
              - containerPort: 80
           

部署Pods

為了從我們的YAML檔案中建立pod,我們将使用以下指令。

kubectl apply -f <file_name.yml>
             

我們将不得不運作這個指令兩次(一次用于建立Redis pods,一次用于建立Apache pods)。

使用Docker Desktop建立一個Kubernetes叢集
使用Docker Desktop建立一個Kubernetes叢集

要驗證你剛剛建立的一切,請使用以下指令。

kubectl get all
           

你應該看到4個Redis和10個Apache pods。你還可以看到自動配置設定給叢集的叢集IP,以及你在YAML檔案中定義複制時建立的ReplicaSets。

使用Docker Desktop建立一個Kubernetes叢集

确認群集建立

在運作kubectl get all指令後,我們已經證明了我們的叢集已經建立。記住,Docker Desktop隻能建立一個單節點叢集,是以所有東西都在主節點(控制平面)上運作。要驗證這一點,請使用以下指令。

kubectl get nodes
           

上面的指令輸出了你的叢集中的節點清單。我們可以從輸出中看到,我們隻有一個節點在運作,這個節點是控制計劃或主節點。

使用Docker Desktop建立一個Kubernetes叢集

平台之間的溝通

在Kubernetes中,一個pod中的容器可以自動通過localhost互相通信。如果你希望一個pod能夠與另一個pod進行通信,你可以使用每個pod的唯一IP位址來實作。你也可以建立一個服務,但這不在本教程的範圍之内。要獲得pod的IP位址,請使用以下指令。

kubectl get pod -o wide
           
使用Docker Desktop建立一個Kubernetes叢集

為了測試pod之間使用其IP位址的通信,我們可以使用ping指令。使用下面的指令來進入一個pod。我将進入我的第一個Redis pod(redis-deploy-cdd55dd6d-hrmfh)。

kubectl exec --stdin --tty <pod_name> -- /bin/bash
           
使用Docker Desktop建立一個Kubernetes叢集

/bin/bash打開一個shell腳本,以便你可以運作指令。運作。

apt update -y
           

然後運作。

apt upgrade -y
           

要安裝PING,請運作。

apt install iputils-ping -y
           

現在ping已經安裝好了,我們可以ping其他任何一個pod的IP位址來測試可達性。使用控制C來停止ping。

使用Docker Desktop建立一個Kubernetes叢集

清理

要删除你建立的pod,首先使用exit指令離開pod shell。然後使用下面的指令。

kubectl delete deployment <deployment_name>
             
使用Docker Desktop建立一個Kubernetes叢集