在 Virtual Private Cloud (VPC) 中設定第一個叢集

在您的虛擬私有雲(VPC)中建立一個 IBM Cloud® Kubernetes Service 叢集。

使用 VPC 上的 IBM Cloud Kubernetes Service 叢集,您可以在 虛擬私有雲 中的下一代 IBM Cloud 平台中建立叢集。 VPC 為您提供專用雲端環境的安全,同時具備公用雲端的動態可調整性。 VPC 使用的是下一個版本的 IBM Cloud Kubernetes Service 基礎架構提供者,包含一群精選的第 2 版 API、CLI 和主控台功能。 只能為 VPC 建立標準叢集。

適用對象

本教學指南適用於首次在 VPC 中的 IBM Cloud Kubernetes Service 中建立叢集的管理員。

目標

在指導教學的各個課程中,您將在 Virtual Private Cloud (VPC) 中建立 IBM Cloud Kubernetes Service 叢集。 接著,您部署一個應用程式,並透過負載平衡器將該應用程式對外公開。

你會得到什麼

在本教學中,您將建立以下資源。 如果您不想在完成指導教學之後保留這些資源,則有一些選用步驟可刪除這些資源。

  • VPC 叢集
  • 部署至叢集的簡式 Hello World 應用程式
  • 用於公開應用程式的 VPC 負載平衡器

必要條件

請完成下列必要步驟,以設定許可權及指令行環境。

許可權
如果您是帳戶擁有者,則已具有建立叢集所需的許可權,並且可以繼續執行下一步。 否則,請要求帳戶擁有者 設定 API 金鑰,並在 IBM Cloud IAM 中為您指派最低使用者許可權。
指令行工具
若要從指令行快速存取資源,請嘗試 IBM Cloud Shell。 否則,請完成下列步驟來設定本端指令行環境。
  1. 安裝 IBM Cloud CLI (ibmcloud)、Kubernetes Service 外掛程式 (ibmcloud ks) 和 IBM Cloud Container Registry 外掛程式 (ibmcloud cr)
  2. 安裝 Red Hat OpenShift(oc)和 Kubernetes(kubectl)CLI
  3. 若要使用 VPC,請安裝 infrastructure-service 外掛程式。 用於執行指令的字首是 ibmcloud is
    ibmcloud plugin install infrastructure-service
    
  4. 將 Kubernetes Service 外掛程式更新為最新版本。
    ibmcloud plugin update kubernetes-service
    
  5. 確定 kubectl 版本與 VPC 叢集的 Kubernetes 版本相符。 本教學將建立一個執行版本 1.35 的叢集。

在 VPC 中建立叢集

