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

虛擬私有雲

在您的虛擬私有雲(VPC)中建立一個 Red Hat® OpenShift® on IBM Cloud® 叢集。

適用對象

本教學指南適用於首次在 VPC 運算環境中的「Red Hat OpenShift on IBM Cloud」中建立叢集的管理員。

目標

在教學課程中,您將在虛擬私有雲(VPC)中建立一個 Red Hat OpenShift on IBM Cloud 叢集。 然後,您可以存取內建 Red Hat OpenShift 元件,在 Red Hat OpenShift 專案中部署應用程式,並使用 VPC 負載平衡器公開應用程式,以便外部使用者可以存取服務。

你會得到什麼

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

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

必要條件

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

許可權
如果您是帳戶擁有者,您已具備建立叢集所需的權限,可繼續進行下一步。 否則,請請帳戶擁有者 設定 API 金鑰,並在 IBM Cloud 的 IAM 中授予您最低級別的使用者權限
命令列工具
若要從命令列快速存取您的資源,請試試 IBM Cloud Shell。 否則,請完成下列步驟來設定本端指令行環境。
  1. 安裝 IBM Cloud CLI (ibmcloud)、Kubernetes Service 外掛程式 (ibmcloud oc) 和 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 外掛程式更新為最新版本。
```sh {: pre}
    ibmcloud plugin update kubernetes-service
    ```


在 VPC 中建立叢集

