Kubernetes Ingress

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

准备工作

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

使用 Ingress 资源配置入口网关

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

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

  1. 创建一个 Ingress 资源:

    $ kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: istio
      name: ingress
    spec:
      rules:
      - host: httpbin.example.com
        http:
          paths:
          - path: /status
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 8000
    EOF
    

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

  2. 使用 curl 访问 httpbin 服务:

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

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

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

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

下一步

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。例如:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: istio
spec:
  controller: istio.io/ingress-controller
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  ingressClassName: istio
  rules:
  - host: httpbin.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: httpbin
            port:
              number: 8000

清除

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

Zip
$ kubectl delete ingress ingress
$ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!