跳至内容

在启用其他授权策略时启用对 Knative 服务的请求

Knative Serving 系统 Pod(如激活器和自动缩放器组件)需要访问您部署的 Knative 服务。如果您已配置其他安全功能(如 Istio 的授权策略),则必须为这些系统 Pod 启用对 Knative 服务的访问。

开始之前

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

Knative 中的双向 TLS

由于 Knative 请求经常通过激活器路由,因此在使用双向 TLS 时需要考虑一些因素。

Knative request flow

通常,双向 TLS 可以像Istio 文档中那样正常配置。但是,由于激活器可能位于 Knative 服务的请求路径中,因此它必须注入侧车。最简单的方法是标记 knative-serving 命名空间

kubectl label namespace knative-serving istio-injection=enabled

如果激活器未注入

  • 在 PERMISSIVE 模式下,您将看到请求出现,但没有预期的 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 模式下,请求将被直接拒绝。

要了解何时通过激活器转发请求,请参见目标突发容量 文档。

这也意味着许多 Istio AuthorizationPolicies 不会按预期工作。例如,如果您设置了一条规则,允许来自特定来源的请求进入 Knative 服务,那么如果您通过激活器转发这些请求,您将看到请求被拒绝。

例如,以下策略允许来自 serving-tests 命名空间中的 Pod 内部的请求到 serving-tests 命名空间中的其他 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"]

当通过激活器转发时,此处的请求将失败,因为目标服务的 Istio 代理会将请求的源命名空间视为 knative-serving,这是激活器的命名空间。

目前,最简单的解决方法是明确允许来自 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 路径允许自动缩放器 Pod 收集指标。/healthz 路径允许系统 Pod 探测服务。

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

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

    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 共享,以用于该目的。 了解更多.