前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S Ingress使用|常见问题列表

K8S Ingress使用|常见问题列表

作者头像
用户5166556
发布2020-08-27 15:18:58
3.3K0
发布2020-08-27 15:18:58
举报

前言

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

问题列表


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

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


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

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

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  9000: "default/test:80"

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

上面已经说了Ingress就是一种Service,所以Ingress也有命名空间的概念,如果ServiceIngress不在同一个命名空间下面,自然无法访问的,解决办法非常简单,只需要给Ingress加上命名空间即可,当前这个Ingress命名空间下,分配相应命名空间下Service资源对象; 其它命名空间下,只需要添加多个Ingress编排文件, 填写相应命名空间即可。

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: http-test
  namespace: java=svc
  annotations:

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

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


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

直接把本地时间mountPod中即可

代码语言:javascript
复制
 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直接访问?

在资源对象中声明使用本地网络即可,样例如下所示:

代码语言:javascript
复制
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中的默认证书,具体配置如下所示:

代码语言:javascript
复制
........
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之后就提示不合法。具体如下所示:

代码语言:javascript
复制
.....
spec:
  tls:
    - hosts:
      secretName: ssl-cert
  rules:
   - http:
.....

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

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

代码语言:javascript
复制
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-config
data:
  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也是一样,可以通过如下配置解决:

代码语言:javascript
复制
kind: ConfigMap
apiVersion: v1
data:
  enable-underscores-in-headers: "true"
  ......
metadata:
  name: nginx-configuration
  namespace: ingress-nginx

总结

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 问题列表
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档