本文发表已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

Kyma - 轻松扩展和构建 Kubernetes

根据最近完成的 CNCF 调查,云原生技术在生产中的采用率正在迅速增长。Kubernetes 是这场技术革命的核心。当然,云原生技术的增长也伴随着围绕它的生态系统的增长。当然,云原生技术的复杂性也增加了。只需在 Google 上搜索“Kubernetes 很难”,您就会找到很多解释这种复杂性问题的文章。CNCF 社区最棒的一点是,这类问题可以通过聪明的人构建新工具来解决 Kubernetes 用户的问题:例如,Knative 及其 Build 资源扩展等项目,旨在减少各种场景中的复杂性。尽管增加复杂性似乎是最需要解决的问题,但这并不是您在过渡到云原生时面临的唯一挑战。

需要解决的问题

选择正确的技术很难

既然您已经了解了 Kubernetes,您的团队也接受了培训,并且您已经开始在其之上构建应用程序,那么现在是时候面对新一层的挑战了。云原生不仅仅意味着部署一个供开发人员在其之上构建的平台。开发人员还需要存储、备份、监控、日志记录和服务网格,以强制执行传输中的数据策略。这些单独的系统中的每一个都必须正确配置和部署,并且还要单独记录、监控和备份。CNCF 旨在提供帮助。我们提供了所有云原生技术的 概览,但列表非常庞大,可能会让人不知所措。

这就是 Kyma 将使您的生活更轻松的地方。它的使命是实现灵活且轻松地扩展应用程序。

Kyma in center

该项目旨在为您提供编写端到端、生产级云原生应用程序所需的工具。Kyma 由在编写生产级云原生应用程序方面拥有丰富经验的 SAP 公司捐赠给开源社区。这就是我们如此兴奋地 宣布 Kyma 1.0 的第一个主要版本的原因!

决定从单体架构迁移到云原生的路径很难

尝试搜索 monolith to cloud nativemonolith to microservices,您会得到一份关于解决此挑战的大量讲座和论文的列表。有很多不同的路径可用于将单体架构迁移到云,并且我们的经验教会我们在这个领域要有自己的看法。首先,让我们回答为什么要从单体架构迁移到云原生的问题。推动此迁移的目标通常是

  • 提高可扩展性。
  • 更快地实现新功能。
  • 更灵活的可扩展性方法。

您不必重写单体架构来实现这些目标。为什么要花费所有时间重写您已经拥有的功能?只需专注于使您的单体架构支持 事件驱动架构

Kyma 如何解决您的挑战?

什么是 Kyma?

Kyma 在 Kubernetes 上运行,由许多不同的组件组成,其中三个是

  • 应用程序连接器,您可以使用它将任何应用程序连接到 Kubernetes 集群,并通过 Kubernetes 服务目录 公开其 API 和事件。
  • 无服务器,使您可以轻松地为应用程序编写扩展。您的函数代码可以通过 API 调用以及来自外部系统的事件触发。您还可以安全地从函数回调集成的系统。
  • 服务目录 用于公开集成的系统。此集成还使您可以使用来自 Azure、AWS 或 Google Cloud 等超大规模服务商的服务。Kyma 可以轻松集成 Microsoft 和 Google 维护的官方服务代理。

core components

您可以观看 此视频,简要了解基于真实演示场景的 Kyma 主要功能。

我们为您选择了正确的技术

只有经过适当监控和配置,才能在像 Kyma 这样的项目中提供可靠的可扩展性。我们决定不重新发明轮子。CNCF 环境中有许多很棒的项目,它们背后都有庞大的社区。我们决定选择最好的项目,并将它们全部整合到 Kyma 中。您可以查看上面的相同架构图,但重点是我们为了创建 Kyma 而整合的项目

Kyma architecture

您不必集成这些工具:我们确保它们都能很好地协同工作,并且始终保持最新状态(Kyma 已经在使用 Istio 1.1)。借助我们的自定义 安装程序Helm 图表,我们可以轻松安装和轻松升级到 Kyma 的新版本。

不要重写单体架构

