IBM Cloud Docs
Kubernetes 上的可缩放 Web 应用程序

Kubernetes 上的可缩放 Web 应用程序

本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。

本教程将指导您如何在容器中本地运行Web应用程序,然后将其部署到使用 Kubernetes Service 创建的 Kubernetes中。 作为可选步骤,您可以构建容器映像并将该映像推送到专用注册表。 此外,您还将学习如何绑定自定义子域、监控环境健康状况以及扩展应用程序。

容器是打包应用程序及其所有依赖项的标准方法,以便您可以无缝地在环境之间移动应用程序。 与虚拟机不同,容器不会捆绑操作系统。 在容器中只会打包应用程序代码、运行时、系统工具、库和设置。 容器比虚拟机更轻巧、可移植性更强、更高效。

目标

  • 将Web应用程序部署到 Kubernetes。
  • 绑定定制子域。
  • 监视集群的日志和运行状况。
  • 缩放 Kubernetes pod。

体系结构
体系结构图

  1. 开发者下载或克隆样本 Web 应用程序。
  2. (可选) 构建应用程序以生成容器映像。
  3. (可选) 将映像推送到 IBM Cloud Container Registry中的名称空间。
  4. 应用程序部署到 Kubernetes 集群。
  5. 用户访问该应用程序。

准备工作

