GKE Sandbox로 보안


이 문서에서는 Google Kubernetes Engine(GKE)에서 실행되는 Knative serving을 구성하여 호스트 커널에서 워크로드 격리를 개선하는 GKE Sandbox를 사용하는 방법을 설명합니다.

목표

  • Knative serving 클러스터에서 GKE Sandbox를 사용 설정하는 방법을 알아봅니다.
  • 샌드박스 처리된 노드에서 실행되도록 지정된 서비스를 배포합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

기존 Knative serving 클러스터에 GKE Sandbox 노드 풀 추가

기존 Knative serving 클러스터에 GKE Sandbox를 사용하도록 설정된 노드 풀을 추가하는 단계를 따릅니다. 여기에서 GKE Sandbox를 사용하도록 선택한 워크로드가 실행됩니다.

GKE Sandbox 노드 풀에 워크로드 배포

GKE Sandbox가 사용 설정된 노드 풀이 있는 GKE 클러스터가 있으면 Knative serving 구성을 업데이트합니다. 또한 새 노드를 사용하도록 각 서비스 사양을 업데이트합니다. 이러한 업데이트는 한 번만 수행하면 됩니다.

런타임 클래스 기능 플래그 사용 설정

이 섹션에서는 knative-serving 네임스페이스의 config-features ConfigMap에서 Knative 기능 및 확장 프로그램 플래그를 사용하여 Kubernetes 런타임 클래스를 사용 설정합니다. 런타임 클래스를 사용 설정하려면 ConfigMap 플래그 kubernetes.podspec-runtimeclassnameenabled로 설정합니다. 자세한 내용은 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을 지정하는 서비스를 만들 수 있습니다. runtimeClassNamegvisor로 설정하여 서비스가 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. 다음을 실행하여 실행 중인 서비스 포드와 구성된 런타임 클래스를 가져옵니다.

    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 노드 풀에 신뢰할 수 없는 앱을 배포할 수 있는지 확인하면 GKE Sandbox 노드 풀에서 실행할 다른 신뢰할 수 없는 서비스의 Kubernetes 사양에 runtimeClassName: gvisor를 추가할 준비가 된 것입니다.

추가 자료: