Kubernetes 인 액션 2장 도커와 쿠버네티스 첫 걸음
Devops/Kubernetes

Kubernetes 인 액션 2장 도커와 쿠버네티스 첫 걸음

뉴비뉴 2023. 4. 5.

다루는 내용

  • 도커를 사용한 컨테이너 이미지 생성, 실행, 공유
  • 로컬에 단일 노드 쿠버네티스 클러스터 생성
  • 구글 쿠버네티스 엔진에서 쿠버네티스 클러스터 설치
  • kubectl CLI 클라이언트 설정과 사용
  • 쿠버네티스에서 애플리케이션의 배포와 수평 스케일링

2.1 도커를 사용한 컨테이너 이미지 생성, 실행, 공유하기

  1. 도커 설치와 “Hello World” 컨테이너 실행하기
  2. 쿠버네티스에 배포할 간단한 Node.js 애플리케이션 생성하기
  3. 격리된 컨테이너로 실행하기 위해 애플리케이션을 컨테이너 이미지로 패키징하기
  4. 이미지 기반의 컨테이너 실행하기
  5. 누구든 실행할 수 있게 도커 허브에 이미지 푸시하기
LET ME)
busybox는 echo, ls, gizp 등과 같은 표준 UNIX 명령줄 도구들을 합쳐 놓은 단일 실행파일
1. docker run busybox echo "Hello World"
busybox:latest 이미지가 로컬에 존재하는지 확인하고, 존재하지 않다면 dockerhub에서 다운
2.1.3 이미지를 위한 Dockerfile 생성
도커가 이미지를 생성하기 위해 수행해야 할 지시 사항이 담겨 있다.

2.1.3 이미지를 위한 Dockerfile 생성

도커가 이미지를 생성하기 위해 수행해야 할 지시 사항이 담겨 있다.

2.1.4 컨테이너 이미지 생성

$ docker build -t cslee .

이미지 레이어에 관해 이해하기

각 Dockerfile이 새로운 레이어를 하나만 생성한다고 생각할 수 있지만 그렇지 않다. 이미지를 빌드하는 동안 기본 이미지의 모든 레이어를 가져온 다음, 도커는 그 위에 새로운 레이어를 생성하고 app.js 파일을 그 위에 추가한다. 그런 다음 이미지가 실행할 때 수행돼야 할 명령을 지정하는 또 하나의 레이어를 추가한다. 이 마지막 레이어는 cslee:latest라고 태그를 지정한다.

2.1.5 컨테이너 이미지 실행

$ docker run --name cslee-container -p 8888:8888 -d cslee

로컬 localhost:8888로 접근 가능

$ docker inspect cslee 도커 컨테이너의 상세 정보를 JSON 형식으로 출력

2.1.6 실행 중인 컨테이너 내부 탐색하기

$ docker exec -it cslee bash or /bin/bash

-i: 표준 입력(STDIN)을 오픈 상태로 유지한다. 셸에 명령어를 입력하기 위해 필요하다. -t: 의사 터미널(TTY)을 할당한다.

내부에서 컨테이너 탐색

$ ps aux or ps aux | grep app.js 호스트 운영체제에서 실행 중인 컨테이너 프로세스

root$44dxxxx: /# ps aux ## 컨테이너 내부에서 프로세스 조회하기
USER PID %CPU $MEM VSZ      RSS TTY STAT START TIME COMMAND
root   1  0.0  0.1 676380 16504   ?   S1 12:30 0:00 node app.js

$ ps aux | grap app.js ## 호스트 운영체제에서 실행 중인 컨테이너 프로세스
USER PID %CPU $MEM VSZ      RSS TTY STAT START TIME COMMAND
root 382  0.0  0.1 676380 16504   ?   S1 12:30 0:00 node app.js

2.1.7 컨테이너 중지와 삭제

$ docker stop cslee ## 중지

$ docker rm cslee ## 삭제

2.1.8 이미지 레지스트리에 이미지 푸시

