YARP Kubernetes Ingress Controller 单实例部署指南:构建与部署 Combined 示例

发布时间:2026/9/16 1:44:16

YARP Kubernetes Ingress Controller 单实例部署指南:构建与部署 Combined 示例 YARP Kubernetes Ingress Controller 单实例部署指南构建与部署 Combined 示例【免费下载链接】reverse-proxyA toolkit for developing high-performance HTTP reverse proxy applications.项目地址: https://gitcode.com/GitHub_Trending/re/reverse-proxy本篇技术指南围绕 reverse-proxy 仓库中samples/KubernetesIngress.Sample/Combined示例展开讲解如何将 YARP 反向代理引擎与 Kubernetes Ingress 控制器整合为单个可部署单元涵盖镜像构建、集群部署、RBAC 授权、IngressClass 绑定与 YARP 配置注入的完整链路。读完本文你将掌握一键构建 yarp-combined 镜像、通过kubectl apply将控制器部署进集群并正确卸载的全部操作步骤同时理解底层配置项如ControllerClass、DefaultSslCertificate在源码中的真实含义。一、示例概览什么是 Combined 部署形态Combined是samples/KubernetesIngress.Sample提供的三种示例之一。与将监视 Ingress 资源的 Monitor和执行路由转发的 Ingress拆分为两个部署的 Separate 方案 不同Combined 将整个 Ingress 控制器做成一个单一部署single deployable同一个进程既监听 Kubernetes 中的 Ingress/Service/Endpoints 等资源变化又把它们翻译为 YARP 路由与集群配置并直接代理流量。该示例的核心组成如下目录见 Combined文件作用Dockerfile多阶段构建产出控制器镜像Program.cs应用入口注册 Kubernetes 控制器运行时、反向代理与证书选择器ingress-controller.yaml控制器所需的全部 Kubernetes 清单Namespace、ConfigMap、RBAC、IngressClass、Service、Deploymentappsettings.json本地调试用的 Yarp 配置节镜像内由 ConfigMap 的yarp.json覆盖Yarp.Kubernetes.IngressController.csproj项目文件引用src/Kubernetes.Controller工程与 Ingress 控制器对应的核心实现位于 src/Kubernetes.Controller其中 KubernetesReverseProxyServiceCollectionExtensions.cs 的AddKubernetesReverseProxy方法完成了整套组装先注册 Kubernetes 控制器运行时resource informers、缓存、协调器等再注册KubernetesConfigProvider作为IProxyConfigProvider最后调用AddReverseProxy()叠加 YARP 核心。二、构建 Docker 镜像在仓库根目录即存放YARP.slnx的位置执行以下命令构建镜像docker build -t yarp-combined:latest -f ./samples/KubernetesIngress.Sample/Combined/Dockerfile .参数说明-t yarp-combined:latest为镜像指定名称与标签后续部署清单中的镜像引用必须与此保持一致可自行换成私有仓库地址如REGISTRY_NAME/yarp-combined:TAG-f ./samples/KubernetesIngress.Sample/Combined/Dockerfile显式指定构建文件路径因为 Dockerfile 不在仓库根目录末尾的.为构建上下文必须为仓库根目录——Dockerfile 中通过相对路径拷贝了samples/...与src/...下的源码和工程文件。2.1 Dockerfile 构建原理拆解该 Dockerfile 采用标准多阶段构建基础镜像阶段base基于mcr.microsoft.com/dotnet/aspnet:8.0声明运行时工作目录并EXPOSE 80/443发布阶段publish基于mcr.microsoft.com/dotnet/sdk:8.0。由于仓库可能依赖未正式发布的 SDK会先拷贝根目录global.json再通过dotnet-install.sh --jsonfile global.json手动安装匹配版本的 SDK随后仅拷贝各*.csproj、Directory.Build.props、Directory.Build.*、TFMs.props、NuGet.config、eng/Versions.props等文件执行dotnet restore利用 NuGet 缓存层加速后续重建最终阶段final从 publish 阶段拷贝发布产物ENTRYPOINT指向dotnet Yarp.Kubernetes.IngressController.dll。值得注意Dockerfile 显式设置了DOTNET_SYSTEM_GLOBALIZATION_INVARIANT1使容器镜像可以精简运行不依赖系统全球化组件。三、部署 Combined 示例 Ingress 控制器3.1 部署三步走打开 ingress-controller.yaml将 Deployment 中的镜像引用REGISTRY_NAME/yarp-combined:TAG改为与本地构建的镜像名一致例如yarp-combined:latest在仓库根目录执行kubectl apply -f ./samples/KubernetesIngress.Sample/Combined/ingress-controller.yaml如需卸载控制器执行kubectl delete -f ./samples/KubernetesIngress.Sample/Combined/ingress-controller.yaml3.2 清单内容逐项解析ingress-controller.yaml是一个多文档 YAML以---分隔依次定义Namespaceyarp所有控制器资源统一收纳于此命名空间ConfigMapyarp-config以yarp.json为键存放 YARP 控制器配置后续挂载到容器/app/config目录。内容如下{ Yarp: { ControllerClass: microsoft.com/ingress-yarp, ServerCertificates: false, DefaultSslCertificate: yarp/yarp-ingress-tls, ControllerServiceName: ingress-yarp-controller, ControllerServiceNamespace: yarp } }这些配置节直接对应 YarpOptions.cs 中定义的YarpOptions类通过services.ConfigureYarpOptions(config.GetSection(Yarp))绑定见 KubernetesReverseProxyServiceCollectionExtensions.cs配置项说明ControllerClassIngress 控制器名称必填必须与IngressClass.spec.controller字段一致本例为microsoft.com/ingress-yarp控制器据此识别属于自己的 Ingress 资源ServerCertificates是否启用基于 Kubernetes Secret 的服务器证书管理SNI 选择此处为falseDefaultSslCertificate默认 SSL 证书的namespace/name引用如yarp/yarp-ingress-tls在无匹配证书时兜底ControllerServiceName控制器所在 Kubernetes Service 名称必填ControllerServiceNamespace该 Service 所在命名空间必填ServiceAccountyarp-serviceaccount控制器进程以该身份访问 Kubernetes APIClusterRoleyarp-ingress-clusterrole ClusterRoleBinding授予控制器对endpoints、nodes、pods、secrets、namespaces、services的 list/watch/get 权限对ingresses、ingressclassesnetworking.k8s.io、extensions、networking.internal.knative.dev三个 API 组的 get/list/watch 权限以及events的 create/patch、ingresses/status的 get/update 权限。其中 Secrets 的监听被限制为typekubernetes.io/tls字段选择器避免像 Helm V3 那样产生的大量无关 Secret 造成资源浪费对应 RegisterResourceInformer 调用IngressClassyarp声明controller: microsoft.com/ingress-yarp与 ConfigMap 中的ControllerClass呼应示例中默认 IngressClass注解ingressclass.kubernetes.io/is-default-class被注释掉按需启用后可简化 Ingress 资源配置不必每个 Ingress 都显式指定ingressClassNameServiceingress-yarp-controllerLoadBalancer类型暴露两个端口——proxy80 → 容器 8000与proxy-ssl443 → 容器 8443selector 匹配app: ingress-yarp-controllerDeploymentingress-yarpreplicas: 1容器监听ASPNETCORE_URLShttp://*:8000;https://*:8443将 ConfigMapyarp-config只读挂载到/app/config并使用yarp-serviceaccount运行。3.3 入口程序如何串联控制器与反向代理Program.cs 是整个 Combined 进程的装配点关键调用如下builder.Configuration.AddJsonFile(/app/config/yarp.json, optional: true); builder.WebHost.UseKubernetesReverseProxyCertificateSelector(); builder.Services.AddKubernetesReverseProxy(builder.Configuration); var app builder.Build(); app.MapReverseProxy(); app.Run();AddJsonFile(/app/config/yarp.json, optional: true)从挂载的 ConfigMap 读取Yarp配置节本地调试时则回退到 appsettings.json 中的同名配置UseKubernetesReverseProxyCertificateSelector()见 KubernetesReverseProxyWebHostBuilderExtensions.cs它通过ConfigureKestrel为 HTTPS 配置ServerCertificateSelector使 Kestrel 能依据 SNI 域名调用IServerCertificateSelector.GetCertificate从 Kubernetes Secret 中选证——这正是 Ingress TLS 能力的基础AddKubernetesReverseProxy(...)完成控制器运行时IngressController托管服务、IngressCache、Reconciler、Ingress/Service/Endpoints/IngressClass/Secret 五类 resource informer 的注册与KubernetesConfigProvider配置源的注册MapReverseProxy()挂载 YARP 反向代理中间件管线接收经 Ingress 规则翻译而来的请求并转发到后端 Service 的 Endpoints。四、控制器能力边界与 Ingress 注解扩展Yarp.Kubernetes.Controller当前支持的 Ingress 功能详见 samples/KubernetesIngress.Sample/README.mdIngress rules基于主机名与路径的路由转发到后端 ServiceIngressClass通过 class 隔离多个相互独立的控制器实例当前仅支持集群级默认 IngressClass简化 Ingress 资源配置。暂不支持Ingress 资源的 TLS 规范即将支持可与仓库中的 LetsEncrypt 示例组合使用已被废弃的 annotation 规范。除标准 Ingress 语义外控制器还支持一组可选的 YARP 专属注解它们会映射为路由/集群配置。完整注解清单如下注解数据类型yarp.ingress.kubernetes.io/authorization-policystringyarp.ingress.kubernetes.io/rate-limiter-policystringyarp.ingress.kubernetes.io/output-cache-policystringyarp.ingress.kubernetes.io/backend-protocolstringyarp.ingress.kubernetes.io/cors-policystringyarp.ingress.kubernetes.io/health-check*ActivateHealthCheckConfigyarp.ingress.kubernetes.io/http-client*HttpClientConfigyarp.ingress.kubernetes.io/http-request*ForwarderRequestConfigyarp.ingress.kubernetes.io/load-balancing*stringyarp.ingress.kubernetes.io/route-metadataDictionarystring, stringyarp.ingress.kubernetes.io/session-affinity*SessionAffinityConfigyarp.ingress.kubernetes.io/transformsListDictionarystring, stringyarp.ingress.kubernetes.io/route-headersListRouteHeaderyarp.ingress.kubernetes.io/route-queryparametersListRouteQueryParameteryarp.ingress.kubernetes.io/route-orderintyarp.ingress.kubernetes.io/route-methodsListstring注意集群级注解标记*的注解配置的是 YARP 集群而非路由。集群由后端 Service 名称、命名空间与端口共同标识多个指向同一后端的 Ingress 规则会共享该集群因此若各规则中这些注解取值冲突将产生不确定行为——请确保同一后端的所有 Ingress 规则取值一致。常用注解的配置示例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minimal-ingress namespace: default annotations: yarp.ingress.kubernetes.io/authorization-policy: authzpolicy yarp.ingress.kubernetes.io/rate-limiter-policy: ratelimiterpolicy yarp.ingress.kubernetes.io/output-cache-policy: outputcachepolicy yarp.ingress.kubernetes.io/transforms: | - PathRemovePrefix: /apis yarp.ingress.kubernetes.io/route-headers: | - Name: the-header-key Values: - the-header-value Mode: Contains IsCaseSensitive: false yarp.ingress.kubernetes.io/route-methods: | - GET - POST spec: rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: frontend port: number: 804.1 关键注解速查后端协议yarp.ingress.kubernetes.io/backend-protocol: https指定后端 Service 的协议默认http健康检查主动探测后端健康端点yarp.ingress.kubernetes.io/health-check: | Active: Enabled: true Interval: 00:00:10 Timeout: 00:00:10 Policy: ConsecutiveFailures Path: /api/healthHTTP 客户端配置yarp.ingress.kubernetes.io/http-client: | SslProtocols: Ssl3 MaxConnectionsPerServer: 2 DangerousAcceptAnyServerCertificate: true转发请求配置yarp.ingress.kubernetes.io/http-request: | ActivityTimeout: 00:01:00 Version: 2.0 VersionPolicy: RequestVersionExact AllowResponseBuffering: false负载均衡策略yarp.ingress.kubernetes.io/load-balancing: Random可选RoundRobin、LeastRequests、PowerOfTwoChoices、First等对应 LoadBalancing 下的策略实现路由元数据yarp.ingress.kubernetes.io/route-metadata: | Custom: orange Tenant: 12345会话亲和性yarp.ingress.kubernetes.io/session-affinity: | Enabled: true Policy: Cookie FailurePolicy: Redistribute AffinityKeyName: Key1 Cookie: Domain: localhost HttpOnly: true IsEssential: true Path: mypath SameSite: Strict SecurePolicy: Always请求转换键值对语义与 YARP Request Transforms 一致yarp.ingress.kubernetes.io/transforms: | - PathPrefix: /apis - RequestHeader: header1 Append: bar基于请求头的路由yarp.ingress.kubernetes.io/route-headers: | - Name: the-header-key Values: - the-header-value Mode: Contains IsCaseSensitive: false基于查询参数的路由yarp.ingress.kubernetes.io/route-queryparameters: | - Name: the-queryparameter-name Values: - the-queryparameter-value Mode: Contains IsCaseSensitive: false路由顺序yarp.ingress.kubernetes.io/route-order: 10用于控制多条路由的匹配优先级HTTP 方法约束yarp.ingress.kubernetes.io/route-methods: | - GET - POST五、与同仓库其他示例的关系与选型建议Combined本文控制器 代理一体部署最简单适合中小集群与快速验证SeparateIngress 与 Monitor监视器与代理拆分部署可独立伸缩适合需要解耦控制面与数据面的场景Monitor 通过AddKubernetesIngressMonitor注册IDispatcherIngress 侧通过AddKubernetesDispatchController暴露调度端点见 KubernetesReverseProxyServiceCollectionExtensions.csBackendbackend配套的模拟后端应用及其 Ingress 样例可用于端到端验证控制器路由效果。两个部署形态共用 src/Kubernetes.Controller 工程区别仅在服务装配方式。部署后可通过kubectl get ingress -A、kubectl get svc -n yarp观察控制器生成的资源并用kubectl logs -n yarp deploy/ingress-yarp查看 Serilog 输出Program.cs 将日志级别设为 Debug 并输出到控制台验证 Ingress 事件的监听与协调过程。六、故障排查与注意事项镜像名不一致忘记修改 Deployment 中REGISTRY_NAME/yarp-combined:TAG会导致ImagePullBackOffControllerClass不匹配ConfigMap 中Yarp:ControllerClass与IngressClass.spec.controller必须一致否则控制器会忽略对应 Ingress 资源集群级注解冲突同一后端Service Namespace Port的多个 Ingress 规则若对*标注的集群级注解给出不同取值行为不确定务必保持取值一致证书功能示例将ServerCertificates设为false若启用需先在集群中准备好DefaultSslCertificate引用的 TLS Secret如yarp/yarp-ingress-tls并确保 ClusterRole 对secrets的 list/watch 权限可用镜像内配置优先级容器通过挂载/app/config/yarp.json覆盖内置 appsettings.json修改 ConfigMap 后需重启 Deployment 才会重新加载配置。【免费下载链接】reverse-proxyA toolkit for developing high-performance HTTP reverse proxy applications.项目地址: https://gitcode.com/GitHub_Trending/re/reverse-proxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/16 1:44:16

