规划应用程序部署
在将应用部署到集群 Red Hat OpenShift on IBM Cloud 之前,请先确定应用的配置方案,确保应用能够被正确访问,并与集群中的其他服务实现 IBM Cloud 集成。
将工作负载移至 Red Hat OpenShift on IBM Cloud
了解哪些类型的工作负载可以在上运行 Red Hat OpenShift on IBM Cloud,以及设置这些工作负载的最佳方式。
可以在 Red Hat OpenShift on IBM Cloud 中运行哪种应用程序?
- 无状态应用程序
- 对于云本机环境(如 Kubernetes),首选无状态应用程序。 这种应用程序的迁移和缩放都很简单,因为它们声明依赖项,将配置与代码分开存储,并将后备服务(例如,数据库)视为连接的资源,而不是耦合到应用程序。 应用程序 Pod 无需持久化数据存储或稳定的网络 IP 地址,因此可根据工作负载需求随时终止、重新调度和扩展。 应用程序使用数据库即服务来持久存储数据,使用 NodePort、LoadBalancer 或 Ingress 服务在稳定的 IP 地址上公开工作负载。
- 有状态应用程序
- 相比无状态应用程序,有状态应用程序的设置、管理和缩放都更加复杂,因为 pod 需要持久数据和稳定的网络身份。 有状态应用程序通常是数据库或其他分布式数据密集型工作负载,在这些工作负载中,处理的效率更接近数据本身。 如果要部署有状态应用程序,那么需要设置持久存储器,并将持久卷安装到由 StatefulSet 对象控制的 pod。 可以选择将文件存储器、 块存储器或对象存储器添加为有状态集的持久存储器。 您还可以在裸机工作节点上 Portworx 安装,并将其 Portworx 作为高可用性软件定义存储解决方案,用于管理状态化应用程序的持久化存储。 有关状态化集合的工作原理的更多信息,请参阅 文档 Kubernetes。
开发无状态云本机应用程序的一些准则是什么?
了解十二要素应用,这是一种语言中立的方法论,用于从十二个要素考量应用开发,具体如下:
- 代码库: 在版本控制系统中对部署使用单个代码库。 拉取用于容器部署的映像时,指定已测试映像标记,而不是使用
latest。 - 依赖项:显式声明和隔离外部依赖项。
- 配置:在环境变量中(而不是在代码中)存储特定于部署的配置。
- 后备服务:将后备服务(例如,数据存储或消息队列)视为已连接或可替换的资源。
- 应用程序阶段:在不同的阶段(例如,
build、release和run)中进行构建,并严格分离各个阶段。 - 进程:作为不共享任何内容的一个或多个无状态进程运行,并使用持久存储器来保存数据。
- 端口绑定:端口绑定是自包含的,并且在定义明确的主机和端口上提供服务端点。
- 并行:通过进程实例(例如,副本和水平缩放)来管理和缩放应用程序。 为部署设置资源请求和限制。 请注意,Calico 网络策略无法限制带宽。
- 一次性:将应用程序设计为一次性的,启动工作极少,可正常关闭,并能容忍进程突然终止。 请记住,容器、pod 甚至工作程序节点都应该是一次性的,因此请相应地规划应用程序。
- 开发环境与生产环境一致性:为应用程序建立持续集成和持续交付管道,确保开发环境中的应用程序与生产环境中的应用程序之间差异最小。
- 日志:将日志视为事件流:外部或托管环境会处理和路由日志文件。 重要信息:在 Red Hat OpenShift on IBM Cloud 中,缺省情况下不会开启日志。 要启用,请参阅配置日志转发。
- 管理进程:将任何一次性管理脚本与应用程序一同保存,并作为 作业 Kubernetes 对象运行,以确保管理脚本在与应用程序本身相同的环境中执行。 若需在集群 Kubernetes 中运行大型软件包,建议使用包管理器(如 Helm )进行编排。
无服务器应用程序如何?
您可以通过该 IBM Cloud Code Engine 服务运行无服务器应用和任务。Code Engine 该服务还能为您构建镜像。
我已有应用程序。 如何将其迁移到 Red Hat OpenShift on IBM Cloud?
您可以执行一些常规步骤来对应用程序进行容器化,如下所示。
- 将十二要素应用作为指南,用于隔离依赖关系、将进程拆分为独立服务,并尽可能降低应用的状态依赖性。
- 查找要使用的相应基本映像。 您可以使用 Hub Docker 中的公开图像、公共 IBM 图像,或在私有存储中构建和管理 IBM Cloud Container Registry 自己的图像。
- 仅将运行应用程序所必需的内容添加到 Docker 映像。
- 查看 常见应用程序修改方案。
- 不要依赖本地存储器,而是改为计划使用持久存储器或云数据库即服务解决方案来备份应用程序的数据。
- 随着时间的推移,将应用程序进程重构为微服务。
常见应用程序修改场景
Red Hat OpenShift 与社区环境相比具有不同的默认设置,Kubernetes 例如更严格的安全上下文约束。 请查看以下常见场景,了解何时需要修改应用程序才能将其部署到 Red Hat OpenShift 集群中。
| 场景 | 可以执行的步骤 |
|---|---|
应用程序以 root 用户身份运行。 您可能会看到 pod 失败,状态为 CrashLoopBackOff |
pod 需要特权访问权。 请参阅授予部署特权访问权的示例步骤。 更多信息,请参阅 Red Hat OpenShift 管理安全上下文限制(SCC) 文档。 |
| 应用程序设计为在 Docker 上运行。 这些应用程序通常是依赖于容器运行时引擎的日志记录和监视工具,可直接调用容器运行时 API,以及访问容器日志目录。 | 在 Red Hat OpenShift 中,您的映像必须与 容器 CRI-O 运行时兼容才能运行。 有关更多信息,请参阅《 CRI-O 使用容器引擎》。 |
| 您的应用程序使用持久文件存储,但当前非root用户ID无法向已挂载的存储设备写入数据。 | 针对应用程序部署调整安全上下文,以便将 runAsUser 设置为 0。 |
服务在端口 80 或小于 1024 的其他端口上公开。 您可能会看到 Permission denied 错误。 |
小于 1024 的端口是特权端口,保留用于启动进程。 您可以选择以下解决方案之一: -将端口更改为 8080 或大于 1024 的类似端口,并更新容器以侦听此端口。 -将容器部署添加到特权服务帐户,例如,在 授予部署特权访问权的示例中。 -设置容器以侦听任何网络端口, 然后使用 port 转发更新容器运行时以将该端口映射到主机上的端口 80。 |
| 其他用例和场景 | 查看 Red Hat OpenShift 文档以迁移数据库,Web 框架应用程序和 CI/CD。 |
授予部署特权访问权的示例步骤
若您的应用程序以root权限运行,则必须修改部署方案,使其符合集群 Red Hat OpenShift 设置 的安全上下文约束。 例如,您可以通过服务账户设置项目来控制特权访问,然后修改部署配置以使用该服务账户。
开始之前: 访问 Red Hat OpenShift 集群。
-
以集群管理员身份创建项目。
oc adm new-project <project_name> -
将该项目设定为目标,以便后续创建的资源位于该项目名称空间中。
oc project <project_name> -
为项目创建服务帐户。
oc create serviceaccount <sa_name> -
将特权安全上下文约束添加到项目的服务帐户。 若需查看 SCC
privileged中包含哪些策略,请运行oc describe scc privileged. 有关SCCs的更多信息,请参阅 文档 Red Hat OpenShift。oc adm policy add-scc-to-user privileged -n <project_name> -z <sa_name> -
在部署配置文件中,引用特权服务帐户,并将安全上下文设置为 privileged。
- 在
spec.template.spec中,添加serviceAccount: <sa_name>。 - 在
spec.template.spec.containers中,添加securityContext: privileged: true。
示例
apiVersion: apps/v1 kind: Deployment metadata: name: myapp_deployment labels: app: myapp spec: ... template: ... spec: serviceAccount: <sa_name> containers: - securityContext: privileged: true ... - 在
-
部署应用程序配置文件。
oc apply -f <filepath/deployment.yaml> -
检查 pod 是否处于 Running 状态。 如果 pod 显示错误状态或长时间卡在某个状态,请描述该 pod 并查看 Events 部分以开始对部署进行故障诊断。
oc get pods
了解应用程序的 Kubernetes 对象
使用 Kubernetes 时,可在 YAML 配置文件中声明许多类型的对象,例如 pod、部署和作业。 这些对象描述多种内容,如正在运行的容器化应用程序、这些应用程序使用的资源以及管理其重新启动、更新、复制等操作行为的策略。 有关更多信息,请参阅 配置最佳实践文档 Kubernetes。
我以为自己需要把应用程序放入容器中。 现在,pod 中都有哪些相关内容?
一个 pod 是可 Kubernetes 管理的最小部署单元。 将容器(或一组容器)放入 pod 中,并使用 pod 配置文件来指示 pod 如何运行容器以及与其他 pod 共享资源。 您放入 pod 中的所有容器都在共享环境中运行,这意味着它们共享同一台虚拟机或物理机。
- 要放入容器中的内容
- 在考虑应用程序的组件时,请评估它们在CPU和内存等资源需求方面是否存在显著差异。 对于以最佳性能运行的某些组件,在将资源转移到其他区域期间,可以接受这些组件停止运行一小会儿吗? 是否有面向客户的其他组件,使其保持运行至关重要? 如果有这类组件,请将其拆分放入不同的容器中。 您始终可以将这些组件部署到同一 pod,使其同步运行。
- 要放入 pod 中的内容
- 应用程序的容器不必始终位于同一 pod 中。 事实上,如果有一个有状态且难以缩放的组件(例如,数据库服务),请将其放入其他 pod 中,然后可以将该 pod 安排在使用更多资源来处理工作负载的工作程序节点上。 如果在不同工作程序节点上运行的容器可以正常工作,请使用多个 pod。 如果容器需要位于同一机器上并一起缩放,请将容器分组到同一 pod 中。
既然我可以使用一个 Pod,为什么还需要这么多不同类型的对象呢?
创建 pod YAML 文件非常简单。 您可以编写只包含下面几行的 pod YAML 文件。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
但是,您并不希望就此止步。 如果运行 pod 所在的节点停止运行,那么 pod 会随之停止运行,并且不会重新安排该 pod。 相反,应使用部署来支持 Pod 重调度、副本集和滚动更新。 创建基本部署几乎与创建 pod 一样容易。 但是,不要在
spec 中定义容器本身,请改为在部署 replicas 中指定 template 和 spec。 对于模板中的容器,模板具有自己的 spec,如下所示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
可以持续添加功能,例如 pod 反亲缘关系或资源限制,所有这些都在同一 YAML 文件中添加。
有关可添加到部署中的不同功能的详细说明,请参阅 《创建应用部署 YAML 文件》。
我可以为自己的应用程序创建什么类型的 Kubernetes 对象?
准备应用程序 YAML 文件时,您有许多选项可用于提高应用程序的可用性、性能和安全性。 例如,您可以不使用单个 pod,而改为使用 Kubernetes 控制器对象来管理工作负载(例如,副本集、作业或守护程序集)。 有关 Pod 和控制器更多信息,请参阅 文档 Kubernetes。 用于管理 pod 副本集的部署是应用程序的常见用例。
例如,要部署应用程序 pod,kind: Deployment 对象是一个不错的选择,因为使用该对象,可以指定副本集,从而提高 pod 的可用性。
下表描述了您可能会创建不同类型 Kubernetes 工作负载对象的原因。
| 对象 | 描述 |
|---|---|
Pod |
pod 是工作负载的最小可部署单元,可以容纳单个或多个容器。 与容器类似,Pod 具有一次性特性,常用于应用功能的单元测试。 为避免应用程序发生中断,请考虑使用 Kubernetes 控制器(例如,部署)来部署 pod。 部署可帮助您管理多个 pod、副本、pod 缩放、应用等。 |
ReplicaSet |
副本集可确保 pod 的多个副本同时运行,并且如果某个 pod 关闭,会重新安排一个 pod。 您可以创建副本集来测试 pod 安排的工作方式,但要管理应用程序更新、应用和缩放,请改为创建部署。 |
Deployment |
部署是一个控制器,用于管理 pod 或 pod 模板的 副本集。 您可以不使用部署来创建 pod 或副本集,以测试应用程序功能。 对于生产级别的设置,请使用部署来管理应用程序更新、应用和缩放。 |
StatefulSet |
有状态集与部署类似,也是管理 pod 副本集的控制器。 但与部署不同的是,有状态集可确保 pod 具有唯一的网络身份,用于在重新安排期间保持相应 pod 的状态不变。 如果要在云中运行工作负载,请尝试将应用程序设计为无状态,这样服务实例可实现彼此独立,并且万一发生故障也不会导致服务中断。 但是,某些应用程序(例如,数据库)必须是有状态的。 对于这些情况,请考虑创建有状态集,并使用 文件存储器、块存储器或对象存储器作为有状态集的持久性存储器。 您还可以在裸机工作节点上 Portworx 安装,并将其 Portworx 作为高可用性软件定义存储解决方案,用于管理有状态集的持久化存储。 |
DaemonSet |
必须在集群中的每个工作程序节点上运行相同的 pod 时,请使用守护程序集。 将工作程序节点添加到集群时,会自动安排守护程序集所管理的 pod。 典型用例包括日志收集器(例如,logstash 或 prometheus),用于从每个工作程序节点收集日志,以提供对集群或应用程序的运行状况的洞察。 |
Job |
作业可确保一个或多个 pod 成功运行至完成。 您可以使用作业来处理队列或批处理任务,从而支持对独立但相关的工作项进行并行处理,例如渲染特定帧、发送电子邮件以及转换文件等操作。 要安排作业在特定时间运行,请使用 CronJob. |
如果我想让我的应用程序配置使用变量怎么办? 如何将这些变量添加到YAML中?
要在部署中添加可变信息,而非将数据硬编码到 YAML 文件中,您可以使用 或 Secret KubernetesConfigMap 对象。
要使用配置映射或私钥,您需要将其安装到 pod。 就在运行 pod 之前,配置映射或私钥会与 pod 组合在一起。 您可以跨许多应用程序复用部署规范和映像,但要交换出定制的配置映射和私钥。 尤其是私钥可能会在本地节点上占用大量存储空间,因此请相应地进行规划。
这两个资源都会定义键/值对,但这些对将用于不同的情境。
- 配置映射
- 为部署中指定的工作负载提供非敏感配置信息。 您可以通过三种主要方式来使用配置映射。
- 文件系统:您可以将整个文件或一组变量挂载到 Pod 上。 系统将根据文件中设置为该值的键名内容为每个条目创建一个文件。
- 环境变量:为容器规范动态设置环境变量。
- 命令行选项:设置在容器规范中使用的命令行选项。
- 私钥
- 为工作负载提供敏感信息,例如以下信息。 请注意,集群的其他用户可能有权访问私钥,因此请确保您确定可以与这些用户共享私钥信息。
- 个人身份信息(PII):将电子邮件地址等敏感信息,或公司合规要求及政府法规所需的其他类型信息保密存储。
- 凭证:将密码、密钥和令牌等凭证存入密钥库,以降低意外泄露的风险。 例如,绑定服务到集群时,凭证会存储在私钥中。
想要使私钥更安全吗? 请求集群管理员在集群中 启用密钥管理服务提供者 以加密新密钥和现有密钥。
如何确保我的应用程序拥有正确的资源?
在指定应用程序的 YAML 文件 时,您可以为应用程序配置添加 Kubernetes 功能,这些功能有助于应用程序获取正确的资源。 特别地,为YAML文件中定义的每个容器 设置资源限制和请求。
此外,集群管理员可能会设置可影响应用程序部署的资源控制,例如以下各项。
如何为我的应用程序配置添加功能?
请参阅在 YAML 文件中指定应用程序需求,以获取有关部署中可包含的内容的描述。 此示例包含以下选项。
如何向我的应用添加 IBM 服务,例如 Watson?
请参阅向应用程序添加服务。
规划高可用性部署
设置在多个工作程序节点和集群上分发得越广泛,用户使用应用程序时遇到中断的可能性就越低。
查看以下潜在的应用程序设置(按可用性程度从低到高排序)。
- 一个部署,其中由单节点上的副本 n+2 集管理的 Pod。
- 部署具有 n+2 个 pod,这些 pod 由副本集管理并跨单专区集群的多个节点分布(反亲缘关系)。
- 部署具有 n+2 个 pod,这些 pod 由副本集管理并在多个专区中跨多专区集群的多个节点分布(反亲缘关系)。
您还可以使用全局负载平衡器连接不同区域的多个群集。
如何提高应用程序的可用性?
请考虑以下选项以提高应用程序的可用性。
- 使用部署和副本集来部署应用程序及其依赖项
- 部署是一个 Kubernetes 资源,可用于声明应用程序的所有组件及其依赖项。 借助部署功能,您无需手动记录所有步骤,而是可以专注于应用程序本身。 当您部署多个 Pod 时,系统会自动为部署创建副本集,该副本集负责监控 Pod 并确保指定数量的 Pod 处于运行状态。 pod 发生故障时,副本集会将无响应的 pod 替换为新的 pod。 您可以使用部署来定义应用程序的更新策略,包括在滚动更新期间要添加的 pod 数,以及允许同时不可用的 pod 数。 执行滚动更新时,部署系统会检查修订版本是否正常运行,一旦检测到故障就会停止发布。 通过部署功能,您可以同时部署多个具有不同选项的修订版本。 例如,您可以先测试部署,然后再决定是否将其推送到生产环境。 通过使用部署,可以跟踪任何已部署的修订版。 如果遇到更新无法按预期运行的情况,可以使用此历史记录回滚到上一个版本。
- 包含足够多的副本用于应用程序的工作负载,在此基础上再额外增加两个副本
- 要使应用程序具有更高可用性且在出现故障时能够更快恢复,请考虑在处理预期工作负载所需最低要求的副本数基础上,再包含额外的副本。 在某个 pod 崩溃且副本集尚未恢复已崩溃 pod 的情况下,额外的副本可处理工作负载。 要针对同时发生两个故障的情况进行防护,请包含两个额外的副本。 此设置是 N+2 模式,其中 N 是处理入局工作负载的副本数,+2 是额外两个副本。 只要集群具有足够的空间,就可以拥有任意数量的 pod。
- 跨多个节点分布 pod(反亲缘关系)
- 创建部署时,各个 pod 可部署到同一工作程序节点。 这被称为亲和性,或称同位。 为保护应用免受工作节点故障的影响,您可以在标准集群中使用 选项
podAntiAffinity配置部署,将 Pod 分布到多个工作节点上。 可以定义两种类型的 pod 反亲缘关系:首选或必需。 有关更多信息,请参阅《 将 Pod 分配Kubernetes 到节点》文档。 有关应用程序部署中的亲缘关系的示例,请参阅创建应用程序部署 YAML 文件。 - 跨多个专区或区域分布 pod
- 要保护应用程序不受专区故障的影响,可以在不同专区中创建多个集群,或者向多专区集群的工作程序池添加专区。 多专区集群仅在某些 经典 或 VPC 多专区 (例如达拉斯) 中可用。 如果在不同专区中创建多个集群,那么必须 设置全局负载均衡器。 使用副本集并指定 pod 反亲缘关系时,Kubernetes 会跨节点分布应用程序 pod。 如果节点位于多个专区中,那么 pod 会跨这些专区分布,从而提高应用程序的可用性。 如果要限制应用程序仅在一个专区中运行,您可以配置 pod 亲缘关系,或者在一个专区中创建并标记工作程序池。
- 在多区域集群部署中,我的应用程序Pod是否均匀分布在各个节点上?
- pod 会跨专区均匀分布,但不一定会跨节点均匀分布。 例如,如果有一个集群在 3 个专区中分别有 1 个节点,并且部署了包含 6 个 pod 的副本集,那么每个节点会获得 2 个 pod。 但是,如果集群在 3 个专区中分别有 2 个节点,并且部署了包含 6 个 pod 的副本集,那么每个专区会安排 2 个 pod,这 2 个 pod 可能会每个节点安排 1 个,也可能 2 个 pod 都安排在一个节点上。 若需更精细地控制调度,可 设置 Pod 亲和性。
- 如果某个区域发生故障,如何将Pod重新调度到其他区域中剩余的节点上?
- 这取决于您在部署中使用的安排策略。 若您启用了 节点特定的Pod亲和性,则Pod不会被重新调度。 如果未包含此策略,那么会在其他专区中的可用工作程序节点上创建 pod,但可能不会对这些 pod 进行均衡。 例如,这 2 个 pod 可能分布在 2 个可用节点上,也可能都安排到 1 个具有可用容量的节点上。 与此类似,当不可用专区恢复时,不会自动删除 pod 并跨节点对这些 pod 进行重新均衡。 若需在区域恢复后重新平衡各区域的负载,请配置 调度 Kubernetes 器。 在多区域集群中,请尽量将每个区域的工作节点容量保持在50%,以确保保留足够的容量来保护集群免受区域故障的影响。
- 如果我想将我的应用程序扩展到多个地区呢?
- 为保护应用免受区域故障影响,请在另一区域创建第二个 集群,设置全局负载均衡器连接两个集群,并使用部署YAML文件为应用部署具有 Pod反亲和性的副本集副本。
- 如果我的应用程序需要持久化存储怎么办?
- 使用云服务,例如 IBM Cloudant 或 IBM Cloud Object Storage。
如何扩展我的应用程序?
如果要动态添加和除去应用程序以响应工作负载使用情况,请参阅 缩放应用程序 以获取用于启用水平 pod 自动缩放的步骤。
对应用程序进行版本控制和更新
您投入了大量工作来准备使用应用程序的下一个版本。 您可以使用 IBM Cloud 和 Kubernetes 更新工具来发布应用的不同版本。
如何组织部署以使其更容易更新和管理?
既然您已清楚地了解要在部署中包含哪些内容,您可能会想知道如何管理所有这些不同的 YAML 文件? 当然还包括这些文件在 Kubernetes 环境中创建的对象!
以下提示可帮助您组织部署 YAML 文件。
- 使用版本控制系统,例如 Git。
- 将紧密相关的 Kubernetes 对象分组在单个 YAML 文件中。 例如,如果要创建
deployment,那么还可以将service文件添加到 YAML。 使用---分隔对象,如以下示例中所示。apiVersion: apps/v1 kind: Deployment metadata: ... --- apiVersion: v1 kind: Service metadata: ... - 您可以使用该
oc apply -f命令对整个目录进行操作,而不仅限于单个文件。 - 请试用
kustomize项目,此项目可用于帮助编写、定制和复用 Kubernetes 资源 YAML 配置。
在 YAML 文件中,可以使用标签或注释作为元数据来管理部署。
可以使用哪些应用程序更新策略?
要更新应用程序,可以从各种策略中进行选择,例如以下策略。 在执行更复杂的金丝雀部署之前,您可能要首先执行滚动部署或即时切换。
- 滚动部署
- 可以使用 Kubernetes 本机功能来创建
v2部署,并逐渐替换先前的v1部署。 此方法要求应用程序与早期版本兼容,确保使用该v2应用程序版本的用户不会遇到任何破坏性变更。 有关更多信息,请参阅管理滚动部署来更新应用程序。 - 即时切换
- 即时切换也称为蓝绿部署,这种方法需要将计算资源加倍,以同时运行两个版本的应用程序。 通过此方法,可以近乎实时地将用户切换到更高版本。 请确保使用服务标签选择器(例如
version: green和version: blue)来确保请求被发送到正确的应用程序版本。 可以创建新的version: green部署,等待它准备就绪,然后删除version: blue部署。 或者,您可以执行 滚动更新,但需将maxUnavailable参数设置为0%,并将maxSurge参数设置为100%。 - 金丝雀或 A/B 部署
- 金丝雀部署是更复杂的更新策略,使用此方法时,要求您选取用户百分比(例如,5%),然后将这一比例的用户发送到新的应用程序版本。 可以在日志记录和监视工具中收集有关新应用程序版本执行情况的度量值,执行 A/B 测试,然后将更新应用到更多用户。 与所有部署一样,标注应用程序(例如,
version: stable和version: canary)至关重要。
如何自动执行应用程序部署?
如果要在多个集群中、公共和专用环境中,或者甚至在多个云提供者中运行应用程序,那么您可能会想知道如何使部署策略在所有这些环境中都有效。 借助 IBM Cloud 和其他开放式源代码工具,您可以打包应用程序以帮助自动执行部署。
- 设置持续集成和交付 (CI/CD) 管道
- 通过在源代码控制管理系统(如 Git)中组织的应用程序配置文件,可以构建管道来测试代码,并将代码部署到不同的环境,例如
test和prod。 与集群管理员一起 设置持续集成和交付。 - 打包应用程序配置文件
- 使用诸如 Kustomize 或 Helm之类的工具来打包应用程序。
- 通过
kustomize项目,您可以编写,定制和复用 Kubernetes 资源 YAML 配置。 - 使用 包 HelmKubernetes 管理器,您可以在 图表 Helm 中指定应用所需的所有 Kubernetes 资源。 然后,可以使用 Helm 来创建 YAML 配置文件,并在集群中部署这些文件。 您还可以 集成 IBM Cloud-provided Helm 图表来扩展集群的功能,例如使用块存储插件。
- 通过
要创建 YAML 文件模板吗? 有些人使用 Helm 来实现这个目的,或者你可以尝试其他社区工具,例如 ytt。
设置服务发现
集群 Red Hat OpenShift 中的每个 pod 都拥有一个 IP 地址。 但是,将应用程序部署到集群时,您并不希望依赖 pod IP 地址来执行服务发现和联网。 pod 会以动态方式频繁被除去和替换。 因此,请改为使用 Kubernetes 服务,该服务表示一组 pod,并通过服务的虚拟 IP 地址(称为其cluster IP)提供稳定的入口点。 有关更多信息,请参阅 服务文档 Kubernetes。
如何确保我的服务已连接到正确的部署并准备就绪?
对于大多数服务,请将选择器添加到服务 .yaml 文件,以便它应用于通过该标签运行应用程序的 pod。 很多时候,当应用首次启动时,你并不希望它立即处理请求。 向部署添加就绪性探测器,以便将流量仅发送到被视为准备就绪的 pod。 要查看使用标签并设置就绪探针的服务部署示例,请参阅此 NGINX YAML 文件。
有时,您不希望服务使用标签。 例如,您可能有外部数据库,或者希望将服务指向集群内其他名称空间中的其他服务。 发生这种情况时,您必须手动添加端点对象,并将其链接到服务。
如何在因特网上公开服务?
可以为外部联网创建三种类型的服务:NodePort、LoadBalancer 和 Ingress。
您可根据集群类型选择不同的方案。 有关更多信息,请参阅规划联网服务。
- 标准集群:可以使用 NodePort、LoadBalancer 或 Ingress 服务来公开应用程序。
- 使用 Calico 变为专用的集群:可以使用 NodePort、LoadBalancer 或 Ingress 服务来公开应用程序。 您还必须使用 Calico DNAT 前网络策略来阻止公共节点端口。
在规划集群中需要多少Service对象时,请记住,Kubernetes 是使用 iptables 来处理联网和端口转发规则。 若在集群中运行大量服务(例如5000个),性能可能会受到影响。
保护应用程序
在规划和开发应用程序时,请考虑以下选项以维护安全映像,确保敏感信息已加密,并控制应用程序 pod 与集群中其他 pod 和服务之间的流量。
- 映像安全性
- 要保护应用程序,必须保护映像并建立确保映像完整性的检查。 请查看 映像和注册表安全性主题,以了解为确保安全容器映像而可以执行的步骤。 例如,您可以使用 Vulnerability Advisor 来检查容器映像的安全状态。 当您将图像添加到组织的 IBM Cloud Container Registry 命名空间时,该图像将自动被扫描 Vulnerability Advisor 以检测安全问题和潜在漏洞。 如果发现安全问题,系统会提供指示信息,以帮助修复所报告的漏洞。 要开始使用,请参阅 使用 Vulnerability Advisor。
- Kubernetes 秘密
- 部署应用时,请勿在 YAML 配置文件、配置映射或脚本中存储凭据或密钥等机密信息。 请改为使用 Kubernetes 私钥,例如用于注册表凭证的映像拉取私钥。 然后,可以在部署 YAML 文件中引用这些私钥。
- 私钥加密
- 您可以使用密钥管理服务 (KMS) 提供程序对在集群中创建的 Kubernetes 私钥进行加密。 要开始使用,请参阅 使用 KMS 提供程序加密密钥 和 验证密钥是否已加密。
- Pod 流量管理
- Kubernetes 网络策略 保护 pod 免受内部网络流量的影响。 例如,如果大多数或所有 pod 不需要访问特定 pod 或服务,并且您希望确保缺省情况下 pod 无法访问这些 pod 或服务,那么可以创建 Kubernetes 网络策略来阻止流入这些 pod 或服务的流量。 Kubernetes 网络策略还可以通过控制不同名称空间中的 pod 和服务之间的通信方式来帮助您实施名称空间之间的工作负载隔离。 对于运行 Kubernetes 1.21 及更高版本的集群,pod 用于与 Kubernetes API 服务器通信的服务帐户令牌是有时间限制的,会自动刷新,作用域限定为特定用户受众 (pod),并在 pod 被删除后失效。 要继续与 API 服务器通信,必须设计应用程序以定期 (例如每分钟) 读取刷新的令牌值。 有关更多信息,请参阅 绑定服务帐户令牌。
管理访问和监视应用程序运行状况
部署应用程序后,可以控制谁可以访问应用程序,并监视应用程序的运行状况和性能。
如何控制谁有权访问我的应用程序部署?
账户和集群管理员可以在多个不同层级上控制访问权限:集群、Red Hat OpenShift 项目、Pod 和容器。
通过 IBM Cloud IAM,可以在集群实例级别为各个用户、组或服务帐户分配许可权。 您可以通过将用户限制为只能访问集群内的特定名称空间,从而进一步缩小集群访问范围。 有关更多信息,请参阅分配集群访问权。
要在 pod 级别控制访问,您可以配置 安全上下文约束(SCC)。
在应用程序部署 YAML 中,可以为 pod 或容器设置安全上下文。 如需了解更多信息,请查阅 文档 Kubernetes。
部署应用程序后,如何监视其运行状况?
您可以为集群设置 IBM Cloud 日志记录和监视。