練習 - 使用 Azure CNI 部署 Azure Kubernetes Service 叢集

已完成

注意

此練習為選擇性項目。 如果想要完成此練習,您必須先建立 Azure 訂用帳戶,再開始進行。 如果您沒有 Azure 帳戶,或者目前不想建立帳戶,您可以閱讀相關指示,以了解所呈現的資訊。

在此練習中,您會部署虛擬網路、子網路和身分識別,然後使用 Azure 容器網路介面 (CNI) 外掛程式,部署 Azure Kubernetes Service (AKS) 叢集。

您聯絡了公司的 IT 部門,並提供了您收集到有關應用程式需求、虛擬機器 (VM) 大小規模和網路大小規模的資訊。 IT 部門提供了一些您可用於叢集的網路位址範圍。

下表列出 IT 部門所提供的需求和 IP 位址:

項目 說明 IP 位址
AKS 子網路 叢集中節點和 Pod 的 IP 位址。 需要 248 個可用的 IP 位址。 10.150.20.0/24
Kubernetes Service 子網路 Kubernetes 服務叢集內使用的 IP 位址。 不得與其他虛擬網路或內部部署網路衝突。 10.240.0.0/24
網域名稱系統 (DNS) 服務 IP 位址 必須位於 Kubernetes 服務子網路中,但不得為可用範圍中的第一個 IP 位址。 10.240.0.10
  • 對於 AKS 子網路,您確定需要 248 個可用的 IP 位址。 您的 IT 部門提供了 10.150.20.0/24 的網路,這會在考慮到 Azure 在每個子網路中保留的 5 個位址後提供 251 個可用的 IP 位址。
  • Kubernetes 服務子網路是一組 IP 位址,不會用於任何其他 Azure 虛擬網路,且不會與任何內部部署網路範圍衝突。 此位址範圍只會在叢集內使用。 您的 IT 部門指出了您應該使用 10.240.0.0/24。
  • DNS 服務 IP 位址Kubernetes 服務子網路位址範圍內的單一 IP 位址,但不得為該範圍中的第一個 IP 位址。 您決定使用 10.240.0.10 當作 DNS IP 位址。

建立虛擬網路與子網路

針對本練習,您會建立一個虛擬網路和子網路。 在現實的環境中,您的 IT 部門可能有一個小組負責管理網路,他們可能會為您建立這些資源。

  1. 啟動 Azure Cloud Shell

  2. 如果您尚未登入 Azure,請使用 az login 命令登入您的 Azure 帳戶。

    az login
    
  3. 選擇靠近您的 Azure 區域,例如 eastus。 將值儲存在環境變數中,以便您可以在練習的其餘部分使用它。

    AKSLocation=eastus
    
  4. 使用 az group create 命令建立一個資源群組 (AKSLearn) 來保存本練習中的資源。

    az group create --location $AKSLocation --name AKSLearn
    
  5. 使用 az network vnet create 命令建立一個虛擬網路 (AKSVirtualNetwork)。

    az network vnet create \
        --name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --address-prefixes 10.150.0.0/16  \
        --location $AKSLocation
    
  6. 使用 az network vnet subnet create 命令建立一個子網路 (AKSSubnet),並指定 IT 部門所提供的位址範圍。

    az network vnet subnet create \
        --resource-group AKSLearn \
        --vnet-name AKSVirtualNetwork \
        --name AKSSubnet \
        --address-prefixes 10.150.20.0/24
    

建立一個 Azure 受控識別

您需要為 AKS 建立一個 Azure 受控識別,以用來存取您的 Azure 訂用帳戶內的資源。 下列兩個命令會建立 Azure 受控識別,然後將其唯一識別碼值儲存在環境變數中,以供稍後使用。

  1. 使用 az identity create 命令建立一個 Azure 受控識別 (AKSIdentity)。

    az identity create \
        --name AKSIdentity \
        --resource-group AKSLearn
    
  2. 使用 az identity show 命令取得受控識別的識別碼,並將它儲存在環境變數 identityId 中,以便在後續的命令中使用。

    identityId=$(az identity show \
        --name AKSIdentity \
        --resource-group AKSLearn \
        --query id \
        --output tsv)
    

