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

发布时间:2026/11/14 5:18:32

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/11/1 6:50:39

拖拽运行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/10/25 7:40:59

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

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

2026/11/14 5:17:16

苏州特种工实操考试心里没底怕挂科?通过率揭秘全在这儿了

苏州特种工实操考试心里没底怕挂科?通过率揭秘全在这儿了 你是不是也这样,准备去考苏州特种工证,一想到实操考试就紧张得睡不着觉?怕自己手脚不稳、操作失误,最后挂科白费时间和钱?别急,这期内容就给你 通过率揭秘…

2026/11/14 5:17:16

新乡办理电工证学校真实经历:外省证如何转过来,一步到位

新乡办理电工证学校真实经历:外省证如何转过来,一步到位 之前考的证在外省能不能转过来?这个是很多在外地打工或回乡发展的电工兄弟最关心的问题。我自己就是从郑州回新乡做电工的,去年才把外省的低压电工证转过来,过程挺曲折,但也算积累了真实经验。今…

2026/11/14 5:17:16

铜仁电工证怎么考取,外省证书能不能转?官方报名入口全解析

铜仁电工证怎么考取,外省证书能不能转?官方报名入口全解析 之前考的证在外省能不能转过来?这个问题几乎是每个特种作业从业者最关心的事。特别是像你这样在郑州金水区从事公路工程的电工,可能之前在别的城市考过电工证,现在想在铜仁地区继续使用,但不清…

2026/11/14 5:17:16

_河南电工证好考吗上岗必须要这个证吗

河南电工证好考吗 拿到电子证书后能不能顺利上岗 你是不是也担心自己学历不高,报不了电工证?其实不然,河南的电工证报考门槛并不高,只要符合年龄和健康条件,基本都能报上名。特别是现在推行的是 电子证书…

2026/11/14 5:17:16

惠安特种工证报名费怎么报名 你怕实操考试挂科就该这样准备

惠安特种工证报名费怎么报名 你怕实操考试挂科就该这样准备 实操考试心里没底怕挂科?这几乎是每个准备报考特种作业操作证的学员最真实的感受。特别是像惠安这样的地区,特种工证报名费虽然不算太高,但考试难度和通过率却是很多人担心的问题。别慌,本文结…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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