Kubernetes Ingress

此任务描述如何使用Ingress Resource入口资源将 Istio 配置为在服务网格集群之外公开服务。

准备工作

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

使用Ingress resource配置ingress

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

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

  1. 创建一个 Ingress 资源:

    $ kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: istio
      name: ingress
    spec:
      rules:
      - host: httpbin.example.com
        http:
          paths:
          - path: /status/*
            backend:
              serviceName: httpbin
              servicePort: 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/v1beta1
kind: IngressClass
metadata:
  name: istio
spec:
  controller: istio.io/ingress-controller
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  ingressClassName: istio
  rules:
  - host: httpbin.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: httpbin
          servicePort: 8000

清除

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

Zip
$ kubectl delete ingress ingress
$ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@
这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!