4.3 KiB
| title | description | weight | keywords | owner | test | ||
|---|---|---|---|---|---|---|---|
| Kubernetes Ingress | 展示如何配置Kubernetes Ingress对象,使得从服务网格外部可以访问网格内服务。 | 40 |
|
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流量。
-
创建一个
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,否则它将被忽略。 - host: httpbin.example.com
http:
paths:
-
使用 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绑定。 -
访问未显式公开的其他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 。这允许将路径明确声明为Exact 或 Prefix。
指定 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 >}}