(公共)网关和服务之间的Istio 503:s

时间:2019-10-22 17:39:08

标签: google-kubernetes-engine istio

我一直在研究Istio群集配置,最终陷入无法调试的状态。

我有配置了公共IP的SDS + Gateway。我已经在端口5000上部署了Istio HelloWorld应用程序。我可以:

但是当查询其公共绑定的IP时,我无法使Ingressgateway实际上返回除503以外的任何内容。如果我查询的时候没有/hello路径,它将返回404,因此显然是在尝试路由到helloworld服务/部署并失败。

因此,当我问网关本身helloworld或从我们的网络curl localhost/hello -i进入网关时,我实际上可以从Istio Ingress网关联系我的curl -i http://35.x.y.z/hello服务总是得到503 Service Unavailable Back

我没有适用于helloworld的DestinationRule或政策,而且我的Istio具有严格的mTLS。

我以前可以今天通过入口网关访问(其他)服务,但是后来我开始清理工作(直到我只拥有helloworld服务VirtualService + Gateway而没有其他服务),现在它不起作用。应该可以进行调试。

怎么了?

不相关(我可以告诉你):

1 个答案:

答案 0 :(得分:2)

首先将curl与SDS网关一起使用,您需要按照Istio documentation中的说明使用它。

$ curl -v -HHost:httpbin.example.com \
--resolve httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST \
--cacert httpbin.new.example.com/2_intermediate/certs/ca-chain.cert.pem \
https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418
...
HTTP/2 418
...
-=[ teapot ]=-

   _...._
 .'  _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
  |       ;/
  \_     _/
    `"""`

其次,根据Istio文档,使用严格的mTLS(相互TLS)身份验证策略要求这两种服务都必须运行TLS通信。在您的情况下,您正在尝试使用使用TLS的Istio访问纯文本(HTTP)服务。这会导致相互TLS配置冲突。

您可以在文档的this部分中使用istioctl命令进行验证:

  

istioctl命令为此提供了一个选项。您可以这样做:

$ istioctl authn tls-check $CLIENT_POD httpbin.default.svc.cluster.local
HOST:PORT                                  STATUS     SERVER     CLIENT     AUTHN POLICY        DESTINATION RULE
httpbin.default.svc.cluster.local:8000     OK         mTLS       mTLS       default/            default/istio-system
     

$CLIENT_POD是其中一个客户服务吊舱的ID。

     

有关更多信息,请参见Verify mutual TLS configuration

要解决此问题,必须为此服务关闭mTLS,以便Istio接受从纯文本到TLS服务的连接。请遵循此guide创建目标规则,该规则允许指定服务的非TLS通信

要确认这是导致此问题的原因,可以临时启用Permissive模式。


编辑:

在您上一个部署文件helloworld.yaml中提供的链接中,没有targetPort,这就是nginx无法访问的原因。

这是它的外观:

apiVersion: v1
kind: Service
metadata:
  name: helloworld
  labels:
    app: helloworld
spec:
  ports:
  - port: 5000
    name: http
    targetPort: 80
  selector:
    app: helloworld
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-v1
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v1
  template:
    metadata:
      labels:
        app: helloworld
        version: v1
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: helloworld
        image: docker.io/istio/examples-helloworld-v1
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: IfNotPresent #Always
        ports:
        - containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-v2
  labels:
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v2
  template:
    metadata:
      labels:
        app: helloworld
        version: v2
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: helloworld
        image: docker.io/istio/examples-helloworld-v2
        resources:
          requests:
            cpu: "100m"
        imagePullPolicy: IfNotPresent #Always
        ports:
        - containerPort: 5000