Istio:无法通过HTTP / HTTPS通过网关访问服务

  • 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之外唯一的一个服务和网关)使用不同的子域和differend端口)。它位于默认名称空间中。

$ 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

VirtualService

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
hajunpeng 回答:Istio:无法通过HTTP / HTTPS通过网关访问服务

问题真的很简单而且很愚蠢。我在Istio values.yml中启用了global.k8sIngress.enabled = true。将其更改为false后,所有功能都将开始工作。

,

Istio默认的入口网关在istio-system名称空间中。由于网关选择器的标签搜索范围是当前名称空间,因此您需要在istio-system名称空间中创建它。

  

selector:   一个或多个标签,指示应在其上应用此网关配置的一组特定的Pod / VM。标签搜索的范围仅限于存在资源的配置名称空间。换句话说,网关资源必须与网关工作负载实例位于相同的命名空间中。

此外,由于您正在使用SDS,因此它必须在同一命名空间中具有证书机密,才能加载它。

因此,您需要做的是在istio-system名称空间中也具有证书和网关。

VirtualService可以位于任何名称空间中,但您需要在网关名称前加上namespace/

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tg-app-auth-vs
  namespace: default
spec:
  hosts:
  - www.example.com
  gateways:
  - istio-system/tg-gateway
  http:
  - match:
    - port: 443
    - uri:
        prefix: /api/auth
    rewrite:
      uri: /api
    route:
    - destination:
        host: tg-app-auth

如果您的服务位于与虚拟服务不同的名称空间中,则需要在目标位置指定名称空间,但我建议您始终显式添加名称空间以防止此类错误:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tg-app-auth-vs
  namespace: istio-system
spec:
  hosts:
  - www.example.com
  gateways:
  - istio-system/tg-gateway
  http:
  - match:
    - port: 443
    - uri:
        prefix: /api/auth
    rewrite:
      uri: /api
    route:
    - destination:
        host: tg-app-auth.default.svc.cluster.local

请注意,on istio < 1.3.4 with certificate loading in SDS存在问题,因此您可能需要更新到最新版本1.3

本文链接:https://www.f2er.com/3116958.html

大家都在问