1. 도커 사용하기
1) 도커 설치와 "Hello world" 컨테이너 실행하기
- busybox:latest 이미지가 로컬 컴퓨터에 없었으므로 도커 허브 레지스트리에서 이미지 다운받은 뒤 컨테이너를 생성했고, 컨테이너 내부에서 echo 명령어를 수행했다.
2) 쿠버네티스에 배포할 간단한 Node.js 애플리케이션 실행하기
- 이 코드는 포트 8080으로 HTTP 서버를 시작하고, 서버는 모든 요청에 대해 상태코드 200 OK와 "You've hit (hostname)"의 텍스트를 응답한다.
- Node.js를 설치해 직접 테스트해볼 수 있지만, 그럴 필요가 없다. 도커를 통해 앱을 컨테이너 이미지로 패키징하면 어디에서든 실행할 수 있다.
3) 격리된 컨테이너로 실행하기 위해 애플리케이션을 컨테이너 이미지로 패키징하기
- 애플리케이션을 이미지로 패키징하기 위해서 Dockerfile을 생성한다. Dockerfile은 app.js와 동일한 디렉토리에 있어야 한다.
4) 이미지 기반의 컨테이너 실행하기
- 어떻게 이미지가 빌드되는지 이해하기
- 빌드 프로세스는 도커 클라이언트가 수행하지 않는다. 디렉터리의 전체 컨텐츠가 도커 데몬에 업로드되고 그곳에서 이미지가 빌드된다.
- 빌드 디렉터리에 의미없는 파일을 놔두면 빌드가 느려진다.
5) 누구든 실행할 수 있게 도커 허브에 이미지 푸시하기
- docker tag kubia sanspareilsmyn/kubia
- docker push sanspareilsmyn/kubia
- docker run -p 8080:8080 -d sanspareilsmyn/kubia
2. 쿠버네티스 사용하기
1) 쿠버네티스 클러스터 설치
- 로컬 머신에 단일 노드 쿠버네티스 클러스터 실행하는 방법 / GKE에 실행중인 클러스터에 접근하는 방법 / kubeadm을 사용해 클러스터를 설치하는 방법
/ AWS에 쿠버네티스 설치하는 방법
- 로컬에서 minikube를 통해 단일 클러스터를 실행해본다.
2) 쿠버네티스에 첫 번째 애플리케이션 실행하기
- 파드(pod)는 하나 이상의 밀접하게 연관된 컨테이너의 그룹이다. 파드 내에서 실행 중인 모든 컨테이너는 동일한 논리적인 머신 위에서 실행하는 것처럼 보인다.
- 백그라운드에서 일어난 동작 이해하기
1~2. 개발자가 kubia 이미지를 Docker Hub에 push함.
3~4. kubectl 명령어를 실행하면 API server로 REST HTTP 요청을 전달함.
5. 클러스터에 새로운 ReplicationController 오브젝트를 생성함. ReplicationController는 새 Pod를 생성하고 Scheduler에 의해 worker node 중 하나에 스케쥴링이 됨.
6~7. 해당 worker node의 kubelet은 Pod가 스케쥴링됐다는 것을 보고 image가 로컬에 없기 때문에 docker에게 registry pull을 지시함.
8. Docker가 image download한 후 컨테이너를 생성/실행함.
3) 웹 애플리케이션에 접근하기
- 각 Pod는 자체 IP를 가지고 있지만 이 주소는 클러스트 내부에 있으며 외부에서 접근 불가능함.
- 외부에서 파드에 접근을 가능하게 하려면 서비스 오브젝트를 통해 노출해야 함.
- 일반적인 서비스 오브젝트는 클러스터 내부에서만 접근이 가능하기 때문에, LoadBalancer 유형의 서비스를 생성해서 public IP를 통해 파드와 연결해야 함.
- Minikube는 로드밸런서를 지원하지 않으므로 서비스는 외부 IP를 얻지 못 하는 것을 참고.
4) 시스템의 논리적인 부분
- RC, Pod, Service가 서로 동작하는 방식
- 개발자가 컨테이너를 직접 생성하거나 동작시키지 않고, 대신 Pod를 이용한다. 그러나 Pod도 직접 생성하지 않는다. kubectl run을 수행하면 RC를 생성하고 RC가 Pod을 생성한다.
- 클러스터 외부에서 Pod에 접근하게 하기 위해 RC에 의해 관리되는 모든 Pod를 단일 Service로 노출하도록 명령한다.
Reference - Kubernetes in Action by Marco Luksa