Search

[스터디] Docker & Kubernetes Study #2

쿠버네티스 스터디 2회차

요약

Docker를 이용해서 첫 앱을 실행해 보았다
Dockerfile과 간단한 서버 앱을 작성하고 내 이미지를 빌드해 보았다
GKE 에 cluster 를 만들고 배포해 보았다

배운점

도커로 실행된 애플리케이션은 컨테이너 내부에서 실행되고, 컴퓨터에서 실행중인 다른 모든 프로세스로부터 완전히 격리된다는 점이다
Docker run 명령어를 실행하면 생기는 일
1.
사용자의 command 입력 (docker run busybox echo "hello world")
2.
로컬 머신에 buxybox 이미지가 저장되어 있는지 확인
3.
로컬에 이미지가 없으면 도커는 레지스트리로부터 이미지 pull
4.
도커가 격리된 컨테이너에서 echo "hello world"를 실행
Docker 로 이미지 생성 + 실행해 보기
const http = require("http"); const os = require("os"); console.log("Kubia server starting"); var handler = function (request, response) { console.log("received from" + request.connection.remoteAddress); response.writeHead(200); response.end("you've hit" + os.hostname() + "\n"); } var www = http.createServer(handler); www.listen(8080);
JavaScript
docker build -t kibia . Sending build context to Docker daemon 3.072kB Step 1/3 : FROM node:7 7: Pulling from library/node ad74af05f5a2: Pull complete 2b032b8bbe8b: Pull complete a9a5b35f6ead: Pull complete 3245b5a1c52c: Pull complete afa075743392: Pull complete 9fb9f21641cd: Pull complete 3f40ad2666bc: Pull complete 49c0ed396b49: Pull complete Digest: sha256:af5c2c6ac8bc3fa372ac031ef60c45a285eeba7bce9ee9ed66dad3a01e29ab8d Status: Downloaded newer image for node:7 ---> d9aed20b68a4 Step 2/3 : ADD app.js /app.js ---> c3506a21bea1 Step 3/3 : ENTRYPOINT ["node", "app.js"] ---> Running in 8e0357e91bf8 Removing intermediate container 8e0357e91bf8 ---> bb7ed40ca659 Successfully built bb7ed40ca659 Successfully tagged kubia:latest docker run --name kubia-container -p 8080:8080 -d kubia c098b2b23f53ee4b8814910e7a9dbf0f956657cdf91c12f11239549414c4ea75 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c098b2b23f53 kubia "node app.js" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp kubia-container docker exec -it kubia-container bash docker stop kubia-continer docker rm kubia-container docker tag kubia codertimo/kubia docker login docker push codertimo/kubia
Shell
도커 이미지가 빌드되는 과정
1.
docker build kubia .
2.
도커 클라이언트가 디렉토리의 컨텐츠를 데몬에 업로드한다 (Dockerfile, app.js)
3.
이미지가 아직 로컬에 저장됭어 있지 않은 경우 도커가 node:7.0 이미지를 pull 함
4.
새로운 이미지를 빌드한다
빌드 프로세스는 도커 클라이언트가 수행하지 않음. 대신 디렉터리 전체의 컨텐츠가 도커 데몬으로 업로드되고 그곳에서 이미지가 빌드된다 .
그럼 docker 데몬은 build 명령어를 작성한 머신이 아니여도 가능한 건가? 그렇다면 어떻게 외부 머신을 데몬으로 설정해 주지? 어떤 이점이 있지?
docker stop 을 해도 해당 컨테이너 내에서 작업한 내용들은 남아 있는다. docker rm 을 해야 컨테이너의 모든 내용이 삭제되어 다시 시작할 수 없다.
docker tag 는 tag를 변경하는 것이 아닌, 기존의 이미지에 또 하나의 tag 를 추가하는 것. 그래서 기존 tag 도 남아 있고, 이미지 역시 원본은 동일하다

Kubeflow 설치하기 (Minikube)

Minikube 에서 단일 노드 쿠버네티스 클러스터 실행을 해 볼것임
https://minikube.sigs.k8s.io/docs/start/ 에서 Minikube 설치할 수 있음
minikube kubectl -- get po -A 로 kubectl 설치

GKE (Google Kubernetes Engine) 사용하기

Google Cloud 에서 개인 프로젝트(junseong-study) 만들고, GKE 활성화
gcloud init 으로 사용자 인증 (시키는대로 하면 됨)
gcloud components install kubectl 으로 kubectl 설치
gcloud container clusters create kubia --num-nodes 3 --zone us-central1-c
gcloud container clusters create kubia --num-nodes 3 --zone us-central1-c # 아래 실행 결과 Creating cluster kubia in us-central1-c... Cluster is being health-checked (master is healthy)...done. Created [https://container.googleapis.com/v1/projects/junseong-study/zones/us-central1-c/clusters/kubia]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-c/kubia?project=junseong-study kubeconfig entry generated for kubia. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS kubia us-central1-c 1.18.12-gke.1210 35.193.99.150 e2-medium 1.18.12-gke.1210 3 RUNNING kubectl get nodes # 아래 실행 결과 NAME STATUS ROLES AGE VERSION gke-kubia-default-pool-0822874c-65vk Ready <none> 8m42s v1.18.12-gke.1210 gke-kubia-default-pool-0822874c-fwtm Ready <none> 8m42s v1.18.12-gke.1210 gke-kubia-default-pool-0822874c-jf47 Ready <none> 8m42s v1.18.12-gke.1210 kubectl describe node gke-kubia-default-pool-0822874c-65vk # 실행 결과 Name: gke-kubia-default-pool-0822874c-65vk Roles: <none> Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/instance-type=e2-medium ...
Shell
서울 리전으로 하려고 하니깐 Quota 오류 나던데.. 서울은 GKE 안되나? gcloud container clusters create kubia --num-nodes 3 --zone asia-northeast3 ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=Insufficient regional quota to satisfy request: resource "IN_USE_ADDRESSES": request requires '9.0' and is short '1.0'. project has a quota of '8.0' with '8.0' available. View and manage quotas at https://console.cloud.google.com/iam-admin/quotas?usage=USED&project=junseong-study.
어플리케이션 실행하기 (codertimo/kubia)
kubectl run kubia --image=codertimo/kubia --port=8000 --generator=run/v1 # 실행 결과 Flag --generator has been deprecated, has no effect and will be removed in the future. pod/kubia created
Shell
실행 중인 모든 컨테이너를 보여주는 리스트에서 컨테이너를 보는 방법? → 없음
k8s 는 개별 컨테이너들을 직접 다루지 않는다
함께 배치된 다수의 컨테이너 그룹인 POD 이라는 개념을 사용한다
POD 은 하나 이상의 밀접하게 연관된 컨테이너의 그룹으로 같은 워커 노드에서 같은 리눅스 네임스페이스로 함께 실행된다.
각 POD 은 자체 IP, 호스트 이름, 프로세스 등이 있는 논리적으로 분리된 머신이다.
애플리케이션은 단일 컨테이너로 실행될 수도 있고, 개별 컨테이너에서 실행될 수도 있다
"단일 컨테이너로 실행되는 단일 프로세스일수도 있고, 개별 컨테이너에서 실행되는 주 애플리케이션 프로세스와 부가적으로 도와주는 프로세스 일수도 있다" 이게 무슨 말이지 개념이 이해가 된단다
POD 조회하기
kubectl get pods # 실행 결과 NAME READY STATUS RESTARTS AGE kubia 1/1 Running 0 9m15s
Shell