Kubernetes Ingress

本任务介绍如何使用 Kubernetes Ingress 资源将 Istio 配置为在服务网格集群外部公开服务。

开始之前

请按照 开始之前确定入口 IP 和端口 部分中的说明进行操作 Ingress 网关任务

使用 Ingress 资源配置入口

Kubernetes Ingress 资源 将来自集群外部的 HTTP 和 HTTPS 路由暴露给集群内的服务。

让我们看看如何为 HTTP 流量在端口 80 上配置 Ingress

  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 标头设置为“httpbin.example.com”。这是必要的,因为Ingress配置为处理“httpbin.example.com”,但在您的测试环境中,您没有该主机的 DNS 绑定,只是将您的请求发送到入口 IP。

  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服务

压缩
$ kubectl delete ingress ingress
$ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@
这些信息有用吗?
您对改进有什么建议吗?

感谢您的反馈!