拖拽运行WSL脚本:Windows与Linux无缝协作的批处理方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 1:44:16

C++ inline内联优化实战:收益边界、失效原因与验证方法

我最早接触 C 的 inline 关键字时,以为它就是让函数变快的魔法词,哪儿觉得慢就加哪儿。后来维护过一个老项目,看到满屏 inline 不仅没变快,反而把 .text 段撑大了,还让调试器里的调用栈莫名其妙消失,才意识…

2026/9/16 2:34:18

STM32嵌入式AI编程:重构开发流程的三层工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 2:34:18

QLExpress底层实现深度解析:轻量级规则引擎如何落地会员体系

刚接手会员中台那阵,我最头疼的就是业务方隔三差五提规则变更。今天说金卡会员下单打 9 折,明天说连续签到 7 天额外送 100 分,后天又说黑金卡用户在 618 预售期双倍积分。这种规则如果全部走代码发布,上线窗口至少半天&#xff0…

2026/9/16 2:29:18

CTF入门实战指南:从夺旗赛到网络安全的完整路径

1. 入门CTF前,先想清楚这三件事1.1 CTF到底是什么:一场有规则、有flag的实战练兵场这两年问“CTF怎么入门”的人越来越多,很多是完全零基础的在校生,也有刚转行想做网络安全的职场新人。我的建议通常很直接:先把CTF当成…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码