다른 컴퓨터에서도 실행하려면 외부 이미지 저장소에 이미지를 푸시해야 한다. hub.docker.com or Google Container Registy

$ docker tag cslee korea(ID)/cslee

$ docker login

$ docker push korea/cslee

2.2 쿠버네티스 클러스터 설치

도커에서 직접 실행하는 쿠버네티스 클러스터에 배포할 수 있다.

2.2.1 minikube를 활용한 단일 노드 쿠버네티스 클러스터 실행하기

for mac

curl -LO <https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64>
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

minikube start

brew install kubectl
or
curl -LO <https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64>
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

alias k=kubectl

쿠버네티스에 첫 번째 애플리케이션 실행하기

2.3.1 Node.js 애플리케이션 구동하기

$ kubectl run cslee --image=korea/cslee --port=8000 —generator=run/v1
$ kubetl run —generator=run-pod/v1 or kubectl create
replicationcontroller “cslee” created

--generator는 보통은 사용하지 않지만 쿠버네티스에서 디플로이먼트 대신 래플리케이션컨트롤러를 생성하기 때문에 사용했다.

파드 소개

파드는 하나 이상의 밀접하게 연관된 컨테이너의 그룹으로 같은 워커 노드에서 같은 리눅스 네임스페이스로 함께 실행된다.

파드 조회하기

$ kubectl get pod

NAME READY STATUS RESTARTS AGE
cslee 0/1 Pending 0 1m

$ kubectl describe pod

명령어로 파드의 세부 정보를 볼 수 있다.

백그라운드에 일어난 동작 이해하기

  1. kubectl 명령어를 실행하면 쿠버네티스의 API 서버로 REST HTTP 요청을 전달
  2. 클러스터에 새로운 래플리케이션컨트롤러 오브젝트를 생성한다.
  3. 래플리케이션컨트롤러는 새 파드를 생성하고 스케줄러에 의해 워커 노드 중 하나에 스케줄링 된다.
  4. 해당 워커 노드의 kubelet은 파드가 스케줄링 됐다는 것을 보고 이미지가 로컬에 없기 때문에 도커에게 레지스트리에서 특정 이미지를 풀 하도록 지시한다.
  5. 이미지를 다운로드한 후 도커는 컨테이너를 생성하고 실행한다.

|정의| 스케줄링이라는 용어는 파드가 특정 노드에 할당됨을 의미한다.

웹 애플리케이션에 접근하기

각 파드는 자체 IP 주소를 가지고 있지만 이 주소는 클러스터 내부에 있으며 외부에서 접근이 불가능하다. 외부에서 파드에 접근을 가능하게 하려면 서비스 오브젝트를 통해 노출해야 한다. Load Balancer 유형의 특별한 서비스를 생성해야 한다. Load Balancer 유형의 서비스를 생성하면 외부 로드 밸런서가 생성되므로 로드 밸럭서의 퍼블릭 IP를 통해 파드에 연결할 수 있다.

서비스 오브젝트 생성하기

서비스를 생성하기 위해 쿠버네티스에게 앞서 생성한 래플리케이션컨트롤러를 노출하도록 명령한다.

 

$ kubectl expose rc(래플리케이션컨트롤러) kubia --type=LoadBalancer --name kubia-http
service “kubia-http” exposed | rc를 노출하였지만 service 가 생성되었다.

서비스 조회하기

$ kubectl get service

NAME CLUSTER_IP EXTERNAL_IP PORT(S) AGE

kubernetes 10.3.240.1 <none> 443/TCP 34m
kubia-http 10.3.246.185 104.155.74.57 8000:31348/TCP 4s

외부 IP가 확인되고, 이제 애플리케이션 외부 어디에서나 http://104.155.74.57:8000 로 접근 가능하다.

래플리케이션컨트롤러, 파드, 서비스가 서로 동작하는 방식 이해

