资讯中心

KubeVela gateway 运维特征(Trait)实战:为组件一键暴露公网流量与 Ingress 配置详解

📅 2026/11/3 4:54:46
KubeVela gateway 运维特征(Trait)实战:为组件一键暴露公网流量与 Ingress 配置详解
云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载导读gateway是 KubeVela 内置的运维特征Trait用于为应用组件暴露公网 HTTP 流量它会在组件旁自动创建 Service 与 Ingress并把域名、路径到端口的路由规则声明成一份简洁的应用配置。本文以references/docgen/def-doc/trait/gateway.eg.md中的示例为主线结合仓库中vela-templates/definitions/internal/trait/gateway.cue的完整定义逐项讲解 domain、http、class、classInSpec、secretName、pathType、annotations、labels、existingServiceName、gatewayHost 与多网关 name 等参数的用法并说明网关 Trait 的状态输出、健康检查逻辑及与 K8s 版本适配的底层原理。读完本文你将掌握在 KubeVela Application 中声明式接入 Ingress 的完整实操方案。gateway Trait 能做什么在 KubeVela 中Trait 是以“组件之上叠加能力”的声明方式存在的运维特征。gatewayTrait 的核心职责是让一个组件可以被公网访问它同时完成两件事若组件没有对应的 Service则自动生成一个Service将组件的工作负载端口暴露出来生成一条Ingress规则把指定域名domain和 HTTP 路径映射到组件端口由集群内的 Ingress Controller 完成公网流量接入。从 gateway.cue 的定义可以看到该 Trait 的应用范围appliesToWorkloads限定为deployments.apps与statefulsets.apps两类工作负载并且podDisruptive: false即添加、修改该 Trait 不会导致 Pod 被重建适合在运行期随时调整。gateway与ingressTrait 功能相近二者的差别主要在语义与默认行为上ingress只生成 Ingress 对象要求组件本身已经具备可访问的 Service例如由webservice组件自动生成的 Service而gateway更“重”一些它会替你补齐 Service 创建这一步并额外支持existingServiceName复用已有 Service、支持在单个组件上挂载多个网关等场景。最简示例一个域名、一条路径references/docgen/def-doc/trait/gateway.eg.md给出了 gateway Trait 的最小可用示例直接在 Application 的组件 traits 段声明即可apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-app spec: components: - name: express-server type: webservice properties: image: oamdev/hello-world port: 8000 traits: - type: gateway properties: domain: testsvc.example.com http: /: 8000将这份 YAML 保存为vela-app.yaml后通过vela up或kubectl apply -f交付即可。它的效果等价于生成一个名为express-server的 Service把容器端口 8000 暴露出来生成一条名为express-server的 Ingress将http://testsvc.example.com/的流量路由到该 Service 的 8000 端口。这里只用到两个必填语义domain要暴露的域名和http路径到端口的路由映射表。http是一个键值映射键为 URL 路径值为工作负载端口可以一次声明多条例如同时开放/: 8000与/api: 8080。参数全解从 domain 到 existingServiceName对照 gateway.cue 中parameter段的定义gateway Trait 共支持如下参数参数类型必填默认值说明domainstring否无要暴露的域名对应 Ingress 规则中的 host不填则不限定主机名httpmap[string]int是无HTTP 路径到组件端口的映射关系如/: 8000classstring否nginx使用的 Ingress Class即 Ingress Controller 的名称classInSpecbool否false为 true 时把 class 写入spec.ingressClassName字段否则写入kubernetes.io/ingress.class注解secretNamestring否无引用已有的 TLS Secret 名称配置后将自动生成 Ingress 的 tls 段gatewayHoststring否无Ingress 网关的主机名用于在 host 为空时生成访问端点namestring否无该网关的唯一名称用于在一个组件上挂载多个 gateway Trait 时区分彼此pathTypestring否ImplementationSpecificIngress 路径匹配类型可选ImplementationSpecific/Prefix/Exactannotationsmap[string]string否无附加到 Ingress 上的自定义注解labelsmap[string]string否无附加到 Ingress 上的自定义标签existingServiceNamestring否无若指定则复用已有的 Service不再自动创建 Service必填项http 路径映射http: [string]: int是唯一强制要求提供的参数。它定义了“哪些路径由哪个端口服务”模板中通过for k, v in parameter.http遍历生成两条关键内容自动创建 Service 时为每个端口生成一条ports项port与targetPort均为该端口值见 gateway.cue生成 Ingress 规则时每个路径对应一个http.paths条目将 path 与后端 Service 端口关联起来见 gateway.cue。域名与 TLSdomain secretNamedomain会写入 Ingress 的spec.rules[].host当同时提供secretName时模板会追加spec.tls段把该域名与指定的 Secret 绑定从而启用 HTTPStraits: - type: gateway properties: domain: testsvc.example.com secretName: my-tls-secret http: /: 8000生成的 Ingress tls 段形如spec: tls: - hosts: - testsvc.example.com secretName: my-tls-secret注意模板只负责引用 Secret不会创建 Secret你需要提前在集群中准备好 TLS 证书 Secret。Ingress Class 的两种声明方式class 与 classInSpecKubernetes 1.19 之后推荐使用spec.ingressClassName字段指定 Ingress Controller而更早的版本普遍使用kubernetes.io/ingress.class注解。gateway Trait 通过classInSpec参数兼容这两种写法classInSpec: false默认把class值写入注解kubernetes.io/ingress.classclassInSpec: true把class值写入spec.ingressClassName字段。对应的模板逻辑位于 gateway.cue 与 gateway.cue。class默认值为nginx即默认对接集群内的 NGINX Ingress Controller。pathType 路径匹配pathType决定路径的匹配语义默认ImplementationSpecific由具体 Ingress Controller 决定匹配规则可选ImplementationSpecific匹配方式由 Ingress Controller 自行实现Prefix前缀匹配如/api可匹配/api/v1Exact精确匹配仅命中完全一致的路径。该值会被写入每个http.paths[].pathType见 gateway.cue。自定义注解与标签annotations labelsIngress Controller 的许多高级能力如重写路径、限流、CORS、认证等依赖注解配置。gateway Trait 允许通过annotations与labels原样透传任意键值对traits: - type: gateway properties: domain: testsvc.example.com http: /: 8000 annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: true labels: team: frontend模板会把这些键值逐一写入 Ingress 的metadata.annotations与metadata.labels见 gateway.cue。复用已有 ServiceexistingServiceName如果组件已经存在现成的 Service例如由工作负载定义自带或希望多个网关共用同一个 Service可以用existingServiceName直接引用此时 Trait 不再自动创建 Servicetraits: - type: gateway properties: existingServiceName: my-existing-svc domain: testsvc.example.com http: /: 8000模板逻辑在 gateway.cue只有未指定existingServiceName时才会生成Service输出且生成的 Service 名称、Ingress 名称都会按规则拼接后缀。单组件多网关name 与命名后缀name参数用于在一个组件上声明多个 gateway Trait。未指定name时生成的 Service 与 Ingress 名称均为context.name指定后名称变为context.name - name后缀拼接逻辑见 gateway.cue。例如一个组件同时暴露业务域名和内部管理域名traits: - type: gateway properties: name: public domain: www.example.com http: /: 8000 - type: gateway properties: name: admin domain: admin.example.com http: /admin: 8001此时会生成express-server-service-public、express-server-ingress-public与express-server-service-admin、express-server-ingress-admin两组资源互不冲突。gatewayHosthost 为空时的访问端点gatewayHost用于指定 Ingress 网关的主机名。当domain未设置host 为空时它会被写入ingress.controller/host注解见 gateway.cue供上层平台根据该主机名生成可访问的端点地址。底层原理Service Ingress 的生成逻辑自动生成的 Service当没有指定existingServiceName时模板在outputs中生成一个v1/Service其selector固定为app.oam.dev/component: context.name即按组件名选择工作负载 Podports则遍历http映射生成port与targetPort取同一端口值端口名统一为port-端口号见 gateway.cue。自动生成的 IngressIngress 是 gateway Trait 的核心产物其完整结构由 gateway.cue 生成要点包括apiVersion根据集群版本自动选择context.clusterVersion.minor 19时使用networking.k8s.io/v1beta1否则使用networking.k8s.io/v1兼容 K8s 1.20 的标准 API这也是该定义 description 中“the ingress API matches K8s v1.20”的由来metadata.name由组件名与name参数拼接注解、标签、tls、rules 均按上文参数规则动态渲染。状态输出customStatus 与 healthPolicygateway Trait 定义了两段可观测逻辑帮助vela status与健康检查直接使用customStatusgateway.cue从生成的 Ingress 中提取 LoadBalancer 的 IP 与第一条 rule 的 host。若已获得负载均衡 IP则输出Visiting URL: host, IP: ip若 IP 尚未就绪则提示“No loadBalancer found, visiting by using vela port-forward 应用名”引导用户用端口转发临时访问。healthPolicygateway.cue以“是否已生成对应名称的 Ingress”作为健康判据isHealth供控制器对应用状态进行聚合判定。这两段 CUE 定义说明 gateway Trait 与 KubeVela 的应用状态体系深度集成用户可以借助vela status 应用名直接看到公网访问入口是否就绪。与 K8s 版本的适配说明gateway Trait 对 Kubernetes API 版本的选择是自动的无需用户干预集群版本生成的 Ingress apiVersionminor 191.18 及更早networking.k8s.io/v1beta1minor 191.19含 1.20networking.k8s.io/v1这一判断来自模板中的legacyAPI: context.clusterVersion.minor 19gateway.cue并在生成 backend 时区分两种写法旧版本使用serviceName/servicePort新版本使用service.name/service.port.number见 gateway.cue。因此在 K8s 1.20 集群上gateway Trait 生成的是标准networking.k8s.io/v1Ingress在更早的集群上则自动降级到 v1beta1。常见场景与排查提示只想复用已有 Ingress Controller 之外的能力结合annotations透传 Ingress Controller 特有配置重写、灰度、限流等这是让 gateway Trait 与具体网关生态NGINX、Traefik 等协同的关键入口。访问入口迟迟未就绪执行vela status 应用名查看状态信息若提示 “No loadBalancer found”说明 Ingress Controller 尚未分配负载均衡 IP可先用vela port-forward 应用名临时验证服务本身可用同时确认集群中已部署对应的 Ingress Controller且class或classInSpec与 Controller 名称匹配。多网关冲突同一组件挂载多个 gateway Trait 时务必为每个 Trait 指定不同的name否则生成的 Ingress 名称相同会导致资源冲突。TLS 无法生效检查secretName指向的 Secret 是否真实存在且位于应用同一命名空间Ingress Controller 无法引用不存在的 Secret。参考资料示例文档references/docgen/def-doc/trait/gateway.eg.md定义源码vela-templates/definitions/internal/trait/gateway.cue功能相近的 ingress Trait 示例references/docgen/def-doc/trait/ingress.eg.md赞分享云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载相关推荐fgprof 全量 Go 性能剖析器在 buildkit 中同时分析 On-CPU 与 Off-CPU 时间fgprof 全量 Go 性能剖析器在 buildkit 中同时分析 On CPU 与 Off CPU 时间 fgprof 是一个基于采样的 Go 性能剖析云原生DevOps运维微服务KubeVela Route Trait 设计解析从 Service/Ingress 到一键暴露应用入口KubeVela Route Trait 设计解析从 Service/Ingress 到一键暴露应用入口 Route Trait 是 KubeVela 中用于云原生DevOps运维微服务ToolJet Checkbox 组件详解属性、事件、CSA 组件特定动作与暴露变量ToolJet Checkbox 组件详解属性、事件、CSA 组件特定动作与暴露变量 本文围绕 ToolJet 低代码平台中的 Checkbox复选框组件低代码后端前端AI 应用MCP 服务上一篇5分钟掌握Upscayl免费AI图像放大工具的终极使用指南下一篇Python控制流终极指南if、for、while、try四大语句全掌握 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

看完文章,想为自己的企业也做一次专业网站诊断?

尧图顾问免费为您评估现有网站,并给出建站/改版建议与报价方案。

免费获取方案