在kyma云原生平台上开发并部署node.js应用

JerryWang汪子熙 JerryWang汪子熙     2022-11-30     756

关键词:


从 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,) 
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:
-

使用下列的命令行进行部署:

​kubectl -n multitenancy-ns apply -f k8s-deployment-backend.yaml​

部署成功后,回到 Kyma 控制台,找到自动生成的能访问该 Node.js 应用的 url:

在

至此,Node.js 应用的开发,以及部署到 Kyma 云原生平台的步骤就介绍完毕。


云原生应用的10大关键属性

“云原生(CloudNative)”是用于描述基于容器的环境的术语。云原生技术被用于开发应用程序,这些应用程序是使用容器打包的服务构建的、被部署为微服务、并通过灵活的DevOps流程和持续交付工作流在弹性基础架构上进行管理... 查看详情

用友云平台,真正的云原生架构,加速云应用落地

...且能够更快实现的技术手段。真正的云应用必须是基于云原生架构的,PaaS是一个重要的步骤,因为这是云原生的第一接触点。基于云原生架构的PaaS平台于企业客户、于生态伙伴而言,都是真正上云的必要支撑!用友公司聚焦企... 查看详情

云原生应用是啥?它的特点都有哪些?

...IT所不具备的能力。这里说的“云化的应用”也就是“云原生应用”。云原生架构和云原生应用所涉及的技术很多,如容器技术、微服务等,而云原生应用最大的特点就是可以迅速部署新业务。在企业里,提供新的应用程序环境... 查看详情

最简单的sap云平台开发教程-如何开发ui5应用并运行在sap云平台上

选择ServicesCatalog,根据关键字搜索到WebIDE服务,点击超链接打开WebIDE:进入workspace,选择Git->CloneRepository:从我的githubclone:https://github.com/i042416/jerrylistclone完毕之后选择Run->Runindex.html,检查clone是否成功。正常情况下应该看到... 查看详情

青训营node.js基础-web应用开发-开发调试-线上部署(代码片段)

文章目录Web应用开发HTTP模块Koa介绍中间件常用中间件基于Koa的前端框架调试断点调试日志调试线上部署利用多核CPU进程守护复杂计算前端开发与后端开发对比前几天学了一些Node.js的基础,今天来学习Web应用开发,在开发... 查看详情

通过github与pm2部署node应用

...百度云的BAE部署自己的Node应用的,不过随着应用的不断开发,BAE的限制不断制约了应用的使用。于是着手将应用迁移到阿里云的ECS上去。本文即是介绍了如何在ECS上搭建Node环境,并将本地制作好的应用进行发布。环境介绍本地... 查看详情

在kubernetes中部署并使用kubeedge

作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及Kubernetes、KubeSphere、KubeKey等。边缘计算在广泛制造业、工业、零售和金融等行业,随着云原生应用的兴起,不可变基础设施和快速... 查看详情

什么是云原生应用

天生就具备云的基因,适合云环境的业务应用系统云原生技术诞生是在互联网头部企业大规模软件研发交付需求驱动下技术平台化,通过数字基础设施升级解放生产力,围绕降本增效,面向提升可靠性、稳定性、... 查看详情

如何在 Ubuntu/Linux 中部署 Node.js 应用程序?

...间】:2017-09-0213:10:35【问题描述】:哪个是在.net框架下开发的,不使用docker?感谢您度过了愉快的时光。【问题讨论】:在.net框架中开发的Node.js应用是什么意思?我在.net中开发了一个node.js应用,需要部署在ubuntu服务器上。也... 查看详情

云原生之docker实战在docker环境部署answer问答平台

【云原生之Docker实战】在Docker环境部署Answer问答平台一、Answer介绍二、检查本地Docker环境1.检查本地Docker版本2.检查Docker状态3.检查dockercompose版本三、下载Answer镜像四、部署Answer应用1.创建部署目录2.编辑docker-compose.yaml文件3.创建A... 查看详情

node.js 部署的安全问题 [关闭]

...】:我目前在亚马逊AWS上部署node.js时遇到一些问题。我开发了一个应用程序供一些小公司使用。现在该公司希望我拥有某种WAP(Web应用程序防火墙)。好吧,我在awsMarketplace上查看并看到了一些解决方案,但它们对我来说代价高 查看详情

bss应用程序云原生部署的8大挑战

云原生部署改变了软件开发。根据云原生计算基金会(CNCF)2021年年度调查,96%的组织正在使用或评估Kubernetes。更确切地说,560万开发者在使用Kubernetes,比去年增加了67%。云原生架构使松散耦合的服务具有弹性、可管理性和可观察... 查看详情

云原生核心技术之——容器

导言:作为一个从青少年时代已经步入“中年”的Linux后端服务开发工程师,很多年前深受应用部署方式的困扰,但自打携团队用上了容器技术后,拯救了无数中青年工程师的心情和爱情时间,不信自己看……一、应用部署方式... 查看详情

求告知iaas、saas和paas分别是啥?

...支持多语言的开发,面向应用市场。时速云是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。SaaS 查看详情

前端走进云原生,k8s部署助力项目上云(代码片段)

 一、云原生云原生是面向云应用设计的一种全新架构理念,是充分发挥云效能的最佳实践路径,可以帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升关键应用的交付效率,降低系统的运维复杂度。云原生是一种文化... 查看详情

在共享 OVH 服务器上部署 Node.js socket.io 项目

...持Node.js),老实说我不知道​​该怎么做。我的项目在开发中运行良好,它与socket.io 查看详情

在 Linux 服务器上的何处部署 node.js 应用程序?

】在Linux服务器上的何处部署node.js应用程序?【英文标题】:Wheretodeploynode.jsappsonaLinuxserver?【发布时间】:2012-06-0317:11:50【问题描述】:我在Linux服务器上运行4个独立的Node.js应用程序,具有不同的端口和前面的代理。由于我(... 查看详情

深度解读华为云智能企业云应用平台

...决方案,为企业业务创新保驾护航。一个应用底座:全栈云原生应用开发与管理,敏捷高效,快速DevOps全栈云原生应用开发与管理包括容器、微服务框架、云中间件、压测、APM等系列产品,涵盖应用开发、编译、构建、部署、测试、发... 查看详情