在 IBM Cloud Kubernetes Service Virtual Private Cloud (VPC) 環境中建立 IBM Cloud 叢集。 如需 VPC 的相關資訊,請參閱 開始使用 Virtual Private Cloud

  1. 登入您要在其中建立 VPC 環境的帳戶、資源群組及 IBM Cloud 地區。 VPC 必須設定在您欲建立叢集的同一多區域都會區內。 在本指導教學中,將在 us-south 建立 VPC。 如需其他支援的地區,請參閱適用於 VPC 叢集的多區域都會。 如果您擁有聯合身分識別碼,請包含 --sso 選項。
    ibmcloud login -r us-south [-g <resource_group>] [--sso]
    
  2. 為叢集建立 VPC。 如需相關資訊,請參閱有關在主控台CLI 中建立 VPC 的文件。
    1. 建立一個名為「myvpc」的 VPC,並記下輸出中的 ID。 VPC 會為要在公用雲端中執行的工作負載提供隔離的環境。 可以將相同 VPC 用於多個叢集,例如如果計劃使不同的叢集管理需要相互通訊的不同微服務。 如果要分隔叢集(例如,針對不同部門的叢集),則可以為每個叢集建立一個 VPC。
        ibmcloud is vpc-create myvpc
        ```
    2. 為 VPC 建立子網路,並記下其 **ID**。 建立 VPC 子網路時,請考慮下列資訊:
        - **區域**:叢集裡每個區域必須有一個 VPC 子網路。 可用的區域取決於您建立 VPC 的都會區。 若要列出該區域中可用的區域,請執行 `ibmcloud is zones`。
        - **IP 位址**:VPC 子網會為叢集中的工作節點和負載平衡服務提供私有 IP 位址,因此請務 [必建立一個擁有足夠 IP 位址的子網,](/docs/containers?topic=containers-vpc-subnets#vpc_basics_subnets) 例如 256 個。 您無法在事後變更 VPC 子網所擁有的 IP 位址數量。
        - **公開閘道**:您無需連接公開閘道即可完成本教學。 可以改為使用 VPC 負載平衡器安全地公開工作負載,以便能使工作者節點保持隔離,避免受到公用存取。 如果工作者節點需要存取公用 URL,則可能要連接公用閘道。
    
    ```sh {: pre}
        ibmcloud is subnet-create mysubnet1 VPC_ID --zone us-south-1 --ipv4-address-count 256
        ```
    
  3. 在子網路所在的區域的 VPC 中建立叢集。 預設情況下,您的叢集建立時會包含一個公有雲服務端點和一個私有雲服務端點。 您可以使用公有雲服務端點,從本地端電腦存取 Kubernetes 主伺服器,例如執行 kubectl 指令。 您的工作節點可透過私有雲服務端點與主節點進行通訊。 如需有關命令選項的更多資訊,請參閱 cluster create vpc-gen2 CLI 參考文件
    ibmcloud ks cluster create vpc-gen2 --name myvpc-cluster --zone us-south-1 --version 1.35 --flavor bx2.2x8 --workers 1 --vpc-id VPC_ID --subnet-id VPC_SUBNET_ID
    
  4. 檢查叢集的狀態。 佈建叢集可能需要幾分鐘時間。
    1. 驗證叢集的 State 是否為 normal
        ibmcloud ks cluster ls --provider vpc-gen2
        ```
    2. 下載 Kubernetes 配置檔。
    ```sh {: pre}
        ibmcloud ks cluster config --cluster myvpc-cluster
        ```
    3. 檢查 Kubernetes CLI 伺服器版本,驗證叢集已適當地執行 `kubectl` 指令。
    ```sh {: pre}
        kubectl version  --short
        ```
        輸出範例
        ```sh {: screen}
        Client Version: 1.35
        Server Version: 1.35+IKS
        ```
    
    
    

部署專用可用的應用程式

