我们正在将现有的 k8s 服务转换为使用 istio 和 knative。这些服务接收来自外部用户以及集群内部的请求。我们正在尝试设置 IstioAuthorizationPolicy
以实现以下要求:
- 某些路径(如 docs/healthchecks)不需要任何特殊的标头或任何东西,并且必须可以从任何地方访问
- knative 需要访问的健康和指标收集路径必须只能由 knative 控制器访问
- 来自集群外部的任何请求(
knative-serving/knative-ingress-gateway
基本上通过)必须包含与预共享密钥匹配的密钥标头 - 来自集群内任何服务的任何请求都可以访问所有路径
以下是我正在尝试的示例。我能够满足前 3 个要求,但不能满足最后一个要求...
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: my-svc
namespace: my-ns
spec:
selector:
matchLabels:
serving.knative.dev/service: my-svc
action: "ALLOW"
rules:
- to:
- operation:
methods:
- "GET"
paths:
- "/docs"
- "/openapi.json"
- "/redoc"
- "/rest/v1/healthz"
- to:
- operation:
methods:
- "GET"
paths:
- "/healthz*"
- "/metrics*"
when:
- key: "request.headers[User-Agent]"
values:
- "Knative-Activator-Probe"
- "Go-http-client/1.1"
- to:
- operation:
paths:
- "/rest/v1/myapp*"
when:
- key: "request.headers[my-key]"
values:
- "asjhfhjgdhjsfgjhdgsfjh"
- from:
- source:
namespaces:
- "*"
我们没有对 istio-knative 设置默认提供的 mTLS 配置进行任何更改,因此假设当前 mtls 模式为PERMISSIVE
.
涉及的技术堆栈的详细信息
- AWS EKS - 版本 1.21
- Knative Serving - 1.1 版(使用 Istio 1.11.5)