本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kyma - 輕鬆擴展並建構於 Kubernetes 之上
根據最近完成的 CNCF 調查,雲原生技術在生產環境中的採用率正在快速成長。Kubernetes 是這場技術革命的核心。自然地,雲原生技術的成長伴隨著圍繞它的生態系統的成長。當然,雲原生技術的複雜性也隨之增加。只要在 Google 上搜尋「Kubernetes 很難」,您就會找到大量文章解釋這個複雜性問題。CNCF 社群最棒的地方在於,像這樣的問題可以透過聰明人建構新工具來解決 Kubernetes 使用者的問題:例如,像 Knative 及其 Build 資源擴充功能這樣的專案,有助於降低各種情境的複雜性。即使增加複雜性似乎是要解決的最重要問題,但這並不是您在轉型到雲原生時面臨的唯一挑戰。
待解決的問題
選擇正確的技術很難
現在您已經了解 Kubernetes,您的團隊也接受了培訓,並且您已經開始在其上建構應用程式,現在是時候面對新一層的挑戰了。雲原生不僅僅意味著部署一個平台供開發人員在其上建構。開發人員還需要儲存、備份、監控、日誌記錄和服務網格,以對傳輸中的資料強制執行策略。這些個別系統中的每一個都必須正確配置和部署,以及記錄、監控和備份自身。CNCF 在此提供協助。我們提供了所有雲原生技術的 landscape 概觀,但列表非常龐大,可能會讓人不知所措。
這就是 Kyma 讓您的生活更輕鬆的地方。其使命宣言是實現一種靈活且簡單的方式來擴展應用程式。

這個專案旨在為您提供編寫端對端、生產級雲原生應用程式所需的工具。Kyma 由 SAP 捐贈給開源社群;SAP 是一家在編寫生產級雲原生應用程式方面擁有豐富經驗的公司。這就是為什麼我們如此興奮地 -- 宣布 Kyma 1.0 的首個主要版本!
決定從單體式架構到雲原生的路徑很難
嘗試在 Google 上搜尋 monolith to cloud native
或 monolith to microservices
,您將獲得大量探討此挑戰的演講和論文列表。將單體式架構遷移到雲端有很多不同的路徑可供選擇,而我們的經驗教會我們在這個領域要有相當的見解。首先,讓我們回答為什麼您想要從單體式架構轉移到雲原生的問題。推動這種轉移的目標通常是
- 提高擴充性。
- 更快地實作新功能。
- 更靈活的擴充性方法。
您不必重寫單體式架構即可實現這些目標。為什麼要花費所有時間重寫您已經擁有的功能?只需專注於使您的單體式架構能夠支援 事件驅動架構。
Kyma 如何解決您的挑戰?
什麼是 Kyma?
Kyma 在 Kubernetes 上運行,由許多不同的組件組成,其中三個是
- 應用程式連接器,您可以使用它將任何應用程式與 Kubernetes 叢集連接,並透過 Kubernetes 服務目錄 公開其 API 和事件。
- 無伺服器,使您能夠輕鬆地為您的應用程式編寫擴充功能。您的函數程式碼可以由 API 呼叫以及來自外部系統的事件觸發。您也可以從您的函數安全地回呼整合系統。
- 服務目錄 在此公開整合系統。這種整合還使您能夠使用來自 Azure、AWS 或 Google Cloud 等超大規模業者的服務。Kyma 允許輕鬆整合 Microsoft 和 Google 維護的官方服務中介。
您可以觀看 此影片,以簡要了解基於真實示範情境的 Kyma 主要功能。
我們為您挑選了正確的技術
只有在經過適當的監控和配置後,您才能在像 Kyma 這樣的專案中提供可靠的擴充性。我們決定不重新發明輪子。CNCF landscape 中有許多很棒的專案,大多數專案背後都有龐大的社群。我們決定挑選最好的專案,並將它們全部整合到 Kyma 中。您可以看到上面的相同架構圖,但重點是我們組合在一起以建立 Kyma 的專案

- 監控和警報基於 Prometheus 和 Grafana
- 日誌記錄基於 Loki
- 事件處理使用 Knative 和 NATS
- 資產管理使用 Minio 作為儲存
- 服務網格基於 Istio
- 追蹤是使用 Jaeger 完成的
- 身分驗證由 dex 支援
您不必整合這些工具:我們確保它們都能良好協同運作,並且始終保持最新狀態(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 快速存取我的日誌,並且我可以快速存取預先配置的 Grafana 儀表板,以查看透過 Prometheus 和 Istio 交付的 Lambda 指標。

這樣的方法讓您在新增功能方面具有很大的彈性。它也讓您有時間重新思考重寫舊函數的需求。
貢獻並提供意見反應
Kyma 是一個開源專案,我們希望在您的幫助下讓它成長。實現這一目標的方式是透過您的幫助。在閱讀這篇文章後,您已經知道我們不想重新發明輪子。我們在我們的工作模式中堅持這種方法,這使社群貢獻者能夠參與其中。我們在 特別興趣小組 中工作,並公開錄製您可以隨時加入的會議,因此我們的設置與您從 Kubernetes 本身了解到的類似。也隨時透過 Twitter 或 Slack 與我們分享您的意見反應。