728x90

개요

Google Kubernetes Engine (GKE)은 Google 인프라를 사용하여 컨테이너화 된 애플리케이션을 배포, 관리 및 확장하기 위한 관리형 환경을 제공한다. Kubernetes Engine 환경은 컨테이너 클러스터 를 형성하기 위해 그룹화된 여러 머신(특히 Compute Engine 인스턴스)으로 구성된다. 이 실습에서는 GKE를 사용하여 컨테이너 생성 및 애플리케이션 배포를 실습한다.

Google Kubernetes Engine을 사용한 클러스터 오케스트레이션

Kubernetes는 인기 있는 Google 서비스를 실행하고 애플리케이션 컨테이너에 대한 자동 관리, 모니터링, 자동 확장, 롤링 업데이트 등 동일한 이점을 제공하는 동일한 설계 원칙을 사용한다.

GKE 클러스터의 이점

  • Compute Engine 인스턴스의 부하 분산
  • 추가 유연성을 위해 클러스터 내에서 노드의 하위 집합을 지정하는 노드 풀
  • 클러스터의 노드 인스턴스 수 자동 조정
  • 클러스터의 노드 소프트웨어에 대한 자동 업그레이드
  • 노드 상태 및 가용성을 유지하기 위한 노드 자동 복구
  • 클러스터에 대한 가시성을 위한 Cloud Monitoring으로 로깅 및 모니터링

GKE 명령어

gcloud container clusters create [CLUSTER-NAME]

클러스터는 하나 이상의 클러스터 마스터 시스템과 노드라고 하는 여러 작업공간으로 시스템으로 구성된다.

위의 명령어는 클러스터를 생성하는 명령어입니다. 또한 클러스터의 이름은 문자로 시작하고 영어 또는 숫자로 끝나야 하며 40자를 초과할 수 없다. 클러스터를 생성하는데 시간이 걸릴 수도 있습니다.

 

gcloud container clusters get-credentials [CLUSTER-NAME]

클러스터를 만든 후 클러스터와 상호 작용하려면 인증 자격 증명이 필요합니다. 클러스터를 인증을 진행하는 명령어입니다.

 

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

--image배포할 컨테이너 이미지를 지정합니다.
 gcr.io/google-samples/hello-app:1.0가져올 특정 이미지 버전을 나타냅니다. 
 버전을 지정하지 않으면 최신 버전이 사용됩니다.

위의 명령어는 컨테이너 이미지에서 새 배포를 만들기 위한 명령어이다. 이제 컨테이너화된 애플리케이션을 클러스터에 배포할 수 있습니다. 이 실습에서는 hello-app클러스터에서 실행한다. GKE는 Kubernetes 객체를 사용하여 클러스터의 리소스를 만들고 관리한다. 또한 Kubernetes는 웹 서버와 같은 상태 비저장 애플리케이션을 배포하기 위한 Deployment 개체를 제공한다. 서비스 객체는 인터넷에서 애플리케이션에 액세스하기 위한 규칙과 로드 밸런싱을 정의합니다. 이 명령어는 hello-server의 Deployment 개체를 만듭니다. Container Registry 버킷에서 예시 이미지를 가져옵니다.

 

kubectl expose deployment hello-server --type=LoadBalancer --port 8080

--port컨테이너가 노출하는 포트를 지정합니다.
type="LoadBalancer"컨테이너에 대한 Compute Engine 부하 분산기를 만듭니다.

위의 명령어는 애플리케이션을 외부 트래픽에 노출할 수 있는 Kubernetes 서비스를 생성하는 명령어입니다.

 

kubectl get service

Kubernetes 서비스에 대한 정보와 쿠버네티스 서비스를 확인하는 명령어입니다.

 

kubectl get service

외부 IP 주소가 생성되는 데 시간이 조금 걸릴 수 있습니다. EXTERNAL-IP열 상태가 pending인 경우 위의 명령어를 다시 실행하면 EXTERNAL-IP 정상적으로 나오는 것을 확인하실 수 있습니다.

 

http://[EXTERNAL-IP]:8080

위에서 확인했던 EXTERNAL-IP와 :8080을 브라우저 주소창에 입력하면 위의 화면이 나오는 것을 확인하실 수 있습니다.

화면에 Hello, world! 메시지가 표시되고 버전 및 호스트 이름도 잘 나오는 것을 확인하실 수 있습니다.

 

