使用 GKE Sandbox 確保安全


本文說明如何設定在 Google Kubernetes Engine (GKE) 上執行的 Knative 服務,以使用 GKE Sandbox,進一步將工作負載與主機核心隔離。

目標

  • 瞭解如何在 Knative Serving 叢集上啟用 GKE Sandbox。
  • 部署指定要在沙箱節點上執行的服務。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

事前準備

將 GKE Sandbox 節點集區新增至現有的 Knative 服務叢集

請按照這些步驟,將啟用 GKE Sandbox 的節點集區新增至現有的 Knative 服務叢集。您選擇使用 GKE Sandbox 的工作負載會在此執行。

在 GKE Sandbox 節點集區中部署工作負載

建立啟用 GKE Sandbox 的節點集區後,請更新 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 中執行的服務

啟用執行階段類別功能旗標後,您就能建立在規格中指定 runtimeClassName 的服務。將 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 新增至 Kubernetes 規格,以便在 GKE Sandbox 節點集區上執行其他不受信任的服務。

延伸閱讀:

  • GKE Sandbox 說明文件:瞭解可能導致與部分服務不相容的限制。
  • 如需在 gVisor (也稱為 GKE Sandbox) 上部署 Knative 應用程式的詳細指南,請參閱 gVisor 文件