K8s + Istio + Firefox硬刷新。在其他服务上访问服务原因404,直到访问了其他服务

时间:2020-04-19 08:25:46

标签: firefox kubernetes http-status-code-404 istio

在这里学习k8s + istio。我用kops设置了2个节点+ 1个主群集。我有Istio作为入口控制器。我正在尝试为虚拟Nginx服务设置OIDC身份验证。我遇到了一个超级奇怪的错误,我不知道它来自哪里。

所以,我有一个

  1. 密钥斗篷服务
  2. Nginx服务

keycloak服务在keycloak.example.com上运行 nginx服务在example.com

上运行

AWS上有一个经典ELB可以提供服务。 有Route53 DNS记录用于

ALIAS example.com          dualstack.awdoijawdij.amazonaws.com
ALIAS keycloak.example.com dualstack.awdoijawdij.amazonaws.com

当我设置密钥斗篷服务时,只有该服务,我没有问题。但是,当我添加了虚拟的nginx服务时,我开始得到它。

我将使用firefox转到keycloak.example.com,并获取404。如果我进行硬刷新,则会加载页面。

然后我将转到example.com,并得到404。如果我进行硬刷新,则会加载页面。

如果我在一页上进行硬刷新,那么当我转到另一页上时,我将不得不进行硬重装或得到404。这就像某些DNS条目在每次执行时在这两种情况之间切换一样硬刷新。我不知道如何调试它。

如果我

  • wget -O- example.com正如预期的那样,我有一个301 redirecthttps://example.com
  • wget -O- https://example.com我的期望值是200 OK
  • wget -O- keycloak.example.com正如预期的那样,我有一个301 redirecthttps://keycloak.example.com
  • wget -O- https://keycloak.example.com我的期望值是200 OK

然后一切都很好。看来问题只出现在浏览器中。

我尝试以隐身模式打开页面,但问题仍然存在。

有人可以帮我调试吗?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      name: http
      protocol: TCP
  selector:
    app: nginx
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: nginx-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      tls:
        httpsRedirect: true
      hosts:
        - "example.com"
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: ingress-cert
      hosts:
        - "example.com"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: nginx
spec:
  hosts:
    - "example.com"
  gateways:
    - nginx-gateway
  http:
    - route:
        - destination:
            port:
              number: 80
            host: nginx
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: keycloak-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      tls:
        httpsRedirect: true
      hosts:
        - "keycloak.example.com"
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: ingress-cert
      hosts:
        - "keycloak.example.com"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: keycloak
spec:
  hosts:
    - "keycloak.example.com"
  gateways:
    - keycloak-gateway
  http:
    - route:
        - destination:
            port:
              number: 80
            host: keycloak-http

1 个答案:

答案 0 :(得分:2)

问题是我为两个网关使用了相同的证书,因此导致两个服务保持相同的tcp连接。

这里https://github.com/istio/istio/issues/9429

有关于它的讨论

通过对两个网关端口使用不同的证书,问题消失了