建立 AKS 叢集

  1. 使用 az network vnet subnet list 命令取得子網路的資源識別碼值,並將它儲存在環境變數 subnetId 中,以便在後續的命令中使用。

    subnetId=$(az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[?name=='AKSSubnet'].id" \
        --output tsv)
    
  2. 使用 az aks create 命令建立一個 AKS 叢集 (AKSCluster)。

    az aks create \
        --name AKSCluster \
        --resource-group AKSLearn \
        --location $AKSLocation \
        --network-plugin azure \
        --vnet-subnet-id $subnetId \
        --service-cidr 10.240.0.0/24 \
        --dns-service-ip 10.240.0.10 \
        --generate-ssh-keys \
        --enable-managed-identity \
        --assign-identity $identityId \
        --node-vm-size  Standard_F8s_v2 \
        --node-count 3
    

    下表描述 az aks create 命令中所使用的參數:

    參數 描述
    --name 正在建立的叢集名稱。
    --resource-group 應在其中建立叢集的資源群組。
    --location 應在其中建立叢集的 Azure 區域。
    --network-plugin 指定要使用的網路外掛程式。
    --vnet-subnet-id 指定要使用之子網路的資源識別碼。
    --service-cidr 指定要使用的 Kubernetes 服務位址範圍。
    --dns-service-ip 指定要使用的 DNS IP 位址。
    --generate-ssh-keys 建立一組用來保護節點的 SSH 金鑰。
    --enable-managed-identity 可讓您使用 Azure 受控識別來存取 Azure 訂用帳戶中的資源。
    --assign-identity 指定要使用之 Azure 受控識別的識別碼值。
    --node-vm-size 指定要使用的 VM 大小。
    --node-count 指定要建立的節點數目。
  3. 叢集成功部署之後,請使用 az aks nodepool list 命令來查看節點集區的詳細資料。

    az aks nodepool list \
        --cluster-name AKSCluster \
        --resource-group AKSLearn \
        --output table
    

    您的輸出看起來應類似下列的範例輸出:

    Name       OsType    VmSize           Count    MaxPods    ProvisioningState    Mode
    ---------  --------  ---------------  -------  ---------  -------------------  ------
    nodepool1  Linux     Standard_F8s_v2  3        30         Succeeded            System
    

    從輸出中,您可以看到有三個 Standard_F8s_v2 類型節點、MaxPods 值為 30,以及節點集區模式為 System

確認叢集的 IP 位址使用量

  • 使用 az network vnet subnet list 命令來查看叢集正在使用的 IP 位址數目。

    az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[].ipConfigurations.length(@)" \
        --output table
    

    此命令會使用 JMESPath 查詢字串,判斷子網路中定義的 ipConfigurations 數量。 輸出上限應該是 93。 您部署了三個節點來開始,因此每個節點都有一個 IP 位址。 您使用了 30 的預設值作為最大的 Pod 數目,因此每個節點都有 30 個預先配置的 IP 位址可供 Pod 使用。 到目前為止配置的 IP 位址總數為 3 x nodes + (30 pods * 3 nodes) = 93。 不過,某些位址會保留,因此您的輸出可能較少。

將額外節點新增至叢集

讓我們看看 IP 位址使用量如何受到竊取叢集和新增一個額外節點的影響。

  1. 使用 az aks scale 命令擴大叢集規模並新增一個節點。

    az aks scale \
        --name AKSCluster \
        --resource-group AKSLearn \
        --node-count=4
    
  2. 該命令成功完成之後,請使用 az aks nodepool list 命令來確認節點集區新的詳細資料。

    az aks nodepool list \
        --cluster-name AKSCluster \
        --resource-group AKSLearn \
        --output table
    

    您的輸出看起來應該類似下列的範例輸出,其中顯示您現在有四個節點。

    Name       OsType    VmSize           Count    MaxPods    ProvisioningState    Mode
    ---------  --------  ---------------  -------  ---------  -------------------  ------
    nodepool1  Linux     Standard_F8s_v2  4        30         Succeeded            System
    
  3. 使用 az network vnet subnet list 命令來查看叢集現在正在使用的 IP 位址數目。

    az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[].ipConfigurations.length(@)" \
        --output table
    

    這次,輸出上限應該是 124,比上次多了 31。 這是新節點多一個 IP 位址,再加上針對將在該節點上執行的 Pod 預先配置的 30 個 IP 位址。 不過,某些位址會保留,因此您的輸出可能較少。