K8S Ingress使用|常见问题列表

前言

最近有部分同窗咨询关于使用Ingress-nginx碰到的一系列问题,其实有部分问题,我也没有碰到过,都是在官网上找到的答案,验证后,进行了一个简单问题列表整理,但愿可以帮助到须要的人。前端

问题列表


  • Ingress就是谷歌的标新立异,其实用处不大,使用 NodePort就能够轻易替代,不知道你们为啥还要用这个?

所谓的Ingress,能够把它理解为Service中的"Service",这个IngressService是用于代理后端不一样服务的负载均衡服务。从本质上来讲是对反向代理的一种抽象,说到抽象,K8S中有不少抽象,常见有数据存储卷,经过存储卷,你能够声明各类不一样类型的存储,知足不一样使用场景。固然Ingress也不例外,你能够经过Ingress Controller选择不一样后端代理服务,好比你的服务对中断很是敏感,你能够选择Traefik。这些都是K8S插件化思想一个体现。固然你能够选择使用NodePort+nginx Pod实现服务的访问,可是后面就会出现一系列的端口管理问题、安全等问题。使用见:Kubernetes Ingress工做原理介绍java


  • Ingress资源对象中包含 TCP/UDP端口,应该如何暴露?

Ingress自己是7层代理,不支持TCPUDP端口访问,所以Ingress使用--tcp-services-configmapudp-services-configmap这些标识指向现有的配置映射,对外公开端口。其中data字段部分:键是要使用的外部端口,而且该值使用如下格式指示要公开的服务,若是存在命名空间,则把default修改成相应命名空间。具体使用示例以下所示:nginx

apiVersion: v1kind: ConfigMapmetadata: name: tcp-services namespace: ingress-nginxdata: 9000: "default/test:80"

  • 不一样命名空间下的 Service,如何使用 Ingress进行访问?

上面已经说了Ingress就是一种Service,因此Ingress也有命名空间的概念,若是ServiceIngress不在同一个命名空间下面,天然没法访问的,解决办法很是简单,只须要给Ingress加上命名空间便可,当前这个Ingress命名空间下,分配相应命名空间下Service资源对象; 其它命名空间下,只须要添加多个Ingress编排文件, 填写相应命名空间便可。git

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: http-test namespace: java=svc annotations:

  • 如何使用 Ingress作动静分离(个人前端和后台服务分开的)?

前端静态页面建议放到最外层CDN上,一来加快访问速度、体验良好。若是没有使用CDN,也可使用Ingress作动静分离,只须要把Ingress中匹配前端页面正则表达式开启。nginx.ingress.kubernetes.io/use-regex: "true"这样你就能够在path中经过配置正则表达式,把静态请求和后端动态请求分离。github


  • Ingress访问打印日志时间不对?

直接把本地时间mountPod中便可web

 volumeMounts: - name: webhook-cert mountPath: /usr/local/certificates/ readOnly: true - name: tz-config mountPath: /etc/localtime resources: requests: cpu: 100m memory: 90Mi serviceAccountName: ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: secretName: ingress-nginx-admission - name: tz-config hostPath:  path: /usr/share/zoneinfo/Asia/Shanghai

  • Ingress如何使用本机 Ip直接访问?

在资源对象中声明使用本地网络便可,样例以下所示:正则表达式

spec: selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller revisionHistoryLimit: 10 minReadySeconds: 0 template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet

  • Ingress中证书如何配置?配置以后不生效,使用了 K8S默认证书,如何修改?

证书在Ingress资源编排文件中tls字段中配置,有同窗反应配置以后不生效,其实看下日志就知道,大多由于证书中使用的域名和Ingress中配置域名不一致致使的,这个时候Ingress会选择使用K8S中的默认证书,对于部分存在证书验证的客户端服务,会出现验证不经过的问题,其实这个解决方法也很简单,当前Ingress中域名和证书中域一致便可。固然你也能够修改Ingress中的默认证书,具体配置以下所示:后端

........containers: - name: nginx-ingress-controller image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.31.2 args: - /nginx-ingress-controller - --configmap=$(POD_NAMESPACE)/nginx-configuration - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --publish-service=$(POD_NAMESPACE)/ingress-nginx - --annotations-prefix=nginx.ingress.kubernetes.io - --default-ssl-certificate=default/https-cert.......

  • Ingress没有域名如何配置 IP

很简单,不配置便可,有同窗尝试配置IPapply以后就提示不合法。具体以下所示:api

.....spec: tls: - hosts: secretName: ssl-cert rules: - http:.....

  • Ingress不支持 TLS1.0、TLS1.1 如何处理?

默认不支持1.01.1,部分客户端仍然使用老协议,就会出现访问不经过问题,能够经过以下方式进行修改:安全

kind: ConfigMapapiVersion: v1metadata: name: nginx-configdata: ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA" ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"

  • Ingress灰度发布不生效?

首先到更新列表中https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md查看当前版本是否支持灰度发布,ingress nginx0.25.0开始支持头部匹配灰度发布,以后又出现了模糊匹配等灰度发布功能。Ingress-nginx的灰度发布必须使用域名,不然会不生效,提示以下错误:https://github.com/kubernetes/ingress-nginx/issues/5847


  • 请求头部标识包含下划线, ingress nginx不能正确转发,如何处理?

默认状况下nginx也不支持头部包含下划线,Ingress nginx也是同样,能够经过以下配置解决:

kind: ConfigMapapiVersion: v1data: enable-underscores-in-headers: "true" ......metadata: name: nginx-configuration namespace: ingress-nginx

总结

如上就是使用过程当中碰到的一些细节问题,之因此会出现上述问题,大多由于咱们尚未把K8S搞明白,又来了一个Ingress的概念,其实很简单,多看文档便可。具体参考:https://kubernetes.github.io/ingress-nginx/。若有问题,关注公众号、加我好友,拉你进群讨论。另外祝你们七夕快乐,单身的今日脱单,有情人的永远浪漫!

推荐


Kubernetes Ingress工做原理介绍

如何使用 Ingress-nginx 进行先后端分离?

Ingress-nginx灰度发布功能详解

白话K8S核心组件概念



原创不易,随手关注或者”三连“,诚挚感谢!

本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索