使用 GKE Sandbox 保护安全


本文档介绍了如何配置在 Google Kubernetes Engine (GKE) 上运行的 Knative serving,以使用 GKE Sandbox 提高工作负载与主机内核的隔离性。

目标

  • 了解如何在 Knative serving 集群上启用 GKE Sandbox。
  • 部署在沙盒化节点上运行的服务。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

将 GKE Sandbox 节点池添加到现有 Knative serving 集群

按照相应步骤将启用了 GKE Sandbox 的节点池添加到现有 Knative serving 集群。这是您选择使用 GKE Sandbox 的工作负载运行的位置。

在 GKE Sandbox 节点池上部署工作负载

拥有启用了 GKE Sandbox 节点池的 GKE 集群后,请更新 Knative serving 配置。此外,请更新每个服务规范以利用新节点。这些更新只需执行一次。

启用运行时类功能标志

在本部分中,您将使用 knative-serving 命名空间中的 config-features ConfigMap 中的 Knative 功能和扩展标志来启用 Kubernetes 运行时类。如需启用运行时类,请将 ConfigMap 标志 kubernetes.podspec-runtimeclassname 设置为 enabled。如需了解详情,请参阅 Knative 功能和扩展程序文档中的 Kubernetes 运行时类配置标志

  1. 打开 config-features ConfigMap 进行修改:

    kubectl edit configmap config-features -n knative-serving
    
  2. kubernetes.podspec-runtimeclassname: enabled 功能标志添加到 data 字段。

  3. 作为上述步骤的替代方案,您可以运行以下命令,将此标志修补到 Knative 功能中:

    kubectl patch configmap config-features \
        --type='json' \
        -p="[{'op': 'replace', 'path': '/data/kubernetes.podspec-runtimeclassname', 'value': 'enabled'}]" \
        -n knative-serving
    
  4. 如需验证修改,请运行以下命令以查看 ConfigMap:

    kubectl get configmap config-features -n knative-serving -o yaml
    

    ConfigMap 应如下所示:

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: config-features
        namespace: knative-serving
        labels:
            serving.knative.dev/release: v0.22.0
    data:
        kubernetes.podspec-runtimeclassname: enabled
    

部署配置为在 GKE Sandbox 中运行的 Service

启用运行时类功能标志后,您可以创建在规范中指定 runtimeClassName 的 Service。将 runtimeClassName 设置为 gvisor,以指示服务应在 GKE Sandbox 节点池上运行。

  1. 通过运行以下命令来部署“Hello World”Knative 应用:

    cat <<EOF | kubectl apply -f -
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
        name: helloworld-go
    spec:
        template:
            spec:
                runtimeClassName: gvisor
                containers:
                    -   image: gcr.io/knative-samples/helloworld-go
                        env:
                        -   name: TARGET
                            value: "gVisor User"
    EOF
    

    如果启用了 Kubernetes 运行时类名称功能,则该命令应完成并且不会出现错误。

  2. 通过运行以下命令来获取正在运行的服务的 Pod 及其配置的运行时类:

    kubectl get pods \
        -o=custom-columns='NAME:.metadata.name,RUNTIME CLASS:.spec.runtimeClassName,STATUS:.status.phase'
    

    您应该会看到类似如下所示的输出:

    NAME                                              RUNTIME CLASS   STATUS
    helloworld-go-00001-deployment-55f58477f-fxm6m    gvisor          Running
    

后续步骤

验证您可以在新创建的 GKE Sandbox 节点池上部署不受信任的应用后,您就可以将 runtimeClassName: gvisor 添加到您想要在 GKE Sandbox 节点池上执行的其他不受信任服务的 Kubernetes 规范中。

附加阅读材料: