ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Kubeless Functions 完全指南:事件接口、超时、安全上下文与定时函数

Kubeless Functions 完全指南:事件接口、超时、安全上下文与定时函数 后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载导读本文以 Kubeless 官方文档 docs/kubeless-functions.md 为主体结合仓库源码pkg/apis/kubeless/v1beta1/function.go、pkg/utils/kubelessutil.go、pkg/function-proxy/utils/proxy-utils.go、cmd/kubeless/function/deploy.go与真实示例examples/系统讲解 Kubeless 中函数Function这一核心实体的通用属性统一的event/context编程接口、默认超时机制、非 root 安全上下文以及基于 CronJob 的定时触发与 Prometheus 监控。读完本文你将能正确编写并部署任意语言的 Kubeless 函数、按需调整超时与安全上下文、创建定时调度的函数并理解其底层实现原理。函数是 Kubeless 的核心实体在 Kubeless 中函数Function是核心实体。函数可以用不同语言编写但无论使用何种运行时所有函数都共享一组通用属性统一的函数接口、默认超时时间以及运行时用户runtime UID。此外Kubeless 还提供了一致的函数管理 CLI 与 CRD 规范。从 API 定义看函数由Function自定义资源承载其FunctionSpec主要字段包括见 pkg/apis/kubeless/v1beta1/function.go#L37-L48字段含义handler函数处理器格式为文件.函数名如helloget.foofunction函数文件内容或指向函数代码的 URLfunction-content-type函数文件内容类型纯文本、URL、base64、zip 或压缩 tar 包runtime函数使用的运行时如python3.7、nodejs8timeout函数执行的最大超时时间deps函数依赖描述deployment内嵌的 Kubernetes Deployment 模板可自定义 Pod 规范service函数对外服务的 Service 规范horizontalPodAutoscaler函数的 HPA 配置关于 Function 规范的更深层细节可阅读 docs/advanced-function-deployment.md。统一的函数接口event 与 context每个函数接收两个参数event和context。event包含函数所收到事件的来源信息例如事件数据、事件 ID、事件类型、时间戳与发出方context包含函数的通用信息例如函数名称、最大超时时间、运行时与内存限制。下面是 docs/kubeless-functions.md 中给出的一个 Kafka 事件的 YAML 表示event: data: # 事件数据 foo: bar # 数据在需要时会被解析为 JSON event-id: 2ebb072eb24264f55b3fff # 事件 ID event-type: application/json # 事件内容类型 event-time: 2009-11-10 23:00:00 0000 UTC # 事件源的时间戳 event-namespace: kafkatriggers.kubeless.io # 事件发出方 extensions: # 可选参数 request: ... # 对收到的请求的引用 response: ... # 对要发送的响应的引用 # 具体属性取决于函数语言 context: function-name: pubsub-nodejs timeout: 180 runtime: nodejs6 memory-limit: 128M返回值约定函数应返回一个字符串该字符串将作为调用方的 HTTP 响应。部分运行时也支持返回其他类型如对象。以仓库中的 Python 示例 examples/python/helloget.py 为例一个最简单的函数仅需三行def foo(event, context): return hello world这里foo即为 handler 中的函数名event携带调用数据context携带函数元信息。类似的最小示例还存在于examples/目录下的 golangexamples/golang/helloget.go、nodejsexamples/nodejs/helloget.js、javaexamples/java/HelloGet.java、rubyexamples/ruby/helloget.rb、phpexamples/php/helloget.php与 dotnetcoreexamples/dotnetcore/helloget.cs等目录中。通过 CLI 部署函数使用kubeless function deploy命令即可部署函数核心参数定义见 cmd/kubeless/function/deploy.go#L284-L306参数默认值说明--runtime, -r空指定运行时如python3.7与--runtime-image二选一必填--handler空指定处理器格式为文件.函数名--from-file, -f空指定代码文件或代码文件的 URL--schedule空以 Cron 格式指定定时调度见下文定时函数--timeout180函数完成执行的最大超时秒--memory空函数内存请求支持E/P/T/G/M/K/Ei/Pi/Ti/Gi/Mi/Ki后缀--cpu空函数 CPU 请求以核为单位--dependencies, -d空指定包含函数依赖列表的文件--env, -e[]注入函数容器的环境变量:与分隔符均可--secrets[]要挂载到函数容器的 Secret如--secrets mySecret--label, -l[]函数标签如--label foo1bar1,foo2:bar2--node-selectors[]函数 Pod 的节点选择器--service-account空函数使用的 ServiceAccount--runtime-image空自定义运行时镜像与--runtime二选一必填--image-pull-policyAlways镜像拉取策略必须是IfNotPresent/Always/Never之一--port8080HTTP 函数自定义端口--servicePort0自定义 Service 端口未设置时使用port的值--headlessfalse以无头 Service 方式部署 HTTP 函数--dryrunfalse只输出函数清单而不实际创建--output, -oyaml输出格式yaml或json与--dryrun配合使用例如部署上面的 Python 函数kubeless function deploy hello --runtime python3.7 --handler helloget.foo --from-file helloget.pyCLI 在校验阶段会做多道检查runtime 必须通过langruntime.IsValidRuntime校验从 ConfigMap 中读取运行时列表见 pkg/langruntime/langruntime.go#L100-L108--schedule必须能被标准 Cron 解析cmd/kubeless/function/deploy.go#L73-L77--image-pull-policy只接受三种取值--port必须在 1~65535 之间cmd/kubeless/function/deploy.go#L174-L176。使用--dryrun -o yaml可以提前预览将要创建的 Function CRD 清单而不实际部署。函数超时FUNC_TIMEOUT 与默认 180 秒所有运行时都有一个最大超时时间由环境变量FUNC_TIMEOUT设置。该环境变量可通过 CLI 选项--timeout配置默认值为180 秒。如果函数执行超过该时间进程将被终止。从源码可以看到这条超时链路如何生效注入环境变量控制器在构建 Deployment 时若FunctionSpec.Timeout为空则回退到默认值180常量定义见 pkg/utils/k8sutil.go#L52-L54随后以FUNC_TIMEOUT环境变量注入函数容器见 pkg/utils/kubelessutil.go#L682-L708。同一段代码还会注入FUNC_HANDLER、MOD_NAME、FUNC_RUNTIME、FUNC_MEMORY_LIMIT与FUNC_PORT。对应测试见 pkg/utils/kubelessutil_test.go#L846-L857。运行时读取并强制超时函数代理读取FUNC_TIMEOUT为空时同样回退到180pkg/function-proxy/utils/proxy-utils.go#L34-L38 与init()中的回退逻辑。在Handler中代理以context.WithTimeout创建超时上下文将用户函数放在 goroutine 中执行一旦超时即返回408并写入Timeout exceeded同时logReq会检测到 408 状态码并强制进程退出pkg/function-proxy/utils/proxy-utils.go#L96-L157。因此超时即终止由两层保证HTTP 请求层在超时后返回 408 响应进程层随后强制退出避免僵死的函数容器长期占用资源。如果你的函数需要更长的执行时间只需在部署时增大超时值kubeless function deploy hello --runtime python3.7 --handler helloget.foo --from-file helloget.py --timeout 300运行时用户默认以非特权 UID 1000 运行作为 Kubernetes [Security Context] 的一部分函数默认配置为以**非特权用户UID 1000**运行OpenShift 环境除外其 UID 会自动设置。这可以防止函数拥有 root 权限。源码中的默认实现位于 pkg/utils/kubelessutil.go#L734-L741控制器在创建 Deployment 时如果 Pod 的SecurityContext为空会自动设置runtimeUser : int64(1000) dpm.Spec.Template.Spec.SecurityContext v1.PodSecurityContext{ RunAsUser: runtimeUser, FSGroup: runtimeUser, }即同时设置了runAsUser: 1000与fsGroup: 1000保证容器进程以非 root 身份运行且共享卷组 ID 同样为非特权值。覆盖默认行为因为函数的 Deployment 模板是 Function Spec 的一部分FunctionSpec.Deployment见 pkg/apis/kubeless/v1beta1/function.go#L45你可以通过覆盖 Deployment 模板中的 Security Context 来指定不同的用户。例如在 Function YAML 中自定义spec: deployment: spec: template: spec: securityContext: runAsUser: 2000 fsGroup: 2000控制器在构建 Deployment 时只在SecurityContext nil时才注入默认值因此你的自定义值会被保留。定时函数基于 Cron 与 CronJob 的调度可以部署按固定时间表触发的函数。调度频率使用Cron 格式指定部署时通过--schedule参数或单独创建 CronJobTrigger 资源。每次定时函数执行时会启动一个 KubernetesJob。该 Job 会向函数 Service 发起 HTTP GET 请求只要函数返回 200 OKJob 即视为成功。创建定时函数kubeless function deploy hello --runtime python3.7 --handler helloget.foo --from-file helloget.py --schedule */5 * * * *--schedule会在部署时被校验cron.ParseStandard解析失败将直接报错cmd/kubeless/function/deploy.go#L73-L77。部署成功后CLI 还会创建一个CronJobTrigger自定义资源携带function-name与schedule字段cmd/kubeless/function/deploy.go#L256-L280。也可以先部署函数再单独创建 CronJob 触发器kubeless trigger cronjob create hello-cron --function hello --schedule */5 * * * *该命令支持--payload/--payload-from-file传入 JSON 数据作为事件负载两者互斥并可配合--dryrun预览清单cmd/kubeless/trigger/cronjob/create.go。CronJob 的默认行为Kubeless 使用 KubernetesCronJob执行定时函数且基本使用默认选项这意味着失败不重启如果某个 Job 失败它不会被重启而是在下一个调度事件到来时重试。Job 存在的最长时间由函数超时指定默认 180 秒。并发策略为Allow允许并发 Job 存在。历史记录限制最多保留三个成功 Job 的历史以及一个失败的。修改默认值如果因某些原因需要修改某个函数的默认值可以执行kubectl edit cronjob trigger-func_name其中func_name是你的函数名称。修改并保存所需字段后CronJob 会被更新。监控函数/metrics 与 Prometheus部分 Kubeless 运行时会暴露/metrics端点Prometheus 会自动采集这些指标。仓库在 manifests/monitoring/prometheus.yaml 中附带了一套 Prometheus 部署配置方便你快速搭建监控环境。采集的指标包括调用次数function_calls_total成功与失败的执行次数function_failures_total每次调用的耗时function_duration_seconds这些指标由函数代理通过 Prometheus 客户端库注册并暴露pkg/function-proxy/utils/proxy-utils.go#L40-L51每次调用开始时funcCalls计数加一结束时用直方图记录耗时异常或超时则累加funcErrors。因此即使不使用外部监控系统函数自身也带有可查询的 Prometheus 指标端点。kubeless function top命令cmd/kubeless/function/top.go正是基于这些指标工作它通过 Service 代理访问/function:port/metrics获取原始指标pkg/utils/metrics.go#L104-L113解析function_duration_seconds、function_calls_total、function_failures_total三个指标族聚合出每个函数、每个 HTTP 方法的调用总数、失败总数与平均耗时pkg/utils/metrics.go#L47-L101。若函数尚未被调用也会在输出中列出占位条目若函数不暴露指标则返回Function does not expose metrics提示。kubeless function top hello仓库还提供 Grafana 监控大盘配置docs/misc/kubeless-grafana-dashboard.json以及 Prometheus Operator 相关清单manifests/monitoring/可参考 docs/monitoring.md 获得更完整的监控搭建步骤。运行时与语言变体Kubeless 支持多种运行时和语言版本运行时列表由 ConfigMap 中runtime-images键维护CLI 与控制器均通过 pkg/langruntime/langruntime.go 读取GetRuntimes()返回运行时ID版本形式的全部可用运行时IsValidRuntime()负责合法性校验GetFunctionImage()则根据运行时与版本解析出对应的运行时镜像还支持通过UPPER_RUNTIME版本_RUNTIME环境变量覆盖默认镜像见 pkg/langruntime/langruntime.go#L189-L211。关于受支持的运行时、语言与版本号的完整细节请参阅 docs/runtimes.md。部署时可用kubeless function deploy --runtime runtime指定如python3.7、nodejs8、ruby2.4等--runtime-image则用于指定自定义运行时镜像。为不同语言编写函数的详细指南可参考 docs/building-functions.md运行时的实现规范见 docs/implementing-new-runtime.md。赞分享后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载相关推荐curl_multi_poll 完全指南libcurl multi 接口的高效事件等待与超时控制curl_multi_poll 完全指南libcurl multi 接口的高效事件等待与超时控制 导读 curl_multi_poll 是 libcurl mCLI网络通信Exposed SQL Functions 完全指南内置函数、自定义函数与窗口函数实战Exposed SQL Functions 完全指南内置函数、自定义函数与窗口函数实战 本指南以 JetBrains ExposedKotlin SQL FORM后端数据存储Sinon assert.calledOn 完全指南验证 JavaScript 函数调用时的 this 上下文Sinon assert.calledOn 完全指南验证 JavaScript 函数调用时的 this 上下文 output_article Sinon a测试开发工具上一篇SciPy 列联表模块的 Array API 标准支持CPU、GPU 与 JIT 能力矩阵解析下一篇GPU显存测试免费方案memtest_vulkan 快速上手3步摸清显卡健康状况创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表