IBM Cloud Docs
在虚拟私有云 (VPC) 中设置第一个集群

在虚拟私有云 (VPC) 中设置第一个集群

在您的虚拟私有云(VPC)中创建一个 IBM Cloud® Kubernetes Service 集群。

通过 VPC 上的IBM Cloud Kubernetes Service 集群,您可以在 Virtual Private Cloud 中的下一代 IBM Cloud 平台中创建集群。 VPC 提供了私有云环境的安全性以及公共云的动态可伸缩性。 VPC 使用的是下一个版本的 IBM Cloud Kubernetes Service 基础架构提供者,包含一组精选的 v2 API、CLI 和控制台功能。 只能为 VPC 创建标准集群。

受众

IBM Cloud Kubernetes Service 本教程适用于首次在VPC中创建集群的管理员。

目标

在教程的各个课程中,您将在 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.32 的集群。

在 VPC 中创建集群

在 IBM Cloud Kubernetes Service Virtual Private Cloud (VPC) 环境中创建 IBM Cloud 集群。 有关 VPC 的更多信息,请参阅 Virtual Private Cloud 入门

  1. 登录到要在其中创建 VPC 环境的帐户,资源组和 IBM Cloud 区域。 VPC必须设置在与您想要创建集群的同一多区域都市区。 在本教程中,将在 us-south 创建 VPC。 有关其他支持的区域,请参阅适用于 VPC 集群的多专区大城市。 如果您有联盟ID,请添加 --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地址,例如256个。 您无法更改VPC子网IP地址的数量。
      • 公共网关:您无需连接公共网关即可完成本教程。 可以改为使用 VPC 负载均衡器安全地公开工作负载,从而使工作程序节点保持隔离,避免受到公共访问。 如果工作程序节点需要访问公共 URL,那么可能要连接公共网关。
      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.32 --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 配置文件。
      ibmcloud ks cluster config --cluster myvpc-cluster
      
    3. 通过检查 Kubernetes CLI 服务器版本,验证 kubectl 命令是否针对您的集群正常运行。
      kubectl version  --short
      
      示例输出
      Client Version: 1.32
      Server Version: 1.32+IKS
      

部署专用应用程序

创建 Kubernetes 部署以将单个应用程序实例作为 pod 部署到 VPC 集群中的工作程序节点。

  1. 将Hello world应用程序的源代码复制到用户主目录。 存储库在以 Lab 开头的各个文件夹中分别包含类似应用程序的不同版本。 每个版本包含以下文件:

    • Dockerfile:映像的构建定义。
    • app.js:Hello World 应用程序。
    • package.json:有关应用程序的元数据。
    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 时,会随机分配这些 NodePort,但范围为 30000-32767。 在此示例中,NodePort 为 30872。

      kubectl describe service hello-world-service
      

      示例输出

      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 名称。

      kubectl get pods
      

      示例输出

      NAME                                     READY     STATUS        RESTARTS   AGE
      hello-world-deployment-d99cddb45-lmj2v   1/1       Running       0          2d
      
    3. 描述 pod 以查找运行 pod 的工作程序节点。 在示例输出中,运行Pod的工人节点是 10.xxx.xx.xxx

      kubectl describe pod hello-world-deployment-d99cddb45-lmj2v
      

      示例输出

      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 load balancing for a cluster

  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输出示例中,名为 kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 的VPC负载均衡器是为 Kubernetes LoadBalancer 服务创建的:

    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 服务的主机名和端口进行整理,向应用程序发送请求。

    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 通道中发布。