이 문서에서는 Google Kubernetes Engine(GKE)에서 실행되는 Knative serving을 구성하여 호스트 커널에서 워크로드 격리를 개선하는 GKE Sandbox를 사용하는 방법을 설명합니다.
목표
- Knative serving 클러스터에서 GKE Sandbox를 사용 설정하는 방법을 알아봅니다.
- 샌드박스 처리된 노드에서 실행되도록 지정된 서비스를 배포합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- 이 튜토리얼에서는 Knative serving이 클러스터에 설치 및 구성되었다고 가정합니다.
- 명령줄 환경이 설정되고 도구가 최신 상태인지 확인합니다.
기존 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-runtimeclassname
을 enabled
로 설정합니다. 자세한 내용은 Knative 기능 및 확장 프로그램 문서에서 Kubernetes 런타임 클래스 및 플래그 구성을 참조하세요.
수정할
config-features
ConfigMap을 엽니다.kubectl edit configmap config-features -n knative-serving
kubernetes.podspec-runtimeclassname: enabled
기능 플래그를data
필드에 추가합니다.앞의 단계를 실행하는 대신 다음 명령어를 실행하여 이 플래그를 Knative 기능에 패치할 수 있습니다.
kubectl patch configmap config-features \ --type='json' \ -p="[{'op': 'replace', 'path': '/data/kubernetes.podspec-runtimeclassname', 'value': 'enabled'}]" \ -n knative-serving
수정사항을 확인하려면 다음 명령어를 실행하여 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 노드 풀에서 실행되도록 지정합니다.
다음 명령어를 실행하여 '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 런타임 클래스 이름 기능이 사용 설정된 경우 명령어가 오류 없이 완료됩니다.
다음을 실행하여 실행 중인 서비스 포드와 구성된 런타임 클래스를 가져옵니다.
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
를 추가할 준비가 된 것입니다.
추가 자료:
- GKE Sandbox 문서에서 일부 서비스와의 호환성을 손상시킬 수 있는 제한사항을 설명합니다.
- gVisor(GKE Sandbox라고도 함)에 Knative 앱을 배포하는 방법에 대한 자세한 가이드는 knative 서비스 배포에 대한 gVisor 문서를 참조합니다.