在虚拟私有云 (VPC) 中设置第一个集群
虚拟私有云
在您的虚拟私有云(VPC)中创建一个 Red Hat® OpenShift® on IBM Cloud® 集群。
- Red Hat OpenShift on IBM Cloud 为您提供了集群基础架构环境的所有 受管产品的优点,同时将在 Red Hat Enterprise Linux 上运行的 Red Hat OpenShift 工具和目录 用于应用程序部署。
- VPC 提供了私有云环境的安全性以及公共云的动态可伸缩性。 VPC 使用的是下一个版本的 Red Hat OpenShift on IBM Cloud 基础架构提供者,包含一组精选的 v2 API、CLI 和控制台功能。
- 本教程使用 ibmcloud CLI 命令在 VPC 中创建群集。 或者,也可以使用开源的企业级 Terraform 模块来部署 OpenShift VPC 基础设施上的集群.NET Framework。 您可以在 Terraform IBM 模块注册表中查看更多模块。
受众
本教程面向首次在 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 负载均衡器
先决条件
完成以下先决条件步骤以设置许可权和命令行环境。
- 许可权
- 如果您是账户所有者,则已具备创建集群所需的权限,可以继续进行下一步操作。 否则,请让账户 所有者在 IBM Cloud IAM 中设置 API 密钥,并授予您最低级别的用户权限。
- 命令行工具
- 若要从命令行快速访问您的资源,请尝试使用 IBM Cloud Shell。 否则,请通过完成以下步骤来设置本地命令行环境。
- 安装 IBM Cloud CLI (
ibmcloud)、Kubernetes Service 插件 (ibmcloud oc) 和 IBM Cloud Container Registry 插件 (ibmcloud cr)。 - 安装 Red Hat OpenShift(
oc)和 Kubernetes(kubectl)CLI。 - 要使用 VPC,请安装
infrastructure-service插件。 用于运行命令的前缀是ibmcloud is。
ibmcloud plugin install infrastructure-service ``` 4. 将 Kubernetes Service 插件更新到最新版本。 ```sh {: pre} ibmcloud plugin update kubernetes-service ``` - 安装 IBM Cloud CLI (
在 VPC 中创建集群
创建一个 IBM Cloud 虚拟私有云(VPC)环境。 然后,在VPC基础设施上创建一个 Red Hat OpenShift on 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 子网,以便工作程序节点可以在公用网络上进行通信。 默认Red Hat OpenShift组件,如网络控制台和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} - 创建一个名为“
-
创建标准 IBM Cloud Object Storage 实例以备份集群中的内部注册表。 在输出中,请注意该实例的 ID。
ibmcloud resource service-instance-create myvpc-cos cloud-object-storage standard global -
在子网所在的专区的 VPC 中创建集群。 以下命令将在达拉斯创建一个 4.21 集群,该集群的配置为至少包含2个工作节点,每个节点至少拥有4个核心和16 GB内存,以便能够部署默认的 Red Hat OpenShift 组件。 有关命令选项的更多信息,请参阅
cluster create vpc-gen2CLI 参考文档。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 -
列出集群详细信息。 查看集群 State,检查 Ingress Subdomain,并记下 Master URL。 创建集群可能需要一些时间才能完成。 当集群状态显示为“正常” 后,集群网络和 Ingress 组件还需要大约 10 分钟来部署并更新您用于访问 Red Hat OpenShift Web 控制台及其他路由的集群域名。 继续之前,请通过检查 Ingress 子域 是否遵循
<cluster_name>-<globally_unique_account_HASH>-0001.<region>.containers.appdomain.cloud模式来等待集群就绪。ibmcloud oc cluster get --cluster myvpc-cluster -
通过设置集群上下文,将自己作为用户添加到 Red Hat OpenShift 集群。
ibmcloud oc cluster config --cluster myvpc-cluster --admin -
在浏览器中,导航至 Master URL 的地址并附加
/console。 例如,https://c0.containers.cloud.ibm.com:23652/console。 如果时间允许,您可以探索 Red Hat OpenShift 网络控制台的各个区域。 -
在 Red Hat OpenShift 网页控制台的菜单栏中,点击您的个人资料 IAM#user.name@email.com > 复制登录命令。 显示并复制
oc login令牌命令到命令行中,以便通过CLI进行身份验证。请保存您的集群主节点 URL,以便稍后访问 Red Hat OpenShift 控制台。 在未来的会话中,可以跳过
cluster config步骤,而改为通过控制台复制登录命令。 -
通过检查版本,验证
oc命令是否针对您的集群正常运行。oc version示例输出
Client Version: v4.21.0 Kubernetes Version: v1.35.7.2如果您无法执行需要管理员权限的操作(例如列出集群中的所有工作节点或 Pod),请通过运行
ibmcloud oc cluster config --cluster myvpc-cluster --admin命令,下载该集群管理员的 TLS 证书和权限文件。
将应用程序部署到您的集群中
快速部署仅可用于来自集群内的请求的新样本应用程序。
-
为您的“Hello World”应用程序创建一个 Red Hat OpenShift 项目。
oc new-project hello-world -
根据源代码构建示例应用程序。 使用 Red Hat OpenShift
new-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" -
验证是否已创建样本 Hello World 应用程序组件。
- 列出 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 负载均衡器访问应用的服务,即使您的工作节点仅连接到一个私有子网。
-
在集群中创建 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-port与port相同,但您创建的其他应用程序可能使用的是不同端口。-n <hello-world>您的部署所在的命名空间。 -
验证 Kubernetes
LoadBalancer服务是否已在集群中成功创建。 创建服务 KubernetesLoadBalancer时,系统会自动为您创建一个VPC负载均衡器。 VPC负载均衡器会为您的LoadBalancerKubernetes 服务分配一个主机名,您可以在CLI输出的 Ingress LoadBalancer 字段中查看该主机名。 在 VPC 中,会为集群中的服务分配主机名,因为服务的外部 IP 地址不稳定。 VPC 负载均衡器需要几分钟时间才能在 VPC 中进行供应。 在 VPC 负载均衡器准备就绪之前,您无法通过其主机名访问 KubernetesLoadBalancer服务。oc describe service hw-lb-svc -n hello-worldCLI 输出示例:
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 oc 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服务的主机名和端口进行整理,向应用程序发送请求。 示例: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! -
可选:要清理本课中创建的资源,可以使用分配给每个应用的标签。
- 列出
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 通道中发布。