尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Kubeless 快速上手指南:集群安装、CLI 部署与函数调用全流程实战

Kubeless 快速上手指南:集群安装、CLI 部署与函数调用全流程实战 后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载Kubeless 是一个基于 Kubernetes 原生的 Serverless无服务器框架它利用 Kubernetes 原生的 Custom Resource DefinitionCRD和 Controller 机制把函数当作一等公民资源来管理。本文以仓库中的 docs/quick-start.md 为主体完整还原从安装 Kubeless、安装 CLI、编写并部署第一个函数、调用函数到清理卸载的全过程并结合仓库源码深入拆解kubeless function deploy、kubeless function call等命令的底层行为与参数细节。读完本文你将能够在一套 Kubernetes 集群上独立完成 Kubeless 的端到端部署与函数生命周期管理。一、安装 Kubeless三个步骤概览Kubeless 的安装分为三步从项目 Release 页面下载kubelessCLI 二进制创建默认使用的kubeless命名空间使用 Release 页面提供的 YAML 清单部署 Kubeless。清单会自动创建functions等 Custom Resource DefinitionCRD并启动 Controller控制器。其中第三步是整个安装的核心Kubeless 的控制器会监听集群中新增的 Function 自定义资源并为其自动创建底层的 Deployment 与 Service。仓库根目录中保留了对应三种集群环境的清单源码Jsonnet 模板kubeless.jsonnet用于启用了 RBAC 的 Kubernetes 集群kubeless-non-rbac.jsonnet用于未启用 RBAC 的 Kubernetes 集群kubeless-openshift.jsonnet用于 OpenShift 1.5 集群。以 RBAC 集群为例完整的部署过程如下$ export RELEASE$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d -f 4) $ kubectl create ns kubeless $ kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yaml $ kubectl get pods -n kubeless NAME READY STATUS RESTARTS AGE kubeless-controller-manager-567dcb6c48-ssx8x 1/1 Running 0 1h $ kubectl get deployment -n kubeless NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubeless-controller-manager 1 1 1 1 1h $ kubectl get customresourcedefinition NAME AGE cronjobtriggers.kubeless.io 1h functions.kubeless.io 1h httptriggers.kubeless.io 1h从输出可以看到安装成功后kubeless命名空间内会运行kubeless-controller-managerDeployment集群中注册了functions.kubeless.io函数、cronjobtriggers.kubeless.io定时触发、httptriggers.kubeless.ioHTTP 触发等多个 CRD。从 kubeless-non-rbac.jsonnet 的源码结构可以看出控制器通过KUBELESS_NAMESPACE取自 Pod 自身所在命名空间、KUBELESS_CONFIG指向名为kubeless-config的 ConfigMap等环境变量确定自己的监听范围与配置来源。默认情况下控制器只监听kubeless命名空间。如需在其他命名空间安装 Kubeless请参考 function-controller-configuration.md 中 Install Kubeless in a Different Namespace 一节。安装 kubeless CLICLI 需要单独安装。Linux 与 macOS 可通过如下命令完成export OS$(uname -s| tr [:upper:] [:lower:]) curl -OL https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless_$OS-amd64.zip \ unzip kubeless_$OS-amd64.zip \ sudo mv bundles/kubeless_$OS-amd64/kubeless /usr/local/bin/其中$RELEASE沿用前一步导出的版本号。x86 架构的二进制同样可以在 Release 页面找到。Windows 平台的安装方式从 Release 页面下载最新版本解压压缩包并将kubeless可执行文件加入系统 PATH。安装完成后即可开始创建函数。kubeless是项目的统一 CLI 入口其根命令在 cmd/kubeless/kubeless.go 中注册了function、topic、version、autoscale、get-server-config、trigger、completion等子命令其中function子命令又包含deploy、delete、list、call、logs、describe、update、top等操作参见 cmd/kubeless/function/function.go。二、编写并部署第一个函数2.1 一个最简 Python 函数Kubeless 中的函数与具体语言、事件源无关所有函数都遵循统一接口。以下是一个最简单的 Python 函数def hello(event, context): print (event) return event[data]仓库的 examples/python/helloget.py 提供了一个更精简的同款示例def foo(event, context): return hello world每个 Kubeless 函数都遵循如下约定第一个参数event包含事件源的全部信息其中data键存放函数请求的 body 内容第二个参数context包含函数本身的通用信息返回值一个字符串/对象作为返回给调用方的响应。更完整的event/context结构定义可以在 kubeless-functions.md 的 Functions Interface 一节中找到例如event: data: # Event data foo: bar # The data is parsed as JSON when required event-id: 2ebb072eb24264f55b3fff # Event ID event-type: application/json # Event content type event-time: 2009-11-10 23:00:00 0000 UTC # Timestamp of the event source event-namespace: kafkatriggers.kubeless.io # Event emitter extensions: # Optional parameters request: ... # Reference to the request received response: ... # Reference to the response to send context: function-name: pubsub-nodejs timeout: 180 runtime: nodejs6 memory-limit: 128M2.2 使用 CLI 部署函数假设上面这段代码保存在test.py中执行$ kubeless function deploy hello --runtime python3.8 \ --from-file test.py \ --handler test.hello INFO[0000] Deploying function... INFO[0000] Function hello submitted for deployment INFO[0000] Check the deployment status executing kubeless function ls hello逐项拆解这条命令hello要部署的函数名称--runtime python3.8函数使用的运行时。可用运行时的完整列表可通过kubeless get-server-config查询--from-file test.py包含函数代码的文件。也支持 zip 文件或 gzip/bzip2/xz 压缩的 tar 文件压缩 tar 的支持后缀参见 tar 压缩格式约定只要不超过 etcd 单条记录的最大体积约 1 MB即可--handler test.hello指定接收请求时使用的文件与暴露函数。本例即使用test.py中的hello函数。其余可选参数可通过kubeless function deploy --help查看。从 cmd/kubeless/function/deploy.go 的 flag 定义可以看到deploy命令实际支持的能力远不止上述四个参数完整参数列表如下参数说明默认值--runtime, -r指定运行时如python3.8空--handler指定 handler格式file.function空--from-file, -f函数代码文件路径或代码文件 URL空--label, -l函数标签支持:与两种分隔符如--label foo1bar1,foo2:bar2空--secrets挂载到函数容器的 Secret如--secrets mySecret空--env, -e函数环境变量支持:与两种分隔符空--node-selectors函数的节点选择器支持:与两种分隔符空--service-account函数使用的 ServiceAccount空--namespace, -n函数所属命名空间默认命名空间--dependencies, -d包含函数依赖清单的文件空--schedulecron 格式的调度表达式用于部署定时函数空--memory内存请求量支持 E/P/T/G/M/K、Ei/Pi/Ti/Gi/Mi/Ki 等后缀空--cpuCPU 请求量单位核空--runtime-image自定义运行时镜像空--image-pull-policy镜像拉取策略Always--timeout函数执行最大超时时间秒180--output, -o输出格式yaml--headless以无头 Service 方式部署 HTTP 函数false--dryrun只输出函数清单 JSON/YAML不实际创建false--portHTTP 函数自定义端口8080--servicePortHTTP 函数自定义 Service 端口未指定时使用port的值02.3 deploy 命令的底层行为cmd/kubeless/function/deploy.go 完整展示了deploy命令的校验与组装逻辑几个值得注意的实现细节运行时校验命令会读取集群中的kubeless-configConfigMap通过GetKubelessConfig再用 pkg/langruntime/langruntime.go 中的IsValidRuntime校验传入的--runtime是否在支持列表内否则直接报错退出调度表达式校验若指定了--schedule会用cron.ParseStandard解析非法 cron 表达式会在提交前被拦截镜像拉取策略校验--image-pull-policy只允许IfNotPresent、Always、Never三种取值端口校验--port必须在 1~65535 之间--servicePort必须在 0~65535 之间必填项约束--runtime与--runtime-image必须至少指定一个指定了--runtime则必须指定--handler干跑模式--dryrun为 true 时命令只将组装好的 Function 对象以 JSON 或 YAML 形式打印到标准输出不向集群提交任何资源。组装函数对象的工作由 cmd/kubeless/function/function.go 中的getFunctionDescription完成它会将文件内容/URL、checksum、内容类型写入Function.Spec并把 env、label、secret、资源请求、Service 端口等转换成Deployment与Service规格。函数对象的 API 结构定义在 pkg/apis/kubeless/v1beta1/function.go核心字段包括Handlerfile.function、Function代码内容或 URL、FunctionContentType、Checksum、Runtime、Timeout、Deps、Deployment、ServiceSpec与HorizontalPodAutoscaler。提示查看当前集群支持哪些运行时可以直接执行kubeless get-server-config。该命令的实现位于 cmd/kubeless/getserverconfig/getServerConfig.go它会读取kubeless-configConfigMap 中runtime-images字段并通过 pkg/langruntime/langruntime.go 解析出python3.8、nodejs12之类的运行时 ID版本组合。2.4 查看函数状态部署后即可通过 kubectl 或 kubeless CLI 看到对应的自定义资源$ kubectl get functions NAME AGE hello 1h $ kubeless function ls NAME NAMESPACE HANDLER RUNTIME DEPENDENCIES STATUS hello default helloget.foo python3.8 1/1 READYkubeless function ls的STATUS列显示的是ready replicas / replicas与 READY/NOT READY 状态其计算逻辑对应 cmd/kubeless/function/function.go 中的getDeploymentStatus函数——它会读取同名的 Deployment 对象并比对ReadyReplicas与Replicas。三、调用函数3.1 通过 kubeless CLI 调用$ kubeless function call hello --data Hello world! Hello world!从源码看kubeless function callcmd/kubeless/function/call.go的实现逻辑是先通过 clientset 查找同名 Service 及其第一个端口然后借助 Kubernetes API 的 Service Proxy 子资源发起请求当--data为空时走 GET否则走 POST如果 data 是 JSON会设置Content-Type: application/json否则使用application/x-www-form-urlencoded。此外每次调用都会附带event-id随机 11 位字符串、event-timeRFC3339 时间戳、event-namespace: cli.kubeless.io等头信息——这正是event对象中对应字段的来源。若函数执行超时HTTP 408CLI 会给出更友好的 Request timeout exceeded 错误提示。3.2 通过 kubectl proxy 调用也可以直接用kubectl proxy借助 apiserver 代理 URL 发起请求$ kubectl proxy -p 8080 $ curl -L --data {Another: Echo} \ --header Content-Type:application/json \ localhost:8080/api/v1/namespaces/default/services/hello:http-function-port/proxy/ {Another: Echo}请求被转发到default命名空间中名为hello的 Service 的http-function-port端口该端口名在 cmd/kubeless/function/function.go 构建ServiceSpec时固定为http-function-port。3.3 通过 Ingress 暴露自定义 URLKubeless 还支持 Ingress允许为函数提供自定义访问 URL。相关配置与使用方式详见 http-triggers.md。四、函数的高级特性速览快速开始之外仓库文档还覆盖了几个与部署直接相关的高级能力便于你在第一个函数跑通后继续深入超时控制运行时通过环境变量FUNC_TIMEOUT控制最大执行时间对应 CLI 参数--timeout默认 180 秒超时后进程会被终止详见 kubeless-functions.md。定时函数通过--schedule指定 cron 表达式即可部署定时触发的函数每次执行会启动一个 Kubernetes Job 对函数 Service 发起 HTTP GET详见 kubeless-functions.md 与 cronjob-triggers.md。函数监控部分运行时会在/metrics端点暴露指标供 Prometheus 采集仓库在 manifests/monitoring 中提供了现成的 Prometheus 部署清单详见 kubeless-functions.md。运行时清单各语言运行时Python、Node.js、Golang、Java、Ruby、PHP、.NET 等及依赖管理方式的详细说明见 runtimes.md。五、清理与卸载删除函数并卸载 Kubeless$ kubeless function delete hello $ kubeless function ls NAME NAMESPACE HANDLER RUNTIME DEPENDENCIES STATUS $ kubectl delete -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yamlkubeless function delete会移除对应的 Function 自定义资源控制器随之清理其管理的 Deployment 与 Service。六、更多示例仓库的 examples 目录提供了 NodeJS、Python、Golang、Java、Ruby、PHP、.NET Core、Ballerina、Scala 等多种语言的最简函数示例例如examples/python/helloget.py无参数返回固定字符串examples/python/hellowithdata.py读取event[data]并回显examples/python/hellowithdeps.py演示--dependencies依赖注入用法examples/nodejs/helloget.jsNode.js 版本的最简函数这些示例配合对应的function.yaml清单如 examples/python/function.yaml可以直接用于验证不同运行时下的部署行为是理解同一套函数接口、多种语言运行时设计的最佳起点。赞分享后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载相关推荐Kubeless多集群管理如何实现跨集群的函数部署和调用在当今云原生环境中多集群架构已成为企业级应用的标配。Kubeless作为Kubernetes原生无服务器框架提供了强大的多集群管理能力让您能够轻松实现跨集后端云原生微服务10分钟上手Supabase CLI从安装到云函数部署的全流程指南10分钟上手Supabase CLI从安装到云函数部署的全流程指南 引言为什么选择Supabase CLI 你是否还在为Firebase的封闭生态感到受限开发工具CLIApache Pulsar Functions 快速上手从 Standalone 集群到 Java/Python/Go 函数部署实战Apache Pulsar Functions 快速上手从 Standalone 集群到 Java/Python/Go 函数部署实战 Apache Pulsa消息队列后端流处理上一篇Element Plus日期选择器disabled-date属性使用注意事项下一篇Element Plus穿梭框Transfer数据穿梭与批量操作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表