GKE 入口;将重写应用于特定服务

GKE ingress; apply rewrite to specific service

鉴于此 yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress-2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
          serviceName: admin
          servicePort: 8080
        path: /admin/*
        pathType: ImplementationSpecific
      - backend:
          serviceName: keycloak
          servicePort: 8080
        path: /auth/*
        pathType: ImplementationSpecific

我希望 rewrite-target 仅适用于服务 admin。对 keycloak 的请求不应受到影响。我怎样才能做到这一点?

你可以分离出入口文件或配置,只要确保你保持不同的名称

所以你可以创建 两个 入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
          serviceName: admin
          servicePort: 8080
        path: /admin/*
        pathType: ImplementationSpecific

Ingress: 2 使用不同的配置,您可以根据需要编辑任何内容,现在删除注释。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress-2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
          serviceName: keycloak
          servicePort: 8080
        path: /auth/*
        pathType: ImplementationSpecific

如果您想将所有内容存储在一个 YAML 文件中,您也可以通过将它们与 --- 合并来实现。

用户Harsh Manvar的回答很好,给出了正确的解决方案。但我会稍微扩展一下并告诉你原因。始终创建尽可能少相互依赖的部署。例如,如果您需要更改 keycloak 中的某些内容,它不应该对 admin 产生任何影响。此外,如果入口发生故障,您将有 2 个损坏的服务,而不是一个。实际上,您应该始终为一项服务创建一个入口。

此外,您可能想要创建完全不同的重写规则。那么,创建单独的入口将是一个很好的主意。看看this question.

另请参阅 documentation 关于重写规则。