我在服务网格上有此配置:
这是gw和yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: http-gateway
spec:
selector:
istio: ingressgateway # Specify the ingressgateway created for us
servers:
- port:
number: 80 # Service port to watch
name: http-gateway
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: simple-web
spec:
gateways:
- http-gateway
hosts:
- '*'
http:
- match:
- uri:
prefix: /simple-web
rewrite:
uri: /
route:
- destination:
host: simple-web
port:
number: 8080
vs和gw都在同一个命名空间中。 部署已创建并通过以下命令公开:
k create deployment --image=yeasy/simple-web:latest simple-web
k expose deployment simple-web --port=8080 --target-port=80 --name=simple-web
我得到了k个吊舱:
pod/simple-web-9ffc59b4b-n9f85 2/2 Running
发生的事情是,从外部指向入口网关负载平衡器,我收到503 HTTP错误。 如果我尝试从Ingressgateway Pod卷曲,则可以访问简单Web服务。 为什么启用了mTLS的网站无法访问网站?什么是正确的配置?
答案 0 :(得分:1)
正如@suren在他的回答中提到的,此问题在istio版本1.3.2中不存在。因此,解决方案之一就是使用较新的版本。
如果您选择将istio升级到较新的版本,请查阅文档1.3 Upgrade Notice和Upgrade Steps,因为Istio仍在开发中,并且每个版本都有很大的变化。
正如@Manuel Castro的评论中所提到的,这很可能是Avoid 503 errors while reconfiguring service routes中解决的问题,而较新的版本则可以更好地解决这些问题。
同时创建VirtualServices和DestinationRules来定义 使用单个kubectl调用对应的子集(例如,kubectl apply -f myVirtualServiceAndDestinationRule.yaml是不够的,因为资源(从配置服务器(即, Kubernetes API服务器)到最终的Pilot实例 一致的方式。如果使用子集的VirtualService到达 在定义子集的DestinationRule之前,特使 Pilot生成的配置将引用不存在的上游 池。这会导致HTTP 503错误,直到所有配置对象 可供飞行员使用。
应该可以通过在部署期间暂时禁用mTLS
或使用permissive mode
来避免此问题。
答案 1 :(得分:0)
我刚刚安装了istio-1.3.2和k8s 1.15.1,以重现您的问题,它无需任何修改即可工作。这就是我所做的:
0.-创建一个名为istio
的命名空间,并自动启用sidecar注入。
1.- $ kubectl run nginx --image nginx -n istio
2.- $ kubectl expose deploy nginx --port 8080 --target-port 80 --name simple-web -n istio
3.- $kubectl craete -f gw.yaml -f vs.yaml
注意:这些是您的文件。
测试:
$ curl a.b.c.d:31380/simple-web -I
HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 11 Oct 2019 10:04:26 GMT
content-type: text/html
content-length: 612
last-modified: Tue, 24 Sep 2019 14:49:10 GMT
etag: "5d8a2ce6-264"
accept-ranges: bytes
x-envoy-upstream-service-time: 4
[2019-10-11T10:04:26.101Z] "HEAD /simple-web HTTP/1.1" 200 - "-" "-" 0 0 6 4 "10.132.0.36" "curl/7.52.1" "4bbc2609-a928-9f79-9ae8-d6a3e32217d7" "a.b.c.d:31380" "192.168.171.73:80" outbound|8080||simple-web.istio.svc.cluster.local - 192.168.171.86:80 10.132.0.36:37078 - -
并且要确保启用了mTLS,这是从ingress-gateway describe命令:
--controlPlaneAuthPolicy
MUTUAL_TLS
所以,我不知道出什么问题了,但是您可能需要执行以下步骤并丢弃东西。
注意:之所以要在端口31380上攻击istio网关,是因为我的k8目前在VM上,并且我不想启动GKE集群进行测试。
编辑
只需使用您的映像部署另一个部署,将其公开为simple-web-2,然后再次工作。也许我对istio很幸运:
$ curl a.b.c.d:31380/simple-web -I
HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 11 Oct 2019 10:28:45 GMT
content-type: text/html
content-length: 354
last-modified: Fri, 11 Oct 2019 10:28:46 GMT
x-envoy-upstream-service-time: 4
[2019-10-11T10:28:46.400Z] "HEAD /simple-web HTTP/1.1" 200 - "-" "-" 0 0 5 4 "10.132.0.36" "curl/7.52.1" "df0dd00a-875a-9ae6-bd48-acd8be1cc784" "a.b.c.d:31380" "192.168.171.65:80" outbound|8080||simple-web-2.istio.svc.cluster.local - 192.168.171.86:80 10.132.0.36:42980 - -
您的k8s环境是什么?
EDIT2
# istioctl authn tls-check curler-6885d9fd97-vzszs simple-web.istio.svc.cluster.local -n istio
HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE
simple-web.istio.svc.cluster.local:8080 OK mTLS mTLS default/ default/istio-system