쿠버네티스-Pod 관련 실행 연습

2022. 11. 20. 18:58프로그래밍

728x90

이 포스트에서 우리는 Kubernetes의 매우 중요한 개념인 기본 빌딩 블록인 Pod에 대해 논의해 볼 것입니다.

https://examples.javacodegeeks.com/kubernetes-pods/

 

Kubernetes - Pods

In this post, we are going to discuss a very important concept and the basic building block of Kubernetes which is a Pod. A Pod is a basic...

examples.javacodegeeks.com

 

1. 소개

Pod는 Kubernetes(K8S) 클러스터의 기본 빌드 블록이자 배포 가능한 최소 단위입니다. Pod는 하나 이상의 컨테이너를 포함할 수 있습니다.

 

Kubernetes 세계에서 모든 것은 하나의 객체입니다. 예를 들어 Pod, Deployment, Service 등은 서로 다른 종류의 객체입니다.

 

간단히 말해서 Pod는 컨테이너의 래퍼라고 할 수 있습니다. Kubernetes 클러스터에 컨테이너를 직접 배포할 수 없습니다. Kubernetes는 다음의 CRT(Container Runtime) 환경을 지원하기 때문입니다.

  • Docker
  • containerd
  • CRI-O
  • Mirantis Container Runtime

Kubernetes가 K8S 클러스터에 배포한 이러한 컨테이너 유형들을 이해하는 것은 매우 어렵습니다. 따라서 Kubernetes는 Pod만 이해할 수 있으며 CRT는 컨테이너를 처리합니다.

 

K8S 클러스터에서 하나 이상의 포드를 노드(물리적 서버 또는 가상 머신)에 배포할 수 있으며 각 포드에는 아래와 같이 하나 이상의 컨테이너가 포함될 수 있습니다.

그림 1: 마스터 노드 1개와 작업자 노드 2개가 있는 K8S 클러스터.

참고:- 로컬 환경에 Docker 소프트웨어(예: Docker Desktop)를 설치하십시오.

 

저는 MacOS를 사용하여 이 포스트에서 제공하는 모든 설치 단계와 예제를 수행/실행할 것입니다.

 

2. 환경설정

어떤 Kubernetes 환경을 사용하여 Google GKE, AWS EKS, AKS, Minikube 등에 이 게시물에 제공된 명령이나 예제를 실행할 수 있습니다.

 

이번 포스팅에서는 Minikube 환경을 사용하겠습니다. Minikube는 단일 노드 및 오픈 소스 Kubernetes 클러스터입니다. 로컬 Minikube 환경을 설정하려면 다음 3단계를 수행해야 합니다.

 

2. 환경 설정

이 섹션에서는 다음 섹션에서 설명 할 명령과 예제를 실행하기 위한 로컬 Minikube 환경을 설정하려고 합니다.

 

2.1. 버추얼박스 설치

이 페이지에서 OS에 따라 필요한 VirtualBox 소프트웨어를 다운로드한 다음 해당 소프트웨어를 두 번 클릭하여 몇 가지 간단한 단계로 설치하십시오.

 

MacOS에서는 다음 brew 명령을 사용하여 간단히 설치할 수 있습니다.

brew install --cask virtualbox
 

2.2. Minikube 설치

이 Minikube 문서 페이지에서 OS에 따라 필요한 Minikube 소프트웨어를 선택한 다음 해당 소프트웨어를 두 번 클릭하여 몇 가지 간단한 단계로 설치하십시오.

MacOS에서는 다음 brew 명령을 사용하여 Minikube를 간단히 설치할 수 있습니다.

brew install minikube
 

Minikube가 제대로 설치되면 다음 명령으로 이 환경을 시작하세요.

minikube start --driver=virtualbox
 

이 게시물에서는 VirtualBox를 Minikube 드라이버(가상화 도구)로 사용할 예정입니다. docker를 드라이버로 사용하려면 다음 명령을 사용하여 Minikube 환경을 시작하고 실행하십시오.

minikube start --driver=docker
 

참고:- 사용 가능한 Minikube 드라이버를 더 알고 싶다면 이 페이지를 확인하십시오.

 

Minikube 환경 상태를 확인하려면 아래 명령어를 실행하세요.

minikube status
 

2.3. Kubectl 설치

Minikube 환경을 설치하면 기본적으로 kubectl 명령줄 도구가 제공됩니다. 이 명령을 사용하려면 이 단계를 수행할 필요가 없습니다. 이 명령줄 사용의 제가 찾은 유일한 문제는 아래와 같이 약간 지루한 접근 방식입니다.

minikube kubectl <command>
 

아래 명령처럼 전달하지 못하고, 매번 "minikube kubectl"을 입력해야 합니다.

kubectl <command>
 

이 바로 가기나 간단한 명령을 사용하려면 kubectl 명령줄 도구를 별도로 설치해야 합니다.

brew install kubectl
 

kubectl 명령어를 성공적으로 설치한 후, 다음 명령어를 실행하여 버전을 확인하고 kubectl 명령어가 제대로 설치되었는지 다시 확인하십시오.

kubectl version
 

 

