专栏首页CNCFKyma - 轻松扩展和构建Kubernetes

Kyma - 轻松扩展和构建Kubernetes

作者:Lukasz Gornicki(SAP)

根据最近完成的CNCF调查,云原生技术在生产中的采用率正在快速增长。Kubernetes是这场技术革命的核心。云原生技术的增长自然地伴随着围绕它的生态系统的增长。当然,云原生技术的复杂性也有所增加。只要谷歌搜索一下“Kubernetes是困难的”,你将获得大量解释这个复杂性问题的文章。CNCF社区最好的一点是,这样的问题可以通过聪明的人构建新的工具来解决,以支持Kubernetes用户:例如,像Knative这样的项目及其Build资源扩展,可以降低各种场景的复杂性。尽管增加复杂性似乎是需要解决的最重要的问题,但它并不是你在过渡到云原生环境时所面临的唯一挑战。

https://www.cncf.io/blog/2018/08/29/cncf-survey-use-of-cloud-native-technologies-in-production-has-grown-over-200-percent/

https://github.com/knative/build

要解决的问题

选择正确的技术是困难的

现在你已经了解了Kubernetes,你的团队已经接受了培训,并且已经开始在其上构建应用程序,现在是时候面对一个新的挑战层了。云原生并不仅仅意味着为开发者部署一个可以在其上构建的平台。开发者还需要存储、备份、监视、日志记录和服务网格来对传输中的数据执行政策。必须正确配置和部署这些单独的系统,并对其进行日志记录、监视和备份。CNCF在这提供帮忙。我们提供了所有云原生技术的景观(l.cncf.io),但是列表非常庞大,可能会让人无法承受。

这就是Kyma会让你的生活更容易的地方。它的使命是提供一种灵活和简单的方法来扩展应用程序。

http://kyma-project.io/

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

决定从单体到云原生的路径是困难的

尝试谷歌搜索一下monolith to cloud native或monolith to microservices,你会得到一个列表,上面列出了大量应对这一挑战的演讲和论文。将一个单体迁移到云上有很多不同的方法,我们的经验告诉我们在这个领域要有自己的见解。首先,让我们回答一个问题:为什么要从单体迁移到原生云。推动这一举措的目标通常是:

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

你不必重写你的单体来实现这些目标。为什么要花那么多时间重写已有的功能呢?只需集中精力使你的单体支持事件驱动的体系结构。

Kyma如何解决你的挑战?

Kyma是什么?

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

  • Application Connector:你可以使用应用程序连接器将任何应用程序与Kubernetes集群连接起来,并通过Kubernetes服务目录公开其API和事件。
  • Serverless:它使你能够轻松地为你的应用程序编写扩展。你的函数代码可以由API调用触发,也可以由来自外部系统的事件触发。你还可以安全地从函数中回调集成的系统。
  • Service Catalog:服务目录用于公开集成系统。这种集成还允许你使用来自Azure、AWS或谷歌云等提供的服务。Kyma允许轻松集成由Microsoft和谷歌维护的官方服务代理。

你可以观看这个视频,了解基于真实演示场景的Kyma关键特性的简短概述。

https://www.youtube.com/watch?v=wJzVWFGkiKk

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

只有进行了适当的监视和配置之后,才能在Kyma这样的项目中提供可靠的可扩展性。我们决定不重新发明轮子。在CNCF景观有许多伟大的项目,其中大多数背后都有巨大的社区。我们决定挑选最好的,然后把它们粘在一起。你可以看到上面相同的架构图,但重点是我们一起创建Kyma的项目:

  • 监测和警报是基于Prometheus和Grafana
  • 日志是基于Loki的
  • Eventing使用Knative和NATS
  • 资产管理使用Minio作为存储
  • 服务网格基于Istio
  • 跟踪使用Jaeger完成
  • 身份验证使用dex

你不必集成这些工具:我们确保它们都能很好地协同工作,并且总是最新的(Kyma已经在使用Istio 1.1)。通过我们自定义的Installer和Helm chart,我们可以轻松安装和升级到Kyma的新版本。

不要重写你的单体

