Container
컨테이너에 대해서 먼저 이야기해 보자. 컨테이너는 어플리케이션 하나를 실행하는 공간이다. 어플리케이션 하나를 온전히 실행하기 위해, 공간에는 그 어플리케이션을 위한 의존성 패키지가 설치되고, cgroup을 통해 리소스가 할당될 것이다.
쿠버네티스에서 말하는 컨테이너는 도커에서의 컨테이너와 완전히 같다. 단지 작업 하나의 단위가 컨테이너가 아닐 뿐이다. 예를 들어 가장 흔한 웹 서비스를 제공하는 APM
세트의 경우, 프로세스 하나를 실행한다는 개념에서는 컨테이너가 세 개가 동작해야 한다. 하지만 각 컨테이너는 웹 서비스를 제공하는 작업의 단위로서는 각각 부족한 프로세스일 뿐이다. 세 개가 모여 하나의 웹 서비스를 제공한다는 개념이 쿠버네티스의 팟이 되겠다.
뒤에서 나올 pod, deployment 등은 모두 컨테이너를 기반으로 동작하는, 쉽게 말하면 컨테이너의 그룹 관리를 대신해주는 추상화된 개념이다. 그러면 쿠버네티스에서는 컨테이너 하나를 어떻게 표현하는가?
name: example-container
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["-c", "4"]
...
쿠버네티스에서 컨테이너 하나를 만드는 yaml파일은 없지만, pod에서 사용하는 spec.containers
의 내용이 대부분 이런 모양이다. docker
로 만드는 컨테이너의 옵션과 별반 다를 것이 없다는 것이다. 이 위에 어떤 추상화된 개념을 추가할 것인지가 더 중요한 거고.
그래서 kubectl
을 docker-cli
처럼 사용하는 것이 가능하다. 이를테면,
- kubectl exec:
docker exec
와 같다. 대신에 pod 안의 특정 컨테이너를 실행하기 위해-c
옵션으로 컨테이너를 선택한다. - kubectl cp: 이것도
docker cp
와 모양이 같다. - …