istio.io/content/zh/docs/tasks/traffic-management/ingress/kubernetes-ingress/index.md

4.3 KiB
Raw Blame History

title description weight keywords owner test
Kubernetes Ingress 展示如何配置Kubernetes Ingress对象使得从服务网格外部可以访问网格内服务。 40
traffic-management
ingress
istio/wg-networking-maintainers yes

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

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

准备工作

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

使用Ingress resource配置ingress

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

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

  1. 创建一个 Ingress 资源:

    {{< text bash >}} $ 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 {{< /text >}}

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

  2. 使用 curl 访问 httpbin 服务:

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

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

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

    {{< text bash >}} $ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/headers" HTTP/1.1 404 Not Found ... {{< /text >}}

下一步

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

{{< text yaml >}} 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 {{< /text >}}

清除

删除 Ingress 配置,然后关闭 [httpbin]({{< github_tree >}}/samples/httpbin)服务:

{{< text bash >}} $ kubectl delete ingress ingress $ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@ {{< /text >}}