详解K8S入口Ingerss

这篇具有很好参考价值的文章主要介绍了详解K8S入口Ingerss。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 缘起

学习K8S的过程中,先学习使用,了解K8S正常工作需要哪些模块,
然后,学习各个模块,
之前,学习了K8S的Pod、Service,完成K8S内部服务部署和访问,
当需要将服务暴露给外部(K8S之外的机器集群)调用时,需要设计一个路由分发的组件,
匹配不同的Service,Ingerss即完成该工作的模块,官方文档,
本文围绕Ingress展开,
帮助读者了解和学习Ingerss的设计。
回顾知识:Pod和Service的相关文档如下:
详解K8S的Pod
详解K8S网络模型(包含Service讲解)

2 Ingress

2.1 相关术语

序号 术语 描述
1 节点(Node) Kubernetes集群中的某台工作的机器
2 集群(Cluster) 由Kubernetes管理运行容器应用的一组节点
3 边缘路由器(Edge router) 强制防火墙策略的集群路由器,可以是由云服务商或者物理机提供的网关
4 集群网络(Cluster network) 根据Kubernetes网络模型,一组逻辑或物理链路,帮助集群内通信
5 服务(Service) 使用标签选择器识别一组Pod的Kubernetes服务。除非另外说明,否则假定服务只有虚拟IP才能在集群网络中路由

2.2 是什么

Ingress是集群中管理外部接入Service的接口(API)对象。
Ingress可提供负载均衡、SSL终端和基于名称虚拟主机等功能。
Ingress将外部集群的HTTP和HTTPS暴露给集群内部的Service,示意图如下图所示,
由图可知,Ingress将集群外部的请求通过路由规则(routing rule)转发给Servcie,
然后由Service匹配到最终的Pod。

详解K8S入口Ingerss

Ingress将外部集群的HTTP和HTTPS暴露给集群内部的Service,示意图如下图所示。
Ingress可以通过配置为Service提供可访问的URL,流量负载均衡,终端SSL/TLS以及基于名称的的虚拟主机。
Ingress控制器提供入口功能,通常使用负载均衡器,也可以通过配置边缘路由器或其他前端辅助处理流量。
Ingress不会暴露任何端口或协议。向Internet暴露HTTP和HTTPS以外的服务通常使用service的Type:如NodePort或LoadBalancer。

2.3 配置Ingress

Ingress需要apiVersion、kind、metadata和spec属性。Ingress对象的名称必须是有效的DNS子域名。
Ingress经常使用注解配置Ingress控制器的依赖,如rewrite-target注解。不同的Ingress控制器支持不同的注解。Ingress属性spec拥有配置负载均衡或代理服务的所有信息。最重要地是包含请求的规则匹配列表。Ingress资源仅支持定向的HTTP(s)流量路由。
如果省略ingressClassname,需要定义默认的Ingress类。
Ingress配置最小单元如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

2.4 Ingress规则

每个HTTP规则包含如下信息:

  • 可选主机。当前例子中没有配置host,因此规则适用于通过指定IP地址入站的所有HTTP流量。如果配置host,规则适用于配置的host,如foo.bar.com。
  • 路径列表。路径关联后台服务,这些服务通过servcie.name、service.port.name或者service.port.number定义。host和path必须在负载均衡定向流量到Service前匹配请求内容,以分发流量到Service。
  • 后台服务是Service和端口名称的组合。HTTP(或HTTPS)请求到Ingress后,会将请求发送到与host和path匹配的后台服务中。
    Ingress控制器中通常配置默认的后台来服务没有匹配到path的请求。

2.5 默认后端

没有配置规则的Ingress将所有流量发送到某个默认的后端,.spec.defaultBackend即处理请求的后端。defaultBackend通常是Ingress控制的可选属性,Ingress资源中并未指定。如果没有指定的.spec.rules,则必须指定.spec.defaultBackend。如果没有配置defaultBackend,不符合任何规则的请求的处理由Ingress控制器决定。
Ingress对象中没有host和path与HTTP请求相匹配,流量会被路由到默认后端。

