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

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

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

Overview

오늘은 kubernetes pod에 대해서 공부해보려고 한다.

 

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

 

728x90
반응형