Kubernetes

Kubernetes 기초 - Pod(1)

사실 나도 모름 2023. 12. 6. 04:03
  1. 파드(Pod)란
  2. CLI로 파드 생성
  3. 파일로 파드 생성
  4. 알면 좋은 내용

1. 파드(Pod)란

파드(Pod)는 쿠버네티스에서 가장 작은 배포 단위이자 기본 실행 단위다.

파드는 하나 이상의 컨테이너를 포함하며, 이 컨테이너들이 동일한 노드에서 공유하는 네트워크 네임스페이스, IPC 네임스페이스, UTS 네임스페이스 등과 같은 리눅스 네임스페이스를 함께 사용한다.

 

파드의 주요 특징

  1. 컨테이너 그룹 : 파드는 하나 이상의 컨테이너를 묶어서 관리합니다. 이 컨테이너들은 같은 노드에서 실행되며, 공통의 네트워크와 스토리지를 공유합니다.
  2. 공유 네임스페이스 : 파드 안의 컨테이너들은 리눅스의 여러 네임스페이스를 공유합니다. 이는 파드 내에서 각 컨테이너가 독립적으로 실행되는 것처럼 보이면서도, 같은 네트워크 환경과 호스트 환경을 공유할 수 있도록 합니다.
  3. 단일 IP 주소 : 파드는 하나의 IP 주소를 가지며, 파드 안의 컨테이너들은 같은 네트워크 네임스페이스를 공유하므로 서로 통신할 수 있습니다.
  4. 컨테이너 간 통신 : 같은 파드 내의 컨테이너들은 로컬호스트를 통해 간단하게 통신할 수 있습니다. 이는 서로 강력한 결합을 필요로 하는 어플리케이션의 경우 유용하게 사용될 수 있습니다.
  5. 스토리지 공유 : 파드 내의 컨테이너들은 스토리지를 공유할 수 있습니다. 이를 통해 파일이나 데이터베이스 등을 공유하거나, 볼륨을 통해 데이터를 영속적으로 저장할 수 있습니다.

파드는 쿠버네티스에서 어플리케이션을 실행하고 관리하는 기본 단위이며, 컨테이너 오케스트레이션과 관련된 여러 기능을 지원한다.

 

 

 

 


2. CLI로 파드 생성

파드를 생성할 때 일반적으로 deployment를 사용해서 배포한다.

deployment에는 다양한 요소들이 들어있어 이름의 뜻과 같이 파드를 어떻게 배포할 것인지 상세 설정을 기재하여 배포하는 형식으로 활용된다.

 

kubectl 사용법

 

kubectl 명령 사용법
kubectl [command] [Type] [Name] [flags]    # [ ]에 묶여있는 것은 때때로 생략이 가능하다.

 

  • command의 종류
    • create
    • get
    • delete
    • edit
    • run
    • set
    • describe
    • port-forward
    • logs
    • exec
    • ...
  • Type의 종류
    • node
    • pod
    • ingress
    • service
    • replicaset
    • deployment
    • ...
  • flags의 종류
    • --namespace
    • --context
    • -o [options]
    • --dry-run
    • --show-label
    • --help
    • ...

다양한 명령이 있으니 자세한 것은 명령 뒤에 '--help'를 붙여서 찾아보면 된다.

 

 

kubectl run으로 파드 생성

 

현재 상태

현재 노드(master와 node1, 2, 3)
현재 파드 없음

 

 

 

# 80번 포트로 연결가능한 nginx 최신버전 컨테이너가 들어있는 파드 생성
kubectl run web --image=nginx:latest --port=80

 

생성 완료

 

참고로  kubectl run의 경우는 run 뒤에 pod라는 Type이 붙어있지 않다.

이는 파드를 실행하는 명령이기에 Type은 pod 이외에는 올 수 없으므로 명시하지 않는다.

명시하려고 했다가 오류가 발생한다.

 

하나씩 해석해보자.

  • kubectl : API서버에게 요청하는 명령
  • run : 파드를 실행하는 명령(command)
  • web : 이름(Name)
  • --image=nginx:latest : nginx이미지를 최신버전으로 가지고 오라는 flag
    최신버전을 원하는 경우 뒤에 :latest는 생략 가능하다.
  • --port : 컨테이너에 접속하는 포트를 80번으로 지정하는 flag
