교육, 커뮤니티 후기/인프런 교육

<인프런> 대세는 쿠버네티스 [초급] - No.7 Object - Pod

Somaz 2022. 8. 29. 17:13
728x90
반응형

Overview

이번 글에서는 Kubernetes의 가장 기본적인 실행 단위인 Pod에 대해 학습하였다.
Pod는 하나 이상의 컨테이너를 포함할 수 있는 논리적인 단위이며, 클러스터 내부에서 고유 IP를 통해 통신이 가능하다.


하지만 Pod는 휘발성이 있기 때문에, 직접 접근보다는 Service를 통한 연결이 일반적이다.

또한 Pod에는 다양한 Label을 부여하여 목적에 따라 분류하고, 특정 Label을 기준으로 Service를 연결하거나 관리할 수 있다.


Pod가 어디에서 실행될지를 제어할 수 있는 Node 스케줄링 방식(nodeSelector, 자원 기반 스케줄링) 도 함께 살펴보며 클러스터 내 자원 활용에 대한 이해를 넓혔다.

 

마지막으로, Pod를 생성하고 제어하는 데 사용되는 kubectl 명령어의 기본 사용법도 정리하였다.

 

 

 


 

 

 

Object - Pod

 

 

 

 

 


 

 

 

Container

 

 

Pod의 특징을 보면 pod 안에는 하나의 독립적인 Service를 구동할 수 있는 Container들이 있다.

Container들은 Service가 연결될 수 있도록 Port를 가지고 있다. Container가 Port를 여러 개 가질 수는 있지만,

Pod내에서 Container들끼리 Port가 중복될 수는 없다. Container들은 같은 Host로 묶여있다.

 

그리고 Pod가 생성될 때 고유의 IP주소가 생성되고 Kubernetes Cluster 안에서만 해당 IP(10.16.36.22)를 통해서 해당 Pod에 접근할 수 있다.

 

외부에서는 해당 IP(10.16.36.22)로 접속할 수 없다. 만약 Pod에 문제가 생기게 되면, 시스템이 감지해서 Pod를 삭제시키고 재 생성하게 되는데 IP는 재생성된다. 따라서 휘발성을 가진 IP라고 볼 수 있다.

 

 

 

apiVersion: v1
kind: Pod
metadata:
 name: pod-1
spec:
 containers:
 - name: container1
   image: tmkube/p8000
   ports:
   - containerPort: 8000
 - name: container2
   image: tmkube/p8080
   ports:
   - containerPort: 8080
  • 위의 yaml 파일과 같이 한 개의 Pod에 여러 개의 Container를 담을 수 있다. 실습 때 확인해보록 하자.

 

 

 

 


 

 

 

Label

 

Label은 Pod뿐만 아니라 모든 Object에 설정할 수 있다. Label은 목적에 따라 Object들을 분류를 하고 분류된 Object들만 따로 연결을 하기 위해서이다.

 

 

Label의 구성은 Key : Value 가 한쌍이다. 한 Pod에는 여러개의 Label을 달 수 있다.

ex)
만약 개발자가 web 화면만 보고싶다고 하면 type:web label Pod 들을 Service에 연결을 해서 Service의 정보를 개발자에게 알려주면 된다.

또한 production 환경을 담당하는 운영자가 정보를 원하면 lo:production label Pod 들을 Service에 연결을 해서 Service의 정보를 운영자에게 알려주면 된다.

 

 

 

 

 

즉 각각의 담당자는 자신의 원하는 Pod들만 골라서 접속을 할 수 있게된다.

이렇게 사용목적에 따라, Label을 잘 설정해놓으면 해시태그를 찾아 검색을 하듯이 원하는 Pod들만 확인할 수 있다.

apiVersion: v1
kind: Pod
metadata:
 name: pod-2
 labels:
   type: web
   lo: dev
spec:
 containers:
 - name: container
   image: tmkube/init

-------------------------

apiVersion: v1
kind: Service
metadata:
 name: svc-1
spec:
 selector:
  type: web
 ports:
  - port: 8080

 

 

 

 


 

 

 

Node Schedule

 

 

1) 직접선택

 

 

 

 

 

