본문 바로가기
Kubernetes

gVisor 및 runsc를 활용한 Host와의 컨테이너 커널 격리

by beann 2024. 3. 21.
반응형

컨테이너가 가진 장점이자 단점으로 host의 커널을 사용한다는 것이다.

이는 Host가 만약 해킹으로 인해 커널의 파라미터가 수정되는 등 이러한일이 발생하게 된다면 해당 Host에 속한 모든 Container들은 동일하게 적용되어 매우 심각한 상황이 초래될 수 있다.

 

이러한 문제점을 해결하기 위해 Google은 gVisor라는 도구를 만들었다.

gVisor는 Sandbox환경을 만들어 Host와 완전하게 격리된, 가상화된 환경을 제공해준다.  그리고 gVisor를 사용하게 된다면 기존 Container Runtime인 runc에서 runsc으로 변경해주어야 한다.

 

 

 

 

gVisor설치 및 활용방법


설치 참고 사이트: https://gvisor.dev/docs/user_guide/install/

 

 

 


gVisor 설치/세팅 

!!! Control Plane, Node에서 모두 똑같이 세팅해야함.

sudo apt-get update && \
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg
    
    
curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | sudo tee /etc/apt/sources.list.d/gvisor.list > /dev/null

sudo apt-get update && sudo apt-get install -y runsc

 

 

( 컨테이너 런타임이 Containerd인 경우 )

root@k8s-m:# vi /etc/containerd/config.toml
disabled_plugins = ["io.containerd.internal.v1.restart"]
            ...
            ...
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          base_runtime_spec = ""
          cni_conf_dir = ""
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = ""
          runtime_path = ""
          runtime_root = ""
          runtime_type = "io.containerd.runc.v1" # v2에서 v1으로 변경
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]  # 새로 추가
          runtime_type = "io.containerd.runcsc.v1"  # 새로 추가
          
          
   [plugins."io.containerd.runtime.v1.linux"]
    ...
    ...
    shim_debug = true  # false에서 true로 변경
    
root@k8s-m:# systemctl restart containerd
root@k8s-m:# systemctl status containerd

 

 

 

 

gVisor 활용방법 및 테스트


Pod를 생성하고 uname -r 커맨드를 했을때 확인된 커널 버전과, Host의 커널 버전이 동일한 것이 확인된다.

root@k8s-m:# k run nginx --image=nginx
pod/nginx created

root@k8s-m:# k exec nginx -- uname -r
5.15.0-91-generic

root@k8s-m:~# uname -r
5.15.0-91-generic

 

 

 

runtime class 배포

root@k8s-m:# cat runsc-test.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: runsc-test
handler: runsc


root@k8s-m:# k apply -f runsc-test.yaml

 

 

테스트 pod 생성 / 커널버전 확인

root@k8s-m:# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  runtimeClassName: runsc-test  # runtime class 적용
  containers:
  - image: nginx
    name: nginx
    
    
root@k8s-m:# k apply -f nginx.yaml

root@k8s-m:# k exec nginx -- uname -r
4.4.0

root@k8s-m:# uname -r
5.15.0-91-generic

Pod의 커널 버전과 Host의 커널 버전이 다른 것이 확인된다.

nginx 컨테이너는 Host와 완전 격리된채 실행된 것이 확인 되었으며, 이는 Sandbox화된 환경 이라고도 한다.

 

반응형