# 파드 삭제
kubectl delete pod web

삭제도 간단하게

 

 

deployment를 이용해서 파드 생성

 

deployment는 앞서 설명했듯이 파드를 어떻게 배포할 것인지 상세 정보를 기술한 것이다.

# deployment로 동일한 파드 3개 생성
kubectl create deployment home --image:httpd --replicas=3

deployment로 파드 생성 완료

위와 같이 deployment를 통해 파드 3개를 한번에 생성할 수도 있다.

 

하나씩 해석해보자.

  • kubectl :  API서버에게 요청하는 명령
  • create : 생성하라는 명령(command)
  • deployment : deployment로 배포하는 명령(Type)
  • home : 이름(Name)
  • --image:httpd : apache2 최신버전 이미지로 생성하는 flag
  • --replicas=3 : 파드를 3개로 유지하라는 flags

참고로 replicas는 파드를 몇개 생성하라는 뜻도 되지만 파드에 장애가 발생하여 동작하지 않을 때 실행중인 파드의 개수가 3개가 되도록 유지하는 역할을 한다.

 

# 파드 정보 확인
kubectl get pods

파드를 삭제했더니 곧바로 새로운 파드 생성

 

이렇게 항상 3개를 유지하려고 노력한다.

파드의 정보를 조금 더 자세히 보자.

 

# 파드의 상세 정보 확인
kubectl get pods -o wide

파드의 상세 정보

명령 뒤에 -o wide라는 flag를 붙이면 상세정보가 나온다.

NODE라고 되어있는 필드를 보면 node1, node2, node3에 골고루 배치되어있다.

이는 지난 포스트에서 언급했듯이 scheduler가 각 노드의 리소스 상태를 점검하고 적합한 노드에 파드를 배치를 하는 과정에서 위와 같이 된 것이다.

 

 

파드 생성 정보 수정

 

위와 같이 현재 3개의 파드가 배포되었다.

만약 replicas를 3개가 아니라 5개로 바꾸고 싶다면 어떻게 해야할까?

 

# 파드 정보 수정
kubectl edit deployment home

다음과 같은 vi 에디터 화면이 나온다.

 

vi 에디터를 조금 사용할 줄 알아야 해당 작업을 수행하기가 쉽다.

위 내용은 yaml파일 형식으로 되어있으며 하이라이트된 부분을 보면 우리가 처음에 CLI로 명시한 replicas가 있다.

저기를 3에서 5로 바꿔주면 yaml파일을 수정하는 즉시 파드가 추가적으로 더 생성된다.

이렇게 5로 변경

 

# 파드의 상세 정보 확인
kubectl get pods -o wide

파드가 5개로 증가했다.

 

이렇게 edit명령을 통해 실행중인 deployment의 내용을 수정할 수도 있다.

방금 전 내용을 본 것처럼 쿠버네티스에서 클러스터에 파드를 배포하는 경우는 CLI로 직접하는 것보다 yaml파일을 작성해서 실행시켜 배포하는 경우가 더 편리하며 대부분 이런 형태로 운영된다.

 

일단 다음 실습을 위해 기존의 리소스들은 삭제한다.

# deployment 삭제
kubectl delete deployment home

 

 

쿠버네티스가 처음이라면 지금까지 내용이 뭔 소린가 싶겠지만 나중에 계속하다 보면 자연스럽게 습득될 것이다.

 

지금부터 파일로 파드를 배포하는 방법을 알아보자.

 

 

 

 


3. 파일로 파드 생성

yaml파일을 작성하는 법은 귀찮다.

직접 처음부터 작성할 수도 있겠지만 CLI로 파드를 생성하던 방법에서 yaml파일을 구할 수도 있다.

 

# yaml파일 형식으로 보기
kubectl create deployment home --image=nginx --port=80 --replicas=3 --dry-run -o yaml > home.yaml

--dry-run이 더이상 사용되지 않으며 --dry-run=client로 대체되었다고는 하지만 일단 무시한다.
yaml파일 생성

 