建立 Kubernetes 部署以將單一應用程式實例作為 Pod 部署到 VPC 叢集裡的工作者節點。

  1. 將「Hello world」應用程式的原始碼複製到您的使用者主目錄中。 儲存庫在每一個以 Lab 為開頭的資料夾中包含不同版本的類似應用程式。 每一個版本都包含下列檔案:

    • Dockerfile:映像檔的建置定義。
    • app.js:Hello World 應用程式。
    • package.json:應用程式的相關 meta 資料。
    git clone https://github.com/IBM/container-service-getting-started-wt.git
    
  2. 前往 Lab 1 目錄。

    cd 'container-service-getting-started-wt/Lab 1'
    
  3. 請使用現有的登錄命名空間,或建立一個新的命名空間,例如 vpc-gen2

    ibmcloud cr namespace-list
    
    ibmcloud cr namespace-add vpc-gen2
    
  4. 建置 Docker 映像檔,其中包括 Lab 1 目錄的應用程式檔案。

    在映像檔名稱中,只可使用小寫英數字元或底線 (_)。 請不要忘記指令尾端的句點 (.)。 這個句點告訴 Docker 要在現行目錄中尋找 Dockerfile 及建置構件,以建置映像檔。

    docker build -t us.icr.io/<namespace>/hello-world:1 .
    

    當建置完成時,請驗證您看到下列成功訊息。

    => exporting to image                                                                           0.0s
    => => exporting layers                                                                          0.0s
    => => writing image sha256:3ca1eb1d0998f738b552d4c435329edf731fe59e427555b78ba2fb54f2017906     0.0s
    => => naming to <region>.icr.io/<namespace>/hello-world:1                                       0.0s
    
  5. 登入 IBM Cloud Container Registry。

    ibmcloud cr login
    
  6. 將映像檔推送至您建立的 IBM Cloud Container Registry 名稱空間。 如果未來需要變更應用程式,請重複這些步驟以建立映像檔的另一個版本。 附註:進一步瞭解使用容器映像檔時如何保護個人資訊安全

    docker push us.icr.io/<namespace>/hello-world:1
    
  7. 為應用程式建立部署。 部署可用來管理 Pod,而 Pod 中包括應用程式的容器化實例。 下列指令會將應用程式部署在某個單一 Pod 中。 基於本指導教學的目的,部署命名為 hello-world-deployment,但您可以將部署改為任何您想要的名稱。

    kubectl create deployment hello-world-deployment --image=us.icr.io/vpc-gen2/hello-world:1
    

    輸出範例

    deployment.apps/hello-world-deployment created
    

    進一步瞭解使用 Kubernetes 資源時如何保護個人資訊安全

  8. 藉由將部署公開為 NodePort 服務,使應用程式可供存取。 由於 VPC 工作者節點僅連接至專用子網路,因此 NodePort 僅指派有專用 IP 位址,不會在公用網路上公開。 在專用網路上執行的其他服務可以使用 NodePort 服務的專用 IP 位址來存取應用程式。

    kubectl expose deployment/hello-world-deployment --type=NodePort --name=hello-world-service --port=8080 --target-port=8080
    

    輸出範例

    service/hello-world-service exposed
    
    有關命令選項的資訊。
    參數 說明
    expose 將 Kubernetes 資源(例如部署)公開為 Kubernetes 服務,以便使用者能透過該服務的 IP 位址存取該資源。
    deployment/*<hello-world-deployment>* 要使用此服務公開之資源的資源類型及名稱。
    --name=*<hello-world-service>* 服務的名稱。
    --type=NodePort 要建立的服務類型。 在本課中,將建立 NodePort 服務。 在下一課中,將建立 LoadBalancer 服務。
    --port=*<8080>* 服務於其上接聽外部網路資料流量的埠。
    --target-port=*<8080>* 您的應用程式於其上接聽的埠,且服務會將送入的網路資料流量導向該埠。 在此範例中,target-portport 相同,但您建立的其他應用程式可能使用不同的埠。
  9. 既然所有的部署工作均已完成,接下來可以測試叢集裡的應用程式。 取得詳細資料以構成可用於存取應用程式的專用 IP 位址。

    1. 取得服務的相關資訊,以查看指派了哪個 NodePort。 使用 expose 指令來產生 NodePort 時,即已將其隨機指派,但範圍落在 30000 到 32767 之間。 在此範例中,NodePort 為 30872。
        kubectl describe service hello-world-service
        ```
        輸出範例
    
        ```sh {: screen}
        NAME:                   hello-world-service
        Namespace:              default
        Labels:                 run=hello-world-deployment
        Selector:               run=hello-world-deployment
        Type:                   NodePort
        IP:                     10.xxx.xx.xxx
        Port:                   <unset> 8080/TCP
        NodePort:               <unset> 30872/TCP
        Endpoints:              172.30.xxx.xxx:8080
        Session Affinity:       None
        No events.
        ```
    2. 列出執行應用程式的 Pod,並記下 Pod 名稱。
    ```sh {: pre}
        kubectl get pods
        ```
        輸出範例
        ```sh {: screen}
        NAME                                     READY     STATUS        RESTARTS   AGE
        hello-world-deployment-d99cddb45-lmj2v   1/1       Running       0          2d
        ```
    3. 說明 Pod 以尋找執行 Pod 的工作者節點。 在範例輸出中,Pod 所執行的工作節點是 **10.xxx.xx.xxx**。
    ```sh {: pre}
        kubectl describe pod hello-world-deployment-d99cddb45-lmj2v
        ```
        輸出範例
    
        ```sh {: screen}
        NAME:               hello-world-deployment-d99cddb45-lmj2v
        Namespace:          default
        Priority:           0
        PriorityClassName:  <none>
        Node:               10.xxx.xx.xxx/10.xxx.xx.xxx
        Start Time:         Mon, 22 Apr 20122 12:40:48 -0400
        Labels:             pod-template-hash=d99cddb45
                            run=hello-world-deployment
        Annotations:        kubernetes.io/psp=ibm-privileged-psp
        Status:             Running
        IP:                 172.30.xxx.xxx
        ...
        ```
    
  10. 登入到 Pod,以便可以從叢集內對應用程式發出要求。

    kubectl exec -it hello-world-deployment-d99cddb45-lmj2v /bin/sh
    
  11. 使用先前選取的工作者節點專用 IP 位址和節點埠,對 NodePort 服務發出要求。

    wget -O - 10.xxx.xx.xxx:30872
    

    輸出範例

    Connecting to 10.xxx.xx.xxx:30872 (10.xxx.xx.xxx:30872)
    Hello world from hello-world-deployment-d99cddb45-lmj2v! Your app is up and running in a cluster!
    -                    100% |*****************************************************************************************|    88   0:00:00 ETA
    

    若要關閉 Pod 階段作業,請輸入 exit

為 VPC 設定負載平衡器,以便將您的應用程式對外公開

設定 VPC 負載平衡器以在公用網路上公開應用程式。

在叢集裡建立 Kubernetes LoadBalancer 服務時,將在叢集外部的 VPC 中自動建立用於 VPC 的負載平衡器。 負載平衡器是多區域的,且會透過在您工作者節點上自動開啟的專用 NodePort,為您的應用程式遞送要求。 下圖說明了使用者如何透過負載平衡器存取應用程式的服務,即使您的工作節點僅連接到私有子網。

叢集的 VPC 負載平衡。
叢集的 VPC 負載平衡

  1. 在叢集裡建立 Kubernetes LoadBalancer 服務以公用方式公開 Hello World 應用程式。

    kubectl expose deployment/hello-world-deployment --type=LoadBalancer --name=hw-lb-svc  --port=8080 --target-port=8080
    

    輸出範例

    service "hw-lb-svc" exposed
    
    有關命令選項的資訊。
    參數 說明
    expose 將 Kubernetes 資源(例如部署)公開為 Kubernetes 服務,以便使用者能透過該服務的 IP 位址存取該資源。
    deployment/*<hello-world-deployment>* 要使用此服務公開之資源的資源類型及名稱。
    --name=*<hello-world-service>* 服務的名稱。
    --type=LoadBalancer 要建立的 Kubernetes 服務類型。 在本課中,將建立 LoadBalancer 服務。
    --port=*<8080>* 服務於其上接聽外部網路資料流量的埠。
    --target-port=*<8080>* 您的應用程式於其上接聽的埠,且服務會將送入的網路資料流量導向該埠。 在此範例中,target-portport 相同,但您建立的其他應用程式可能使用不同的埠。
  2. 驗證 Kubernetes LoadBalancer 服務已在您的叢集裡順利建立。 當您建立 Kubernetes LoadBalancer 服務時,會自動為您建立 VPC 負載平衡器。 VPC 負載平衡器會將主機名稱指派給 Kubernetes LoadBalancer 服務,您可以在 CLI 輸出的 LoadBalancer Ingress 欄位中看到該服務。 VPC 負載平衡器需要幾分鐘時間才能在 VPC 中進行佈建。 在 VPC 負載平衡器準備就緒之前,您無法透過其主機名稱存取 Kubernetes LoadBalancer 服務。

    kubectl describe service hw-lb-svc
    

    CLI 輸出範例

    NAME:                     hw-lb-svc
    Namespace:                default
    Labels:                   app=hello-world-deployment
    Annotations:              <none>
    Selector:                 app=hello-world-deployment
    Type:                     LoadBalancer
    IP:                       172.21.xxx.xxx
    LoadBalancer Ingress:     1234abcd-us-south.lb.appdomain.cloud
    Port:                     <unset> 8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset> 32040/TCP
    Endpoints:
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:
        Type    Reason                Age   From                Message
        ----    ------                ----  ----                -------
        Normal  EnsuringLoadBalancer  1m    service-controller  Ensuring load balancer
        Normal  EnsuredLoadBalancer   1m    service-controller  Ensured load balancer
    
  3. 驗證 VPC 負載平衡器已在您的 VPC 裡順利建立。 在輸出中,驗證 VPC 負載平衡器的 佈建狀態active作業狀態online

    VPC 負載平衡器的名稱格式為 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 若要查看您的叢集 ID,請執行 ibmcloud ks cluster get --cluster CLUSTER_NAME。 若要查看 Kubernetes LoadBalancer 服務 UID,請執行 kubectl get svc hw-lb-svc -o yaml,並在輸出中尋找 metadata.uid 欄位。

    ibmcloud is load-balancers
    

    在以下範例的 CLI 輸出中,已為 Kubernetes LoadBalancer 服務建立了一個名為 kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 的 VPC 負載平衡器:

    ID                                          Name                                                         Family        Subnets               Is public   Provision status   Operating status   Resource group
    r006-d044af9b-92bf-4047-8f77-a7b86efcb923   kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306   Application   mysubnet-us-south-3   true        active             online             default
    
  4. 透過對您在步驟 2 中找到的 VPC 負載平衡器所指派 Kubernetes LoadBalancer 服務的主機名稱及埠進行 curing,將要求傳送至應用程式。

    curl 1234abcd-us-south.lb.appdomain.cloud:8080
    

    輸出範例

    Hello world from hello-world-deployment-5fd7787c79-sl9hn! Your app is up and running in a cluster!
    

下一步為何?

既然您已有了 VPC 叢集,接下來請進一步瞭解可執行的作業。

需要協助、有疑問或要提供有關 VPC 叢集的意見嗎? 嘗試在 Slack 頻道中張貼文章。