大家好,今天小编来为大家解答以下的问题,关于Ingress-Nginx的工作原理和实践,这个很多人还不知道,现在让我们一起来看看吧!
[[388304]]
此图是一般的前后端分离的k8s部署结构:
Nginx Ingress负责暴露服务(nginx前端静态资源服务)。根据十二要素应用原则,将后端API作为nginx服务的附加动态资源。
Ingress vs Ingress-nginx
Ingress 是一种向k8s 集群外部的客户端公开服务的方法。 Ingress 工作在网络协议栈的应用层。
在应用Ingress对象提供的功能之前,必须强调集群中存在Ingress Controller,以便Ingress资源正常工作。
我这里的web项目使用的是常见的Ingress-nginx(官方还有其他Ingress用途)。 Ingress-nginx 是一个K8s Ingress 控制器,使用nginx 作为反向代理和负载均衡器。它作为kube-system 命名空间中的Pod 运行。
了解Ingress是如何工作的,有助于我们与运维人员打交道。
下面通过Ingress-nginx暴露Kibana服务:
apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:kibanalabels:app:kibanaannotations:kubernetes.io/ingress.class:'nginx'nginx.ingress.kubernetes.io/proxy-connect-timeout:'30'nginx.ingress .kubernetes.io/proxy-read-timeout:'1800'nginx。 ingress.kubernetes.io/proxy-send-timeout:'1800'nginx.ingress.kubernetes.io/proxy-body-size:'8m'nginx.ingress.kubernetes.io/ssl-redirect:'true'spec:tls:-hosts:-'https://logging .internal.gridsum.com/'secretName:tls-certrules:-host:'https://logging.internal.gridsum.com'http:paths:-path:/backend:serviceName:kibanaservicePort:5601 最让我困惑的是它的Paths diversion 和rewrite-target 注释。
rewrite-target 将请求重定向到后端服务。那有什么用呢?答:以上面暴露的kibana为例,我们已经可以在https://logging.internal.gridsum.com/访问完整的Kibana。如果我想用这个域名暴露ElasticSearch站点。如何操作?然后你可以使用重写目标。
apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:elasticsearchlabels:app:kibanaannotations:kubernetes.io/ingress.class:'nginx'nginx.ingress.kubernetes.io/proxy-connect-timeout:'30' nginx.ingress .kubernetes.io/proxy-read-timeout:'1800'nginx。 ingress.kubernetes.io/proxy-send-timeout:'1800'nginx.ingress.kubernetes.io/proxy-body-size:'8m'nginx.ingress.kubernetes.io/ssl-redirect:'true'nginx.ingress.kubernetes。 io/rewrite-target:'/$2'spec:tls:-hosts:-'logging.internal.gridsum.com'secretName:tls-certrules:-host:'logging.internal.gridsum.com'http:paths:-path:/es(/|$)(.*) backend:serviceName:elasticsearchservicePort:9200在此Ingress 定义中,(.*) 捕获的所有字符都将分配给占位符$2,然后将其用作重写目标注释中的参数。在这种情况下:https://logging.internal.gridsum.com/es将被重定向到后端elasticsearch站点,路径es将被忽略
Ingress-nginx 到 webapp 的日志追踪
熟悉我的朋友都知道,我写的是《一套标准的ASP.NET Core容器化应用日志收集分析方案》,主要是BackEnd App的日志。从上面的结构图来看,
Ingress-nginx----Nginx前端App---后端App需要一个序列化的跟踪ID,方便观察运维网络和业务应用。
幸运的是,Ingress-nginx,Nginx强大的配置能力帮助我们做了很多事情:
当客户端请求到达Ingress-Nginx Controller时,Ingress-Nginx Controller会自动添加一个X-Request-ID(随机值)的请求头----该配置是默认到达Nginx前端应用程序的请求。 Nginx 默认配置proxy_pass_request_headers on ;自动将所有请求头传递给上游Backend App,这样整个结构图中的request_id 就已经清晰了。最后一步只需要我们在Backend App中提取出请求中携带的X-Request-ID,并将其作为日志输出字段的key即可。
这里涉及到如何自定义日志的LayoutRender。
下面是一个名为x_request_id 的Asp.NETCore NLog 自定义渲染,它从请求的X-Request-ID 标头中提取值。
定义 NLog Render//////RepresentauniqueidentifiertorepresentarequestfromrequestHTTPheaderX-Request-Id.///[LayoutRenderer('x_request_id')]publicclassXRequestIdLayoutRender:HttpContextLayoutRendererBase{protectedoverridevoidAppend(StringBuilderbuilder,LogEventInfologEvent){varident ityName=HttpContextAccessor.HttpContext?Request?Headers?[' X -Request-Id'].FirstOrDefault();builder.Append(identityName);}}//////代表一个httpcontextlayoutrenderer来访问当前的httpcontext.///publicabstractclassHttpContextLayoutRendererBase:LayoutRenderer{privateIHttpContextAccessor_httpContextAccessor;//////获取'IHt tpContextAccessor'/.///protectedIHttpContextAccessorHttpContextAccessor{get{return_httpContextAccessor?(_httpContextAccessor=ServiceLocator.ServiceProvider.GetService());}}}internalsealedclassServiceLocator{publicstaticIServiceProviderServiceProvider{get;set;}}
从请求中获取X-Request-Id并依赖IHttpContextAccessor组件
这里使用依赖搜索来获取组件,所以请在StartupConfigureService中生成服务。
publicvoidConfigureServices(IServiceCollectionservices){//.ServiceLocator.ServiceProvider=services.BuildServiceProvider();}最后在程序中注册这个NLog Render:
publicstaticvoidMain(string[]args){LayoutRenderer.Register('x_request_id');CreateHostBuilder(args).Build().Run();} 这样Ingress-Nginx生成的request_id就会流向Backend App并被记录日志中起到了巨大的分析作用,有利于运维/开发的故障责任认定。
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#generate-request-idhttp://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_request_headers
总结
1.了解Ingress的应用分层工作,根据Host 和Path 公开k8s 服务。
3. 对于使用Ingress的应用,整理出Ingress-nginx到WebApp的日志跟踪ID,方便排查网络/业务故障。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7263.html
用户评论
我一直在想学习下Ingress-Nginx的工作原理,这篇文章正好可以帮到我了!
有13位网友表示赞同!
了解Ingress-Nginx能让我更轻松地搭建Kubernetes中的服务吧?
有6位网友表示赞同!
Ingress-Nginx怎么部署? 这篇文章的实践部分一定很实用!
有14位网友表示赞同!
想把我的应用程序放在 Kubernetes 中,这篇文章会不会提到一些部署技巧?
有13位网友表示赞同!
学习一下如何使用 Ingress 和 Nginx 来管理我的服务的流量,听起来很有意义。
有5位网友表示赞同!
Kubernetes 新手 here,希望能从文章中学会如何用Ingress-Nginx来配置我的容器应用。
有8位网友表示赞同!
想要更好地理解 Kubernetes 中 ingress 的工作方式,这篇文章应该是很合適的参考材料吧!
有17位网友表示赞同!
看完标题这个文章应该会详细介绍 Ingress-Nginx 的原理和实际运用,期待!
有15位网友表示赞同!
之前一直用 Apache 做负载均衡,想尝试一下 Ingress-Nginx,看它能带来什么样的优势。
有8位网友表示赞同!
最近在研究 Kubernetes 中的网络管理,Ingress-Nginx听起来很关键,赶紧来学习学习!
有11位网友表示赞同!
这篇文章会不会讲很多通俗易懂的例子? 希望能理解Ingress-Nginx的工作原理!
有18位网友表示赞同!
看标题感觉文章很详细,希望包含ingress 和 Nginx 的所有配置细节。
有10位网友表示赞同!
Ingress-Nginx 是 Kubernetes 中常用的工具,了解它对于日常开发很重要。
有7位网友表示赞同!
这个标题听起来很有吸引力,希望能找到一些新的思路!
有17位网友表示赞同!
学习一下 Ingress-Nginx 的部署和使用,对未来工作有很大的帮助!
有16位网友表示赞同!
希望这篇文章能够清晰地讲解出 Ingress 以及 Nginx 的结合方式!
有16位网友表示赞同!
看样子文章挺深入的,应该可以让我更了解 Kubernetes 的服务网格功能。
有20位网友表示赞同!
期待阅读文章中关于 Ingress-Nginx 实践部分的内容!
有11位网友表示赞同!
Ingress-Nginx 可以在各种场景下应用吗? 这篇文章能给我一些案例吗?
有18位网友表示赞同!
使用 Ingress-Nginx 可以提高 Kubernetes 中服务的安全性吗?
有7位网友表示赞同!