반응형
컨테이너가 가진 장점이자 단점으로 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화된 환경 이라고도 한다.
반응형
'Kubernetes' 카테고리의 다른 글
trivy를 활용한 Container Image 취약점 스캔하기 (0) | 2024.03.27 |
---|---|
Kubernetes에서 App Armor를 활용하여 Container 내부 디렉토리 Write 제한하기 (0) | 2024.03.23 |
kube-bench 사용법 및 Install (0) | 2024.03.20 |
kubesec install 및 사용법 (1) | 2024.03.19 |
Kubernetes Network Study #2(Service to Pod) (0) | 2023.11.23 |