建立一個 IBM Cloud 虛擬私有雲 (VPC) 環境。 接著,在 VPC 基礎架構上建立一個 Red Hat OpenShift on 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. 建立公用閘道,並記下輸出中的 **ID**。 在下一步中,您將公用閘道連接至 VPC 子網路,以便工作者節點可以在公用網路上進行通訊。 預設Red Hat OpenShift元件,例如 Web 控制台和OperatorHub,需要公共網路存取。 如果您跳過此步驟,則必須改為連接至 VPC 專用網路 (例如透過 VPN 連線),以存取 Red Hat OpenShift Web 主控台或使用 `kubectl` 指令存取叢集。
    ```sh {: pre}
        ibmcloud is public-gateway-create gateway-us-south-1 <vpc_ID> us-south-1
        ```
    3. 為 VPC 建立子網路,並記下其 **ID**。 建立 VPC 子網路時,請考慮下列資訊:
        *  **區域**:叢集裡每個區域必須有一個 VPC 子網路。 可用的區域取決於您建立 VPC 的地區。 若要列出該區域中可用的區域,請執行 `ibmcloud is zones`。
        *  **IP 位址**:VPC 子網會為叢集中的工作節點和負載平衡服務提供私有 IP 位址,因此請務 [必建立一個擁有足夠 IP 位址的子網,](/docs/openshift?topic=openshift-vpc-subnets#vpc_basics_subnets) 例如 256 個。 您無法在事後變更 VPC 子網所擁有的 IP 位址數量。
        *  **公用閘道**: 包括您先前建立的公用閘道。 叢集中的每個區域都必須擁有一個公開閘道。
    
            ```sh {: pre}
            ibmcloud is subnet-create mysubnet1 VPC_ID --zone us-south-1 --ipv4-address-count 256 --pgw GATEWAY_ID
            ```
    如果有多個區段,請針對每個區段重複這些步驟。
    {: tip}
    
    
  3. 建立標準 IBM Cloud Object Storage 實例,以備份叢集中的內部登錄。 請注意輸出中的實例 ID

    ibmcloud resource service-instance-create myvpc-cos cloud-object-storage standard global
    
  4. 在子網路所在的區域的 VPC 中建立叢集。 以下指令將在達拉斯建立一個版本為 4.21 的叢集,其最低配置為 2 個工作節點,每個節點至少具備 4 個核心和 16 GB 記憶體,以便能部署預設的 Red Hat OpenShift 元件。 如需有關命令選項的更多資訊,請參閱 cluster create vpc-gen2 CLI 參考文件

    ibmcloud oc cluster create vpc-gen2 --name myvpc-cluster --zone us-south-1 --version 4.21_openshift --flavor bx2.4x16 --workers 2 [--operating-system REDHAT_8_64] --vpc-id VPC_ID --subnet-id VPC_SUBNET_ID --cos-instance COS_CRN --disable-outbound-traffic-protection
    
  5. 列出叢集詳細資料。 檢閱叢集 State、檢查 Ingress Subdomain,並記下 Master URL。 叢集建立可能需要一點時間才能完成。 當叢集狀態顯示為「正常」後,叢集網路和 Ingress 元件還需要大約 10 分鐘,才能完成部署並更新您用於 Red Hat OpenShift 網頁控制台及其他路由的叢集網域。 在繼續之前,請先檢查 Ingress 子網域 是否遵循 <cluster_name>-<globally_unique_account_HASH>-0001.<region>.containers.appdomain.cloud 型樣,以等待叢集備妥。

    ibmcloud oc cluster get --cluster myvpc-cluster
    
  6. 透過設定叢集環境定義,以使用者身分新增至 Red Hat OpenShift 叢集。

    ibmcloud oc cluster config --cluster myvpc-cluster --admin
    
  7. 在瀏覽器中,導覽至 Master URL 的位址並附加 /console。 例如,https://c0.containers.cloud.ibm.com:23652/console。 如果時間允許,您可以探索 Red Hat OpenShift 網頁主控台的不同區域。

  8. 在 Red Hat OpenShift 的網頁控制台選單列中,點選您的個人檔案 IAM#user.name@email.com > 複製登入指令。 請顯示並將「oc login token」指令複製到您的命令列中,以便透過 CLI 進行驗證。

    請將叢集主節點的 URL 網址儲存起來,以便稍後存取 Red Hat OpenShift 控制台。 在未來的階段作業中,可以跳過 cluster config 步驟,而改為使用主控台複製登入指令。

  9. 透過檢查版本,驗證 oc 指令是否針對您的叢集正常執行。

    oc version
    

    輸出範例

    Client Version: v4.21.0
    Kubernetes Version: v1.35.7.2
    

    若您無法執行需要管理員權限的操作(例如列出叢集中的所有工作節點或 Pod),請執行 ibmcloud oc cluster config --cluster myvpc-cluster --admin 指令,下載叢集管理員的 TLS 憑證及權限檔案。

將應用程式部署至您的叢集

快速部署新的範例應用程式,它只適用於來自叢集內的要求。

  1. 為您的「Hello World」應用程式建立一個「Red Hat OpenShift」專案。

    oc new-project hello-world
    
  2. 從原始碼編譯範例應用程式。 透過 Red Hat OpenShiftnew-app 指令,您可以指定遠端儲存庫中包含 Dockerfile 和應用程式程式碼的目錄,藉此建置您的映像檔。 指令會建置映像檔,將映像檔儲存在本端 Docker 登錄中,並建立應用程式部署配置 (dc) 及服務 (svc)。如需建立新應用程式的相關資訊,請參閱 Red Hat OpenShift 文件

    oc new-app --name hello-world https://github.com/IBM/container-service-getting-started-wt --context-dir="Lab 1"
    
  3. 驗證是否已建立範例 Hello World 應用程式元件。

    1. 列出 hello-world 服務並記下服務名稱。 到目前為止,您的應用程式只會接聽這些內部叢集 IP 位址上的資料流量。 在下一課,您將為服務建立負載平衡器,以便負載平衡器可以將外部資料流量要求轉遞至應用程式。
        oc get svc -n hello-world
        ```
        輸出範例
        ```sh {: screen}
        NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
        hello-world   ClusterIP   172.21.xxx.xxx   <none>       8080/TCP   31m
        ```
    2. 列出 Pod。 名稱中具有 `build` 的 Pod 是在新應用程式建置程序中**已完成**的工作。 確保 **hello-world** Pod 的狀態為 **Running**。
    ```sh {: pre}
        oc get pods -n hello-world
        ```
        輸出範例
        ```sh {: screen}
        NAME                  READY     STATUS             RESTARTS   AGE
        hello-world-1-9cv7d   1/1       Running            0          30m
        hello-world-1-build   0/1       Completed          0          31m
        hello-world-1-deploy  0/1       Completed          0          31m
        ```
    
    
    

設定 VPC 負載平衡器以公開您的應用程式

設定一個 VPC 負載平衡器,讓您的應用程式能接收來自公共網路的外部請求。

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

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

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

    輸出範例

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

    oc describe service hw-lb-svc -n hello-world
    

    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 oc 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!
    
  5. 可選步驟:若要清理本課程中建立的資源,您可以使用分配給各應用程式的標籤。

    1. 列出 hello-world 項目中每個應用程式的所有資源。
        oc get all -l app=hello-world -o name -n hello-world
        ```
        輸出範例
        ```sh {: screen}
        pod/hello-world-1-dh2ff
        replicationcontroller/hello-world-1
        service/hello-world
        deploymentconfig.apps.openshift.io/hello-world
        buildconfig.build.openshift.io/hello-world
        build.build.openshift.io/hello-world-1
        imagestream.image.openshift.io/hello-world
        imagestream.image.openshift.io/node
        ```
    2. 刪除建立的所有資源。
    ```sh {: pre}
        oc delete all -l app=hello-world -n hello-world
        ```
    
    

下一步為何?

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

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