在全局启用istio和mTLS的情况下公开虚拟服务

时间:2019-10-11 08:47:33

标签: kubernetes istio envoyproxy

我在服务网格上有此配置:

  • 全局启用了mTLS,默认启用了网格策略
  • 简单网络部署在端口8080上显示为clusterip
  • 用于端口80和我的服务上的虚拟服务路由的http网关

这是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的网站无法访问网站?什么是正确的配置?

2 个答案:

答案 0 :(得分:1)

正如@suren在他的回答中提到的,此问题在istio版本1.3.2中不存在。因此,解决方案之一就是使用较新的版本。

如果您选择将istio升级到较新的版本,请查阅文档1.3 Upgrade NoticeUpgrade 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