gcloud container clusters delete [CLUSTER-NAME]

위의 명령어는 클러스터를 삭제하는 명령어이다.

  1. 클러스터를 삭제 하려면 다음 명령어를 실행하세요.
  2. 메시지가 표시되면 Y를 입력하여 확인합니다.

클러스터를 삭제하는 데 시간이 조금 걸릴 수 있습니다.

728x90
728x90

쿠버네티스 입문반 Introduction to Docker

첫 수업으로 Introduction to Docker 강의를 들었습니다. 구글 클라우드 환경에서 터미널에 접속해 docker를 실행하고 실습하는 시간이 되었습니다. docker기본을 배우고 듣는 수업이라 어려운 수업은 아니였습니다. 강의가 영어로 되어있어 살짝 힘든 것 말고는 좋은 학습이 될 것 같습니다. 혹시 몰라 구글에서 사용하는 아이디는 모자이크 처리하였습니다.

 

구글 클라우드 쉘에 접속한 모습입니다. 여기서 쿠버네티스 실습을 진행합니다.

 

docker run hello-world

위의 사진을 잘 보시면 Unable to find image를 보실 수 있습니다. docker 데몬은 hello-world 이미지를 검색했지만 로컬에서 이미지를 찾지 못해서 Docker Hub라는 공개 레지스트리에서 이미지를 가져와서 해당 이미지에서 컨테이너를 생성하고 컨테이너를 실행했습니다.

 

docker images

docker images 명령어입니다. 이 스크린 샷은 못 찍었습니다. 이미지 목록을 확인하는 명령어입니다.

 

docker run hello-world

정상적으로 실행되었습니다. Hello from Docker !

 

docker ps

docker ps 명령어입니다. 실행 중인 컨테이너가 없습니다. 이전에 실행한 hello-world 컨테이너가 이미 종료되었습니다. 

 

docker ps -a

종료된 컨테이너를 포함하여 모든 컨테이너를 보려면 docker ps에서 - a 옵션만 추가시켜주면 됩니다.

 

mkdir test
cd test

test 디렉터리를 만들고 test 디렉터리에 들어갑니다. 

 

cat > Dockerfile <<EOF
# 공식 Node 런타임을 부모 이미지로 사용 
FROM node:lts
# 컨테이너의 작업 디렉터리를 /app으로 설정 
WORKDIR /app
# 현재 디렉터리 내용을 /app으로 설정
ADD . /app
# 컨테이너의 포트 80을 외부에서 사용할 수 있도록 설정.
EXPOSE 80
# 컨테이너가 실행될 때 node를 사용하여 app.js를 실행합니다. 
CMD ["node", "app.js"]
EOF

dockerfile을 만드는 방법에 대한 설명입니다. 간단하게 실습하는 것이라 명령어에 잘 모르실 경우 제 블로그 참고 바랍니다.

https://lusida-coding.tistory.com/35?category=1031465 

 

따배도) Docker 명령어, dockerfile 만들기 및 repo배포

따라 하며 배우는 도커 유튜브 영상을 보고 학습한 내용을 블로그에 정리하려고 합니다. 1. 도커 기본 명령어 docker docker를 설치하셔서 docker를 치면 docker에 관련된 명령어들이 나온다. docker search

lusida-coding.tistory.com

 

cat > app.js <<EOF
const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World\n');
});
server.listen(port, hostname, () => {
    console.log('Server running at http://%s:%s/', hostname, port);
});
process.on('SIGINT', function() {
    console.log('Caught interrupt signal and will exit');
    process.exit();
});
EOF

노드 애플리케이션 파일을 만듭니다. 포트 80에서 수신 대기하고 Hello World를 출력하는 간단한 HTTP 서버입니다.

 

docker build -t node-app:0.1 .

 

이미지를 빌드합니다. "."은 현재 디렉터리를 의미하므로 Dockerfile이 있는 디렉토리 내에서 이 명령어를 실행해야 합니다.

 

node은 기본 이미지이며 node-app빌드한 이미지입니다. node먼저 제거하지 않고는 node-app을 제거할 수 없습니다. 이미지의 크기는 VM에 비해 상대적으로 작습니다.

 

docker run -p 4000:80 --name my-app node-app:0.1