3. 쿠버네티스 Pod 운영

우리는 두 가지 방법으로 Pod 생성, 업데이트 및 삭제와 같은 Pod 작업을 수행할 수 있습니다.

1. 명령적 접근 방식

2. 선언적 접근 방식

 

3.1. Pod – 필수 접근 방식

이 섹션에서는 명령형 접근 방식으로 일부 포드 작업을 수행하는 방법을 탐구하려고 합니다.

 

kubectl 명령으로 pod를 생성하려면

kubectl run <pod-name> –image=<image-name>
 

여기서 pod-name은 생성할 포드의 이름이고 image-name은 새 포드에 배포할 도커 이미지 또는 컨테이너 이름입니다. Minikube 환경에서 이 명령을 실행하면 Dockerhub에서 해당 이미지를 다운로드하여 새 포드에 컨테이너로 배포합니다.

 

아래에 언급된 대로 명령을 실행하십시오.

그림 2: 포드 명령.

 

모든 포드 세부 정보를 얻으려면 이 명령을 사용하세요.

kubectl get pods
 

이름, 네임스페이스, IP 세부 정보, 상태, 이벤트 등과 같은 포드의 전체 세부 정보를 얻으려면 이 명령을 사용하십시오.

kubectl describe pod nginx
 

포드를 삭제하려면 이 명령을 사용하세요.

kubectl delete pod nginx
 

3.2. Pod – 선언적 접근 방식

이 섹션에서는 선언적 접근 방식으로 일부 포드 작업을 수행하는 방법을 탐구하려고 합니다.

 

이 접근 방식에서 가장 먼저 해야 할 일은 포드 작업을 수행하기 위해 YAML 파일에 모든 포드 세부 정보를 정의하는 것입니다. 이 접근 방식을 사용하여 여기에서 동일한 nginx 포드를 만들려고 합니다.

 

이 단계를 수행하기 전에 기존 nginx 포드(있는 경우)를 삭제하십시오.

 

3.2.1. YAML 파일 정의

 

YAML 파일은 계획 텍스트 파일입니다. 이 텍스트 파일 확장자로 "yaml" 또는 "yml"을 사용할 수 있습니다. 이 YAML 파일을 생성하려면 일관된 공백(탭 아님)으로 적절한 들여쓰기 법을 따라야 합니다.

apiVersion: v1
kind: Pod
metadata: 
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
 

여기서 우리는 주로 4가지를 이해해야 합니다

  • apiVersion: Kubernetes API 버전
  • kind: Kubernetes에서는 모든 것이 객체입니다. 여기에서 이 yaml 파일을 사용하여 생성할 객체의 종류를 정의해야 합니다. 예를 들어 Pod, Deployment, Service 등
  • metadata: 새로 생성된 포드 이름을 정의해야 합니다.
  • spec: 여기에 이미지 세부 정보를 나열해야 합니다.

이 YAML 파일을 관찰하면 Map 및 List 구성 요소의 형태로 K8S 객체의 모든 세부 정보가 포함되어 있다고 말할 수 있습니다. Map은 키 및 값 공정을 의미하고 List는 값 또는 키/값 목록을 의미합니다. 이러한 맵과 목록을 단순하거나 복잡한 구성 요소로 정의할 수 있습니다. 이는 복잡한 맵 또는 목록이 다른 맵 및/또는 목록을 포함할 수 있음을 의미합니다.

 

예를 들어, apiVersion은 하나의 키 및 값 항목이 있는 apiVersion: v1과 같은 간단한 맵입니다.

metadata는 복잡한 맵이며 내부에 또 다른 간단한 맵이 포함되어 있습니다.

spec은 복잡한 맵이며 컨테이너를 복잡한 맵으로 포함하고 차례로 복잡한 목록을 포함합니다.

 

3.2.2. YAML 파일을 사용하여 Kubernetes Pod 만들기

 

모든 pod 세부 정보가 포함된 YAML 파일 매니페스트 파일을 정의한 후에는 선언적 접근 방식으로 해당 포드를 생성하기 위해 다음 명령을 실행해야 합니다.

 

여기 apply 는 존재하지 않는 경우 새 포드를 생성하거나 제공된 세부 정보로 기존 포드를 업데이트하는 데 사용됩니다.

존재하지 않는 새 포드를 생성하려는 경우 아래와 같이 생성 옵션을 사용할 수 있습니다.

kubectl create -f nginx.yaml
 

nginx 컨테이너가 실행되는 nginx 포드를 생성한 후 즐겨 사용하는 브라우저를 사용하여 외부에서 홈페이지에 액세스하려면 아래와 같이 포트 포워드 개념을 사용해야 합니다:

기본적으로 nginx는 내부적으로 80포트에서 실행됩니다. 우리는 외부 세계를 위해 80을 8080(사용 가능한 모든 포트 번호)으로 포트 포워딩하고 있습니다.

이제 아래와 같이 http://localhost:8080 을 사용하여 nginx 홈페이지에 액세스할 수 있습니다.

그림 5: Nginx 홈페이지.

선언적 방식으로 nginx 포드를 삭제하려면 이 명령을 사용하세요.

