前言 最近有部分同学咨询关于使用Ingressnginx碰到的一系列问题,其实有部分问题,我也没有碰到过,都是在官网上找到的答案,验证后,进行了一个简单问题列表整理,希望能够帮助到需要的人。问题列表Ingress就是谷歌的标新立异,其实用处不大,使用NodePort就可以轻易替代,不知道大家为啥还要用这个? 所谓的Ingress,可以把它理解为Service中的Service,这个Ingress的Service是用于代理后端不同服务的负载均衡服务。从本质上来说是对反向代理的一种抽象,说到抽象,Kubernates中有很多抽象,常见有数据存储卷,通过存储卷,你可以声明各种不同类型的存储,满足不同使用场景。当然Ingress也不例外,你可以通过IngressController选择不同后端代理服务,比如你的服务对中断非常敏感,你可以选择Traefik。这些都是Kubernates插件化思想一个体现。当然你可以选择使用NodePortnginxPod实现服务的访问,但是后面就会出现一系列的端口管理问题、安全等问题。使用见:KubernetesIngress工作原理介绍Ingress资源对象中包含TCPUDP端口,应该如何暴露? Ingress本身是7层代理,不支持TCP和UDP端口访问,因此Ingress使用tcpservicesconfigmap和udpservicesconfigmap这些标识指向现有的配置映射,对外公开端口。其中data字段部分:键是要使用的外部端口,并且该值使用以下格式指示要公开的服务,如果存在命名空间,则把default修改为相应命名空间。具体使用示例如下所示:apiVersion:v1kind:ConfigMapmetadata:name:tcpservicesnamespace:ingressnginxdata:9000:defaulttest:80不同命名空间下的Service,如何使用Ingress进行访问? 上面已经说了Ingress就是一种Service,所以Ingress也有命名空间的概念,如果Service和Ingress不在同一个命名空间下面,自然无法访问的,解决办法非常简单,只需要给Ingress加上命名空间即可,当前这个Ingress命名空间下,分配相应命名空间下Service资源对象;其它命名空间下,只需要添加多个Ingress编排文件,填写相应命名空间即可。apiVersion:extensionsv1beta1kind:Ingressmetadata:name:httptestnamespace:javasvcannotations:如何使用Ingress做动静分离(我的前端和后台服务分开的)? 前端静态页面建议放到最外层CDN上,一来加快访问速度、体验良好。如果没有使用CDN,也可以使用Ingress做动静分离,只需要把Ingress中匹配前端页面正则表达式开启。nginx。ingress。kubernetes。iouseregex:true这样你就可以在path中通过配置正则表达式,把静态请求和后端动态请求分离。Ingress访问打印日志时间不对? 直接把本地时间mount到Pod中即可volumeMounts:name:webhookcertmountPath:usrlocalcertificatesreadOnly:truename:tzconfigmountPath:etclocaltimeresources:requests:cpu:100mmemory:90MiserviceAccountName:ingressnginxterminationGracePeriodSeconds:300volumes:name:webhookcertsecret:secretName:ingressnginxadmissionname:tzconfighostPath:path:usrsharezoneinfoAsiaShanghaiIngress如何使用本机Ip直接访问? 在资源对象中声明使用本地网络即可,样例如下所示:spec:selector:matchLabels:app。kubernetes。ioname:ingressnginxapp。kubernetes。ioinstance:ingressnginxapp。kubernetes。iocomponent:controllerrevisionHistoryLimit:10minReadySeconds:0template:metadata:labels:app。kubernetes。ioname:ingressnginxapp。kubernetes。ioinstance:ingressnginxapp。kubernetes。iocomponent:controllerspec:hostNetwork:truednsPolicy:ClusterFirstWithHostNetIngress中证书如何配置?配置之后不生效,使用了Kubernates默认证书,如何修改? 证书在Ingress资源编排文件中tls字段中配置,有同学反应配置之后不生效,其实看下日志就知道,大多因为证书中使用的域名和Ingress中配置域名不一致导致的,这个时候Ingress会选择使用Kubernates中的默认证书,对于部分存在证书验证的客户端服务,会出现验证不通过的问题,其实这个解决方法也很简单,当前Ingress中域名和证书中域一致即可。当然你也可以修改Ingress中的默认证书,具体配置如下所示:。。。。。。。。containers:name:nginxingresscontrollerimage:quay。iokubernetesingresscontrollernginxingresscontroller:0。31。2args:nginxingresscontrollerconfigmap(PODNAMESPACE)nginxconfigurationtcpservicesconfigmap(PODNAMESPACE)tcpservicesudpservicesconfigmap(PODNAMESPACE)udpservicespublishservice(PODNAMESPACE)ingressnginxannotationsprefixnginx。ingress。kubernetes。iodefaultsslcertificatedefaulthttpscert。。。。。。。Ingress没有域名如何配置IP? 很简单,不配置即可,有同学尝试配置IP,apply之后就提示不合法。具体如下所示:。。。。。spec:tls:hosts:secretName:sslcertrules:http:。。。。。Ingress不支持TLS1。0、TLS1。1如何处理? 默认不支持1。0和1。1,部分客户端仍然使用老协议,就会出现访问不通过问题,可以通过如下方式进行修改:kind:ConfigMapapiVersion:v1metadata:name:nginxconfigdata:sslciphers:ECDHEECDSAAES128GCMSHA256:ECDHERSAAES128GCMSHA256:ECDHEECDSAAES256GCMSHA384:ECDHERSAAES256GCMSHA384:ECDHEECDSACHACHA20POLY1305:ECDHERSACHACHA20POLY1305:DHERSAAES128GCMSHA256:DHERSAAES256GCMSHA384:DHERSACHACHA20POLY1305:ECDHEECDSAAES128SHA256:ECDHERSAAES128SHA256:ECDHEECDSAAES128SHA:ECDHERSAAES128SHA:ECDHEECDSAAES256SHA384:ECDHERSAAES256SHA384:ECDHEECDSAAES256SHA:ECDHERSAAES256SHA:DHERSAAES128SHA256:DHERSAAES256SHA256:AES128GCMSHA256:AES256GCMSHA384:AES128SHA256:AES256SHA256:AES128SHA:AES256SHA:DESCBC3SHAsslprotocols:TLSv1TLSv1。1TLSv1。2TLSv1。3Ingress灰度发布不生效? 首先到更新列表中https:github。comkubernetesingressnginxblobmasterChangelog。md查看当前版本是否支持灰度发布,ingressnginx从0。25。0开始支持头部匹配灰度发布,之后又出现了模糊匹配等灰度发布功能。Ingressnginx的灰度发布必须使用域名,否则会不生效,提示如下错误:https:github。comkubernetesingressnginxissues5847请求头部标识包含下划线,ingressnginx不能正确转发,如何处理? 默认情况下nginx也不支持头部包含下划线,Ingressnginx也是一样,可以通过如下配置解决:kind:ConfigMapapiVersion:v1data:enableunderscoresinheaders:true。。。。。。metadata:name:nginxconfigurationnamespace:ingressnginx总结 如上就是使用过程中碰到的一些细节问题,之所以会出现上述问题,大多因为我们还没有把Kubernates搞明白,又来了一个Ingress的概念,其实很简单,多看文档即可。具体参考:https:kubernetes。github。ioingressnginx。