Kubernetes Ingress

此任务描述如何使用 Kubernetes Ingress 为 Istio 配置入口网关以暴露服务网格集群内的服务。

建议使用 Gateway 而不是 Ingress 来利用 Istio 提供的完整功能集,例如丰富的流量管理和安全功能。

准备工作

请按照入口网关任务中的准备工作确定 Ingress IP 和端口的说明进行操作。

使用 Ingress 资源配置入口网关

Kubernetes Ingress 公开了从集群外到集群内服务的 HTTP 和 HTTPS 路由。

让我们看看如何在端口 80 上配置 Ingress 以实现 HTTP 流量。

  1. 创建一个 Ingress 资源:

    1. $ kubectl apply -f - <<EOF
    2. apiVersion: networking.k8s.io/v1
    3. kind: Ingress
    4. metadata:
    5. annotations:
    6. kubernetes.io/ingress.class: istio
    7. name: ingress
    8. spec:
    9. rules:
    10. - host: httpbin.example.com
    11. http:
    12. paths:
    13. - path: /status
    14. pathType: Prefix
    15. backend:
    16. service:
    17. name: httpbin
    18. port:
    19. number: 8000
    20. EOF

    需要使用 kubernetes.io/ingress.class 注解来告知 Istio 网关控制器它应该处理此 Ingress,否则它将被忽略。

  2. 使用 curl 访问 httpbin 服务:

    1. $ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200"
    2. HTTP/1.1 200 OK
    3. server: istio-envoy
    4. ...

    注意,您需要使用 -H 标志将 Host 的 HTTP header 设置为 “httpbin.example.com”,因为 Ingress 中已经配置为处理访问 “httpbin.example.com” 的请求,但是在测试环境中,该 host 并没有相应的 DNS 绑定。

  3. 访问未显式公开的其他 URL 时,将返回 HTTP 404 错误:

    1. $ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/headers"
    2. HTTP/1.1 404 Not Found
    3. ...

下一步

TLS

Ingress 支持指定 TLS 设置。Istio 支持此功能,但是引用的 Secret 必须存在于 istio-ingressgateway 部署的命名空间(通常是 istio-system)中。cert-manager 可用于生成这些证书。

指定路径类型

Istio 默认路径类型为精确匹配,除非路径以 /*.* 结尾,在这种情况下,路径类型为前缀匹配。不支持其他正则表达式。

在 Kubernetes 1.18 中,添加了一个新字段 pathType。这允许将路径明确声明为 ExactPrefix

指定 IngressClass

在 Kubernetes 1.18 中,添加了新资源 IngressClass,以替换 Ingress 资源上的 kubernetes.io/ingress.class 注解。如果使用此资源,则需要将 controller 字段设置为 istio.io/ingress-controller。例如:

  1. apiVersion: networking.k8s.io/v1
  2. kind: IngressClass
  3. metadata:
  4. name: istio
  5. spec:
  6. controller: istio.io/ingress-controller
  7. ---
  8. apiVersion: networking.k8s.io/v1
  9. kind: Ingress
  10. metadata:
  11. name: ingress
  12. spec:
  13. ingressClassName: istio
  14. rules:
  15. - host: httpbin.example.com
  16. http:
  17. paths:
  18. - path: /
  19. pathType: Prefix
  20. backend:
  21. service:
  22. name: httpbin
  23. port:
  24. number: 8000

清除

删除 Ingress 配置,然后关闭 httpbin 服务:

Zip

  1. $ kubectl delete ingress ingress
  2. $ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@