利用 Operator 为 Kubernetes 应用简化生命周期管理流程

您是否正在 Kubernetes
集群上部署应用程序,并希望为应用程序或其组件简化生命周期管理流程?您也可能正在寻找更简单的方法来管理在集群上部署第三方应用程序的过程。Operator
能够以 Kubernetes 原生方式来管理应用程序和组件,并可以显著简化您的日常工作。使用 Operator 将 Kubernetes
上的应用程序或组件作为资源来管理时,您会获得更完整的资源生命周期控制权。您可以将用于 Kubernetes
资源的同类声明式模型用于整个应用程序或服务。

本教程展示了 IBM Cloud
Operator

Red
Hat OpenShift on IBM Cloud

™ 示例。

免费试用 IBM Cloud

利用 IBM Cloud Lite
快速轻松地构建您的下一个应用程序。您的免费帐户从不过期,而且您会获得 256 MB 的 Cloud Foundry 运行时内存和包含
Kubernetes 集群的 2 GB 存储空间。了解所有细节并确定如何开始。如果您不熟悉 IBM Cloud,请查阅 cognitiveclass.ai 上的 IBM Cloud Essentials 课程

前提条件

本教程建立在以下两个基础之上:对 Kubernetes 有个基本了解;能够访问 OpenShift 或上游 Kubernetes 集群。要使用
IBM Cloud Operator 从目录创建服务实例,就需要一个 IBM Cloud 帐户
,并且需要安装IBM Cloud CLI。

预估时间

阅读本教程并尝试操作示例大约需要 30 分钟。

Operator
简介

Kubernetes 作为领先的容器编排项目之所以如此成功,其中一个原因就在于其可扩展性。借助 自定义资源
,开发者可以扩展 Kubernetes API 以管理超出原生对象范围外的资源(例如,pod
和服务)。此外,Kubernetes Go Client
提供了强大的资源库,用于为自定义资源编写 控制器
。控制器实施闭环控制逻辑,通过持续运行对资源的期望状态与所观测到的状态进行协调。

Operator
将特定于应用程序的控制器与相关自定义资源组合在一起,编撰特定领域的知识,用于管理资源生命周期。第一组 Operator 起初聚焦于
Kubernetes 中运行的有状态服务,但近年来,Operator 的范围越来越广泛,如今社区为各种广泛用例构建的 Operator
数量正与日俱增。例如, OperatorHub.io
提供了一个社区 Operator 目录,用于处理各种不同种类的软件和服务。

Operator 的吸引力如此之大,原因有多种。如果您已在使用 Kubernetes 来部署和管理应用程序或更大的解决方案,Operator
可提供一致的资源模型来定义和管理应用程序中的所有不同组件。例如,如果应用程序需要 etcd
数据库,那么只需安装 etcd
Operator

并创建 EtcdCluster 自定义资源即可。etcd Operator
随后就会负责为应用程序部署和管理 etcd 集群,包括次日操作,如备份和复原。由于 Operator 依赖于自定义资源,即 Kubernetes
API 扩展,因此默认情况下,Kubernetes 的所有现有工具都适用。无需学习新工具或新方法。您可以使用同样的 Kubernetes CLI ( kubectl
) 来创建、更新或删除 Pod 和自定义资源。对于自定义资源来说,基于角色的访问控制 (RBAC)
和准入控制的工作方式是相同的。

那么集群外部的应用程序组件情况又如何呢?Operator
在这方面同样可以提供帮助。例如,假设您正在编写需要语言翻译的应用程序。您可以使用基于云的服务,例如, Watson
Language Translator

。要使用此服务,您就需要使用 IBM Cloud
目录或命令行界面并从中配置此服务,然后创建服务凭证,并将凭证复制到可供 pod 轻松访问的 Kubernetes
密钥中。通常,此过程中涉及若干手动步骤,但 Operator 可以自动执行这些步骤。

借助 Operator,您可以像在 Kubernetes
中创建任何其他资源一样来创建翻译程序服务的实例。无需采用超出范围的步骤或脚本来创建外部资源。只需通过一组 Kubernetes
模板来描述自己的应用程序(包括外部依赖项),并直接通过 kubectl apply
部署整个应用程序和依赖项即可。
此外,由于 Operator 可持续将期望状态与当前状态进行比较并加以协调,因此 Operator
可提供自我修复功能,并确保重新启动服务(如果服务不正常或遭意外删除,则可重新创建)。

