zoukankan      html  css  js  c++  java
  • Kubernetes Ingress

    Ingress 可以提供负载平衡,SSL 终端和基于名称的虚拟主机。

    Ingress 是什么

    通常情况下,service和pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或被转发到其他地方。

        internet
            |
      ------------
      [ Services ]
    

    Ingress是授权入站连接到达集群服务的规则集合。

        internet
            |
       [ Ingress ]
       --|-----|--
       [ Services ]
    

    可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress。Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开给 Internet 时,通常使用以下类型的服务 Service.Type=NodePort 或者 Service.Type=LoadBalancer.

    Ingress 资源

    需要一个Ingress Controller来实现Ingress,单纯的创建一个Ingress没有任何意义。
    GCE/GKE会在master节点上部署一个ingress controller。你可以在一个pod中部署任意个自定义的ingress controller。
    最简化的Ingress配置:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - http:
          paths:
          - path: /testpath
            backend:
              serviceName: test
              servicePort: 80
    

    配置说明:
    1-4行:跟Kubernetes的其他配置一样,ingress的配置也需要apiVersion,kind和metadata字段。
    5-7行: Ingress spec 中包含配置一个loadbalancer或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。目前ingress只支持http规则。
    8-9行:每条http规则包含以下信息:一个host配置项(比如for.bar.com,在这个例子中默认是*),path列表(比如:/testpath),每个path都关联一个backend(比如test:80)。在loadbalancer将流量转发到backend之前,所有的入站请求都要先匹配host和path。
    10-12行:正如 services doc中描述的那样,backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
    在所有请求都不能跟spec中的path匹配的情况下,请求被发送到Ingress controller的默认后端,可以指定全局缺省backend。
    为了使Ingress正常工作,集群中必须运行Ingress controller。

    Ingress类型

    单Service Ingress

    通过指定一个没有rule的默认backend的方式来实现暴露单个service。
    ingress.yaml定义文件:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
    spec:
      backend:
        serviceName: testsvc
        servicePort: 80
    

    使用kubectl create -f命令创建,然后查看ingress:

    $ kubectl get ingress test-ingress
    NAME           HOSTS     ADDRESS           PORTS     AGE
    test-ingress   *         107.178.254.228   80        59s
    

    107.178.254.228就是Ingress controller为了实现Ingress而分配的IP地址。RULE列表示所有发送给该IP的流量都被转发到了BACKEND所列的Kubernetes service上。

    简单扩展

    kubernete pod中的IP只在集群网络内部可见,我们需要在边界设置一个东西,让它能够接收ingress的流量并将它们转发到正确的端点上。这个东西一般是高可用的loadbalancer。使用Ingress能够允许你将loadbalancer的个数降低到最少:

    foo.bar.com -> 178.91.123.132 -> / foo    service1:4200
                                     / bar    service2:8080
    

    需要一个Ingress:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: simple-fanout-example
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: service1
              servicePort: 4200
          - path: /bar
            backend:
              serviceName: service2
              servicePort: 8080
    

    使用kubectl create -f创建完ingress后:

    $ kubectl describe ingress simple-fanout-example
    Name:             simple-fanout-example
    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:4200 (10.8.0.90:4200)
                   /bar   service2:8080 (10.8.0.91:8080)
    Annotations:
      nginx.ingress.kubernetes.io/rewrite-target:  /
    Events:
      Type     Reason  Age                From                     Message
      ----     ------  ----               ----                     -------
      Normal   ADD     22s                loadbalancer-controller  default/test
    

    只要服务存在,Ingress controller就会将提供一个满足该Ingress的特定loadbalancer实现。 这一步完成后,在Ingress的最后一列可以看到loadbalancer的地址。

    基于名称的虚拟主机

    基于名称的虚拟主机支持将 HTTP 流量路由到同一 IP 地址上的多个主机名。

    foo.bar.com --|                 |-> foo.bar.com service1:80
                  | 178.91.123.132  |
    bar.foo.com --|                 |-> bar.foo.com service2:80
    

    下面的 Ingress 让后台的负载均衡器基于 Host header 路由请求。

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: name-virtual-host-ingress
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - backend:
              serviceName: service1
              servicePort: 80
      - host: bar.foo.com
        http:
          paths:
          - backend:
              serviceName: service2
              servicePort: 80
    

    如果请求header中的host不能跟ingress中的host匹配,并且/或请求的URL不能与任何一个path匹配,则流量将路由到默认backend。
    例如,以下Ingress资源会将 first.bar.com 请求的流量路由到 service1,将 second.foo.com 请求的流量路由到 service2, 而所有到IP地址但未在请求中定义主机名的流量流量路由到 service3。

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: name-virtual-host-ingress
    spec:
      rules:
      - host: first.bar.com
        http:
          paths:
          - backend:
              serviceName: service1
              servicePort: 80
      - host: second.foo.com
        http:
          paths:
          - backend:
              serviceName: service2
              servicePort: 80
      - http:
          paths:
          - backend:
              serviceName: service3
              servicePort: 80
    

    TLS

    可以通过指定包含TLS私钥和证书的secret来加密Ingress。 目前,Ingress仅支持单个TLS端口443,并假定TLS termination。 如果Ingress中的TLS配置部分指定了不同的主机,则它们将根据通过SNI TLS扩展指定的主机名(假如Ingress controller支持SNI)在多个相同端口上进行复用。 TLS secret中必须包含名为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中引用这个secret将通知Ingress controller使用TLS加密从将客户端到loadbalancer的channel:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: tls-example-ingress
    spec:
      tls:
      - hosts:
        - sslexample.foo.com
        secretName: testsecret-tls
      rules:
        - host: sslexample.foo.com
          http:
            paths:
            - path: /
              backend:
                serviceName: service1
                servicePort: 80
    

    Ingress controller启动时附带一些适用于所有Ingress的负载平衡策略设置,例如负载均衡算法,后端权重方案等.

    更新 Ingress

    假如你想要向已有的ingress中增加一个新的Host,你可以编辑和更新该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)
    Annotations:
      nginx.ingress.kubernetes.io/rewrite-target:  /
    Events:
      Type     Reason  Age                From                     Message
      ----     ------  ----               ----                     -------
      Normal   ADD     35s                loadbalancer-controller  default/test
    

    编辑yaml:

    $ kubectl edit ingress test
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - backend:
              serviceName: service1
              servicePort: 80
            path: /foo
     (添加一个host)
      - host: bar.baz.com
        http:
          paths:
          - backend:
              serviceName: service2
              servicePort: 80
            path: /foo
    ..
    

    保存它会更新API server中的资源,这会触发ingress controller重新配置loadbalancer。

    $ 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
    

    可以通过 kubectl replace -f 命令调用修改后的 Ingress YAML 文件来获得同样的结果。

  • 相关阅读:
    遇到swiper高度问题
    overflow
    transition过渡规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。
    【记录一个问题】thinkpad x1笔记本,安装ubuntu 16后,拔掉U盘,总是启动到windows,无法启动到ubuntu
    【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录
    golang gin框架中实现一个简单的不是特别精确的秒级限流器
    【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
    【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败
    【解决了一个小问题】golang xorm中使用where id in (xxx),没办法使用参数替换
    【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错
  • 原文地址:https://www.cnblogs.com/aresxin/p/Kubernetes-Ingress.html
Copyright © 2011-2022 走看看