컨테이너에 대해서 먼저 이야기해 보자. 컨테이너는 어플리케이션 하나를 실행하는 공간이다. 어플리케이션 하나를 온전히 실행하기 위해, 공간에는 그 어플리케이션을 위한 의존성 패키지가 설치되고, 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로 만드는 컨테이너의 옵션과 별반 다를 것이 없다는 것이다. 이 위에 어떤 추상화된 개념을 추가할 것인지가 더 중요한 거고.

그래서 kubectldocker-cli처럼 사용하는 것이 가능하다. 이를테면,

  • kubectl exec: docker exec와 같다. 대신에 pod 안의 특정 컨테이너를 실행하기 위해 -c옵션으로 컨테이너를 선택한다.
  • kubectl cp: 이것도 docker cp와 모양이 같다.