IBM Cloud
目录

此 Watson Language Translator 示例并非唯一用例。对于注入 AI
功能(无论是添加语言处理、图像分类和标记还是对话框等功能)的应用程序,使用来自 IBM Cloud 目录的 Watson
服务这种情况极其常见。来自该目录的服务涉及各种范围广泛的功能,包括 AI 和机器学习、数据存储和分析、集成和消息传递以及天气和物联网等。
要使用其中任一服务,就需要从目录配备该服务来创建服务实例。配备步骤基本上就是对 IBM Cloud 执行 API
调用,请求将特定服务类型的实例与期望的计划相结合。您可以选择服务的免费版本和付费版本。
对于在 Kubernetes 中运行的应用程序,使用来自 IBM Cloud 目录的组件有何益处?对于 Language Translator
之类的服务或 Weather Company API,这些功能当前仅作为管理服务来提供。

但对于开源数据库(如 PostgreSQL),可以在集群内通过技术方式为数据库添加 pod。但这样做会导致需要将某种持久存储与该 pod
进行绑定,而且该存储需要高可用性支持,并制定相应的备份计划。同时,还存在安全性和合规性的问题。通过选择自主管理数据库,必须完成必要的步骤,为
PostgreSQL 中存储的数据完整记录相应的安全合规性。另一方面,通过使用 IBM Cloud Database for PostgreSQL
,持久存储、高可用性、自动备份、符合 HIPPA 以及
SOC 1 Type 1 与 SOC 2 Type 1 要求的安全性则全部通过管理服务来处理。
虽然将开源数据库部署为 pod 可以减少开发集群方面的成本,但对于生产部署而言,IBM Cloud 目录管理服务才是更有价值的选择。

配置
Operator Lifecycle Manager

正如上文中提到的,OperatorHub.io 提供了社区 Operator 目录。但是,如何才能将 Operator 目录中的 Operator
安装到您的集群中?Operator 的生命周期又是如何管理的?答案很简单:通过另一个 Operator。 Operator Lifecycle Manager (OLM)
引入了自定义资源,用于定义描述和管理 Operator 生命周期所需的所有要素。

ClusterServiceVersion 是封装所有元数据的核心资源,包括描述、版本、作者、功能、依赖项,以及安装和更新 Operator
所需的所有信息。OLM 使用可用 Operator 的本地目录,该目录通过另一个 Operator 与 OperatorHub.io 保持同步 –
Marketplace Operator
。OLM 与 Marketplace Operator 的组合提供了安装
Operator 的功能,并且还可以通过无线 (OTA) 更新来自动接收和应用每个已安装 Operator 的更新。您可以将 OLM 和
Marketplace Operator 安装在任意上游 Kubernetes 发行版中,从而便于访问 OperatorHub.io
中与日俱增的社区 Operator 集合。如果您使用的是 OpenShift V4,那么可以跳过此部分中的步骤,因为默认情况下,OLM 和
Marketplace Operator 已配置并且正常运行。

第 1 步.
在集群中安装 OLM 的最新发行版

运行以下命令:

kubectl apply -f https://github.com/operator-framework/operator-lifecycle-manager/releases/download/0.10.0/crds.yaml
kubectl apply -f https://github.com/operator-framework/operator-lifecycle-manager/releases/download/0.10.0/olm.yaml

第 2
步. 安装 Marketplace Operator

克隆项目:

git clone https://github.com/operator-framework/operator-marketplace.git

然后运行以下命令:

kubectl apply -f operator-marketplace/deploy/upstream/


3 步. 配置 Marketplace Operator 名称空间

OperatorGroup
资源添加到 marketplace-operators
名称空间。此步骤支持从 OperatorHub.io
安装 Operator。

kubectl apply -f - <<END
apiVersion: operators.coreos.com/v1alpha2
kind: OperatorGroup
metadata:
  name: marketplace-operators
  namespace: marketplace
END

第 4 步.
(可选)安装 Operator

