1. 首页 > 快讯

Ingress-Nginx的工作原理和实践

大家好,今天小编来为大家解答以下的问题,关于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,方便排查网络/业务故障。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

几妆痕

我一直在想学习下Ingress-Nginx的工作原理,这篇文章正好可以帮到我了!

    有13位网友表示赞同!

颓废i

了解Ingress-Nginx能让我更轻松地搭建Kubernetes中的服务吧?

    有6位网友表示赞同!

風景綫つ

Ingress-Nginx怎么部署? 这篇文章的实践部分一定很实用!

    有14位网友表示赞同!

呆檬

想把我的应用程序放在 Kubernetes 中,这篇文章会不会提到一些部署技巧?

    有13位网友表示赞同!

七夏i

学习一下如何使用 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位网友表示赞同!

失心疯i

学习一下 Ingress-Nginx 的部署和使用,对未来工作有很大的帮助!

    有16位网友表示赞同!

没过试用期的爱~

希望这篇文章能够清晰地讲解出 Ingress 以及 Nginx 的结合方式!

    有16位网友表示赞同!

泡泡龙

看样子文章挺深入的,应该可以让我更了解 Kubernetes 的服务网格功能。

    有20位网友表示赞同!

棃海

期待阅读文章中关于 Ingress-Nginx 实践部分的内容!

    有11位网友表示赞同!

最怕挣扎

Ingress-Nginx 可以在各种场景下应用吗? 这篇文章能给我一些案例吗?

    有18位网友表示赞同!

▼遗忘那段似水年华

使用 Ingress-Nginx 可以提高 Kubernetes 中服务的安全性吗?

    有7位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7263.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666