Istio:无法使用 HTTP/HTTPS 上的网关访问服务
Istio: Can not access service with gateway over 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 在浏览器中访问这些资源。
然后我部署了一个微服务(真实应用程序的一部分)并为其创建了 Service
、VirtualService
和 Gateway
资源(目前它是唯一的一个服务和网关除了使用不同子域和不同端口的 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 return 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 values.yml 中启用了 global.k8sIngress.enabled = true。将其更改为 false 后,所有开始工作。
- 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 在浏览器中访问这些资源。
然后我部署了一个微服务(真实应用程序的一部分)并为其创建了 Service
、VirtualService
和 Gateway
资源(目前它是唯一的一个服务和网关除了使用不同子域和不同端口的 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 return 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 values.yml 中启用了 global.k8sIngress.enabled = true。将其更改为 false 后,所有开始工作。