【问题标题】:Istio: Can not access service with gateway over HTTP/HTTPSIstio:无法通过 HTTP/HTTPS 访问网关服务
【发布时间】:2020-03-08 05:47:54
【问题描述】:
  • Istio:1.3(在更新到 1.3 之前也尝试过 1.1)
  • K8s:1.16.2
  • 云提供商:DigitalOcean

我有一个使用 Istio 的集群设置。我启用了 grafana/kiali 并安装了 kibana 和 RabbitMQ 管理 UI,对于所有这些,我配置了网关和虚拟服务(全部在 istio-system 命名空间中)以及使用 SDS 和 cert-manager 的 HTTPS,一切正常。这意味着我可以通过带有子域的 HTTPS 在浏览器中访问这些资源。

然后我部署了一个微服务(真实应用程序的一部分)并为其创建了ServiceVirtualServiceGateway 资源(目前它是除了rabbitmq 之外唯一的一个服务和网关,它使用不同的子域和不同的端口)。它位于默认命名空间中。

$ kubectl get gateway

NAME             AGE
gateway-rabbit   131m
tg-gateway       45m

$ kubectl get po

NAME                           READY     STATUS    RESTARTS   AGE
rabbit-rabbitmq-0              2/2       Running   2          134m
tg-app-auth-79c578b94f-mqsz9   2/2       Running   0          46m

如果我尝试使用端口转发连接到我的服务,我可以从localhost:8000/api/me 获得成功响应(还有 healthz,readyz 都返回 200 并且 pod 有 0 次重启)所以它工作正常。

kubectl port-forward $(kubectl get pod --selector="app=tg-app-auth" --output jsonpath='{.items[0].metadata.name}') 8000:8000

但我无法通过 HTTP 和 HTTPS 访问它。我使用 HTTP 得到 404,使用 HTTPS 得到以下响应:

*   Trying MYIP...
* TCP_NODELAY set
* Connected to example.com (MYIP) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.example.com:443 
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.example.com:443

这是我的 yaml 文件:

网关:

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:
  name: tg-gateway
  namespace: default

spec:
  selector:
    istio: ingressgateway

  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - www.example.com
    tls:
      httpsRedirect: true
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - www.example.com
    tls:
      mode: SIMPLE
      serverCertificate: sds
      privateKey: sds
      credentialName: tg-certificate

服务:

apiVersion: v1

kind: Service

metadata:
  name: tg-app-auth
  namespace: default
  labels:
    app: tg-app-auth

spec:
  selector:
    app: tg-app-auth

  ports:
  - name: http
    port: 8000

虚拟服务

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:
  name: tg-app-auth-vs
  namespace: default

spec:
  hosts:
  - www.example.com

  gateways:
  - tg-gateway

  http:
  - match:
    - port: 443
    - uri:
        prefix: /api/auth
    rewrite:
      uri: /api
    route:
    - destination:
        host: tg-app-auth
        port:
          number: 8000

---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tg-app-auth-dr
  namespace: default
spec:
  host: tg-app-auth
  trafficPolicy:
    tls:
      mode: DISABLE

我尝试删除所有 HTTPS 和 TLS 详细信息并仅使用 HTTP 进行配置,但仍然无法获得任何响应。我阅读了 github 上的所有问题,但没有任何帮助,而且似乎我犯了一个非常愚蠢的错误。所有这些配置都与我对 grafana/kibana/kiali/rabbit 的配置几乎相同,并且都可以正常工作。

UPD:试图得到响应,它也可以正常工作,但我不能 从 LB IP 或域获取响应

kubectl exec $(kubectl get pod --selector app=tg-app-auth --output jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl -v http://$(kubectl get endpoints tg-app-auth -o jsonpath='{.subsets[0].addresses[0].ip}'):8000/api/me
$ kubectl get endpoints tg-app-auth

NAME          ENDPOINTS          AGE
tg-app-auth   10.244.0.37:8000   22h

UPD

所有状态都正常。还有很多不同的端口,但我只复制了 80/443。

$ istioctl authn tls-check <pod_name>

cert-manager-webhook.istio-system.svc.cluster.local:443 
istio-galley.istio-system.svc.cluster.local:443
istio-ingressgateway.istio-system.svc.cluster.local:80
istio-ingressgateway.istio-system.svc.cluster.local:443
istio-sidecar-injector.istio-system.svc.cluster.local:443
kubernetes.default.svc.cluster.local:443
$ kubectl get ingress --all-namespaces
No resources found.

$ kubectl get gateways --all-namespaces

default        gateway-rabbit                    3d2h
default        tg-gateway                        17h
istio-system   gateway-grafana                   3d2h
istio-system   gateway-kiali                     3d2h
istio-system   istio-autogenerated-k8s-ingress   3d2h
logging        gateway-kibana                    3d2h

【问题讨论】:

  • 你可以尝试在 istio-namespace 中创建网关、vs、sv 和目标规则,就像使用 kibana、rabbitmq 一样?想知道那是否有效,或者我们必须寻找其他地方,对我来说,yamls 看起来不错,我在这里看不到任何错误。
  • 感谢您的回复!接下来的情况是:如果我们按原样移动所有内容(仅更改命名空间),结果是相同的,如果我们将 HTTPS 端口从 443 更改为 31400(在 istio gateway/values.yml 配置中呈现的非标准),它会启动在职的!在 HTTP 上,我总是得到 404(重定向到 HTTPS 不起作用,将端口从 80 更改为 31400 也不起作用)。我将所有内容从 istio-system 移回默认值,但保留 31400 端口而不是 443,它的行为方式也与 istio-system 相同。太奇怪了。接下来我们应该尝试什么?
  • 你能告诉我为什么你使用tls: mode: SIMPLE serverCertificate: sds privateKey: sds credentialName: tg-certificate然后trafficPolicy: tls: mode: DISABLE,就像你创建tls然后在目标规则中禁用它,也许这就是问题所在?你能检查一下 istio ingress-gateway 是否在监听 443 端口吗?
  • 哦,这是我试图让它发挥作用的实验之一。无论如何,无论有没有这个目标规则(以及启用/禁用的 trafficPolicy),我们都有相同的行为。是的,istio-ingressgateway 正在监听 443(80:31380/TCP,443:31390/TCP,31400:31400/TCP 等)
  • 1.你使用nodeport还是loadbalancer? 2.是kubeadm吧? 3.你有没有像there这样导出主机和端口,当你回显主机和端口时一切正常? 4.您是否在默认命名空间上启用了 sidecar 注入? 5. 您是否在默认命名空间中创建了秘密? The secret must be named istio-ingressgateway-certs in the istio-system namespace to align with the configuration of the Istio default ingress gateway used in this task.

标签: ssl kubernetes digital-ocean istio


【解决方案1】:

问题非常简单和愚蠢。我在 Istio values.yml 中启用了 global.k8sIngress.enabled = true。将其更改为 false 后,一切都开始工作了。

【讨论】:

  • 我有一个类似的问题 - http/80 工作正常,但 https/443 不是 - 你知道为什么将其更改为 false 有效吗?它有什么作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2017-12-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多