Node에 Label을 달고 Pod를 만들때 Node를 지정할 수 있다.

apiVersion: v1
kind: Pod
metadata:
 name: pod-3
spec:
 nodeSelector:
  hostname: node1
 containers:
 - name: container
   image: tmkube/init

 

 

 

 

2) Kubernetes 스케줄러 판단

 

kubernetes 스케줄러가 node의 자원을 확인해서 자원이 많은 node쪽으로 pod를 할당해준다.

 

 

만약 이 설정을 하지 않는다면 pod안에 있는 app에서 부하가 생길 때, 무한정으로 node에 있는 자원을 사용하려고 할 것이고,

그럼 결국 해당 Node에 할당된 나머지 pod들은 자원이 고갈되서 전부 죽게된다.

apiVersion: v1
kind: Pod
metadata:
 name: pod-4
spec:
 containers:
 - name: container
   image: tmkube/init
   resources:
    requests:		# 메모리 2GB 요구
      memory: 2Gi
    limits:		# 최대 허용 메모리		
      memory: 3Gi

 

 

limits 추가설명

  • Memory: 초과시 Pod 종료 시킴
  • Cpu: 초과시 request로 낮춤 Over시 종료되지 않음

 

 

 

 


 

 

Sample Yaml

 

Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-4                           # Pod 이름
  labels:                               # Label 
    type: web                           
    lo: dev  
spec:
  nodeSelector:                         # Node 직접 지정시
    kubernetes.io/hostname: k8s-node1   
  containers:
  - name: container                     # Container 이름
    image: tmkube/init                  # 이미지 선택
    ports:
    - containerPort: 8080               
    resources:                          # 자원 사용량 설정
      requests:
        memory: 1Gi
      limits:
        memory: 1Gi

 

 

 

 


 

 

kubectl

 

 

Create

# 파일이 있을 경우
kubectl create -f ./pod.yaml

# 내용과 함께 바로 작성
kubectl create -f - <<END
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container
    image: tmkube/init
END

 

 

Apply

kubectl apply -f ./pod.yaml

 

 

Get

# 기본 Pod 리스트 조회 (Namepsace 포함)
kubectl get pods -n defalut

# 좀더 많은 내용 출력
kubectl get pods -o wide

# Pod 이름 지정
kubectl get pod pod1

# Json 형태로 출력
kubectl get pod pod1 -o json

 

 

Describe

# 상세 출력
kubectl describe pod pod1

 

 

Delete

# 파일이 있을 경우 생성한 방법 그대로 삭제
kubectl delete -f ./pod.yaml

# 내용과 함께 바로 작성한 경우 생성한 방법 그대로 삭제
kubectl delete -f - <<END
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container
    image: tmkube/init
END

# Pod 이름 지정
kubectl delete pod pod1

 

 

Exec

# Pod이름이 pod1인 Container로 들어가기 (나올땐 exit)
kubectl exec pod1 -it /bin/bash

# Container가 두개 이상 있을때 Container이름이 con1인 Container로 들어가기 
kubectl exec pod1 -c con1 -it /bin/bash

 

 

 

 


 

 

마무리

  • Pod는 Kubernetes에서 가장 작은 배포 단위로, 하나 이상의 컨테이너를 실행 가능하다.
  • Pod 내부의 IP는 휘발성이 강하기 때문에 Service를 통해 안정적인 접근이 필요하다.
  • Label은 Pod를 목적에 따라 분류하여 효율적인 관리 및 서비스 연결이 가능하도록 돕는다.
  • nodeSelectorResource 설정을 통해 Pod의 배치 위치와 자원 사용량을 제어할 수 있다.
  • kubectl 명령어를 통해 Pod의 생성, 조회, 수정, 삭제, 실행 등을 손쉽게 수행할 수 있다.

이번 글을 통해 Kubernetes에서 Pod가 어떤 역할을 하는지, 그리고 실무에서 어떻게 다뤄야 하는지 기본기를 다질 수 있었다.


다음 글에서는 Service, Deployment, ReplicaSet과 같은 상위 오브젝트를 다뤄보며 Kubernetes 운영에 한 걸음 더 다가가보자!

 

 

 

 


 

 

 

 

 

 

728x90
반응형