2.6 资源后端

资源后端是对象引用到另一个Kubernetes资源中有相同命名空间的Ingress对象。
资源与服务是互斥的,如果两者同时指定,会导致验证失败。资源后端通用场景是使用静态资产将数据输入到对象存储后端。

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
  • 查看Ingress
kubectl describe ingress ingress-resource-backend
  • 结果
Name:             ingress-resource-backend
Namespace:        default
Address:
Default backend:  APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
Rules:
  Host        Path  Backends
  ----        ----  --------
  *
              /icons   APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
Annotations:  <none>
Events:       <none>

2.8 路径类型

Ingress中的每个路径需要有对应的路径类型。路径不包括具体的pathType会校验失败。
支持的三种路径类型:

  • ImplementationSpecific:该路径类型的匹配取决于IngressClass。实现可将其视为单独的pathType,亦可以等同于Exact或Prefix路径类型。
  • Exact:精确匹配URL并且区分大小写(大小写敏感)。
  • Prefix:基于以/分割的URL路径前缀匹配。匹配区分大小写,并以路径元素为基础进行。路径元素指由/分隔符分割的路径中的标签列表。

匹配样例:

序号 路径类型 路径 请求路径 是否配置
1 Prefix / 所有路径 匹配,即只有一个/分隔符匹配所有路径
2 Prefix /foo /foo或/foo/ 匹配
3 Prefix /aaa/bb /aaa/bbb或/aaa/bbxyz 不匹配
4 Prefix /aaa/bbb /aaa/bbb或/aaa/bbb/ 匹配
5 Prefix /,/aaa /aaa/ccc 匹配,通过/aaa匹配,因为ccc已经使用/分隔了
6 Exact /foo /foo 匹配
7 Exact /foo /foo/ 不匹配
8 Exact /foo/ /foo 不匹配
9 Exact /foo /bar 不匹配
10 Mixed /foo(Prefix),/foo(Exact) /foo 匹配

2.9 主机名通配符

主机可以精确匹配(如foo.bar.com)或通配符匹配(如*.foo.com)。精确匹配需要HTTP主机头匹配主机属性。通配符匹配需要HTTP主机头与通配符规则的后缀相同。
匹配样例:

序号 主机 主机头 是否配置
*.foo.com bar.foo.com 匹配,后缀相同
*.foo.com baz.bar.foo.com 不匹配,通配符只覆盖单个DNS标签
*.foo.com foo.com 不匹配,通配符只覆盖单个DNS标签

配置样例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: "*.foo.com"
    http:
      paths:
      - pathType: Prefix
        path: "/foo"
        backend:
          service:
            name: service2
            port:
              number: 80

2.10 Ingress类

Ingress可以通过不同的控制器实现,配置通常也不相同。
每个Ingress应该指定一个类,引用IngressClass的资源配置包括控制器名称(应该实现的类)。
IngressClass配置样例,
IngressClass的属性.spec.parameters允许引用另一个资源,为IngressClass提供相关的配置。
指定的参数类型的使用依赖于Ingress控制器,即指定的.spec.controller。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb
spec:
  controller: example.com/ingress-controller
  parameters:
    apiGroup: k8s.example.com
    kind: IngressParameters
    name: external-lb

2.10.1 IngressClass作用域

IngressClass作用域依赖于Ingress控制器,可以使用参数配置为集群范围(cluster-wide)或者只配置一个命名空间。

2.10.1.1 集群(Cluster)

IngressClass参数的默认属性为集群范围(cluster-wide)。
如果配置.spec.paramters属性时没有设置.spec.paramters.scope,或者配置.spec.parameters.scope为Cluster,IngressClass指向集群范围的资源。kind参数指向集群范围的API(组合apiGroup),name参数标识该API的特定集群资源。
配置样例:

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-1
spec:
  controller: example.com/ingress-controller
  parameters:
    # The parameters for this IngressClass are specified in a
    # ClusterIngressParameter (API group k8s.example.net) named
    # "external-config-1". This definition tells Kubernetes to
    # look for a cluster-scoped parameter resource.
    scope: Cluster
    apiGroup: k8s.example.net
    kind: ClusterIngressParameter
    name: external-config-1