kubectl delete -f nginx.yaml
 

4. 자체 Docker 이미지로 Kubernetes Pod 생성

이전 섹션에서는 Dockerhub 환경에서 사용 가능한 도커 이미지를 사용하여 nginx Pod를 생성했습니다. 이 섹션에서는 자체 도커 이미지를 생성하여 Dockerhub에 푸시하고 Minikube 클러스터에서 이 이미지에 대한 포드를 생성할 것입니다.

Flask 프레임워크와 함께 Python 프로그래밍 언어를 사용하여 표준 "Hello World" 예제를 구현합니다.

 

4.1. 파이썬 애플리케이션 만들기

아래와 같이 REST API로 엔드포인트를 노출하는 Python 애플리케이션을 만듭니다.

from flask import Flask
app = Flash(__name__)
  
@app.route("/hello", methods=['GET'])
def helloworld():
    return "Hello World."
      
app.run(host="0.0.0.0", port=9090)
 

여기에서 helloworld python 함수를 만들고 /hello 끝점으로 노출했습니다.

도커 이미지에 플라스크 라이브러리를 설치하기 위해 requirements.txt 파일을 만듭니다.

flask
 

4.1. 도커파일 생성

아래와 같이 Dockerfile을 생성합니다.

FROM python:3.9.14-slim
RUN mkdir /app
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD ["python","helloworld.py"]
 

4.3. 이미지 생성 및 Dockerhub에 푸시

여기서 우리는 우리 자신만의 helloworld 도커 이미지를 만들 것입니다. 다음 내용이 포함된 내 현재 폴더 이름 helloworld:

 

  • helloworld.py
  • requirements.txt
  • Dockerfile

이 연습을 하려면 Dockerhub 환경에 가입해야 합니다. 내 Dockerhub 사용자 이름은 rambabuposa입니다.

helloworld 폴더에서 다음 명령을 실행해야 합니다.

버전 1.0으로 helloworld 도커 이미지를 생성하려면 다음 명령을 실행하세요.

docker build -t helloworld:1.0 .
 

다음 명령을 실행하여 이미지 생성 여부를 확인합니다.

docker images
 

helloworld 이미지에 대한 태그를 만들어 Dockerhub 환경에 푸시하려면 이 명령을 실행하세요.

docker tag helloworld:1.0 rambabuposa/helloworld:1.0
 

여기 rambabuposa는 내 Dockerhub 사용자 이름입니다.

이제 로그인 자격 증명으로 Dockerhub에 로그인하여 도커 이미지를 푸시합니다.

docker login --username=rambabuposa
 

그런 다음 아래 그림과 같이 암호를 입력하십시오

Rambabus-MBP:helloworld ram$ docker login --username=rambabuposa 
Password: 
Login Succeeded

Logging in with your password grants your terminal complete access to your account. 
For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/
 

이제 다음 명령을 사용하여 helloworld 도커 이미지를 Dockerhub에 푸시합니다.

docker push rambabuposa/helloworld:1.0
 
Rambabus-MBP:helloworld ram$ docker push rambabuposa/ram-helloworld:1.0
The push refers to repository [docker.io/rambabuposa/ram-helloworld]
e6c07fb068dd: Pushed 
105176bfd2bd: Pushed 
c4488c216d7d: Pushed 
da32bfd482fc: Mounted from library/python 
6d8788bedbf9: Mounted from library/python 
c9e151a52aaa: Mounted from library/python 
8fb064dfbf5f: Mounted from library/python 
18f9b4e2e1bc: Mounted from library/python 
1.0: digest: sha256:375b723bfb54f135d6744ca4af45bbc06fd7849c454b5a4ecb1d391fb9f8a18d size: 1995
 

브라우저에서 Dockerhub에 로그인하고 상단 메뉴에서 "Repositories" 옵션을 클릭하면 아래와 같이 새로 생성된 도커 이미지를 볼 수 있습니다.

4.4. Docker 이미지를 사용하여 Kubernetes Pod 만들기

이제 Helloworld 도커 이미지가 Dockerhub 환경에서 준비되었습니다. 이제 YAML 파일을 만들어 Pod를 만들고 Python REST API에 액세스할 차례입니다.

 

도커 이미지를 생성한 동일한 helloworld 디렉토리 아래에 helloworld.yaml 또는 helloworld.yml 파일을 생성하십시오.

apiVersion: v1
kind: Pod
metadata: 
  name: helloworld
spec:
  containers:
  - name: helloworld
    image: rambabuposa/helloworld:1.0
 

helloworld 명령에서 다음 명령을 실행하여 새 Kubernetes 포드를 생성하십시오.

kubectl apply -f nginx.yaml
 

helloworld REST API를 외부 세계에 노출하려면 다음 명령을 실행하십시오.

kubectl port-forward helloworld 9090:9090
 

 

즐겨 사용하는 브라우저에서 helloworld REST API에 접근한 모습

다음 포스팅에서 #K8S 의 또 다른 중요한 컨셉으로 찾아뵙겠습니다. 

즐겁게 배우시길..

 

이상.

 

 

 

728x90