Kubernetes 上的可缩放 Web 应用程序
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
本教程将指导您如何在容器中本地运行Web应用程序,然后将其部署到使用 Kubernetes Service 创建的 Kubernetes中。 作为可选步骤,您可以构建容器映像并将该映像推送到专用注册表。 此外,您还将学习如何绑定自定义子域、监控环境健康状况以及扩展应用程序。
容器是打包应用程序及其所有依赖项的标准方法,以便您可以无缝地在环境之间移动应用程序。 与虚拟机不同,容器不会捆绑操作系统。 在容器中只会打包应用程序代码、运行时、系统工具、库和设置。 容器比虚拟机更轻巧、可移植性更强、更高效。
目标
- 将Web应用程序部署到 Kubernetes。
- 绑定定制子域。
- 监视集群的日志和运行状况。
- 缩放 Kubernetes pod。
- 开发者下载或克隆样本 Web 应用程序。
- (可选) 构建应用程序以生成容器映像。
- (可选) 将映像推送到 IBM Cloud Container Registry中的名称空间。
- 应用程序部署到 Kubernetes 集群。
- 用户访问该应用程序。
准备工作
本教程需要:
- IBM Cloud CLI,
- IBM Cloud Kubernetes Service 插件 (
kubernetes-service
),
- IBM Cloud Kubernetes Service 插件 (
kubectl
,用于与 Kubernetes 集群进行交互,Helm 3
以部署 Chart。
您将在 教程入门 指南中找到有关为您的操作环境下载和安装这些工具的指示信息。
要避免安装这些工具,可以从 IBM Cloud 控制台使用 Cloud Shell。
此外:
- 您将需要 Secrets Manager 实例。 使用 Secrets Manager,您可以创建、租赁和集中管理IBM Cloud服务或自定义应用程序的密钥。 私钥存储在专用 Secrets Manager 实例中,您可以使用内置功能来监视到期,调度或手动轮换私钥。 在本教程中,您将使用 Kubernetes 操作程序从 Secrets Manager 检索 TLS 证书,并将其注入到 Kubernetes 私钥中。 如果已有现有实例或通过执行 创建 Secrets Manager 服务实例 中概述的步骤来创建新实例,那么可以使用现有实例。
- (可选) 设置注册表名称空间。 仅当您将构建自己的定制容器映像时才需要此功能。
- 了解 Kubernetes的基础知识。
启用与 Secrets Manager 的服务到服务通信
将 Secrets Manager 与 IBM Cloud Kubernetes Service 集群集成需要服务到服务通信授权。 请按照以下步骤进行授权设置。 有关更多信息,请参阅 集成 Secrets Manager。
- IBM Cloud,点击管理 > 访问(IAM )。
- 点击授权。
- 单击创建。
- 在源服务列表中,选择 Kubernetes Service。
- 选择用于限定对 所有资源的访问范围的选项。
- 在目标服务列表中,选择 Secrets Manager。
- 选择用于限定对 所有资源的访问范围的选项。
- 在 服务访问权 部分中,检查 管理器 选项。
- 单击授权。
创建 Kubernetes 集群
IBM Cloud Kubernetes Service 是一项托管服务,用于创建自己的 Kubernetes 计算主机集群,以便在 IBM Cloud 上部署和管理容器化应用。 具有一个 (1) 专区、一个 (1) 工作程序节点和最小可用大小(类型模板)的最小集群足以满足本教程的需求。
-
打开 Kubernetes群,点击创建集群。
-
在您选择的 基础架构上创建集群。
-
如果在 VPC 基础结构上针对 Kubernetes 选择 VPC,请执行以下步骤。 在创建 Kubernetes 集群之前,您需要创建 VPC 和子网。 有关更多详细信息,请参阅 创建 VPC 集群 文档。
- 单击 创建 VPC。
- 在 位置 部分下,选择 地理位置 和 区域,例如
Europe
和London
。 - 输入 VPC 的 名称,选择 资源组,并 (可选) 添加 标记 以组织资源。
- 取消勾选 默认安全组 中的 允许SSH 和 允许ping。
- 取消勾选 “在每个区域创建子网”。
- 单击创建。
- 在 工作程序区域和子网下,取消选中未为其创建子网的两个区域。
- 将 每个专区的工作程序节点 设置为
1
,然后单击 更改类型模板 以浏览并更改所选的工作程序节点大小。 - 在 Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
- 输入 集群名称,然后选择用于 VPC 的同一 资源组。
- 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建。
- 在等待集群变为活动状态时,请将公共网关连接到 VPC。 浏览至 虚拟私有云。
- 单击集群使用的 VPC 的名称,然后向下滚动到子网部分。
- 单击先前创建的子网的名称,然后在 Public Gateway 部分中,单击 已拆离 以将状态更改为 已连接。
-
如果在经典基础架构上为 Kubernetes 选择 经典,请执行以下步骤。 有关更多详细信息,请参阅 创建标准经典集群 文档。
- 在 位置 部分下,选择 地理位置,多专区 可用性和 高速,例如
Europe
和London
。 - 在 工作程序区域和 VLAN 下,取消选中除一个区域以外的所有区域。
- 将 每个专区的工作程序节点 设置为
1
,然后单击 更改类型模板 以浏览并更改所选的工作程序节点大小。 - 在 主服务端点下,选择 专用和公共端点。
- 在 Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
- 输入 集群名称,然后选择要在其下创建这些资源的 资源组。
- 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建。
- 在 位置 部分下,选择 地理位置,多专区 可用性和 高速,例如
-
克隆样本应用程序
在本部分中,您将使用简单的基于 Helm的 NodeJS 样本应用程序克隆 GitHub 存储库,其中包含一个登录页面和两个端点以开始使用。 您始终可以根据需求扩展样本应用程序。
- 在终端上,运行以下命令以克隆 GitHub 存储库:
git clone https://github.com/IBM-Cloud/kubernetes-node-app
- 更改应用程序目录:
cd kubernetes-node-app
此样本应用程序代码包含用于本地开发和部署到 Kubernetes的所有必需配置文件。
使用 Helm chart 将应用程序部署到集群
使用 Helm 3 部署应用程序
已构建应用程序的容器映像,并将其推送到 IBM Cloud Container Registry中的公共注册表。 在此部分中,您将使用 Helm来部署样本应用程序。 Helm 通过 Helm 帮助您管理 Kubernetes 应用程序,该工具甚至可以帮助您定义、安装和升级最复杂的 Kubernetes 应用程序。
注: 如果要构建应用程序并将其推送到您自己的容器注册表,那么可以使用 Docker CLI 来执行此操作。 在存储库中提供了 Dockerfile ,可以将映像推送到 IBM Cloud Container Registry 或任何其他容器注册表。
-
定义名为
MYAPP
的环境变量,并通过将占位符替换为您的缩写来设置应用程序的名称:export MYAPP=<your-initials>kubenodeapp
-
识别集群:
ibmcloud ks cluster ls
-
用集群名称初始化变量:
export MYCLUSTER=<CLUSTER_NAME>
-
初始化
kubectl
cli 环境:ibmcloud ks cluster config --cluster $MYCLUSTER
确保为使用
ibmcloud target -r <region> -g <resource_group>
创建集群的区域和资源组配置了 CLI。 有关获取集群访问权以及配置 CLI 以运行 kubectl 命令的更多信息,请查看 CLI configure 部分 -
您可以使用
default
Kubernetes 名称空间或为此应用程序创建新的名称空间。- 如果要使用
default
Kubernetes 名称空间,请运行以下命令以设置环境变量:export KUBERNETES_NAMESPACE=default
- 如果要创建新的 Kubernetes 名称空间,请遵循 复制现有映像拉取私钥 和 将映像拉取私钥存储在 Kubernetes 服务帐户中的 Kubernetes 服务文档的所选名称空间 部分中提到的步骤。 完成后,运行以下命令:
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- 如果要使用
-
切换到样本应用程序目录下的 Chart 目录:
cd chart/kubernetesnodeapp
-
安装 Helm Chart:
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
-
切换回样本应用程序目录:
cd ../..
查看应用程序
- 列出名称空间中的 Kubernetes 服务:
kubectl get services -n $KUBERNETES_NAMESPACE
- 列出命名空间中的 Kubernetes:
kubectl get pods -n $KUBERNETES_NAMESPACE
将 IBM 提供的域用于集群
集群附带 IBM域。 这为您提供了一个更好的选择,可以使用正确的 URL 在标准 HTTP/S 端口上公开应用程序。
使用 Ingress 设置集群到服务的入站连接。

-
识别 IBM提供的 Ingress subdomain 和 Ingress secret:
ibmcloud ks cluster get --cluster $MYCLUSTER
以找到
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster
-
定义环境变量
INGRESS_SUBDOMAIN
以保存 Ingress 子域的值:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN>
-
定义环境变量
INGRESS_SECRET
以保存 Ingress 私钥的值:export INGRESS_SECRET=<INGRESS_SECRET>
-
在示例应用程序目录中,运行以下bash命令创建一个
ingress-ibmsubdomain.yaml
入口文件,指向 IBM支持 HTTP 和 HTTPS 的域:./ingress.sh ibmsubdomain_https
通过将占位符 (
$
) 中包含的所有值替换为来自环境变量的相应值,从 yaml-templates 文件夹下的模板文件ingress-ibmsubdomain-template.yaml
生成该文件。 -
部署 Ingress:
kubectl apply -f ingress-ibmsubdomain.yaml
-
在浏览器中打开您的应用程序,网址为
https://<myapp>.<ingress-subdomain>/
,或运行以下命令查看 HTTP:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
使用您自己的自定义子域
此部分要求您拥有定制域。 您将需要创建指向集群的 IBM提供的入口子域的 CNAME
记录。 如果域为 example.com
,那么 CNAME 将 <myapp>.<example.com>
指向 <myapp>.<ingress-subdomain>
。
使用 HTTP
- 创建指向定制域的环境变量:
export CUSTOM_DOMAIN=<example.com>
- 从模板文件
ingress-customdomain-http-template.yaml
创建指向域的 Ingress 文件ingress-customdomain-http.yaml
:./ingress.sh customdomain_http
- 部署 Ingress:
kubectl apply -f ingress-customdomain-http.yaml
- 请访问
http://<myapp>.<example.com>/
访问您的申请。
使用 HTTPS
如果您此时尝试HTTPS 访问您的应用程序 https://<myapp>.example.com/
,您的网络浏览器可能会弹出安全警告,提示您该连接并非私密连接。
现在,将证书导入到先前配置到集群的 Secrets Manager 实例中。
-
从 安全性下的 资源列表 访问 Secrets Manager 服务实例。
-
单击左侧导航中的 密钥。
-
单击添加。
-
您可以选择 公用证书,导入的证书 或 专用证书。 在相应的文档主题中提供了详细步骤: 订购 SSL/TLS 公用证书,导入 SSL/TLS 证书 或 创建 SSL/TLS 专用证书。 如果选择导入证书,请确保上载证书,专用密钥和中间证书文件。
-
找到已导入或已订购证书的条目,然后单击该条目。
- 验证域名是否与 $CUSTOM_DOMAIN 匹配。 如果上传的是通配符证书,那么域名中会包含星号。
- 点击证书CRN 旁边的复制图标。
- 创建指向刚复制的值的环境变量:
export CERTIFICATE_CRN=<certificate CRN>
-
在集群中为 SSL/TLS 证书创建 Ingress 私钥:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE
-
创建指向定制域的环境变量:
export CUSTOM_DOMAIN=<example.com>
-
通过模板
ingress-customdomain-https-template-sm.yaml
创建指向域的 Ingress 文件ingress-customdomain-https.yaml
:./ingress.sh customdomain_https_sm
-
部署 Ingress:
kubectl apply -f ingress-customdomain-https.yaml
-
请访问
https://$MYAPP.$CUSTOM_DOMAIN/
访问您的申请。
curl -I https://$MYAPP.$CUSTOM_DOMAIN
监视应用程序运行状况
- 要检查应用程序的运行状况,请导航至集群以查看集群列表,然后单击您的集群。
- 单击 Kubernetes 仪表板以在新选项卡中启动仪表板。
- 单击左侧的 Pod,然后单击与 $MYAPP 匹配的 pod-name
- 检查 CPU 和内存使用情况。
- 记下节点 IP 名称。
- 单击右上方的操作菜单中的 查看日志 以查看应用程序的标准输出和错误。
- 选择左侧窗格中的节点,点击之前记录的节点名称,然后查看分配资源,以了解节点的运行状况。
- 要执行到容器中,请在操作菜单中选择 执行到
缩放 Kubernetes pod
随着应用程序负载的增加,可以手动增加部署中的 pod 副本数。 副本由 ReplicaSet管理。 要将应用程序扩展为两个副本,请运行以下命令:
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
过一会儿,您Kubernetes (或通过 kubectl get pods
)看到两个用于您应用程序的容器。 仪表板中的Ingress控制器将负责两个副本之间的负载均衡。
借助 Kubernetes,您可以启用 水平 Pod 自动缩放功能,根据 CPU 自动增加或减少应用程序的实例数量。
要创建自动缩放器并定义策略,请运行以下命令:
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
自动缩放器创建成功后,您应该会看到
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled
.
除去资源
-
删除水平 pod 自动缩放器:
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment
-
删除应用的资源:
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml
-
删除为此应用程序创建的 Kubernetes 工件:
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE
-
删除 Kubernetes 密钥:
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key
-
删除外部密钥运算符:
helm uninstall external-secrets
-
删除服务标识:
ibmcloud iam service-id-delete $SERVICE_ID
-
删除集群。