從 Kyma [官網] 得知,Kyma 是一個雲原生應用程式運作環境,它将 Kubernetes 提供的強大容器編排功能與若幹世界級的開源元件和工具相結合,使開發人員能夠開發、運作和操作安全且可擴充的雲原生應用程式。

Kubernetes 提供了一個架構,用于運作基于容器的分布式系統。 我們可以将容器視為一個非常輕量級的虛拟機,其中包含一小塊應用邏輯,這些邏輯服務于一些更大的應用程式,也就是微服務。 Kubernetes 提供了許多用于管理容器生命周期的元件,讓開發人員可以選擇應用程式依賴項,例如消息傳遞總線、監控、日志記錄等。
Kyma 建構于 Kubernetes 之上,解決了與微服務架構、事件消費、身份驗證、日志記錄、跟蹤、監控和警報相關的需求。 此外,服務目錄允許使用開放服務代理輕松使用超大規模提供商提供的雲服務,以及使用應用程式連接配接器連接配接到 Kyma 的服務。 應用程式連接配接器允許開發人員輕松連接配接任何應用程式并以安全的方式公開其 API 和事件。
本文通過一個 Node.js 應用開發和部署的例子,來介紹 Kyma 這個雲原生平台的使用方式。
1. Kyma 環境的 provision
登入 SAP BTP 控制台,點選
Enable Kyma
按鈕,啟用平台對 Kyma 運作環境的支援:
建立一個 Kyma 執行個體:
在背景,正在建立一個新的 Kubernetes 叢集,Kyma 運作時及其所有元件将在其中運作。
要打開 Kyma 運作時控制台 UI,單擊子賬戶概覽頁面的 Kyma 環境部分下的連結到儀表闆。
儀表闆或 Kyma 控制台 UI 是開發者在 Kyma 運作時管理和部署應用程式或服務的圖形界面。 使用儀表闆,開發人員不僅可以部署或删除部署,還可以對它們進行擴充管理,通過自定義 API 規則公開它們等等。
當然,Kyma 運作時是一個 Kubernetes 叢集,是以我們也可以使用工具 kubectl 通過指令行管理資源和配置。
kubectl 工具依賴于一個名為 kubeconfig 的配置檔案來配置對叢集的通路。
在 Kyma 控制台下載下傳這個
kybeconfig
配置檔案:
然後設定環境變量即可。
- Linux:
export KUBECONFIG=<KUBECONFIG_FILE_PATH>
- Windows:
$ENV:KUBECONFIG=<KUBECONFIG_FILE_PATH>
2. 使用 Express Generator 建立 Node.js 應用
使用 Express Generator 建立一個 Node.js 應用程式架構,并将一些片段作為基本應用程式添加到後端。
使用指令行:
npx express-generator --view=jade kyma-multitenant-node
建立好的應用層級結構如下:
Node.js 應用的路由(
Routing
)是指确定應用程式如何響應用戶端對特定端點的請求,該端點是 URI(或路徑)和特定的 HTTP 請求方法(GET、POST 等)。
每個路由可以有一個或多個處理函數,當路由比對時執行。
路由定義采用以下結構:
app.METHOD(PATH, HANDLER)
增加下列的路由實作,我們就得到了一個最簡單的 Hello World 級别的 Node.js 應用:
router.get("/", function(req, res, next) {
try {
var line1 = "Hello " + req.authInfo.getLogonName();
var line2 = "your tenant sub-domain is " + req.authInfo.getSubdomain();
var line3 = "your tenant zone id is " + req.authInfo.getZoneId();
var responseMsg = line1 + "; " + line2 + "; " + line3;
res.send(responseMsg);
} catch (e) {
console.log("AuthInfo object undefined.");
var responseMsg = "Hello World!";
res.send(responseMsg);
}
});
3. 部署 Node.js 應用到 Kyma 雲原生平台
在 SAP BTP 控制台上,找到要部署的 tenant 的 subdomain:
在 Kyma 儀表闆中,在下載下傳的 kubeconfig.yml 檔案或 Kyma 儀表闆的 URL 中找到完整的 Kyma 叢集域。
為了在 Kyma Runtime(或任何基于 Kubernetes 的平台)上運作代碼,我們需要為步驟2 開發的 Node.js 應用程式提供一個 OCI 映像(也稱為 Docker 映像)。 原則上可以自由選擇映像建構工具,本文使用 Cloud Native Buildpacks (CNB)。
指令行工具包支援提供 buildpack 和本地源代碼并從中建立 OCI 映像。
首先安裝指令行工具
pack
:
brew install buildpacks/tap/pack
當我們談到存儲庫名稱時,我們指的是 Docker Hub 中常見的帳戶和存儲庫名稱的組合:
<docker-hub-account>/<repo-name>
。
比如 tiaxu/multitenant-kyma-backend.
由于隻能在 free 的 Docker hub 帳戶中建立一個私有存儲庫,是以存儲在 Docker hub 中的 Docker 映像将具有不同的标記名稱,以便它們可以存儲在一個存儲庫下。 是以,尋址圖像将包括标簽名稱:
<docker-hub-account>/<repo-name>:<tag-name>
。 一個例子是
tiaxu/multitenant-kyma-backend:v1
。
使用如下指令行建構鏡像檔案:
-
pack build multitenant-kyma-backend --builder paketobuildpacks/builder:full
-
docker tag multitenant-kyma-backend <docker-hub-account>/multitenant-kyma-backend:v1
下面将建構好的鏡像檔案釋出到 Docker Hub:
首先登入 Docker:
docker login -u <docker-id> -p <password>
然後進行鏡像釋出:
docker push <docker-hub-account>/multitenant-kyma-backend:v1
由于 OCI 映像存儲在 Docker Hub 中,是以我們需要提供對 Kyma 叢集的通路資訊,以便可以從這些存儲庫中提取映像,并根據 Docker 帳戶替換占位符值:
kubectl -n multitenancy-ns create secret docker-registry registry-secret --docker-server=https://index.docker.io/v1/ --docker-username=<docker-id> --docker-password=<password> --docker-email=<email>
對應的 yaml 檔案如下:
imagePullSecrets:
- name: registry-secret # replace with your own registry secret
建立 Kyma 部署描述檔案,這也是一個 yaml 格式的檔案:
---
apiVersion: gateway.kyma-project.io/v1alpha1
kind: APIRule
metadata:
creationTimestamp: null
labels:
app: kyma-multitenant-node-multitenancy
release: multitenancy
name: kyma-multitenant-node-multitenancy
spec:
gateway: kyma-gateway.kyma-system.svc.cluster.local
rules:
- accessStrategies:
- handler: allow
methods:
- GET
- POST
- PUT
- PATCH
- DELETE
- HEAD
path: /.*
service:
host: <subaccount-subadomain>-node.<cluster-domain> # replace with the values of your account
name: kyma-multitenant-node-multitenancy
port: 8080
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: kyma-multitenant-node-multitenancy
release: multitenancy
name: kyma-multitenant-node-multitenancy
spec:
replicas: 1
selector:
matchLabels:
app: kyma-multitenant-node-multitenancy
release: multitenancy
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: kyma-multitenant-node-multitenancy
release: multitenancy
spec:
automountServiceAccountToken: true
imagePullSecrets:
- name: registry-secret # replace with your own registry secret
containers:
- env:
- name: PORT
value: "8080"
- name: TMPDIR
value: /tmp
image: <docker-hub-account>/multitenant-kyma-backend:v1 # replace with your Docker Hub account name
livenessProbe:
exec:
command:
- nc
- -z
- localhost
- "8080"
failureThreshold: 1
initialDelaySeconds: 60
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 60
name: kyma-multitenant-node-multitenancy
ports:
- containerPort: 8080
readinessProbe:
exec:
command:
- nc
- -z
- localhost
- "8080"
failureThreshold: 1
initialDelaySeconds: 60
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 60
resources:
limits:
ephemeral-storage: 256M
memory: 256M
requests:
cpu: 100m
ephemeral-storage: 256M
memory: 256M
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /tmp
name: tmp
securityContext:
runAsNonRoot: true
volumes:
- emptyDir: {}
name: tmp
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: kyma-multitenant-node-multitenancy
release: multitenancy
name: kyma-multitenant-node-multitenancy
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: kyma-multitenant-node-multitenancy
release: multitenancy
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
creationTimestamp: null
labels:
release: multitenancy
name: multitenancy
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
name: istio-system
podSelector:
matchLabels:
app: istio-ingressgateway
podSelector:
matchLabels:
release: multitenancy
policyTypes:
- Ingress
使用下列的指令行進行部署:
kubectl -n multitenancy-ns apply -f k8s-deployment-backend.yaml
部署成功後,回到 Kyma 控制台,找到自動生成的能通路該 Node.js 應用的 url: