在 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。 否則,請完成下列步驟來設定本端指令行環境。
- 安裝 IBM Cloud CLI (
ibmcloud)、Kubernetes Service 外掛程式 (ibmcloud ks) 和 IBM Cloud Container Registry 外掛程式 (ibmcloud cr)。 - 安裝 Red Hat OpenShift(
oc)和 Kubernetes(kubectl)CLI。 - 若要使用 VPC,請安裝
infrastructure-service外掛程式。 用於執行指令的字首是ibmcloud is。ibmcloud plugin install infrastructure-service - 將 Kubernetes Service 外掛程式更新為最新版本。
ibmcloud plugin update kubernetes-service - 確定
kubectl版本與 VPC 叢集的 Kubernetes 版本相符。 本教學將建立一個執行版本 1.35 的叢集。
在 VPC 中建立叢集
在 IBM Cloud Kubernetes Service Virtual Private Cloud (VPC) 環境中建立 IBM Cloud 叢集。 如需 VPC 的相關資訊,請參閱 開始使用 Virtual Private Cloud。
- 登入您要在其中建立 VPC 環境的帳戶、資源群組及 IBM Cloud 地區。 VPC 必須設定在您欲建立叢集的同一多區域都會區內。 在本指導教學中,將在
us-south建立 VPC。 如需其他支援的地區,請參閱適用於 VPC 叢集的多區域都會。 如果您擁有聯合身分識別碼,請包含--sso選項。ibmcloud login -r us-south [-g <resource_group>] [--sso] - 為叢集建立 VPC。 如需相關資訊,請參閱有關在主控台或 CLI 中建立 VPC 的文件。
- 建立一個名為「
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 ``` - 建立一個名為「
- 在子網路所在的區域的 VPC 中建立叢集。 預設情況下,您的叢集建立時會包含一個公有雲服務端點和一個私有雲服務端點。 您可以使用公有雲服務端點,從本地端電腦存取 Kubernetes 主伺服器,例如執行
kubectl指令。 您的工作節點可透過私有雲服務端點與主節點進行通訊。 如需有關命令選項的更多資訊,請參閱cluster create vpc-gen2CLI 參考文件。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 - 檢查叢集的狀態。 佈建叢集可能需要幾分鐘時間。
- 驗證叢集的 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 叢集裡的工作者節點。
-
將「Hello world」應用程式的原始碼複製到您的使用者主目錄中。 儲存庫在每一個以
Lab為開頭的資料夾中包含不同版本的類似應用程式。 每一個版本都包含下列檔案:Dockerfile:映像檔的建置定義。app.js:Hello World 應用程式。package.json:應用程式的相關 meta 資料。
git clone https://github.com/IBM/container-service-getting-started-wt.git -
前往
Lab 1目錄。cd 'container-service-getting-started-wt/Lab 1' -
請使用現有的登錄命名空間,或建立一個新的命名空間,例如
vpc-gen2。ibmcloud cr namespace-listibmcloud cr namespace-add vpc-gen2 -
建置 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 -
登入 IBM Cloud Container Registry。
ibmcloud cr login -
將映像檔推送至您建立的 IBM Cloud Container Registry 名稱空間。 如果未來需要變更應用程式,請重複這些步驟以建立映像檔的另一個版本。 附註:進一步瞭解使用容器映像檔時如何保護個人資訊安全。
docker push us.icr.io/<namespace>/hello-world:1 -
為應用程式建立部署。 部署可用來管理 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 資源時如何保護個人資訊安全。
-
藉由將部署公開為 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-port與port相同,但您建立的其他應用程式可能使用不同的埠。 -
既然所有的部署工作均已完成,接下來可以測試叢集裡的應用程式。 取得詳細資料以構成可用於存取應用程式的專用 IP 位址。
- 取得服務的相關資訊,以查看指派了哪個 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 ... ``` - 取得服務的相關資訊,以查看指派了哪個 NodePort。 使用
-
登入到 Pod,以便可以從叢集內對應用程式發出要求。
kubectl exec -it hello-world-deployment-d99cddb45-lmj2v /bin/sh -
使用先前選取的工作者節點專用 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,為您的應用程式遞送要求。 下圖說明了使用者如何透過負載平衡器存取應用程式的服務,即使您的工作節點僅連接到私有子網。
-
在叢集裡建立 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-port與port相同,但您建立的其他應用程式可能使用不同的埠。 -
驗證 Kubernetes
LoadBalancer服務已在您的叢集裡順利建立。 當您建立 KubernetesLoadBalancer服務時,會自動為您建立 VPC 負載平衡器。 VPC 負載平衡器會將主機名稱指派給 Kubernetes LoadBalancer 服務,您可以在 CLI 輸出的 LoadBalancer Ingress 欄位中看到該服務。 VPC 負載平衡器需要幾分鐘時間才能在 VPC 中進行佈建。 在 VPC 負載平衡器準備就緒之前,您無法透過其主機名稱存取 KubernetesLoadBalancer服務。kubectl describe service hw-lb-svcCLI 輸出範例
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 -
驗證 VPC 負載平衡器已在您的 VPC 裡順利建立。 在輸出中,驗證 VPC 負載平衡器的 佈建狀態 為
active,作業狀態 為online。VPC 負載平衡器的名稱格式為
kube-<cluster_ID>-<kubernetes_lb_service_UID>。 若要查看您的叢集 ID,請執行ibmcloud ks cluster get --cluster CLUSTER_NAME。 若要查看 KubernetesLoadBalancer服務 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 -
透過對您在步驟 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 頻道中張貼文章。