重写是困难的,需要花费大量的金钱,而且在大多数情况下是不需要的。最终,你需要的是能够更快地编写并将新特性投入到生产中。你可以使用应用程序连接器(Application Connector)将单体连接到Kyma。简而言之,这个组件确保:

  • 你可以安全地回调已注册的单体,而不需要处理授权,因为应用程序连接器处理这个问题。
  • 从你的单体发送的事件安全地到达Kyma事件总线(Kyma Event Bus)。

目前,你的单体可以使用三种不同类型的服务:REST(使用OpenAPI规范)和OData(使用实体数据模型Entity Data Model规范)用于同步通信,而对于异步通信,你可以基于AsyncAPI规范注册事件目录。之后,你的事件将通过带有Knative事件的NATS流通道在内部交付。

一旦连接了单体的服务,就可以在选定的命名空间中提供它们,这要感谢前面提到的服务目录集成。作为开发者,你可以到目录,看到你可以使用的所有服务的列表。通过注册的服务代理(如Azure的OSBA),你可以从你的单体获得服务,也可以从其他第三方提供商获得服务。这是一个你需要一切的地方。如果你想建立一个新的应用程序,Kyma中已经提供了你需要的所有内容。

最后来看一些代码

查看一下我必须编写的一些代码,将Azure服务集成到一个单体中。我想了解客户在产品评论部分的感受。对于每一个带有评论的事件,我都想使用机器学习来调用一个情感分析服务,而对于负面评论,我想将它存储在数据库中,以便以后进行评论。这是由于我们的无服务器组件而创建的函数的代码。请注意我的代码注释:

你可以观看这段简短的视频来了解情绪分析功能的完整演示。

https://www.youtube.com/watch?v=wJzVWFGkiKk

/* 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快速访问我的日志,也可以快速访问预先配置好的Grafana仪表板,以查看我的Lambda的度量,这多亏了Prometheus和Istio。

这种方法在添加新功能时提供了很大的灵活性。它还让你有时间重新考虑重写旧函数的需要。

贡献并给予反馈

Kyma是一个开源项目,我们很乐意帮助它成长。这需要你的帮助。读了这篇文章后,你已经知道我们并不想重新发明轮子。在我们的工作模型中,我们坚持这种方法,支持社区贡献者。我们在特殊兴趣小组工作,并有公开记录的会议,你可以随时参加,我们有一个类似于你从Kubernetes本身所知道的设置。你也可以通过Twitter或Slack与我们分享你的反馈。

https://github.com/kyma-project/community/tree/master/sig-and-wg

https://twitter.com/kymaproject

http://slack.kyma-project.io/

本文分享自微信公众号 - CNCF(lf_cncf),作者:CNCF

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 生产力软件公司Nulab以微服务和Kubernetes提高了自己的生产力

    使用的CNCF项目:Envoy、gRPC、Kubernetes、Prometheus

    CNCF
  • 使用FalcoSideKick扩展Falco的输出

    默认情况下,Falco的事件有5个输出:stdout、file、GRPC、shell和http。如下图所示:

    CNCF
  • 成员网研会:Flink操作器 = Beam-on-Flink-on-K8s(视频+PDF)

    讲者:Aniket Mokashi,工程经理 @谷歌;Dagang Wei,软件工程师 @谷歌

    CNCF
  • MySQL字符串的合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行...

    July
  • 如何在 Java 和 Kotlin 之间进行互操作 | AndroidDevSummit 中文字幕视频

    Kotlin 超好用,您也许想用 Kotlin 写所有的东西,但那些现有的 Java 语言代码该怎么办呢?或者您需要用到一个利用 Java 语言编写并已经在很...

    Android 开发者
  • 02-空间复杂度、递归

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    xbhog
  • 男朋友连模糊匹配like %%怎么优化都不知道

    三歪最近发现我一直在写MySQL的文章,然后就跟我说他有sql用到like的时候就没办法用到索引了,问我怎么办。

    敖丙
  • python调用系统命令打印到文件里

    py3study
  • php图片裁剪函数

    砸漏
  • windows部署SpiderKeeper(爬虫监控)

    最近发现了一个spdierkeeper的库,这个库的主要用途是在于配合这scrpyd管理你的爬虫,支持一键式部署,定时采集任务,启动,暂停等一系列的操作. ...

    周小董

扫码关注云+社区

领取腾讯云代金券