资讯动态

用 Deno 编写 Hello World 应用并部署到 Knative Serving:社区示例完整实战

发布时间:2026/10/13 9:20:14 来源:尧图企业网站定制
文档教程云原生【免费下载链接】docsUser documentation for Knative components.项目地址https://gitcode.com/gh_mirrors/docs1/docs点击查看免费下载本文基于 Knative 官方文档仓库中的社区示例 helloworld-deno完整演示如何用 Deno 编写一个极简 HTTP 服务通过 Dockerfile 容器化并构建多架构镜像最终以 Knative Service 形式部署到 Kubernetes 集群验证域名访问与自动扩缩容行为。读完本文你将掌握 Deno 应用的容器化打包、Knative Serving 资源的声明式部署以及使用kubectl完成从构建到验证、清理的完整闭环。示例概览这个示例教会你什么helloworld-deno是 Knative 社区维护的 Serving 示例之一定位与仓库中的 Go、Node.js、Python 等 Hello World 示例一致用最小的代码量演示一个服务从源码到上线的完整链路。该示例的关键点在于服务逻辑极简监听PORT环境变量指定的端口默认8080对每个 HTTP 请求返回固定文本Hello Deno\n容器镜像自建不像官方示例那样使用预构建镜像而是从本地 Dockerfile 构建并推送到镜像仓库更贴近真实项目流程多架构镜像使用docker buildx同时构建linux/amd64与linux/arm64镜像适配异构 Kubernetes 节点。示例目录在仓库中的完整结构如下文件作用deps.ts集中声明 Deno 远程依赖HTTP 服务模块main.ts应用入口实现 HTTP 服务Dockerfile容器镜像构建定义service.yamlKnative Service 声明仓库中为空占位文件需按下文创建index.md本示例的官方操作指南README.md示例说明与 index.md 内容一致.dockerignore构建上下文排除文件前置条件开始之前请确认以下环境就绪一个已安装 Knative 的 Kubernetes 集群。如果还没有请参照仓库中的 Knative 安装文档含 Operator 安装 与 YAML 安装 两条路径完成部署本机安装并运行 Docker且已配置 Docker Hub 账号——本示例使用 Docker Hub 作为容器镜像仓库后续所有{username}占位符都替换为你的 Docker Hub 用户名。获取示例代码你可以按照指南逐步重建四个文件也可以直接获取一份可运行的副本。若使用 git clone 方式git clone https://gitcode.com/gh_mirrors/docs1/docs knative-docs cd knative-docs/code-samples/community/serving/helloworld-deno逐步创建示例代码1.deps.ts集中管理 Deno 远程依赖Deno 没有 npm 之类的集中式包管理器而是直接以 URL 形式导入远程模块。创建一个名为deps.ts的文件将依赖统一收口export { serve } from https://deno.land/std0.50.0/http/server.ts;serve是 Deno 标准库提供的 HTTP 服务函数。需要说明的是指南原文此处写作stdstd0.50.0属于笔误仓库中实际生效的 deps.ts 使用的是正确的std0.50.0版本号。集中依赖管理的好处是后续升级标准库版本时只需修改这一个文件。2.main.tsHTTP 服务主体创建main.ts粘贴如下脚本与仓库中的 main.ts 完全一致import { serve } from ./deps.ts; import https://deno.land/x/dotenv/mod.ts; const PORT Deno.env.get(PORT) || 8080; const s serve(0.0.0.0:${PORT}); const body new TextEncoder().encode(Hello Deno\n); console.log(Server started on port ${PORT}); for await (const req of s) { req.respond({ body }); }逐行理解这段代码端口读取Deno.env.get(PORT) || 8080从环境变量读取监听端口缺省回退到8080。Knative Serving 约定用户容器监听$PORT环境变量平台注入的默认端口也是8080两者在此对齐监听地址绑定0.0.0.0确保 Kubernetes Pod 网络内的请求来自 queue-proxy 的转发可以到达响应体预编码new TextEncoder().encode(Hello Deno\n)在启动阶段就把字符串编码为Uint8Array请求到来时直接复用避免每次响应重复编码异步请求循环for await (const req of s)逐个取出请求并调用req.respond({ body })这是 Deno std 0.50 时代serve的标准用法dotenv 导入import https://deno.land/x/dotenv/mod.ts为本地开发加载.env文件提供便利由于是副作用导入未显式使用导出符号仅影响本地开发体验部署到 Knative 时环境变量由平台注入。3.Dockerfile容器化 Deno 应用创建Dockerfile与仓库中的 Dockerfile 一致FROM hayd/alpine-deno:1.0.0-rc2 WORKDIR /app # These steps will be re-run upon each file change in your working directory: COPY . ./ # Added to ENTRYPOINT of base image. CMD [run, --allow-env, --allow-net, main.ts]关键点解读基础镜像hayd/alpine-deno:1.0.0-rc2基于 Alpine Linux内置 Deno 1.0.0-rc2 运行时镜像本身定义了 Deno 入口点因此这里的CMD不需要写deno前缀COPY . ./把当前目录deps.ts、main.ts等复制进/app工作目录。由于.dockerignore的存在Dockerfile、.git等文件不会进入镜像避免构建上下文膨胀CMD [run, --allow-env, --allow-net, main.ts]中--allow-env授予环境变量读取权限代码里Deno.env.get(PORT)依赖它--allow-net授予网络监听权限HTTP 服务器必需。这两个权限缺一不可否则 Deno 会在运行时抛出权限错误。4.service.yamlKnative Service 声明创建service.yaml将下面的服务定义粘贴进去并把{username}替换为你的 Docker Hub 用户名apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-deno namespace: default spec: template: spec: containers: - image: docker.io/{username}/helloworld-deno注意仓库中现存的 service.yaml 是 0 字节的空占位文件使用时必须按上面的内容自行创建这与仓库其他语言示例如 helloworld-nodejs 的 service.yaml保持一致的结构。该清单是标准 Knative Service 资源spec.template描述 Revision 的 Pod 模板containers.image指向我们即将构建的镜像。相比普通 Kubernetes Deployment这里不写replicas、strategy、service等字段——副本数与网络均由 Knative Serving 托管这正是后续自动扩缩容的基础。如需为服务注入自定义环境变量可以参考 creating-services.md 中的env写法。构建并推送容器镜像四个文件就绪后先构建镜像。为保证镜像能在arm64与amd64两种架构的 Kubernetes 节点上运行使用docker buildx进行多架构构建并直接推送# Build and push the container on your local machine. docker buildx build --platform linux/arm64,linux/amd64 -t {username}/helloworld-deno --push .参数含义--platform linux/arm64,linux/amd64一次性产出两种 CPU 架构的镜像清单manifest list集群中的节点按自身架构自动拉取对应镜像--push构建完成后直接推送到 Docker Hub省去docker push单独一步镜像名{username}/helloworld-deno与service.yaml中的image字段必须一致。如果你的 Docker 环境不支持 buildx 多架构构建也可以退化为docker build -t {username}/helloworld-deno . docker push {username}/helloworld-deno的常规流程此时镜像仅适用于构建机所在架构。部署到集群推送完成后应用 Knative Service 清单kubectl apply --filename service.yaml服务创建成功后Knative Serving 会在后台自动执行以下三件事与 creating-services.md 中的描述一致创建不可变的 Revision为当前版本的镜像生成一个不可变的 Revision后续每次更新template都会生成新的 Revision旧的 Revision 保留以便流量回滚网络编程自动创建 Route、Ingress、Service 与负载均衡器将域名解析并转发到对应 Revision自动扩缩容根据流量自动伸缩 Pod 副本包括在无流量时将副本缩到0 个——这就是 Knative 标志性的 Scale to Zero 能力。关于第 3 点的底层机制可以参考 request-flow.md当 Revision 处于零流量或低流量状态时HTTP 路由器将请求转发给集群级的 Activator 组件暂存Activator 随即通知 Autoscaler 扩容新 Pod 就绪后请求被放行到用户容器这个冷启动过程称为cold-start。而containerConcurrency并发上限与autoscaling.knative.dev/target软性并发目标等参数决定了 Autoscaler 在何种并发水位触发扩容详见 concurrency.md。获取服务 URL 并验证部署完成后通过如下命令获取 Knative 为服务分配的域名kubectl get ksvc helloworld-deno --outputcustom-columnsNAME:.metadata.name,URL:.status.url输出形如NAME URL helloworld-deno http://helloworld-deno.default.1.2.3.4.sslip.io域名规则为服务名.命名空间.集群默认域名示例中的sslip.io是 Knative 默认的占位域名方案。随后用curl发起请求curl http://helloworld-deno.default.1.2.3.4.sslip.io预期返回Hello Deno注意指南原文的示例输出误写为Hello R Sample v1!实际返回内容以 main.ts 中编码的Hello Deno\n为准。如果curl失败可以加-v选项查看详细请求与响应头并结合 troubleshooting.md 排查。另一个值得观察的现象是由于 Scale to Zero首次请求通常伴随冷启动延迟Activator 唤醒 Pod这是 Knative Serving 的正常行为。移除示例部署验证完毕后清理资源删除服务记录即可kubectl delete --filename service.yamlKnative 会随之回收该 Service 关联的 Revision、Route 与配置等资源。若同时不再需要本机镜像可另行执行docker image rm清理本地镜像。延伸阅读仓库内其他语言的 Hello World 对照实现见 code-samples/serving/hello-worldGo、Node.js、Python、Ruby、Shell 等与 code-samples/community/servingClojure、Dart、Elixir、Rust、Swift 等社区语言Knative Service 的完整配置字段参见 creating-services.md请求流转与 Activator 原理参见 request-flow.md并发与扩缩容参数调优参见 autoscaling 目录。赞分享文档教程云原生【免费下载链接】docsUser documentation for Knative components.项目地址https://gitcode.com/gh_mirrors/docs1/docs点击查看免费下载相关推荐用 Clojure 编写并部署 Knative Serving Hello World 服务用 Clojure 编写并部署 Knative Serving Hello World 服务 导读 本文基于 Knative 文档仓库中的社区示例 hellow文档教程云原生使用 Deno 构建并部署 Knative Serving 无服务器应用helloworld-deno 完整实践指南使用 Deno 构建并部署 Knative Serving 无服务器应用helloworld deno 完整实践指南 本指南以 Knative 官方社区示例文档教程云原生Neutone SDK 性能调优benchmark 速度、延迟与 Profiling 三大 CLI 工具完整指南Neutone SDK 性能调优benchmark 速度、延迟与 Profiling 三大 CLI 工具完整指南 Neutone SDK 是一个开源的神经音频上一篇AI Voice Cloning高级配置GPU加速、内存优化与性能调优终极指南下一篇brat标注工具核心功能解析文本标注、关系标注与事件标注创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