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
'교육, 커뮤니티 후기 > 인프런 교육' 카테고리의 다른 글
<인프런> 대세는 쿠버네티스 [초급] - No.8 Object - Pod 실습 (0) | 2022.08.30 |
---|---|
<인프런> 대세는 쿠버네티스 [초급] - No.9 Object - Service (0) | 2022.08.29 |
<인프런> 대세는 쿠버네티스 [초급] - No.6 Kubernetes Cluster 설치(v1.22) (0) | 2022.08.29 |
<인프런> 대세는 쿠버네티스 [초급] - No.5 Kubernetes Overview (0) | 2022.08.29 |
<인프런> 대세는 쿠버네티스 [초급] - No.4 Kubernetes Overview (0) | 2022.07.16 |