명령이 조금 길지만 하나씩 알아보자.

  • kubectl : API서버에게 요청을 보내는 명령
  • create : 뭔가를 생성하는 명령(command)
  • deployment : deployment(Type)
  • home : 이름(Name)
  • --image=nginx : nginx 최신버전 이미지를 사용
  • --port=80 : 컨테이너로 접속할 때 80번 포트로 접속
  • --replicas=3 : 파드를 3개로 유지
  • --dry-run : 해당 명령으로 실행되는 결과를 시뮬레이션하여 화면에 표시
  • -o yaml : yaml형식으로 표시
  • > home.yaml : 표준 입력(stdin)으로 리다이렉션하라는 뜻으로 출력의 결과를 home.yaml파일로 생성

조금은 이해가 되었을지 모르겠다.

이번에는 생성된 yaml파일을 보자.

vi home.yaml을 입력한다.

### 아래와 같이 일부분 지우기
# home.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: home
  name: home
spec:
  replicas: 3
  selector:
    matchLabels:
      app: home
  template:
    metadata:
      labels:
        app: home
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

 

위 형식이 yaml파일 형식이다.

위 파일을 실행시키면 nginx이미지로 3개의 파드가 생성될 것이다.

 

# home.yaml파일로 배포
kubectl create -f home.yaml

정상적으로 실행된다.

 

  • kubectl : API서버에게 요청
  • create : 뭔가를 생성
  • -f home.yaml : -f는 파일을 통해 생성한다는 flag 옵션이며 home.yaml파일을 사용하겠다는 뜻

home.yaml파일 안에는 deployment에 대한 yaml코드들이 있다.

이렇게 파일을 이용하여 파드를 배포할 수도 있다.

 

yaml파일에는 다양한 API(Pod, Service, Namespace 등)들을 기재하여 한번에 배포할 수 있다.

한번 배포하면 삭제는 일일이 해야할까?

삭제도 마찬가지로 파일로 생성했으니 파일을 이용해서 삭제할 수 있다.

# yaml파일로 API 리소스 삭제
kubectl delete -f home.yaml

파일로 리소스 삭제

 

yaml파일 내부에는 deployment밖에 없기에 deployment만 삭제되었지만 만약 yaml파일에 여러 API들이 기재되어있고 현재 시스템에서 실행중이라면 다음과 같은 명령으로 한번에 삭제할 수도 있다.

 

 


 

 

 

4. 알면 좋은 내용

curl

 

'curl'은 커맨드 라인을 통해 데이터를 전송하거나 받을 수 있는 도구다.

kubectl get pods -o wide를 사용하면 파드의 IP가 나오는데 해당 IP를 이용하면 nginx 홈페이지 문구가 나온다.

# curl 사용해보기
curl <파드의 IP or 도메인 주소>

 

 

 

kubectl exec

 

파드 내부로 접속하는 명령이다.

파드의 개별적인 수정이 필요할 때 혹은 유지보수를 위한 목적으로 주로 활용된다.

웹 서버의 파드로 접속해서 index.html파일의 내용을 수정하면 curl로 파드의 데이터를 가져오면 수정한 내용이 반영되어 표시된다.

# 파드에 bash shell로 접속
kubectl exec -it <파드 이름> -- /bin/bash

# 파드 접속 후
cd /usr/share/nginx/html/
echo "Hello! I'm Master" > index.html

내용 수정
curl로 확인

 

 

 

port-forwarding

 

생성한 컨테이너를 접속하기 위해서는 포트 개방이 필수적이다.

포트포워딩을 통해 원하는 파드로 접속하는 포트를 지정해줄 수도 있다.

# 8080포트로 접속하면 80포트로 포트포워딩
kubectl port-forward webserver 8080:80

 

curl 명령을 통해 8080포트로 접속을 시도하면 nginx화면이 표시된다.

curl localhost:8080

 

 

 

파드에 대해서 간단하게 알아봤지만 나중에 더 자세하게 다루게 될 때가 있으니 이런게 있다 정도로만 알고 넘어가면 좋다.

 

 

 


 

 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Pod(3)  (0) 2023.12.07
Kubernetes 기초 - Pod(2)  (0) 2023.12.06
Kubernetes 기초 - 동작 원리  (0) 2023.12.06
23.9.7(목) 쿠버네티스 9일차  (0) 2023.09.07
23.9.6(수) 쿠버네티스 8일차  (0) 2023.09.06