本教程需要:

  • IBM Cloud CLI,
    • IBM Cloud Kubernetes Service 插件 (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

  1. IBM Cloud,点击管理 > 访问(IAM )。
  2. 点击授权
  3. 单击创建
  4. 源服务列表中,选择 Kubernetes Service
  5. 选择用于限定对 所有资源的访问范围的选项。
  6. 目标服务列表中,选择 Secrets Manager
  7. 选择用于限定对 所有资源的访问范围的选项。
  8. 服务访问权 部分中,检查 管理器 选项。
  9. 单击授权

创建 Kubernetes 集群

IBM Cloud Kubernetes Service 是一项托管服务,用于创建自己的 Kubernetes 计算主机集群,以便在 IBM Cloud 上部署和管理容器化应用。 具有一个 (1) 专区、一个 (1) 工作程序节点和最小可用大小(类型模板)的最小集群足以满足本教程的需求。

  1. 打开 Kubernetes群,点击创建集群

  2. 在您选择的 基础架构上创建集群。

    • 如果在 VPC 基础结构上针对 Kubernetes 选择 VPC,请执行以下步骤。 在创建 Kubernetes 集群之前,您需要创建 VPC 和子网。 有关更多详细信息,请参阅 创建 VPC 集群 文档。

      1. 单击 创建 VPC
      2. 位置 部分下,选择 地理位置区域,例如 EuropeLondon
      3. 输入 VPC 的 名称,选择 资源组,并 (可选) 添加 标记 以组织资源。
      4. 取消勾选 默认安全组 中的 允许SSH允许ping
      5. 取消勾选 “在每个区域创建子网”。
      6. 单击创建
      7. 工作程序区域和子网下,取消选中未为其创建子网的两个区域。
      8. 每个专区的工作程序节点 设置为 1,然后单击 更改类型模板 以浏览并更改所选的工作程序节点大小。
      9. Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
      10. 输入 集群名称,然后选择用于 VPC 的同一 资源组
      11. 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建
      12. 在等待集群变为活动状态时,请将公共网关连接到 VPC。 浏览至 虚拟私有云
      13. 单击集群使用的 VPC 的名称,然后向下滚动到子网部分。
      14. 单击先前创建的子网的名称,然后在 Public Gateway 部分中,单击 已拆离 以将状态更改为 已连接
    • 如果在经典基础架构上为 Kubernetes 选择 经典,请执行以下步骤。 有关更多详细信息,请参阅 创建标准经典集群 文档。

      1. 位置 部分下,选择 地理位置,多专区 可用性高速,例如 EuropeLondon
      2. 工作程序区域和 VLAN 下,取消选中除一个区域以外的所有区域。
      3. 每个专区的工作程序节点 设置为 1,然后单击 更改类型模板 以浏览并更改所选的工作程序节点大小。
      4. 主服务端点下,选择 专用和公共端点
      5. Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
      6. 输入 集群名称,然后选择要在其下创建这些资源的 资源组
      7. 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建

克隆样本应用程序

在本部分中,您将使用简单的基于 Helm的 NodeJS 样本应用程序克隆 GitHub 存储库,其中包含一个登录页面和两个端点以开始使用。 您始终可以根据需求扩展样本应用程序。

  1. 在终端上,运行以下命令以克隆 GitHub 存储库:
    git clone https://github.com/IBM-Cloud/kubernetes-node-app
    
  2. 更改应用程序目录:
    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 或任何其他容器注册表。

  1. 定义名为 MYAPP 的环境变量,并通过将占位符替换为您的缩写来设置应用程序的名称:

    export MYAPP=<your-initials>kubenodeapp
    
  2. 识别集群:

    ibmcloud ks cluster ls
    
  3. 用集群名称初始化变量:

    export MYCLUSTER=<CLUSTER_NAME>
    
  4. 初始化 kubectl cli 环境:

    ibmcloud ks cluster config --cluster $MYCLUSTER
    

    确保为使用 ibmcloud target -r <region> -g <resource_group> 创建集群的区域和资源组配置了 CLI。 有关获取集群访问权以及配置 CLI 以运行 kubectl 命令的更多信息,请查看 CLI configure 部分

  5. 您可以使用 default Kubernetes 名称空间或为此应用程序创建新的名称空间。

    1. 如果要使用 default Kubernetes 名称空间,请运行以下命令以设置环境变量:
      export KUBERNETES_NAMESPACE=default
      
    2. 如果要创建新的 Kubernetes 名称空间,请遵循 复制现有映像拉取私钥将映像拉取私钥存储在 Kubernetes 服务帐户中的 Kubernetes 服务文档的所选名称空间 部分中提到的步骤。 完成后,运行以下命令:
      export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
      
  6. 切换到样本应用程序目录下的 Chart 目录:

    cd chart/kubernetesnodeapp
    
  7. 安装 Helm Chart:

    helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
    
  8. 切换回样本应用程序目录:

    cd ../..
    

查看应用程序

  1. 列出名称空间中的 Kubernetes 服务:
    kubectl get services -n $KUBERNETES_NAMESPACE
    
  2. 列出命名空间中的 Kubernetes:
    kubectl get pods -n $KUBERNETES_NAMESPACE
    

将 IBM 提供的域用于集群

集群附带 IBM域。 这为您提供了一个更好的选择,可以使用正确的 URL 在标准 HTTP/S 端口上公开应用程序。

使用 Ingress 设置集群到服务的入站连接。

入口
入口

  1. 识别 IBM提供的 Ingress subdomainIngress secret:

    ibmcloud ks cluster get --cluster $MYCLUSTER
    

    以找到

    Ingress subdomain: mycluster.us-south.containers.appdomain.cloud
    Ingress secret:    mycluster
    
  2. 定义环境变量 INGRESS_SUBDOMAIN 以保存 Ingress 子域的值:

    export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN>
    
  3. 定义环境变量 INGRESS_SECRET 以保存 Ingress 私钥的值:

    export INGRESS_SECRET=<INGRESS_SECRET>
    
  4. 在示例应用程序目录中,运行以下bash命令创建一个 ingress-ibmsubdomain.yaml 入口文件,指向 IBM支持 HTTP 和 HTTPS 的域:

    ./ingress.sh ibmsubdomain_https
    

    通过将占位符 ($) 中包含的所有值替换为来自环境变量的相应值,从 yaml-templates 文件夹下的模板文件 ingress-ibmsubdomain-template.yaml 生成该文件。

  5. 部署 Ingress:

    kubectl apply -f ingress-ibmsubdomain.yaml
    
  6. 在浏览器中打开您的应用程序,网址为 https://<myapp>.<ingress-subdomain>/,或运行以下命令查看 HTTP:

    curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
    

使用您自己的自定义子域

此部分要求您拥有定制域。 您将需要创建指向集群的 IBM提供的入口子域的 CNAME 记录。 如果域为 example.com,那么 CNAME 将 <myapp>.<example.com> 指向 <myapp>.<ingress-subdomain>

使用 HTTP

  1. 创建指向定制域的环境变量:
    export CUSTOM_DOMAIN=<example.com>
    
  2. 从模板文件 ingress-customdomain-http-template.yaml 创建指向域的 Ingress 文件 ingress-customdomain-http.yaml :
    ./ingress.sh customdomain_http
    
  3. 部署 Ingress:
    kubectl apply -f ingress-customdomain-http.yaml
    
  4. 请访问 http://<myapp>.<example.com>/ 访问您的申请。

使用 HTTPS

如果您此时尝试HTTPS 访问您的应用程序 https://<myapp>.example.com/,您的网络浏览器可能会弹出安全警告,提示您该连接并非私密连接。

现在,将证书导入到先前配置到集群的 Secrets Manager 实例中。

  1. 安全性下的 资源列表 访问 Secrets Manager 服务实例。

  2. 单击左侧导航中的 密钥

  3. 单击添加

  4. 您可以选择 公用证书导入的证书专用证书。 在相应的文档主题中提供了详细步骤: 订购 SSL/TLS 公用证书导入 SSL/TLS 证书创建 SSL/TLS 专用证书。 如果选择导入证书,请确保上载证书,专用密钥和中间证书文件。

  5. 找到已导入或已订购证书的条目,然后单击该条目。

    • 验证域名是否与 $CUSTOM_DOMAIN 匹配。 如果上传的是通配符证书,那么域名中会包含星号。
    • 点击证书CRN 旁边的复制图标
    • 创建指向刚复制的值的环境变量:
    export CERTIFICATE_CRN=<certificate CRN>
    
  6. 在集群中为 SSL/TLS 证书创建 Ingress 私钥:

    ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE
    
  7. 创建指向定制域的环境变量:

    export CUSTOM_DOMAIN=<example.com>
    
  8. 通过模板 ingress-customdomain-https-template-sm.yaml 创建指向域的 Ingress 文件 ingress-customdomain-https.yaml :

    ./ingress.sh customdomain_https_sm
    
  9. 部署 Ingress:

    kubectl apply -f ingress-customdomain-https.yaml
    
  10. 请访问 https://$MYAPP.$CUSTOM_DOMAIN/ 访问您的申请。

curl -I https://$MYAPP.$CUSTOM_DOMAIN

监视应用程序运行状况

  1. 要检查应用程序的运行状况,请导航至集群以查看集群列表,然后单击您的集群。
  2. 单击 Kubernetes 仪表板以在新选项卡中启动仪表板。
  3. 单击左侧的 Pod,然后单击与 $MYAPP 匹配的 pod-name
    • 检查 CPU 和内存使用情况。
    • 记下节点 IP 名称。
    • 单击右上方的操作菜单中的 查看日志 以查看应用程序的标准输出和错误。
  4. 选择左侧窗格中的节点,点击之前记录的节点名称,然后查看分配资源,以了解节点的运行状况。
  5. 要执行到容器中,请在操作菜单中选择 执行到

缩放 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
    
  • 删除集群。

相关内容