환경 : docker가 설치된 linux machine
docker 다운로드 참고
$ docker run busybox echo "Hello world"
docker에서는 다운로드나 설치 없이 docker run 명령어로 다른 프로세스들과 분리된 컨테이너에서 애플리케이션을 실행할 수 있다.
$ docker run <image>
$ docker run <image>:<tag>
const http = require('http');
const os = require('os');
console.log("Kubia server starting...");
var handler = function(request, response) {
console.log("Received request from " + request.connection.remoteAddress);
response.writeHead(200);
response.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080)
node.js 애플리케이션을 실행시키기 위해서는 node.js 런타임이 설치되어야 하지만, docker를 사용해서 컨테이너 이미지 안에 앱을 패키징 한다면 설치과정이 필요 없다.
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
docker가 이미지를 빌드할 때 실행 할 목록이 담긴 파일. app.js와 같은 폴더에 있어야 한다.
- FROM : 시작점으로 사용할 컨테이너 이미지
- ADD : 로컬 디렉토리의 app.js를 이미지의 root 디렉토리 안에 app.js로 추가
- ENTRYPOINT : 이미지를 실행시켰을 때 실행 될 명령어
$ docker build -t kubia .
$ docker images
$ docker run --name kubia-container -p 8080:8080 -d kubia
$ curl localhost:8080
$ docker ps
$ docker inspect <container-name>
$ docker exec -it kubia-container bash
# ps aux
$ ps aux | grep app.js
# ls /
$ docker stop <container-name>
$ docker rm <container-name>
빌드한 이미지를 다른 시스템에서 사용하려면, 외부 이미지 레지스트리에 이미지를 등록해야한다. (ex: Docker Hub, Quay.io, Google Container Registry)
이미지의 레파지토리 이름은 본인의 Docker Hub ID로 시작해야한다. (예시에서는 luksa)
$ docker tag <image-name> <dockerHubID>/<image-name>
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. ...
Username: <dockerHubID>
Password:
Login Succeeded
$ docker push luksa/kubia
$ docker run -p 8080:8080 -d luksa/kubia
다중 노드 쿠버네티스 클러스터를 구성하는 것은 쉽지 않다. 단일화된 네트워크 환경을 통해 쿠버네티스 클러스터 안의 모든 컨테이너가 연결될 수 있도록 여러 물리/가상 머신에 걸쳐 설치하고, 적절하게 네트워킹 설정이 되는 것을 요구한다. 쿠버네티스 클러스터를 설치하는 메소드들은 http://kubernetes.io 에서 확인 가능하다.
Minikube는 단일 노드 클러스터를 설정할 수 있는 툴이다. 쿠버네티스 테스트와 로컬 앱 개발에 용이하다.
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/\
v0.23.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube\
/usr/local/bin/
$ minikube start
$ curl -LO https://storage.googleapis.com/kubernetes-release/release\
/$(curl -s https://storage.googleapis.com/kubernetes-release/release\
/stable.txt)/bin/linux/amd64/kubectl\
&& chmod +x kubectl\
&& sudo mv kubectl /usr/local/bin/
$ kubectl cluster-info
GKE 환경 설정을 참고
GKE를 사용하면 직접 모든 클러스터 노드와 네트워킹을 설정 하지않아도 된다.
$ gcloud container clusters create kubia --num-nodes 3 --machine-type f1-micro
$ kubectl get nodes
$ kubectl describe node <node-name>
alias k=kubectl
$ kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1
쿠버네티스는 개별 컨테이너를 직접 관리하지 않고 함께 배치된 여러 컨테이너들을 다룬다. 이 컨테이너 그룹을 pod라고 한다.
pod는 하나 이상의 밀접하게 연관된 컨테이너의 그룹이다. 컨테이너들은 같은 리눅스 네임스페이스의 같은 워커 노드에서 실행된다. 각 pod는 논리 머신으로 분리되어있는 것처럼 각각 단일 애플리케이션이 돌아가는 IP, hostname, process 등을 가진다. 하나의 pod 안에서 실행되는 컨테이너들은 같은 논리 머신에서 작동되는 것으로 보이는 반면에, 다른 pod 안에서 실행되는 컨테이너들은 같은 워커노드에서 실행될지라도 다른 논리 머신에서 작동되는 것으로 보인다.
각 pod는 각자의 IP와 컨테이너(하나 혹은 그 이상)와 애플리케이션 프로세스를 포함한다. pod는 다른 워커 노드들 사이에 분배되어있다.
$ kubectl get pods
$ kubectl describe pod <pod-name>
pod는 IP 주소를 가지지만, 클러스터 내부 IP이기때문에 외부에선 접근이 불가능하다. 외부에서도 접근이 가능하도록 하려면 service 객체에 등록해야한다.
$ kubectl expose rc kubia --type=LoadBalancer --name kubia-http
$ kubectl get services
$ curl <external-ip>:<port>
kubectl run
명령어로 rc를 생성하고, rc가 pod를 생성한 것. pod를 클러스터 외부에서 접속이 가능하도록 해당 rc가 관리하는 모든 pod를 단일 서비스로 노출하도록 쿠버네티스에게 지시하였다. 현재까지 ReplicationController에 의해 모니터링되고 실행이 유지되며 service를 통해 세계에 노출되어있는 애플리케이션을 생성했다.
kubernetes의 장점 중 하나는 deployments를 확장할 수 있다는 점이다.
$ kubectl get replicationcontrollers
$ kubectl get rc
$ kubectl scale rc kubia --replicas=3
kubectl get rc
로 3개로 바뀐 요청값을 확인하고, kubectl get pods
로 3개의 pod가 실행되고 있음을 확인할 수 있다.curl <외부IP>:<port>
로 접근 시 출력되는 결과로 pod들에 랜덤하게 요청이 가는 것을 확인할 수 있다. 즉, service가 다중 pod들 앞에서 로드밸런서 역할을 한다는 것을 알 수 있다. kubernetes에서는 pod가 올바르게 실행만 된다면 어떤 node에서 pod가 실행되는지는 중요하지 않다. 어떤 노드에서 실행되는지에 상관없이 컨테이너 내에서 실행되는 모든 애플리케이션이 동일한 유형의 OS 환경을 갖게된다. 때문인지 kubectl get pods
명령어는 노드에 관한 정보는 알려주지 않아서 옵션을 추가해야 노드 확인이 가능하다.
$ kubectl get pods -o wide
$ kubectl describe pod <pod-name>
GUI, 그래픽으로 pod, rc, service 등의 객체가 확인하고 싶다면 사용
$ kubectl cluster-info | grep dashboard
출력되는 URL로 dashboard 접속
$ gcloud container clusters describe kubia | grep -E "(username|password):"
출력되는 password와 username 입력