尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

Kubernetes上构建Serverless函数平台:架构融合与OpenFaaS实践

Kubernetes上构建Serverless函数平台:架构融合与OpenFaaS实践 1. 项目概述当Kubernetes遇见Serverless函数最近在整理团队去年的技术实践时一个反复被提及的架构模式引起了我的注意将腾讯云的Serverless函数SCF直接部署和运行在自建的Kubernetes集群上。这听起来有点“拧巴”毕竟Serverless的核心卖点之一就是免运维、无需管理底层基础设施而K8s本身就是一套强大的基础设施编排和管理平台。为什么要把一个“无服务器”的东西放到一个专门管理“服务器”的平台上跑这正是这个实践的精妙之处也是我想和大家深入聊聊的。它并非简单的技术堆砌而是一种面向特定场景的架构融合与创新。简单来说它试图打破“Serverless函数只能在云厂商提供的封闭环境中运行”的传统认知将函数的敏捷开发、事件驱动、按需伸缩等特性与K8s集群的资源统一调度、强大的网络与存储能力、以及混合云/多云部署的灵活性结合起来。对于已经拥有成熟K8s集群同时又希望引入Serverless开发范式来应对突发流量、事件处理、轻量API等场景的团队来说这提供了一条极具吸引力的路径。想象一下你的核心业务稳定地运行在K8s的Deployment和StatefulSet中而一些边缘的、临时的、需要快速上线的功能点——比如一个图片处理触发器、一个消息队列的消费者、一个每晚定时运行的报表生成任务——你不再需要为它们单独编写复杂的K8s控制器YAML或者担心资源预留不足或浪费。你可以用熟悉的函数写法Python、Node.js等快速实现然后像部署一个Pod一样将它部署到你的K8s集群里享受集群级别的资源调度、网络策略和监控告警。这本质上是在用K8s的能力去实现一个“私有化”或“混合云化”的Serverless运行时环境。2. 核心思路与架构设计拆解2.1 为什么要在K8s上跑Serverless函数这个问题的答案直指传统Serverless和容器化部署各自的痛点。传统云厂商Serverless的局限供应商锁定Vendor Lock-in你的函数代码、触发器配置、部署方式都深度绑定某一家云厂商。迁移成本极高几乎意味着重写。环境与能力受限函数运行在云厂商提供的“黑盒”环境中虽然省心但你对底层运行时如特定Linux版本、系统库、网络拓扑VPC深度集成、文件系统通常只有临时目录的控制力很弱。想装个特殊的依赖或者使用某个特定的内核模块很可能不支持。混合云/私有化部署困难对于数据敏感、要求本地化部署的业务或者需要与本地数据中心其他服务低延迟交互的场景公有云的Serverless服务往往不是最佳选择。纯K8s原生部署的挑战运维复杂度高即使是一个简单的脚本你也需要定义Deployment、Service、可能还需要HPA、ConfigMap等一系列K8s资源对象。开发人员需要具备相当的K8s知识。资源管理不精细传统的K8s工作负载如Deployment通常设置固定的资源请求requests和限制limits即使Pod内进程空闲这部分资源也被占用无法像Serverless那样做到“有请求才分配无请求即释放”的极致弹性。启动速度虽然K8s Pod启动已经很快但相比一些云函数通过预留实例、快照恢复等技术实现的毫秒级冷启动仍有差距尤其是在需要快速响应突发流量的场景。融合方案的价值主张在K8s上运行Serverless函数正是为了取二者之长避二者之短。它利用K8s作为统一的基础设施层提供稳定、可控、可移植的运行环境同时通过引入一个“函数运行时控制器”例如使用Kubernetes的Operator模式实现来管理函数的生命周期模拟Serverless的体验事件驱动、自动伸缩可能缩容到0、按执行计费内部结算等。这样你既获得了Serverless的开发效率和资源弹性又保持了K8s环境的控制力和可移植性。2.2 核心架构组件解析要实现这个目标我们需要在K8s集群中引入几个关键组件它们共同构成一个“Serverless函数运行时平台”。1. 函数控制器Function Controller / Operator这是整个架构的大脑。它是一个运行在K8s集群中的自定义控制器持续监听代表“函数”的Kubernetes自定义资源Custom Resource Definition CRD例如一个名为Function或ServerlessFunction的资源。职责当用户创建或更新一个FunctionCRD对象时控制器会根据其中的定义如函数代码镜像、触发器配置、环境变量、并发度等自动创建或更新对应的K8s原生资源最核心的就是一个Deployment或更高级的如Knative Serving的Service和一个Service。它负责将抽象的“函数”概念翻译成K8s能理解的“工作负载”。关键技术点通常基于client-go和controller-runtime库开发遵循Operator模式。它需要处理函数的版本管理、灰度发布、自动伸缩与HPA集成等。2. 函数运行时Function Runtime这是函数的执行环境通常是一个特制的容器镜像。构成基础镜像如精简的Alpine、Distroless 语言运行时如Python解释器、Node.js 函数加载器/适配器。函数加载器这是一个关键的小程序。它的职责是从指定的位置如ConfigMap、持久卷、甚至代码仓库加载用户的函数代码。提供一个HTTP服务器监听来自触发器的事件通常转换为HTTP请求。将请求转发给用户的函数代码执行并返回结果。管理函数执行上下文处理超时、收集日志和指标。示例一个典型的Python函数运行时镜像里面会有一个用Python写的加载器例如使用flask框架它知道如何导入用户代码包中的handler函数。3. 触发器管理器Trigger ManagerServerless函数是事件驱动的。触发器管理器负责将外部事件如HTTP请求、消息队列消息、定时任务、对象存储事件转换为对函数运行时容器的调用。HTTP触发器这是最简单的。可以直接通过K8sService的ClusterIP或Ingress暴露函数。更高级的做法是使用一个API网关如nginx-ingress或专门的APISIX、Kong作为统一入口网关根据路径将请求路由到对应函数的Service。其他触发器例如对于定时任务Cron可以使用K8s原生的CronJob在Job Pod中调用函数HTTP端点。对于消息队列如Kafka、RabbitMQ可以部署一个独立的消息消费者组件它订阅主题收到消息后调用对应函数。这个组件也可以被函数控制器管理。4. 自动伸缩器Auto-Scaler这是实现“Serverless”弹性的关键。目标是让函数在没有请求时副本数可以缩容到0以节省资源当请求突增时能快速扩容。K8s原生HPA的局限原生的Horizontal Pod Autoscaler (HPA) 通常基于CPU/内存等指标难以感知到“无请求”的状态以实现缩容到0。即使基于自定义指标如QPS缩容到0后新的请求到来时需要经历Pod调度、拉取镜像、启动容器的完整过程冷启动延迟较高。解决方案业界常用的是Knative Serving。它提供了基于请求的自动伸缩KPA可以缩容到0。当请求到来时Knative的“Activator”组件会先接收请求同时通知自动伸缩器快速扩容对应的Pod再将请求转发过去。这在一定程度上优化了冷启动体验。另一种方案是使用KEDAKubernetes Event-driven Autoscaling它可以根据各种事件源如消息队列长度、HTTP请求队列等来驱动伸缩也支持缩容到0。注意缩容到0是一个非常有吸引力的特性但它与快速响应是一对矛盾。你需要根据函数的业务重要性、可接受的冷启动延迟来权衡是否启用此特性。对于延迟敏感的函数可以设置最小副本数为1或更多。3. 从零开始在K8s上部署一个Serverless函数平台理论讲得再多不如动手实践。下面我将以一个相对简单的方案为例带你走一遍流程。这个方案不会直接使用Knative它较重而是基于一个开源项目OpenFaaS来演示其理念是相通的。我们目标是部署一个函数平台并通过它运行一个Python函数。3.1 环境准备与OpenFaaS部署首先你需要一个可用的Kubernetes集群。可以是本地的minikube、kind也可以是云上的托管集群。1. 安装OpenFaaS CLI和arkadeOpenFaaS提供了便捷的CLI工具和安装器arkade。# 安装OpenFaaS CLI curl -sSL https://cli.openfaas.com | sudo sh # 安装arkade一个K8s应用安装器 curl -sLS https://get.arkade.dev | sudo sh2. 使用arkade部署OpenFaaSarkade极大地简化了安装过程它会处理命名空间创建、Helm chart部署等所有步骤。# 部署OpenFaaS核心组件 arkade install openfaas # 上述命令会输出访问OpenFaaS UI的密码请保存好。 # 默认情况下它会创建两个命名空间openfaas 和 openfaas-fn。 # openfaas 存放核心组件网关、控制器openfaas-fn 是函数部署的命名空间。3. 配置端口转发和登录部署完成后我们需要访问OpenFaaS的网关Gateway和Web UI。# 1. 在终端A转发网关端口默认8080 kubectl port-forward -n openfaas svc/gateway 8080:8080 # 2. 在终端B转发Web UI端口默认31112 kubectl port-forward -n openfaas svc/gateway 31112:8080 # 3. 获取登录密码如果你错过了arkade的输出 kubectl get secret -n openfaas basic-auth -o jsonpath{.data.basic-auth-password} | base64 --decode; echo # 4. 访问Web UI: http://localhost:31112 # 5. 通过CLI登录 export OPENFAAS_URLhttp://127.0.0.1:8080 echo -n 你的密码 | faas-cli login -g $OPENFAAS_URL -s至此你的K8s集群里已经有了一个最小化的Serverless函数平台。OpenFaaS的gateway就是我们的API网关和触发器入口faas-netes就是函数控制器。3.2 创建并部署你的第一个函数OpenFaaS使用“函数商店Function Store”的概念和模板来快速创建函数。我们创建一个Python函数。1. 创建新函数# 使用python3-flask模板创建一个名为hello-python的函数 faas-cli new hello-python --lang python3-flask这个命令会生成两个文件hello-python.yml函数定义文件包含镜像名、语言、配置等。hello-python/handler.py你的函数代码文件。2. 编写函数逻辑编辑hello-python/handler.pydef handle(req): 处理输入请求req是字符串类型的请求体 name req if req else \World\ return f\Hello, {name}! From OpenFaaS on K8s\\n\这是一个简单的HTTP处理函数它接收请求体作为输入返回一句问候语。3. 构建函数镜像OpenFaaS CLI会帮你构建Docker镜像并推送到镜像仓库默认是本地生产环境需指定远程仓库。# 构建镜像需要本地有Docker环境 faas-cli build -f hello-python.yml # 如果你有远程仓库需要先打标签并推送 # docker tag image_id your-registry.com/hello-python:latest # docker push your-registry.com/hello-python:latest # 然后修改hello-python.yml中的image字段4. 部署函数到K8s# 部署函数 faas-cli deploy -f hello-python.yml这个命令会做以下几件事读取hello-python.yml。通过OpenFaaS Gateway的API创建一个函数部署请求。Gateway背后的faas-netes控制器监听到这个请求在openfaas-fn命名空间下创建对应的K8s Deployment和Service。你可以通过kubectl get pods -n openfaas-fn看到名为hello-python-xxx的Pod被创建出来。5. 调用函数# 通过curl调用函数 curl http://localhost:8080/function/hello-python -d \K8s Serverless\ # 输出Hello, K8s Serverless! From OpenFaaS on K8s # 或者通过CLI调用 faas-cli invoke hello-python \K8s Serverless\至此你已经成功在K8s上运行了一个Serverless函数你可以去OpenFaaS UI上看到它的监控指标也可以使用faas-cli scale命令来手动调整副本数。3.3 深入原理OpenFaaS在K8s里做了什么让我们揭开魔法看看faas-cli deploy背后K8s集群里发生了什么。这是理解整个架构的关键。1. 自定义资源定义CRDOpenFaaS控制器会注册一个名为Function的CRD。当你部署函数时CLI实际上是在向Gateway发送请求而Gateway会创建或更新一个Function自定义资源对象。2. 控制器的工作流faas-netes控制器一个Go程序监听着所有Function资源的变化。当它发现一个新的hello-python函数资源被创建时它会执行以下操作生成Deployment根据Function资源中的定义镜像、环境变量、标签等生成一个标准的K8s Deployment YAML。这个Deployment的Pod模板中的容器就是你构建的函数运行时镜像。生成Service同时生成一个同名的K8s Service用于在集群内部暴露这个函数的Pod。应用资源将这些生成的YAML应用到K8s集群中。至此你的函数就变成了一个标准的K8s工作负载。3. 网关的路由OpenFaaS Gateway本身也是一个Deployment。它配置了Ingress或LoadBalancer对外暴露。当外部请求到达/function/hello-python路径时Gateway会根据路径中的函数名hello-python去查找对应的K8s Service并将请求代理过去。4. 函数运行时容器的内部当请求到达函数Pod容器内的进程是如何工作的这取决于你使用的模板。对于python3-flask模板其Dockerfile的入口点通常是一个叫fwatchdog的轻量级看门狗程序。这个fwatchdog就是前面提到的“函数加载器”。它启动了一个微型的HTTP服务器。它预先导入你的handler.py模块。当收到请求时fwatchdog将HTTP请求体、头等信息打包调用你定义的handle(req)函数。将函数返回的字符串作为HTTP响应体返回。这个过程完美诠释了“将事件HTTP请求转换为函数调用”的Serverless本质而这一切都封装在一个标准的K8s容器内运行。4. 进阶配置与生产级考量在本地玩转之后我们需要思考如何将这个方案用于更严肃的生产环境。这涉及到安全、效率、可观测性和集成等多个方面。4.1 安全加固与实践在K8s中运行用户代码安全是第一要务。1. 使用非root用户运行容器绝对不要在容器内以root身份运行函数。这可以在函数模板的Dockerfile中实现。# 在Dockerfile的构建阶段创建一个非root用户和组 RUN addgroup --system app adduser --system --ingroup app app # 在最终运行阶段切换用户 USER appOpenFaaS的许多官方模板已经默认使用了非root用户。部署前务必检查。2. 配置Pod安全上下文Security Context在K8s的Deployment或Pod Spec中进一步限制权限。# 在OpenFaaS的Function CRD中可以通过annotations或环境变量配置 # 或者直接修改faas-netes控制器生成的模板。更推荐的方式是使用Pod安全策略PSP或更新后的Pod安全标准PSS。 securityContext: runAsNonRoot: true runAsUser: 1000 # 与Dockerfile中创建的UID一致 allowPrivilegeEscalation: false capabilities: drop: - ALL seccompProfile: type: RuntimeDefault这些配置会防止容器内进程提权、禁用所有Linux Capabilities并使用默认的Seccomp配置文件极大地限制攻击面。3. 网络策略隔离默认情况下K8s集群内Pod间的网络是互通的。我们需要使用NetworkPolicy来限制函数Pod的网络访问遵循最小权限原则。apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-to-fn-pods namespace: openfaas-fn spec: podSelector: {} # 匹配本命名空间所有Pod policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: openfaas # 只允许来自openfaas命名空间网关的入站流量 egress: - to: - namespaceSelector: matchLabels: name: openfaas # 只允许出站流量到openfaas命名空间用于拉取镜像、上报指标等 ports: - protocol: TCP port: 8080 # 假设网关端口这个策略只允许网关访问函数并限制函数只能访问网关。如果需要访问数据库或其他服务需要额外添加规则。4. 镜像安全扫描与可信仓库将函数镜像推送到私有镜像仓库并集成镜像漏洞扫描工具如Trivy、Clair在CI/CD流水线中阻断含有高危漏洞的镜像部署。4.2 性能优化与冷启动处理Serverless函数的冷启动延迟是核心性能指标。1. 使用更小的基础镜像函数运行时镜像的体积直接影响拉取速度。优先选择Distroless、Alpine等超小镜像作为基础。OpenFaaS的许多模板已经优化过。2. 预留实例Pool of Warm Containers这是对抗冷启动最有效的手段之一。OpenFaaS支持通过com.openfaas.scale.min注解设置最小副本数。即使没有流量也会保持一定数量的Pod处于就绪状态。# 在hello-python.yml中 functions: hello-python: ... annotations: com.openfaas.scale.min: \2\ # 始终保持至少2个副本 com.openfaas.scale.max: \10\但这会牺牲一部分“按需使用”的特性需要根据函数的重要性和延迟要求做权衡。3. 调整K8s调度与资源节点亲和性将函数Pod调度到具有SSD存储、更高性能CPU的节点池。资源请求与限制合理设置CPU/内存的requests和limits。requests设置过小会影响调度和启动速度limits设置过小可能导致函数运行时OOM。建议通过压测确定一个合理值。HPA配置如果使用基于CPU/内存的HPA需要仔细调整目标利用率。对于IO密集型的函数基于自定义指标如请求队列长度可能更合适。4. 利用K8s的拓扑感知路由在云服务商的K8s服务中可以启用拓扑感知路由使请求优先被路由到同一可用区的Pod减少网络延迟。4.3 可观测性日志、监控与链路追踪生产系统必须可观测。1. 集中式日志确保函数容器将日志输出到标准输出stdout和标准错误stderr。K8s的kubelet会自动收集这些日志。你需要部署一个日志收集系统如EFK StackElasticsearch, Fluentd/Fluent Bit, Kibana或Loki Stack来汇聚所有节点和Pod的日志。 OpenFaaS函数通过fwatchdog打印的日志是结构化的JSON非常利于解析。你需要配置Fluentd或Fluent Bit的过滤器来解析这些JSON字段。2. 指标监控OpenFaaS Gateway和每个函数Pod都暴露了Prometheus格式的指标。网关指标如gateway_function_invocation_total调用总数、gateway_functions_seconds调用耗时分布。函数指标每个函数Pod的fwatchdog会暴露http_request_duration_seconds等指标。 你需要部署Prometheus来抓取这些指标并使用Grafana进行可视化。OpenFaaS社区提供了现成的Grafana仪表盘。3. 分布式链路追踪对于由多个函数或函数与微服务组成的复杂工作流链路追踪至关重要。你需要在函数代码中集成追踪SDK如OpenTelemetry并将追踪数据发送到后端的Jaeger或Zipkin。这能帮你清晰看到一次请求在各个函数间的流转路径和耗时。4.4 与现有CI/CD及生态集成1. CI/CD流水线将函数部署集成到现有的GitOps或CI/CD流程中。例如代码推送到Git仓库如GitLab、GitHub。CI流水线如Jenkins、GitLab CI、GitHub Actions被触发。CI流水线运行测试、使用faas-cli build构建镜像、扫描镜像漏洞、将镜像推送到私有仓库。最后使用faas-cli deploy或通过GitOps工具如FluxCD、ArgoCD同步更新的函数YAML文件到集群。2. 秘钥与配置管理不要将数据库密码、API密钥等硬编码在函数代码或镜像中。使用K8s的Secret对象存储敏感信息并通过环境变量或卷挂载的方式注入到函数容器中。OpenFaaS支持通过secrets字段在YAML中引用K8s Secret。3. 与云服务触发器集成如果你在混合云环境部分事件源可能在公有云上。例如腾讯云COS的对象创建事件。你可以在腾讯云上创建一个SCF函数作为“适配器”该函数只做一件事将COS事件转发到你自建K8s集群中的OpenFaaS网关地址通过公网或专线。或者在K8s集群内部署一个消费者主动拉取或订阅云服务的事件队列这通常更复杂。5. 常见问题与故障排查实录在实际操作中你肯定会遇到各种问题。下面是我和团队在过去实践中总结的一些典型场景和排查思路。5.1 函数部署失败现象faas-cli deploy命令执行后函数状态长时间为“Not Ready”或在UI中显示部署失败。排查步骤检查Pod状态kubectl get pods -n openfaas-fn -l faas_functionfunction-name。这是第一步也是最直接的。Pending通常是资源不足CPU/内存、节点选择器不匹配、或镜像拉取失败。使用kubectl describe pod pod-name查看具体事件。ImagePullBackOff/ErrImagePull镜像拉取失败。检查镜像名称和标签是否正确是否有拉取私有镜像的权限imagePullSecrets。CrashLoopBackOff容器启动后立即退出。这是最常见也最需要关注的状态。查看Pod日志kubectl logs -n openfaas-fn pod-name --previous如果当前容器已崩溃查看上一次的日志。日志通常会直接告诉你错误原因例如Python语法错误。模块导入失败依赖未安装。函数handler方法签名不符合fwatchdog预期。检查函数控制器日志kubectl logs -n openfaas deployment/faas-netes。查看控制器在处理你的函数CRD时是否有错误。检查网关日志kubectl logs -n openfaas deployment/gateway。网关是入口它的日志可能包含路由或认证问题。实操心得对于CrashLoopBackOff一个快速调试技巧是修改函数模板的Dockerfile将CMD或入口点临时改为sleep 3600然后重新构建部署。这样Pod会一直运行你可以用kubectl exec进入容器内部手动执行命令来调试环境问题。5.2 函数调用超时或返回错误现象调用函数时收到504 Gateway Timeout、502 Bad Gateway或函数返回内部错误。排查步骤确认Pod是否就绪kubectl get pods确认对应函数的Pod处于Running状态且READY为1/1。检查网关到Pod的网络在网关Pod内尝试curl函数Pod的ClusterIP和端口通常是8080。这可以排除服务发现或网络策略的问题。kubectl exec -n openfaas deployment/gateway -- curl -v http://function-service.namespace.svc.cluster.local:8080查看函数Pod日志这是定位业务逻辑错误的关键。错误日志会直接打印出来。检查资源限制如果函数执行需要较多内存或CPU而Pod的limits设置过低可能导致进程被OOM Kill或CPU节流。使用kubectl describe pod查看是否有相关事件或使用kubectl top pod查看实际资源使用情况。检查函数超时设置OpenFaaS默认函数执行超时时间为20秒。如果你的函数执行时间过长需要在YAML文件中通过read_timeout、write_timeout和exec_timeout环境变量进行调整并且要同步调整网关的超时设置。5.3 自动伸缩不工作现象函数负载很高但Pod没有自动扩容或者负载为零但Pod没有缩容。排查步骤假设使用HPA检查HPA状态kubectl get hpa -n openfaas-fn。查看TARGETS列指标是否显示unknown如果是说明Metrics Server或自定义指标API如Prometheus Adapter可能有问题。检查指标数据如果使用自定义指标如QPS需要确认Prometheus是否成功抓取了网关或函数的指标并且Prometheus Adapter能否正确查询到这些指标并转换为HPA能理解的格式。检查HPA配置kubectl describe hpa -n openfaas-fn。确认minReplicas、maxReplicas、targetCPUUtilizationPercentage或target值设置是否合理。例如CPU目标利用率设置得过高如90%可能永远达不到触发扩容的条件。检查Pod Disruption Budget (PDB)如果为函数设置了PDB可能会阻止缩容操作。检查是否有PDB限制了最小可用Pod数。5.4 镜像构建缓慢或失败现象本地faas-cli build速度极慢或在CI环境中失败。优化与排查利用Docker层缓存优化Dockerfile将不经常变化的操作如安装系统包、下载依赖放在前面将经常变化的代码复制操作放在最后。使用多阶段构建对于编译型语言如Go使用多阶段构建可以显著减小最终镜像体积加快拉取速度。使用国内镜像源在Dockerfile中为系统包管理器apt, apk和语言包管理器pip, npm配置国内镜像源可以极大加速构建过程。CI环境中的Docker In Docker (DinD)在K8s Pod中运行CI任务并需要构建镜像时推荐使用docker.sock挂载有安全风险需评估或更安全的kaniko、buildah等无需Docker守护进程的工具。故障排查表现象可能原因排查命令/步骤部署失败PodPending1. 资源不足2. NodeSelector/Affinity不匹配3. 未配置imagePullSecretskubectl describe pod pod-namekubectl get nodeskubectl get secrets部署失败PodCrashLoopBackOff1. 函数代码错误2. 依赖缺失3. 启动命令错误kubectl logs pod-name --previous进入容器检查环境调用函数返回5021. 函数Pod未就绪2. 网络策略阻断3. 函数进程崩溃kubectl get podskubectl exec测试网络连通性查看函数Pod日志调用函数超时5041. 函数执行时间过长2. Pod资源不足被节流3. 网关超时设置过短检查函数逻辑和复杂度kubectl describe pod看事件调整exec_timeout和网关超时HPA不伸缩指标为unknown1. Metrics Server未安装/异常2. 自定义指标配置错误kubectl top node测试Metrics Server检查Prometheus Adapter日志和配置镜像构建慢1. 网络问题2. Dockerfile未优化使用国内镜像源优化Dockerfile利用缓存6. 总结与个人体会走完这一整套流程从架构设计到手动部署再到生产级问题的思考你会发现在K8s上跑Serverless函数并不是用一个工具替代另一个工具而是将两种范式的优势进行了一次深度的“化学反应”。对我而言最大的价值在于控制力与敏捷性的平衡。我们团队拥有一个庞大的、稳定的K8s集群承载着核心业务。引入这套模式后对于需要快速试错、事件驱动、流量波动的边缘场景开发同学不再需要和复杂的K8s YAML、Service、Ingress打交道。他们写一个简单的函数提交平台就负责把它变成高可用的服务。运维同学则依然在一个统一的K8s控制平面上用熟悉的kubectl、Prometheus、Grafana工具管理一切包括这些函数。安全策略、资源配额、网络策略都是全局统一的。当然这条路并非毫无代价。你需要维护这个“函数平台”本身如OpenFaaS控制器、网关这增加了集群的复杂度。冷启动延迟、多租户隔离、精细化的计费计量都是需要根据自身业务情况去权衡和深度定制的点。它可能不适合对延迟要求极致到毫秒的场景也可能不适合函数规模极其庞大、需要极致多租户隔离的SaaS场景。但无论如何这种模式为我们打开了一扇门一扇通往更灵活、更高效、同时又不失掌控力的云原生应用开发的大门。它特别适合那些已经投资于K8s并希望在其上统一管理所有类型工作负载的团队。如果你也处在这样的阶段不妨从一个小型的POC开始体验一下这种“打破传统方式”带来的新变革。
返回列表