本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

跟踪快速入门

本节介绍如何为策略服务器启用跟踪支持。

在继续之前,请确保您已完成本文档的前一个 OpenTelemetry 部分。这是本节正常工作所必需的。

跟踪让您收集有关策略评估的详细信息。它可以帮助您调试 SUSE Security Admission Controller 部署和策略中的问题。

您使用 Jaeger — 来接收、存储和可视化跟踪事件。

安装 Jaeger

您使用 Jaeger Operator 来管理所有不同的 Jaeger 组件。您可以使用 Helm 图表安装 Jaeger Operator。

在撰写本文时(2022-06-21),只有特定版本的 Jaeger 与 Cert Manager 兼容,https://github.com/jaegertracing/helm-charts/blob/main/charts/jaeger-operator/COMPATIBILITY.md[请参阅兼容性图表]。

要安装 Helm 图表:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade -i --wait \
  --namespace jaeger \
  --create-namespace \
  --version 2.49.0 \
  jaeger-operator jaegertracing/jaeger-operator \
  --set rbac.clusterRole=true

这*不适合生产部署*。您应该查阅 Jaeger 的 官方文档

要创建 Jaeger 资源:

kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: my-open-telemetry
  namespace: jaeger
spec: {}
EOF

在创建 Jaeger Operator 资源后,您在 my-open-telemetry-collector.jaeger.svc.cluster.local 下有一个服务。Jaeger 查询 UI 由 my-open-telemetry-query 服务在 jaeger 名称空间中公开。

安装 Admission Controller

现在您可以按照通常的方式继续部署 Admission Controller。

cert-manager 是 OpenTelemetry 的要求,但您已经在本文档的前一部分中安装了它。

作为第一步,您添加包含 Admission Controller 的 Helm 储存库:

helm repo add kubewarden https://charts.kubewarden.io

然后您安装由 Admission Controller 定义的自定义资源定义(CRDs):

helm install --wait \
  --namespace kubewarden \
  --create-namespace \
  kubewarden-crds kubewarden/kubewarden-crds

现在您可以部署其余的 Admission Controller 堆栈。官方的 kubewarden-defaults helm 图表创建一个名为 default 的 PolicyServer。您希望此 PolicyServer 实例启用跟踪。

为此,您需要为 kubewarden-controller 图表指定一些额外的值。您应该创建一个 values.yaml 文件,包含以下内容:

telemetry:
  mode: sidecar
  tracing: True
  sidecar:
    tracing:
      jaeger:
        endpoint: "my-open-telemetry-collector.jaeger.svc.cluster.local:4317"
        tls:
          insecure: true

为了简单起见,OpenTelemetry 收集器与 Jaeger 端点之间的通信没有加密。

再一次,这对生产部署来说是 不合适的。请参考 Jaeger 的 官方文档

然后您可以继续安装 helm 图表:

helm install --wait --namespace kubewarden --create-namespace \
  --values values.yaml \
  kubewarden-controller kubewarden/kubewarden-controller

helm install --wait --namespace kubewarden --create-namespace \
  kubewarden-defaults kubewarden/kubewarden-defaults

这会创建 PolicyServerdefault 实例:

kubectl get policyservers.policies.kubewarden.io
NAME      AGE
default   3m7s

仔细查看运行 PolicyServer 实例的 Pod,您会看到它有两个容器。policy-server 和 OpenTelemetry Collector 边车 otc-container

强制执行策略

您首先通过部署 安全标签 策略开始。

您希望仅在具有标签 environment 且值为 production 的名称空间中强制执行该策略。

对于具有此类标签的名称空间:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-prod
  labels:
    environment: production
EOF

接下来,您可以定义一个ClusterAdmissionPolicy:

kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: safe-labels
spec:
  module: registry://ghcr.io/kubewarden/policies/safe-labels:v0.1.6
  settings:
    mandatory_labels:
    - owner
  rules:
    - apiGroups:
        - apps
      apiVersions:
        - v1
      resources:
        - deployments
      operations:
        - CREATE
        - UPDATE
  namespaceSelector:
    matchExpressions:
    - key: environment
      operator: In
      values: ["production"]
  mutating: false
EOF

您需要等待该策略变为活动状态:

kubectl wait --for=condition=PolicyActive clusteradmissionpolicy/safe-labels

一旦该策略处于活动状态,您可以尝试它:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: team-alpha-prod
  labels:
    owner: octocat
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

该策略允许创建此部署资源,因为它不违反该策略。

该策略阻止此部署资源:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-prod
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

该策略在另一个名称空间中未被强制执行。

此命令创建一个名为 team-alpha-staging 的新名称空间:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-staging
  labels:
    environment: staging
EOF

该策略允许在 team-alpha-staging 名称空间中创建没有任何标签的部署资源:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-staging
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

如预期的那样,此资源已成功创建。

探索Jaeger UI

您可以看到PolicyServer实例发送到Jaeger的跟踪事件,因为UI中列出了一个新服务`kubewarden-policy-server`:

Jaeger 仪表板

Jaeger 收集器正在接收由您的 PolicyServer 生成的跟踪。

如果您在之前的指南中安装了 Traefik,请使用此 Ingress 公开 Jaeger 查询 UI:

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-open-telemetry-query
  namespace: jaeger
spec:
  ingressClassName: traefik
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-open-telemetry-query
                port:
                  number: 16686
EOF

要通过 Traefik 访问 Jaeger UI,请运行:

kubectl -n traefik port-forward service/traefik 8080:80

然后转到 http://localhost:8080

如果您更喜欢绕过 Traefik,请直接访问 Jaeger:

kubectl -n jaeger port-forward service/my-open-telemetry-query 16686

然后转到 http://localhost:16686