重写很难,成本很高,而且在大多数情况下是不需要的。归根结底,您需要的是能够更快地编写新功能并将其投入生产。您可以使用 应用程序连接器 将您的单体架构连接到 Kyma 来实现此目的。简而言之,此组件确保

  • 您可以安全地回调注册的单体架构,而无需处理授权,因为应用程序连接器会处理此问题。
  • 从您的单体架构发送的事件会安全地到达 Kyma 事件总线。

目前,您的单体架构可以使用三种不同类型的服务:REST(使用 OpenAPI 规范)和 OData(使用实体数据模型规范)进行同步通信,对于异步通信,您可以基于 AsyncAPI 规范注册事件目录。您的事件稍后将使用 NATS Streaming 通道和 Knative 事件处理 在内部传递。

一旦您的单体架构的服务连接好,您就可以借助前面提到的 服务目录 集成在选定的命名空间中配置它们。作为开发人员,您可以转到目录并查看您可以使用的所有服务的列表。得益于注册的服务代理(例如 Azure 的 OSBA),有来自您的单体架构的服务,以及来自其他第三方提供商的服务。它是您所需一切的唯一场所。如果您想启动一个新的应用程序,那么您所需的一切都已经可以在 Kyma 中获得。

最后是一些代码

查看我为了将单体架构与 Azure 服务集成而不得不编写的一些代码。我希望了解客户在产品评论部分分享的情绪。在每个带有评论的事件中,我都想使用机器学习来调用情绪分析服务,并且在出现负面评论的情况下,我想将其存储在数据库中以供以后查看。这是使用我们的 无服务器 组件创建的函数的代码。请注意我的代码注释

您可以观看 短视频,了解情绪分析功能的完整演示。

/* It is a function powered by NodeJS runtime so I have to import some necessary dependencies. I choosed Azure's CosmoDB that is a Mongo-like database, so I could use a MongoClient */
const axios = require("axios");
const MongoClient = require('mongodb').MongoClient;

module.exports = { main: async function (event, context) {
    /* My function was triggered because it was subscribed to customer review event. I have access to the payload of the event. */
    let negative = await isNegative(event.data.comment)
    
    if (negative) {
      console.log("Customer sentiment is negative:", event.data)
      await mongoInsert(event.data)
    } else {
      console.log("This positive comment was not saved:", event.data) 
    }
}}

/* Like in case of isNegative function, I focus of usage of the MongoClient API. The necessary information about the database location and an authorization needed to call it is injected into my function and I just need to pick a proper environment variable. */
async function mongoInsert(data) {

    try {
          client = await MongoClient.connect(process.env.connectionString, { useNewUrlParser: true });
          db = client.db('mycommerce');
          const collection = db.collection('comments');
          return await collection.insertOne(data);
    } finally {
      client.close();
    }
}
/* This function calls Azure's Text Analytics service to get information about the sentiment. Notice process.env.textAnalyticsEndpoint and process.env.textAnalyticsKey part. When I wrote this function I didn't have to go to Azure's console to get these details. I had these variables automatically injected into my function thanks to our integration with Service Catalog and our Service Binding Usage controller that pairs the binding with a function. */
async function isNegative(comment) {
    let response = await axios.post(`${process.env.textAnalyticsEndpoint}/sentiment`,
      { documents: [{ id: '1', text: comment }] }, {headers:{ 'Ocp-Apim-Subscription-Key': process.env.textAnalyticsKey }})
    return response.data.documents[0].score < 0.5
}

得益于 Kyma,我无需担心函数周围的基础设施。正如我所提到的,我拥有 Kyma 中所需的所有工具,并且它们已集成在一起。我可以通过 Loki 快速访问我的日志,并且可以通过 PrometheusIstio 快速访问预配置的 Grafana 仪表板来查看我的 Lambda 的指标。

Grafana with preconfigured lambda dashboard

这种方法为您添加新功能提供了很大的灵活性。它还为您提供了重新考虑重写旧函数的需求的时间。

贡献并提供反馈

Kyma 是一个开源项目,我们很乐意帮助它成长。实现这一目标的方式是您的帮助。阅读这篇文章后,您已经知道我们不想重新发明轮子。我们在我们的工作模式中坚持这种方法,该方法使社区贡献者能够参与。我们在 特殊兴趣小组 中工作,并公开录制会议,您可以随时加入,因此我们有一个类似于您从 Kubernetes 本身了解的设置。欢迎通过 TwitterSlack 与我们分享您的反馈。