使用 IBM Cloud Internet Services 的富有弹性且安全的多区域 Kubernetes 集群
本教程可能会发生成本。 使用“成本估算器”根据您的预计使用量生成成本估算。
在设计应用程序时若能考虑到弹性,用户就不太可能会遇到停机时间。 使用 Kubernetes Service 实施解决方案时,可以利用各种内置功能(如负载均衡和隔离),提高应对主机、网络或应用程序潜在故障的弹性。 通过创建多个集群,如果一个集群发生故障,用户仍可访问部署在另一个集群中的应用程序。 由于许多集群位于不同地点,用户还可以访问最近的集群,减少网络延迟。 为了提高弹性,您还可以选择多区域集群,这意味着您的节点部署在一个地点的多个区域内。
本教程重点介绍如何将 Cloud Internet Services (CIS) (一个用于配置和管理域名系统 (DNS)、全局负载平衡 (GLB)、Web 应用程序防火墙 (WAF),以及防范互联网应用程序的分布式拒绝服务 ( DDoS ) 的统一平台)与 Kubernetes 集群集成,以支持这种情况,并在多个地点提供安全、弹性的解决方案。
目标
- 在不同地点的多个 Kubernetes 集群上部署应用程序。
- 使用全局负载平衡器在多个集群之间分配流量。
- 将用户路由到距离最近的集群。
- 保护应用程序免受安全威胁。
- 通过高速缓存提高应用程序性能。
{: caption="*
- 开发人员为应用程序构建 Docker 镜像。
- 图像被推送到 Container Registry。
- 应用程序将部署到达拉斯和伦敦的 Kubernetes 集群。
- 最终用户访问该应用程序。
- IBM Cloud Internet Services 配置为拦截对应用程序发出的请求并在集群之间分发负载。 此外,还启用了 DDoS 保护和 Web 应用程序防火墙,以保护应用程序免受常见威胁。 (可选)对图像、CSS 文件等资产进行高速缓存。
准备工作
本教程需要:
- IBM Cloud CLI,
- IBM Cloud Kubernetes Service 插件 (
kubernetes-service
),
- IBM Cloud Kubernetes Service 插件 (
kubectl
,用于与 Kubernetes 集群进行交互,
您将在 解决方案教程入门 指南中找到有关为您的操作环境下载和安装这些工具的指示信息。
此外,请确保:
- 拥有一个自定义域,这样就可以将该域的 DNS 配置为指向 IBM Cloud Internet Services 名称服务器。
- 和 了解 Kubernetes的基础知识。
将应用程序部署到一个位置
本教程将在多个地点的集群中部署 Kubernetes 应用程序。 首先部署到一个位置 - 达拉斯,然后对伦敦位置重复这些步骤。
创建 Kubernetes 集群
本教程只需使用一个区域和一个工作节点的最小集群即可。
创建以下 Kubernetes 集群时:
-
将集群名称设置为 my-us-cluster。
-
定位在北美和达拉斯
-
打开 Kubernetes 群集,然后单击创建群集。
-
在您选择的 基础架构上创建集群。
-
如果在 VPC 基础结构上针对 Kubernetes 选择 VPC,请执行以下步骤。 在创建 Kubernetes 集群之前,您需要创建 VPC 和子网。 有关更多详细信息,请参阅 创建 VPC 集群 文档。
- 单击 创建 VPC。
- 在 位置 部分下,选择 地理位置 和 区域,例如
North America
和Dallas
。 - 输入 VPC 的 名称,选择 资源组,并 (可选) 添加 标记 以组织资源。
- 取消选中默认安全组中的允许 SSH 和允许 ping。
- 取消选中在每个区域创建子网。
- 单击创建。
- 在 工作程序区域和子网下,取消选中未为其创建子网的两个区域。
- 将 Worker nodes per zone 设置为
1
,然后单击 Change flavor 浏览并更改为您选择的工作节点类型。 - 在 Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
- 输入 集群名称,然后选择用于 VPC 的同一 资源组。
- 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建。
- 在等待集群变为活动状态时,请将公共网关连接到 VPC。 浏览至 虚拟私有云。
- 单击集群使用的 VPC 的名称,然后向下滚动到子网部分。
- 单击先前创建的子网的名称,然后在 Public Gateway 部分中,单击 已拆离 以将状态更改为 已连接。
-
如果在经典基础架构上为 Kubernetes 选择 经典,请执行以下步骤。 有关更多详细信息,请参阅 创建标准经典集群 文档。
- 在 位置 部分下,选择 地理位置,多专区 可用性和 高速,例如
North America
和Dallas
。 - 在 工作程序区域和 VLAN 下,取消选中除一个区域以外的所有区域。
- 将 Worker nodes per zone 设置为
1
,然后单击 Change flavor 浏览并更改为您选择的工作节点类型。 - 在 主服务端点下,选择 专用和公共端点。
- 在 Ingress 下,启用 Ingress 密钥管理,并选择现有 Secrets Manager 实例。
- 输入 集群名称,然后选择要在其下创建这些资源的 资源组。
- 本教程中不需要日志记录或监视,请禁用这些选项,然后单击 创建。
- 在 位置 部分下,选择 地理位置,多专区 可用性和 高速,例如
-
集群准备就绪后,接着将准备应用程序。
将应用程序部署到 Kubernetes 集群
集群应该已准备就绪。 可以在 Kubernetes Service 控制台中查看其状态。
-
获取对集群的访问权,如集群的“访问权”选项卡上所述。 类似如下:
MYCLUSTER=my-us-cluster ibmcloud ks cluster config --cluster $MYCLUSTER
-
使用应用程序的预构建映像创建部署。 可以在此 GitHub 存储库中找到应用程序源代码。
kubectl create deploy hello-world-deployment --image=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
示例输出:
deployment "hello-world-deployment" created
。 -
通过创建服务,使应用程序在集群中可访问:
kubectl expose deployment/hello-world-deployment --type=ClusterIP --port=80 --name=hello-world-service --target-port=3000
这将返回类似于
service "hello-world-service" exposed
的消息。 要查看服务,请执行以下操作:kubectl get services
-
使用两个副本在集群中运行应用程序:
kubectl scale deployment hello-world-deployment --replicas=2
-
可以使用以下命令检查部署的状态:
kubectl get pods
获取分配给集群的 Ingress 子域
创建 Kubernetes 群集时,会分配一个入口子域(例如、my-us-cluster.us-south.containers.appdomain.cloud )和一个公共应用程序负载平衡器 IP 地址。
- 检索集群的 Ingress 子域:
查找ibmcloud ks cluster get --cluster $MYCLUSTER
Ingress Subdomain
值。 - 记下此信息以在稍后步骤中使用。
本教程使用 Ingress 子域来配置全局负载均衡器。 还可以将 Ingress 子域替换为集群的公共应用程序负载均衡器 (ALB)。 <IngressSubdomain>
类似于 my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud
配置 DNS 子域的入口
将需要具有您自己的 DNS 域名,并且将在以下任务中创建全局负载均衡器子域: <glb_name>.<your_domain_name>
。 hello-world-service.example.com <glb_name> = hello-world-service
和 <your_domain_name> = example.com
之类的内容
- 创建文件 glb-ingress.yaml,并将占位符替换为它们各自的值:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <glb-name> annotations: spec.ingressClassName: "public-iks-k8s-nginx" spec: rules: - host: <glb-name>.<your_domain_name> http: paths: - path: / pathType: Prefix backend: service: name: hello-world-service port: number: 80
- 添加入口实例:
可能需要几分钟才能使入口变为可用,如命令中 ADDRESS 列中的值所指示:kubectl apply -f glb-ingress.yaml
kubectl get ingress
- 现在,通过使用 DNS 子域名配置 curl Host http 头以覆盖缺省值
<IngressSubdomain>
来进行测试:
curl 命令将类似于以下内容:curl --header 'Host: <glb_name>.<your_domain_name>' <IngressSubdomain>/hostname
curl --header 'Host: hello-world-service.ibmom.com' my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud/hostname
然后对另一个位置执行操作
对伦敦位置重复上述步骤,并进行以下替换:
- 在创建 Kubernettes 集群中:
- 将集群名称 my-us-cluster 替换为 my-uk-cluster;
- 来自 北美 和 达拉斯 以及 欧洲 和 伦敦的位置。
- 在 将应用程序部署到 Kubernetes 集群 中,替换:
- 将 MYCLUSTER= my-us-cluster 替换为 my-uk-cluster
- 配置 DNS 子域的入口
配置多位置负载均衡
现在,应用程序在两个集群中运行,但缺少一个组件,供用户从单个入口点透明地访问任一集群。
在此部分中,您将配置 IBM Cloud Internet Services (CIS) 以在两个集群之间分配负载。CIS 是一站式购物服务,提供 全局负载均衡器 (GLB),高速缓存,Web 应用程序防火墙 (WAF) 和 页面规则 以保护应用程序,同时确保云应用程序的可靠性和性能。
要配置全局负载均衡器,您将需要:
- 将定制域指向 CIS 名称服务器,
- 以检索 Kubernetes 集群的 Ingress 子域,
- 配置运行状况检查,以验证应用程序的可用性,
- 以及定义指向集群的源池。
向 IBM Cloud Internet Services 注册定制域
第一步是创建 CIS 实例,并将定制域指向 CIS 名称服务器。
-
如果您没有域名,可以向注册商购买。
-
浏览至 IBM Cloud 目录中的 IBM Cloud Internet Services。
-
选择套餐,设置服务名称和资源组,然后单击 创建 以创建服务实例。
-
供应服务实例时,单击 添加域。
-
输入您的域名,然后单击 下一步。
-
设置 DNS 记录是一个可选步骤,本教程可以跳过,单击“下一步”。
-
分配名称服务器后,配置注册商或域名提供商,以使用列出的名称服务器。
-
此时,您可以单击 取消 以返回到主页,在配置了注册器或 DNS 提供程序之后,可能需要最多 24 小时才能使更改生效。
当域在“概览”页面上的状态从“待定”变为“激活”时,就可以使用
dig <your_domain_name> ns
命令来验证新的名称服务器是否已经生效。
为全局负载均衡器配置运行状况检查
健康检查按设定的时间间隔监控源池对 HTTP / HTTPS 请求的响应。 它们与源池一起使用来确定池是否仍在正确运行。
-
在 IBM Cloud Internet Services 仪表板中,使用导航菜单来选择 可靠性 > 全局负载均衡器。
-
选择 运行状况检查 选项卡,然后单击 创建。
- 将 名称 设置为 hello-world-service
- 将监视类型设置为 HTTP。
- 将 端口 设置为 80。
- 将路径设置为 /。
- 在配置请求标头(可选) 中添加标头名称:
Host
和值:<glb_name>.<your_domain_name>
- 单击创建。
构建您自己的应用程序时,可以定义一个专用的运行状况端点,例如 /heathz,在其中可以报告应用程序状态。
定义源池
池是一组源服务器,在池连接到 GLB 时,会将流量智能路由到池中。 在英国和美国使用集群时,可以定义基于位置的池,并配置 CIS 以根据用户请求的地理位置,将用户重定向到距离最近的集群。
一个池用于达拉斯的集群
- 选择 源池 选项卡,然后单击 创建。
- 将名称设为
US
。 - 将原产地名称设置为
us-cluster
。 - 将 源地址 设置为
ibmcloud ks cluster get --cluster $MYCLUSTER
为美国集群打印的 kubernetes 服务<IngressSubdomain>
。 - 将健康检查设置为上一节中创建的检查。
- 将健康检查区域设置为
Western North America
。 - 单击保存。
一个池用于伦敦的集群
- 选择 源池 选项卡,然后单击 创建。
- 将名称设为
UK
。 - 将原产地名称设置为
uk-cluster
。 - 将 源地址 设置为由
ibmcloud ks cluster get --cluster $MYCLUSTER
为英国集群打印的 Kubernetes 服务<IngressSubdomain>
。 - 将健康检查设置为上一节中创建的检查。
- 将健康检查区域设置为
Western Europe
。 - 单击保存。
创建全局负载均衡器
定义源池后,可以完成负载均衡器的配置。
-
选择 负载均衡器 选项卡,然后单击 创建。
-
在全局负载平衡器名称下输入名称
<glb_name>
。 该名称也将成为通用应用程序 URL (http://<glb_name>.<your_domain_name>
) 的一部分,无论其位于何处。 -
在 地理路径下,单击 添加路径。
- 从 区域 下拉列表中选择 缺省值。
- 选择池 US。
- 单击添加。
重复此过程以创建以下内容:
要创建的地理路径列表 区域 源池 缺省值 US 西欧 UK 东欧 UK 东北亚 UK 东南亚 UK 北美洲西部地区 US 北美洲东部地区 US 通过此配置,欧洲和亚洲的用户将重定向到伦敦的集群,美国的用户将重定向到达拉斯集群。 当请求与定义的路由不匹配时,它将被重定向到默认区域中的池。
-
单击创建。
在此阶段,您已成功配置了一个全局负载平衡器,并在多个位置配置了 Kubernetes 群集。 您可以访问 GLB URL http://<glb_name>.<your_domain_name>/hostname
查看您的申请。 如果 CIS 无法将您的 IP 地址映射到特定位置,则会根据您的位置将您重定向到最近的群集或默认池中的群集。
保护应用程序
开启 Web 应用程序防火墙
Web 应用程序防火墙 (WAF) 可保护 Web 应用程序免受 ISO 第 7 层攻击。 通常,WAF 与分组规则集组合使用,这些规则集旨在过滤掉恶意流量,从而避免应用程序中有漏洞。
- 在 IBM Cloud Internet Services 仪表板中,浏览至 安全性,然后在 WAF 上。
- 确保 WAF 已开启。
- 单击 OWASP 规则集。 在此页面中,可以查看 OWASP 核心规则集,并分别启用或禁用规则。 启用规则后,如果传入的请求触发了该规则,全局威胁分数就会增加。 敏感度设置将决定是否针对该请求触发操作。
- 保留缺省 OWASP 规则集不变。
- 将敏感度设置为
Low
。 - 将操作设置为
Simulate
以记录所有事件。
- 单击 CIS 规则集。 此页面显示基于托管 Web 站点的常见技术堆栈的其他规则。
HTTPS 的安全连接,您可以从 Let's Encrypt 或通过 IBM Cloud Secrets Manager.
提高性能并防御拒绝服务攻击
分布式拒绝服务( DDoS 分布式拒绝服务(DDNS)攻击是一种恶意企图通过互联网流量洪流压倒目标或其周围基础设施来破坏服务器、服务或网络正常流量的行为。CIS 可保护您的域名免受 DDoS。
-
在 CIS 仪表板中,选择可靠性 > 全局负载均衡器。
-
在负载均衡器表中找到创建的 GLB。
-
启用代理列中的“安全性和性能”功能:
CIS 代理切换开启
GLB 现在受到保护。 一个直接的好处就是,集群的源 IP 地址将对客户机隐藏。 如果 CIS 检测到即将进行的请求存在威胁,那么在将用户重定向到应用程序之前,用户可能会看到类似下面的屏幕:

此外,现在可以控制 CIS 高速缓存的内容以及保持高速缓存的时间。 转至性能 > 高速缓存以定义全局缓高速缓存级别和浏览器到期时间。 可以使用页面规则来定制全局安全性和高速缓存规则。 页面规则使用特定域路径来启用细颗粒度配置。 例如,通过页面规则,可以决定将 /assets 下的所有内容高速缓存 3 天:

除去资源
除去 Kubernetes 集群资源
- 除去 Ingress,可以通过运行以下命令来执行此操作:
kubectl delete -f glb-ingress.yaml
- 除去该服务,可以通过运行以下命令来执行此操作:
kubectl delete service hello-world-service
- 除去部署,可以通过运行以下命令来执行此操作:
kubectl delete deployment hello-world-deployment
- 如果专门为此教程创建了集群,那么删除这些集群。
除去 CIS 资源
- 除去 GLB。
- 除去源池。
- 除去运行状况检查。
- 更新定制域的 DNS。
- 如果是专门为本教程创建的 CIS 实例,请将其删除。