Ingress

    该功能目前处于 beta 状态,意味着:

    • 版本名称包含 beta (例如 v2beta3)。
    • 代码经过了充分测试,启用该功能被认为是安全的。默认情况下被启用。
    • 对整体功能的支持在未来不会被移除,尽管细节上可能会做更改。
    • 在后续的 beta 或稳定版本中,对象的模式、语义可能以不兼容的方式发生变化。当这种情况发生时,我们将提供迁移到下一个版本的说明。这可能需要删除、编辑和重建 API 对象,编辑过程可能需要一些思考。这可能导致依赖该功能的应用程序停机一段时间。
    • 建议仅在非业务关键场景使用该功能,因为在后续版本中可能会发生不兼容的更改。如果您有多个可以独立升级的集群,那么您可能可以放松这个限制。
    • 请尝试使用我们的 beta 版功能,并给出反馈!在它们退出 beta 测试阶段之后,我们将很难去做更多的更改。

    Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

    Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

    为了表达更加清晰,本指南定义了以下术语:

    节点(Node):

    Kubernetes 集群中其中一台工作机器,是集群的一部分。

    集群(Cluster):

    一组运行程序(这些程序是容器化的,被 Kubernetes 管理的)的节点。 在此示例中,和在大多数常见的Kubernetes部署方案,集群中的节点都不会是公共网络。

    边缘路由器(Edge router):

    在集群中强制性执行防火墙策略的路由器(router)。可以是由云提供商管理的网关,也可以是物理硬件。

    集群网络(Cluster network):

    一组逻辑或物理的链接,根据 Kubernetes 网络模型 在集群内实现通信。

    服务(Service):

    Kubernetes 使用 标签用来为对象设置可标识的属性标记;这些标记对用户而言是有意义且重要的。 选择器(selectors)标识的一组 Pod。除非另有说明,否则假定服务只具有在集群网络中可路由的虚拟 IP。

    Ingress 是什么?

    Ingress 公开了从集群外部到集群内 services 的HTTP和HTTPS路由。 流量路由由 Ingress 资源上定义的规则控制。

    可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

    Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或者 类型的服务。

    可以将Ingress配置为提供服务外部可访问的URL,负载均衡流量,终止 SSL / TLS 并提供基于名称的虚拟主机。 Ingress 控制器通常负责通过负载平衡器来实现入口,尽管它也可以配置边缘路由器或其他前端以帮助处理流量。

    Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开给 Internet 时,通常使用以下类型的服务 或者 Service.Type=LoadBalancer.

    环境准备

    您必须具有 ingress 控制器才能满足 Ingress 的要求。仅创建 Ingress 资源无效。

    您可能需要部署 Ingress 控制器,例如 。您可以从许多 Ingress 控制器中进行选择。

    一定要检查一下这个控制器的 。 在 GCE/Google Kubernetes Engine 之外的环境中,需要将控制器部署 为 Pod。

    注意:

    确保您查看了 Ingress 控制器的文档,以了解选择它的注意事项。

    一个最小的 Ingress 资源示例:

    1. apiVersion: networking.k8s.io/v1beta1
    2. kind: Ingress
    3. metadata:
    4. name: test-ingress
    5. annotations:
    6. nginx.ingress.kubernetes.io/rewrite-target: /
    7. spec:
    8. rules:
    9. - http:
    10. paths:
    11. - path: /testpath
    12. backend:
    13. serviceName: test
    14. servicePort: 80

    与所有其他 Kubernetes 资源一样,Ingress 需要使用 apiVersionkindmetadata 字段。 有关使用配置文件的一般信息,请参见、 配置容器、。 Ingress 经常使用注解(annotations)来配置一些选项,具体取决于 Ingress 控制器,例如 rewrite-target annotation。 不同的 支持不同的注解(annotations)。查看文档以供您选择 Ingress 控制器,以了解支持哪些注解(annotations)。

    Ingress 规范 具有配置负载均衡器或者代理服务器所需的所有信息。最重要的是,它包含与所有传入请求匹配的规则列表。Ingress 资源仅支持用于定向 HTTP 流量的规则。

    每个 HTTP 规则都包含以下信息:

    • 可选主机。在此示例中,未指定主机,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。如果提供了主机(例如 foo.bar.com),则规则适用于该主机。
    • 路径列表(例如,/testpath),每个路径都有一个由 serviceNameservicePort 定义的关联后端。在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
    • 后端是中所述的服务和端口名称的组合。与规则的主机和路径匹配的对 Ingress 的HTTP(和HTTPS)请求将发送到列出的后端。

    通常在 Ingress 控制器中配置默认后端,以服务任何不符合规范中路径的请求。

    默认后端

    没有规则的 Ingress 将所有流量发送到单个默认后端。默认后端通常是 的配置选项,并且未在 Ingress 资源中指定。

    如果没有主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。

    Ingress 类型

    现有的 Kubernetes 概念允许您暴露单个 Service (查看替代方案),您也可以通过指定无规则的 默认后端 来对 Ingress 进行此操作。

    如果使用 kubectl apply -f 创建它,则应该能够查看刚刚添加的 Ingress 的状态:

    1. kubectl get ingress test-ingress
    1. NAME HOSTS ADDRESS PORTS AGE
    2. test-ingress * 107.178.254.228 80 59s

    其中 107.178.254.228 是由 Ingress 控制器分配以满足该 Ingress 的 IP。

    简单分列

    一个分列配置根据请求的 HTTP URI 将流量从单个 IP 地址路由到多个服务。 Ingress 允许您将负载均衡器的数量降至最低。例如,这样的设置:

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

    将需要一个 Ingress,例如:

    1. kubectl describe ingress simple-fanout-example
    1. Name: simple-fanout-example
    2. Namespace: default
    3. Address: 178.91.123.132
    4. Default backend: default-http-backend:80 (10.8.2.3:8080)
    5. Rules:
    6. Host Path Backends
    7. ---- ---- --------
    8. /foo service1:4200 (10.8.0.90:4200)
    9. /bar service2:8080 (10.8.0.91:8080)
    10. Annotations:
    11. nginx.ingress.kubernetes.io/rewrite-target: /
    12. Events:
    13. Type Reason Age From Message
    14. ---- ------ ---- ---- -------
    15. Normal ADD 22s loadbalancer-controller default/test

    Ingress 控制器将提供实现特定的负载均衡器来满足 Ingress,只要 Service (s1s2) 存在。 当它这样做了,你会在地址栏看到负载均衡器的地址。

    注意:

    根据您使用的 Ingress 控制器,您可能需要创建默认 HTTP 后端 。

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

    1. | 178.91.123.132 |
    2. bar.foo.com --| |-> bar.foo.com service2:80

    以下 Ingress 让后台负载均衡器基于主机 header 路由请求。

    1. apiVersion: networking.k8s.io/v1beta1
    2. kind: Ingress
    3. metadata:
    4. name: name-virtual-host-ingress
    5. spec:
    6. rules:
    7. - host: foo.bar.com
    8. http:
    9. paths:
    10. - backend:
    11. serviceName: service1
    12. servicePort: 80
    13. - host: bar.foo.com
    14. http:
    15. paths:
    16. - backend:
    17. serviceName: service2
    18. servicePort: 80

    如果您创建的 Ingress 资源没有规则中定义的任何主机,则可以匹配到您 Ingress 控制器 IP 地址的任何网络流量,而无需基于名称的虚拟主机。

    例如,以下 Ingress 资源会将 first.bar.com 请求的流量路由到 service1,将 second.foo.com 请求的流量路由到 service2,而没有在请求中定义主机名的 IP 地址的流量路由(即,不提供请求标头)到 service3

    1. apiVersion: networking.k8s.io/v1beta1
    2. kind: Ingress
    3. metadata:
    4. name: name-virtual-host-ingress
    5. spec:
    6. rules:
    7. - host: first.bar.com
    8. http:
    9. paths:
    10. - backend:
    11. serviceName: service1
    12. servicePort: 80
    13. - host: second.foo.com
    14. http:
    15. paths:
    16. - backend:
    17. serviceName: service2
    18. servicePort: 80
    19. - http:
    20. paths:
    21. - backend:
    22. serviceName: service3
    23. servicePort: 80

    TLS

    您可以通过指定包含 TLS 私钥和证书的 secret SecretSecret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥。 来加密 Ingress。 目前,Ingress 只支持单个 TLS 端口 443,并假定 TLS 终止。

    如果 Ingress 中的 TLS 配置部分指定了不同的主机,那么它们将根据通过 SNI TLS 扩展指定的主机名(如果 Ingress 控制器支持 SNI)在同一端口上进行复用。 TLS Secret 必须包含名为 tls.crttls.key 的密钥,这些密钥包含用于 TLS 的证书和私钥,例如:

    在 Ingress 中引用此 Secret 将会告诉 Ingress 控制器使用 TLS 加密从客户端到负载均衡器的通道。您需要确保创建的 TLS secret 来自包含 sslexample.foo.com 的 CN 的证书。

    1. apiVersion: networking.k8s.io/v1beta1
    2. kind: Ingress
    3. metadata:
    4. name: tls-example-ingress
    5. spec:
    6. tls:
    7. - hosts:
    8. - sslexample.foo.com
    9. - host: sslexample.foo.com
    10. http:
    11. paths:
    12. - path: /
    13. backend:
    14. serviceName: service1
    15. servicePort: 80

    接下来