2.10.1.2 命名空间(Namespace)

如果配置.spec.paramters属性时,将.spec.parameters.scope设定为Namespace,IngressClass指向命名空间资源。必须设置.spece.parameters的namespace属性来指定需要使用的命名空间。
kind参数(组合apiGroup)指向命名空间API(如ConfigMap),name参数标识指定命名空间的资源。
命名空间参数有助于集群操作员通过用于工作负载的配置代理控制(如负载均衡配置、API网关定义)。

配置样例:

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    # The parameters for this IngressClass are specified in an
    # IngressParameter (API group k8s.example.com) named "external-config",
    # that's in the "external-configuration" namespace.
    scope: Namespace
    apiGroup: k8s.example.com
    kind: IngressParameter
    namespace: external-configuration
    name: external-config
2.10.1.3 默认IngressClass

可以为集群指定一个特定的默认IngressClass。在IngressClass资源中将ingressclass.kubernetes.io/is-default-class注解设置为true,可保证在不指定ingressClassName时使用默认的IngressClass。

2.11 Ingress类型

2.11.1 Ingress由单一服务支持

现存的Kubernetes概念允许暴露单个服务,Ingress可以通过无规则的默认后端实现。
配置样例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: test
      port:
        number: 80

2.11.2 简单扇出

扇出配置将流量从一个IP地址路由到多个Service,基于HTTP URI请求,
示意图如下图所示。
详解K8S入口Ingerss
配置样例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

2.11.3 基于名称的虚拟主机

基于名称的虚拟主机在相同的IP地址支持路由HTTP流量到多个主机名称,
示意图如下图所示。

详解K8S入口Ingerss
配置样例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: bar.foo.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service2
            port:
              number: 80

当创建Ingress资源时没有定义主机规则,
可以匹配进入到Ingress控制器IP地址的任何web流量,无需基于名称的虚拟主机。
比如,Ingress将请求first.bar.com的流量路由到service1,second.bar.com路由到service2,
不匹配first.bar.com和second.bar.com的流量路由到service3。
配置样例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress-no-third-host
spec:
  rules:
  - host: first.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: second.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service2
            port:
              number: 80
  - http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service3
            port:
              number: 80

2.12 TLS

通过指定包含TLS私有密钥和认证的Secret加密Ingress。
Ingress资源仅支持单个TLS端口:443,并假定TLS在入口点终止(到服务及Pods的流量为明文)。
Ingress的TLS配置指定不同的主机,通过SNI TLS扩展指定的主机名在同一端口多路复用(前提是Ingress控制器支持SNI)。TLS密钥必须包含的键名:tls.crt和tls.key,用于指定TLS认证和私有密钥。
配置样例如下:

apiVersion: v1
kind: Secret
metadata:
  name: testsecret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
type: kubernetes.io/tls

配置密钥后,Ingress需要引用配置的密钥,Ingress配置样例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
      - https-example.foo.com
    secretName: testsecret-tls
  rules:
  - host: https-example.foo.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

2.13 负载均衡

Ingress控制器启动时会加载负载均衡策略配置应用到所有Ingress,比如负载均衡算法、后端权重方案等。
高级的负载均衡概念Ingress尚未公开(如持久会话、动态权重)。

2.14 更新Ingress

将新的主机添加到Ingress,可以通过编辑资源更新:

# 查看ingerss
kubectl describe ingress test
Name:             test
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:80 (10.8.0.90:80)
Annotations:
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     35s                loadbalancer-controller  default/test

修改Ingress

# 编辑ingress
kubectl edit ingress test

添加service2

spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          service:
            name: service1
            port:
              number: 80
        path: /foo
        pathType: Prefix
  - host: bar.baz.com
    http:
      paths:
      - backend:
          service:
            name: service2
            port:
              number: 80
        path: /foo
        pathType: Prefix

更新并保存文档,再查看Ingress:

