当前位置: 首页 > 知识库问答 >
问题:

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

朱兴安
2023-03-14

我一直在玩弄我的Istio集群配置,结果我陷入了无法调试的状态。

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

  • helloworld-[rnd]pod和curl localhost:5000/hello执行istio proxy——这很好用
  • 从以下位置使用istioctl proxy config cluster检查https://istio.io/docs/ops/troubleshooting/network-issues/和https://istio.io/docs/ops/troubleshooting/proxy-cmd/-所有人都报告一切正常,同步:ed等
  • 我可以做kubectl exec istio ingresgateway-[rnd]/bin/bash然后curl helloworld。mynamespace:5000/hello成功(它返回hello版本:v2…

但我无法让ingressgateway在查询其公开绑定的IP时实际返回503以外的任何内容。如果我在没有/hello路径的情况下进行查询,它会返回404,因此它显然试图路由到helloworld服务/部署,但失败了。

因此,当我询问Istio入口网关本身curl localhost/hello-I,或者从我们的网络curl-I>时,我实际上可以从Istio入口网关联系我的helloworld服务http://35.x.y.z/hello503服务不可用的情况下,我总能得到回复

我没有任何适用于helloworld的目的规则或策略,我有严格的MTL中的Istio。

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

怎么了?

不相关(我可以说):

  • Kubernetes Istio ingress gateway始终以503响应(我没有clusterIP:无)

共有1个答案

西门庆
2023-03-14

首先,要在SDS gateway中使用curl,您需要按照Istio文档中的描述使用它。

$ 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配置冲突。

您可以使用本节文档中的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是客户服务的一个POD的ID。

有关更多信息,请参阅验证相互TLS配置。

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

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

编辑:

从上一个部署文件helloworld中提供的链接。yaml没有目标端口,这就是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
 类似资料:
  • 问题内容: 我实际上是在阅读有关微服务体系结构的文章, 但是,似乎他们正在以最简单的方式处理这些事情, 而无需进行深入的解释。 为了向您解释我的问题,我将向您展示我的实际小体系结构: 在此处输入图片说明 所以,这就是我要使用的。在技​​术上做任何事情之前,我需要更多的 理论信息。 我的网域描述 我有一些基于移动和浏览器的客户,他们能够在 应用程序上建立联系,获得他们的用户信息,并能够查询 有关所购

  • 我有一个场景,我必须在AWS ECS上部署多个微服务。我想让服务能够通过每个微服务中开发的API相互通信。我想把前端也部署在AWS ECS上,可以公开访问,也可以与其他部署在AWS ECS上的微服务通信。我怎样才能做到这一点呢?我是否可以使用AWS ECS服务发现,将所有服务都放在一个专用子网中,以启用每个服务之间的通信?我可以使用弹性负载均衡器使前端微服务仅通过HTTP/HTTPS协议在inte

  • 问题内容: 我有问题,同时了解和SQL Server中的运营商。 考虑以下示例查询,它们在各自的输出中具有不同的行为: 第一个查询将提供所需的输出,即选择那些具有值的记录。但是第二个查询将导致匹配记录为零。 请根据优缺点说明这些运算符的不同用法。 编辑 在这里,大多数答案都声称不适用于,但是以下语句将与和一起使用。 这将提供与具有操作符的语句相同的结果。 问题答案: 没有什么等于。 甚至不等于。

  • 我有一个由两个Symfony应用程序使用的库,该库定义了一组我希望公开的服务(我希望能够通过容器直接检索这些服务)。当我尝试访问一个服务时,我有: 编译容器时,已删除或内联库\Service\DerivedServices\OneSpecific实现"服务或别名。您应该将其公开,或者直接停止使用容器,转而使用依赖注入。 问题是,所述服务是公开的。 基本上有: 一个库\服务\BaseService类

  • 我正在aws中运行openshift 我有一个主节点和两个节点。如何向aws公共IP公开服务?我可以在内部访问服务: 我怎么把它暴露给公共IP呢?是否可以在openshfit web控制台中完成?我尝试使用https://docs.openshift.com/container-platform/3.4/dev_guide/expose_service/expose_internal_ip_ser

  • 使用ws,Node.js WebSocket库,可以让多个服务器共享一个HTTP/S服务器。 有可能用socket.io做同样的事情吗?