有了 OLM 和 Marketplace Operator 后,现在即可轻松安装 OperatorHub.io 目录中的任意
Operator。例如,可通过以下命令安装 etcd Operator:

kubectl create -f https://operatorhub.io/install/etcd.yaml

配置 IBM Cloud
Operator

IBM Cloud Operator
以 Kubernetes 原生方法来提供和配置 IBM Cloud 服务,将其作为 Kubernetes 应用程序的一部分。Operator
提供了两个自定义资源:”服务”和”绑定”。”服务”用于创建来自 IBM Cloud 目录的任意服务的实例。”绑定”用于在 Kubernetes
中自动创建服务凭证和对应的密钥。在安装 OperatorHub.io
目录中的 Operator 之前,需要完成几个步骤。由于您正在提供 IBM
Cloud 服务,因此需要一个 IBM Cloud
帐户和IBM Cloud CLI。

第 1 步. 登录到 IBM
Cloud

使用 IBM Cloud CLI 登录到 IBM Cloud 帐户:

ibmcloud login

使用以下命令为 Cloud Foundry 资源选择目标环境:

ibmcloud target --cf

使用以下命令检查是否已设置默认资源组:

ibmcloud target

如果未设置默认资源组或者需要使用其他资源组,那么可使用以下命令进行设置:

ibmcloud target -g 

第 2 步. 为
Operator 配置 API 密钥

使用以下脚本,利用您的 IBM Cloud API 密钥为 Operator 生成默认配置和密钥:

curl -sL https://raw.githubusercontent.com/IBM/cloud-operators/master/hack/config-operator.sh | bash

第 3 步.
使用 OLM 安装来自目录的 Operator

该目录为每个 Operator 提供了要安装资源的 URL。使用以下命令安装 IBM Cloud Operator:

kubectl create -f https://operatorhub.io/install/ibmcloud-operator.yaml

第 4 步.
创建公共云服务的实例

安装 Operator 后,可以在 IBM Cloud 上使用以下自定义资源创建公共云服务的实例:

apiVersion: ibmcloud.ibm.com/v1alpha1
kind: Service
metadata:
  name: myservice
spec:
  plan: 
  serviceClass: 

要查找
的值,可以使用以下命令列出所有 IBM Cloud 服务的名称:

ibmcloud catalog service-marketplace

找到
名称后,可以使用以下命令列出可用计划以选择

ibmcloud catalog service  | grep plan

例如,要创建 Watson Translator Service 的实例,可以使用以下自定义资源(将此资源定义保存到名为 mytranslator-service.yaml
的文件中):

apiVersion: ibmcloud.ibm.com/v1alpha1
kind: Service
metadata:
  name: mytranslator
spec:
  plan: lite
  serviceClass: language-translator

此外,可以使用以下绑定资源为服务创建凭证和 Kubernetes 密钥(将此资源定义保存到名为 mytranslator-binding.yaml
的文件中):

apiVersion: ibmcloud.ibm.com/v1alpha1
kind: Binding
metadata:
  name: binding-translator
spec:
  serviceName: mytranslator
  secretName: translator-secret

第 5 步.
创建服务实例和绑定

如果采用了服务和绑定资源文件的建议名称,请使用以下命令:

kubectl create -f mytranslator-service.yaml
kubectl create -f mytranslator-binding.yaml

就这么简单!添加完这些资源后,即可创建服务实例,并且将服务凭证绑定为当前名称空间内的 Kubernetes 密钥。不仅如此,由于 IBM Cloud
Operator 根据您的云帐户的特定环境(例如,资源组、区域)自动使用默认设置,您的模板组可移植并可轻松部署到其他环境中。您可将模板传送到
DevOps 流程中或者与组织内其他开发者共享,以便这些开发者能够通过 kubectl create
来启动整个应用程序及依赖项。

结束语

在本教程中,您了解了 Operator,IBM Cloud Operator
还有诸多强大功能,这里只是点到为止。要了解更多高级功能(例如,自我修复以及链接至现有服务的功能),可参阅 IBM Cloud Operator 项目文档

参考资源

本文翻译自: Simplify the lifecycle management process for your Kubernetes apps
with operators

(2019-08-01)