kubectl describe ingress test

完成服务添加,结果如下:

Name:             test
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:80 (10.8.0.90:80)
  bar.baz.com
               /foo   service2:80 (10.8.0.91:80)
Annotations:
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     45s                loadbalancer-controller  default/test

3 小结

(1)Ingress是集群中管理外部接入Service的接口(API)对象。
(2)Ingress可提供负载均衡、SSL终端和基于名称虚拟主机等功能。
(3)Ingress中的每个路径需要有对应的路径类型。支持的三种路径类型:ImplementationSpecific、Exact和Prefix。
(4)Ingress可路由一个或多个Service,并且可动态更新Service路由关系。通过kubectl edit ingress ingress-name。文章来源地址https://www.toymoban.com/news/detail-446326.html

到了这里,关于详解K8S入口Ingerss的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s Ingress使用详解

    在上一篇关于k8s之service的使用一篇中提到,Service对集群之外暴露服务的主要方式有两种,NotePort和LoadBalancer,但这两种方式,都有一定的缺点,具体来说: NodePort 会占用很多集群机器的端口,当集群服务变多的时候,过多的端口会给k8s的运维人员带来诸多的不便; 而LB的缺

    2024年02月02日
    浏览(50)
  • k8s标签选择器使用详解

    目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性

    2023年04月08日
    浏览(31)
  • k8s 常用调度策略使用详解

    通过之前的学习,我们了解到k8s集群中最小工作单位是pod,对于k8s集群来说,一个pod的完整生命周期是由一系列调度策略来控制,这些调度策略具体是怎么工作的呢?本文将详细讨论下这个问题。 默认情况下,k8s集群中某个Pod在哪个Node节点运行,是由Scheduler组件采用相应的

    2024年02月01日
    浏览(50)
  • k8s入门和使用详解(一)

    目前,微服务使用越来越广泛,服务越多运维成本就会越高,微服务为了高可用去部署集群可能会消耗开发或者运维大量的精力,k8s为分布式微服务提供了很好的解决方案 k8s全称Kubernetes(k和s中间有8个字母,所以又称k8s),是一个开源的,用于管理云平台中多个主机上的容

    2024年02月12日
    浏览(34)
  • k8s数据存储之Volume使用详解

    目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir  4

    2024年01月21日
    浏览(47)
  • k8s中job与cronjob使用详解

    job,顾名思义就是任务,job的概念在很多框架中都有,而且实际业务场景中也使用非常广泛,比如大家熟悉的hadoop,客户端可以向集群提交一个job,然后集群根据一定的调度策略来处理这个job; k8s中的job,主要用于批量处理的业务场景,比如像那种短暂的一次性任务(每个任

    2024年01月17日
    浏览(45)
  • k8s资源管理命令与Namespace使用详解

    目录 一、前言 二、k8s概述 三、k8s常用操作管理命令 3.1 kubectl 命令用法

    2023年04月16日
    浏览(53)
  • k8s创建资源对象过程

    我们都知道,K8S中一切皆资源,在使用K8S时,所有的pod或者controller都是通过yaml文件进行创建的。 那么接下来,就和大家一起看一下K8S是如何创建资源的。 Deployment是一种常见的资源对象。在Kubernetes系统中创建资源对象有很多种方法。本节将对用kubectl create命令创建Deployment资

    2024年01月19日
    浏览(42)
  • K8S Secret 一文详解, 全面覆盖 Secret 使用场景 | 全家桶

    博客原文 k8s secrets用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。 Secret 类似于 ConfigMap 但专门用于保

    2024年01月21日
    浏览(39)
  • k8s 集群 搭建过程问题汇总

    1. 为k8s集群添加内网域名 修改core-dns 的configmap ,添加hosts 2. 修改apiserver server端口号,支持NodePort 指向80 修改master 节点 vim /etc/kubernetes/manifests/kube-apiserver.yaml - --service-node-port-range=1-65535 然后记得重启  (此处我是kubeadmin 安装的k8s 集群) 删除pod 完后,会自动重启

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包