我一直在研究Istio群集配置,最终陷入无法调试的状态。
我有配置了公共IP的SDS + Gateway。我已经在端口5000上部署了Istio HelloWorld应用程序。我可以:
istio-proxy
窗格和helloworld-[rnd]
上的curl localhost:5000/hello
-很好istioctl proxy-config cluster
(等等)进行检查-都向SYNC:ed等所有事物报告OK kubectl exec istio-ingressgateway-[rnd] /bin/bash
,然后成功完成curl helloworld.mynamespace:5000/hello
(它返回Hello version: v2 ...
但是当查询其公共绑定的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而没有其他服务),现在它不起作用。应该可以进行调试。
怎么了?
不相关(我可以告诉你):
k exec -c istio-proxy helloworld-[rnd] -- curl http://localhost:15000/logging?level=true
之后,istio-proxy
特使根本没有收到来自istio-ingressgateway
的任何呼叫;与这个问题不同,流量从未离开入口Pod) 答案 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