跳到内容

当启用额外的授权策略时,允许对 Knative 服务的请求

Knative Serving 系统 Pod,例如 activator 和 autoscaler 组件,需要访问您部署的 Knative 服务。如果您配置了额外的安全功能,例如 Istio 的授权策略,则必须允许这些系统 Pod 访问您的 Knative 服务。

准备工作

您必须满足以下先决条件才能使用 Istio AuthorizationPolicy

  • 必须为您的 Knative Ingress 使用 Istio。请参阅 安装网络层
  • 必须启用 Istio sidecar 注入。请参阅 Istio 文档

Knative 中的双向 TLS

由于 Knative 请求经常通过 activator 路由,在使用双向 TLS 时需要考虑一些事项。

Knative request flow

通常,双向 TLS 可以按照 Istio 文档 中的方式正常配置。但是,由于 activator 可能在 Knative 服务的请求路径中,因此必须注入 sidecar。最简单的方法是标记 knative-serving 命名空间

kubectl label namespace knative-serving istio-injection=enabled

如果 activator 未注入

  • 在 PERMISSIVE 模式下,当请求由 activator 转发时,您会发现请求缺少预期的 X-Forwarded-Client-Cert 标头。

    $ kubectl exec deployment/httpbin -c httpbin -it -- curl -s http://httpbin.knative.svc.cluster.local/headers
    {
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "Forwarded": "for=10.72.0.30;proto=http",
        "Host": "httpbin.knative.svc.cluster.local",
        "K-Proxy-Request": "activator",
        "User-Agent": "curl/7.58.0",
        "X-B3-Parentspanid": "b240bdb1c29ae638",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "416960c27be6d484",
        "X-B3-Traceid": "750362ce9d878281b240bdb1c29ae638",
        "X-Envoy-Attempt-Count": "1",
        "X-Envoy-Internal": "true"
      }
    }
    
  • 在 STRICT 模式下,请求将被拒绝。

要了解请求何时通过 activator 转发,请参阅 目标突发容量 文档。

这也意味着许多 Istio AuthorizationPolicies 将无法按预期工作。例如,如果您设置了一个规则,允许来自特定源的请求进入 Knative 服务,当请求由 activator 转发时,您会看到请求被拒绝。

例如,以下策略允许来自 serving-tests 命名空间中 Pod 的请求访问同一命名空间中的其他 Pod。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: allow-serving-tests
 namespace: serving-tests
spec:
 action: ALLOW
 rules:
 - from:
   - source:
      namespaces: ["serving-tests"]

当请求由 activator 转发时,这里的请求将失败,因为目标服务的 Istio 代理会看到请求的源命名空间是 knative-serving,这是 activator 的命名空间。

目前,最简单的解决方法是显式允许来自 knative-serving 命名空间的请求,例如通过将其添加到前面提到的策略的列表中。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: allow-serving-tests
 namespace: serving-tests
spec:
 action: ALLOW
 rules:
 - from:
   - source:
      namespaces: ["serving-tests", "knative-serving"]

健康检查和指标收集

除了允许您的应用程序路径外,您还需要配置 Istio AuthorizationPolicy 以允许系统 Pod 对您的应用程序进行健康检查和指标收集。您可以通过路径允许来自系统 Pod 的访问。

允许来自系统 Pod 的通过路径访问

Knative 系统 Pod 使用以下路径访问您的应用程序

  • /metrics
  • /healthz

/metrics 路径允许 autoscaler Pod 收集指标。/healthz 路径允许系统 Pod 探测服务。

要将 /metrics/healthz 路径添加到 AuthorizationPolicy

  1. 使用以下示例创建一个 YAML 文件作为您的 AuthorizationPolicy

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: allowlist-by-paths
      namespace: serving-tests
    spec:
      action: ALLOW
      rules:
      - to:
        - operation:
            paths:
            - /metrics   # The path to collect metrics by system pod.
            - /healthz   # The path to probe by system pod.
    
  2. 通过运行命令应用 YAML 文件

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。