방금 빌드한 이미지를 기반으로 컨테이너를 실행합니다. 현재 터미널에서 실행되는 것을 확인하실 수 있습니다.

 

curl http://localhost:4000

--name은 원하는 경우 컨테이너의 이름을 지정할 수 있습니다.호스트 의 -p포트 4000을 컨테이너의 포트 80에 매핑하도록 명령어를 작성했다. 이제 http://localhost:4000. 포트 매핑이 없으면 localhost의 컨테이너에 연결할 수 없습니다. 다른 터미널을 열고 서버를 테스트합니다. Hello World가 정상적으로 출력되는 것을 확인하실 수 있습니다.

 

docker stop my-app && docker rm my-app

컨테이너를 중지하고 컨테이너를 지우는 명령어입니다.

 

docker run -p 4000:80 --name my-app -d node-app:0.1

컨테이너를 백그라운드에서 실행하려면(터미널 세션에 연결되지 않음) -d옵션을 지정해야 합니다.

 

docker logs my-app

컨테이너의 로그를 확인하는 명령어입니다.

docker logs -f [container_id]

 컨테이너가 실행될 때 로그의 출력을 실시간으로 확인하려면 -f옵션을 사용하면 됩니다.

 

docker build -t node-app:0.2 .

app.js파일에서 Hello World를 Hello Cloud로 수정 후 node-app:0.2로 빌드를 진행하였습니다.

2단계에서 기존 캐시 계층을 사용하고 있음을 알 수 있습니다. 3단계부터 에서 변경했기 때문에 레이어가 수정됩니다.

 

docker run -p 8080:80 --name my-app-2 -d node-app:0.2
curl http://localhost:8080
curl http://localhost:4000

새 이미지 버전으로 다른 컨테이너를 실행합니다. 호스트 포트 4000은 이미 사용 중이기 때문에 사용할 수 없습니다. 컨테이너를 실행 후 curl로 8080과 4000에 접속 테스트를 진행하였습니다. 8080에는 모자이크로 잘리긴 했으나 Hello to Cloud가 출력되었고 4000에는 수정하기 전인 Hello World가 출력되었습니다.

 

docker exec -it [container_id] bash

실행 중인 컨테이너 내에서 Bash 세션을 시작할 때는 명령어 마지막에 bash라고 지정해주면 됩니다. docker exec -it를 사용하면 pseudo-tty를 할당하고 표준 입력을 열린 상태로 유지하여 컨테이너와 상호 작용할 수 있습니다. bash는 Dockerfile에 WORKDIR지정된 디렉터리(/app)에서 실행되었습니다.

 

docker inspect [container_id]

Docker inspect를 사용하여 Docker에서 컨테이너의 메타데이터를 확인할 수 있습니다.

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
--format은 반환된 JSON에서 특정 필드를 검사하는 데 사용 합니다.
위의 예시는 IPAddress을 확인하는 명령어입니다.
 

docker tag node-app:0.2 gcr.io/[project-id]/node-app:0.2

도커를 푸시를 해주려면 컨테이너에 태그가 붙어있어야 합니다. 제 개인 도커 레파지토리에 푸시를 하려면 제 도커 레파지토리 이름 태그를  붙여줘야 합니다.

docker push gcr.io/[project-id]/node-app:0.2

도커를 gcr에 푸시하는 명령어입니다. 

 

728x90
728x90

구글 Cloud Study Jam 쿠버네티스 입문반 과정을 진행한다고 메일이 왔었습니다.

메일 확인을 늦게 해서 턱걸이로 마감 직전에 신청을 완료하였습니다.

도커에 대해 학습을 완료하고 쿠버네티스에 대해 학습을 하려고 강의를 찾고 있었는데 이런 기회가 있어서 정말 감사합니다.

과정 기간은 2022년 6월 27일부터 2022년 7월 25일까지입니다. 학습을 완료하고 수료를 하면 기념품을 증정한다고 하니 열심히 들어야겠습니다. 

수료 조건은 제공된 강좌[Qwiklabs] Kubernetes in the Google Cloud 완료 시 수료가 된다고 합니다.


제공되는 강좌 목록

제공되는 강좌 목록입니다. 입문 과정이지만 배포까지 진행되는 과정인 것 같습니다.수료를 위해 열심히 강의를 듣고 학습한 내용에 대해 블로그에 정리하겠습니다.

 

728x90

+ Recent posts