• Kubernetes Ingress


    What's Ingress


    ingress的定义

    1. Kubernetes管理外部请求访问集群内部的Service而提供的API对象,典型的访问如HTTP请求
    2. ingress提供集群外部请求到集群内部Service的HTTP / HTTPS的路由信息,具体路由信息由ingress中的rules所控制

    ingress功能

    1. 提供外部入站请求至集群内部Service
    2. 提供流量负载均衡
    3. 提供 SSL / TLS
    4. 提供基于virtual host托管

    为什么使用ingress

    众所周知,对外提供服务,服务暴露的3种方式

    1. nodePort
    2. LoadBalance
    3. ingress

    其中nodePort & LoadBalance有以下缺点

    • 消耗资源

    增加主机节点的端口、每个ingress需要独立的公网地址&独立的负载均衡实例

    • 管理复杂

    增加对端口记录配置清单(应用系统功能对应端口)通常形式为nodeIP:nodePort,前端入口需要手动配置独立的Nginx等其它反向代理服务器

    如果是LoadBalance类型,需要对每个ingress对应的负载均衡实例进行维护,如果应用系统非常庞大,那么产生的前端入口负载均衡实例会相当多,从而提高管理复杂性,提高管理成本,配置复杂;而且对负载均衡的功能有所要求(比如HTTP 7层,HTTP header/cookie/URL转发等)

    • 容错性低

    不管是nodePort & LoadBalance类型,无疑降低集群容错性,因为配置复杂,管理复杂,那么在日常使用中犯错的概率就会增加

    ingress却很好的规避这些劣势,ingress Controller实际就是一个反向代理服务器,可以理解为nginx harpoxy等其它,具体参考官方文档

    DefaultBackend


    当接收到来自外部的请求时,但是与ingress路由规则无法匹配时,将转发到defaultbackend,

    通常defaultbackend配置在ingress controller中,并非配置在具体的ingress rules某条规则中

    Resource backedns


    参考官方链接

    https://kubernetes.io/zh/docs/concepts/services-networking/ingress/#resource-backend

    在配置ingress rule时通常要指定backend后端具体配置,官方支持二种形式

    1. resource
    2. service

    在同一条rules中二者是互斥的,只能指其中一种形式,resource通常是ingress对象(ingress object),最常用的配置就是针对访问对象存储、静态资源

    • 参考配置
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-resource-backend
      spec:
        defaultBackend:
          resource:
            apiGroup: k8s.example.com
            kind: StorageBucket
            name: static-assets
        rules:
          - http:
              paths:
                - path: /icons
                  pathType: ImplementationSpecific
                  backend:
                    resource:
                      apiGroup: k8s.example.com
                      kind: StorageBucket
                      name: icon-assets

    路径类型(pathType)


    Kubernetes中的ingress,在配置rules中path,每个path都有对应路径类型,具体pathType分为如下

    1. ImplementationSpecific
    2. Exact
    3. Prefix

    第一种 ImplementationSpecific,使用该种路径类型,如何匹配将取决于定义的ingressClass

    第二种 Exact,精确匹配 URL 路径,且区分大小写

    第三种 Prefix,基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配

    值得注意的是:如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz

    具体详细路径匹配规则,参考官方文档,如下

    https://kubernetes.io/zh/docs/concepts/services-networking/ingress/#path-types

    多重匹配

    当一条ingress资源中包含多个路径时,每个路径的配置都需要指定一种路径类型,发起请求访问时,匹配的规则应符合如下顺序

    1. 优先匹配最长的path
    2. 如果仍然有二条相同的路径,则Exact优先于Prefix

    IngressClass


    在kubernetes集群中,可以部署多个Ingress Controller,通常不同的Ingress Controller对应不同的Ingress,因此需要对Ingress指定对应Ingress Controller

    如果要部署多个Ingress Controller时,不同版本指定不同的Ingress Controller使用参数--ingress-class,而高于Kubernetes v1.18.0官方已弃用--ingress-class,改为--controller-class

    1. 创建Ingress Controller
      # 新版本
      # ingress-nginx Deployment/Statfulset spec: template: spec: containers: - name: ingress-nginx-internal-controller args: - /nginx-ingress-controller - '--controller-class=k8s.io/internal-ingress-nginx' ...
    2. 创建Ingress Class
      # ingress-nginx IngressClass
      apiVersion: networking.k8s.io/v1
      kind: IngressClass
      metadata:
        name: internal-nginx
      spec:
      # 注意下面的Controller与刚才创建的Ingress Controller中的--controller-class参数的值相对应 controller: k8s.io/internal-ingress-nginx ...
    3. 创建具体的ingress,创建时需要指定Ingress Controller,则引用上面创建的Ingress Class的metadata.name字段的值
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: my-ingress
      spec:
        ingressClassName: internal-nginx
        ...

    具体官方文档地址,如下

    https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/

    在创建ingress时,需要注意kubernetes的apiVersion,如下

    引用官方文档

    Running on Kubernetes versions older than 1.19
    • Ingress resources evolved over time. They started with apiVersion: extensions/v1beta1, then moved to apiVersion: networking.k8s.io/v1beta1 and more recently to apiVersion: networking.k8s.io/v1.
    • Here is how these Ingress versions are supported in Kubernetes: - before Kubernetes 1.19, only v1beta1 Ingress resources are supported - from Kubernetes 1.19 to 1.21, both v1beta1 and v1 Ingress resources are supported - in Kubernetes 1.22 and above, only v1 Ingress resources are supported
    • And here is how these Ingress versions are supported in NGINX Ingress Controller: - before version 1.0, only v1beta1 Ingress resources are supported - in version 1.0 and above, only v1 Ingress resources are
    • As a result, if you're running Kubernetes 1.19 or later, you should be able to use the latest version of the NGINX Ingress Controller; but if you're using an old version of Kubernetes (1.18 or earlier) you will have to use version 0.X of the NGINX Ingress Controller (e.g. version 0.49).
    • The Helm chart of the NGINX Ingress Controller switched to version 1 in version 4 of the chart. In other words, if you're running Kubernetes 1.19 or earlier, you should use version 3.X of the chart (this can be done by adding --version='<4' to the helm install command).
  • 相关阅读:
    World Wind Java开发之六——解析shape文件(转)
    World Wind Java开发之五——读取本地shp文件(转)
    laravel 存储base64格式图片
    谷歌分析(Google Analytics) 是什么
    laravel中图片的删除
    js插件---弹出层sweetalert2(总结)
    范仁义web前端介绍课程---5、webstorm的下载安装
    范仁义web前端介绍课程---4、html、css、js初体验
    范仁义web前端介绍课程---3、课程大纲(初步)
    范仁义web前端介绍课程---2、web前端是干嘛的
  • 原文地址:https://www.cnblogs.com/apink/p/15703192.html
Copyright © 2020-2023  润新知