kubectl run 명령을 수행하면 래플리케이션컨트롤러를 생성하고, 래플리케이션컨트롤러가 파드를 생성한다.

클러스터 외부에서 파드에 접근케 하기 위해 쿠버네티스에게 래플리케이션컨트롤러에 의해 관리되는 모든 파드를 단일 서비스로 노출하도록 명령한다.

LET ME) Deployment와 ReplicaSet의 가장 큰 기능은 Pod를 관리하는 컨트롤러이다. 사실, 리플리케이션 컨트롤러는 Deprecated되었고, 지금은 리플리카셋(ReplicaSet)으로 대체되었다. 그러나 아직까지 리플리케이션 컨트롤러를 사용하고있고 사용중 ReplicaSet으로 변경하는것이 어렵지 않으므로 필자에게 익숙한 리플리케이션 컨트롤러에 대해 설명하려한다. 쿠버네티스 컨트롤러는 크게 4가지의 역할을 한다.

  1. Auto Healing 문제가 발생하면 Pod를 다시 실행
  2. Software Update Pod 자동 업데이트 and 롤백 기능도 제공
  3. Auto Scaling 리소스가 부족할 때 pod를 추가적으로 생성 부하 분산
  4. Job 일시적인 작업을 처리할 때 필요한 순간에만 Pod 를 만들고 수행이 끝나면 Pod를 삭제한다.

서비스가 필요한 이유

파드는 언제든지 사라질 수 있다. 비정상 노드에서 파드가 제거될 수도 있다. 사라진 파드는 래플리케이션컨트롤러에 의해 성성된 파드로 대체된다. 새로운 파드는 다른 IP 주소를 할당받는다.

이것이 바로 서비스가 필요한 이유다. 항상 변경되는 파드의 IP 주소 문제와 여러 개의 파드를 단일 IP와 포트의 쌍으로 노출시키는 문제를 해결한다.

2.3.4 애플리케이션 수평 확장

$ kubectl get replicationcontrollers

NAME DESIRED CURRENT AGE
kubia 1 1 17m

DESIRED 열은 래플리케이션컨트롤러가 유지해야 할 파드의 래플리카 수를 보여준다. CURRENT 열은 현재 실행 중인 파드의 실제 수를 나타낸다.

의도하는 래플리카 수 늘이기

$ kubectl scale rc kubia —replicas=3 relicationcontroller “kubia” scaled

시스템의 새로운 상태 시각화

하나의 서비스와 하나의 래플리케이션컨트롤러가 있지만 이제 모든 파드 인스턴스 세 개가 모두 래플리케이션컨트롤러에 의해 관린된다.

2.4 요약

  • 공개된 컨테이너 이미지를 풀하고 실행할 수 있다.
  • 애플리케이션을 컨테이너 이미지로 패키징하고 원격 이미지 레지스트리에 이미지를 푸시해 누구나 사용할 수 있게 된다.
  • 실행 중인 컨테이너에 접속해 환경을 확인할 수 있다.
  • 쿠버네티스 클러스터의 노드, 파드, 서비스 래플리케이션컨트롤러를 조회하고 검사할 수 있다.
  • 쿠버네티스 컨테이너를 실행하고 클러스터 외부에서 접근 가능하게 할 수 있다.
  • 파드, 래프릴케이션컨트롤러, 서비스가 어떻게 연관돼 있는지 기본 개념을 이해할 수 있다.
  • 래플리케이션컨트롤러의 래플리카 수를 변경해 애플리케이션을 수평으로 확징할 수 있다.

https://newbiecs.tistory.com/379

 

Kubernetes 인 액션 3장 쿠버네티스에서 컨테이너 실행

다루는 내용 파드의 생성, 실행, 정지 파드와 다른 리소스를 레이블로 조직화하기 특정 레이블을 가진 모든 파드에서 작업 수행 네임스페이스를 사용해 파드를 겹치지 않는 그룹으로 나누기 특

newbiecs.tistory.com

 

댓글

💲 추천 글