Pod란, 내부에 컨테이너들이 최소 한 개 이상 가지고 있는 단위입니다. 컨테이너 내부끼리 통신이 가능하며 컨테이너별 Port를 설정할 수 있습니다.
A 컨테이너에 8080을 주고 B 컨테이너에 8000을 주면 A 컨테이너에서 localhost:8000으로 B 컨테이너에 접근이 가능합니다.
Port는 중복이 불가능합니다. Pod 생성시 고유 IP(ClusterIP)를 할당해주고 이 IP는 클러스터 내부에서만 사용이 가능합니다. 새로 생성할 때마다 새 IP를 할당해 주기 때문에 휘발성입니다.
일반적으로 Deployment를 사용해서 생성하는 편이라 Pod를 직접 생성 할 일은 없습니다.
SimplePod.yaml apiVersion: v1 kind: Pod metadata: name: pod-1 spec: containers: // containers 아래에 컨테이너들을 설정합니다. - name: container1 image: tmkube/p8000 // container1 이미지 ports: - containerPort: 8000 // container1 Port 설정 - name: container2 image: tmkube/p8080 // container2 이미지 ports: - containerPort: 8080 // container2 Port 설정
#kubectl apply -f SimplePod.yaml
다음 명령어로 생성한 Pod의 ClusterIP를 확인할 수 있습니다.
#kubectl describe pods/pod-1 | more
컨테이너 통신 확인
#curl 10.32.0.5:8000
컨테이너 접속
#kubectl exec --stdin --tty pod-1 -- /bin/bash!
현재 container1에 접속한 상태이다. 이제 container 2와 통신이 잘 이루어지는지 확인해보자.
각각의 파드나 오브젝트별로 Label을 key:value 값으로 설정해 줄 수 있는데. 보통 사용방법으로는 pod를 프로덕션, 개발, db 등 환경을 나눠서 Lable을 정해준 뒤, 서비스를 필요에 맞게 설정해 놓고 pod를 끌어오게 합니다.
그러면 pod1~6까지 만들어보고 각각 라벨을 분류해 보겠습니다.
출처 : https://www.inflearn.com/users/@kubetm
https://kubetm.github.io/k8s/03-beginner-basic-resource/pod/
위의 이미지를 참고해서 type, lo를 분류하여 6개의 pod를 만듭니다.
Pod1.yaml apiVersion: v1 kind: Pod metadata: name: pod1 labels: type: web lo: dev spec: containers: - name: container image: kubetm/init
'lo: production'에 해당하는 Pod만을 가져오는 service를 생성합니다.
proService.yaml apiVersion: v1 kind: Service metadata: name: svc-for-prod spec: selector: lo: production ports: - port: 8080
#kubectl apply -f proService.yaml
Service를 실행하면 label 셀렉터가 'lo:production'에 맞는 Pod를 끌어와서 하나의 묶음으로 만들고 ClusterIp를 생성한다.
Pod를 생성할 때, 원하는 Node를 선정해서 사용할 수 있습니다. 보통은 스케쥴러가 자동으로 할당해줍니다.
node.yaml apiVersion: v1 kind: Pod metadata: name: pod-3 spec: nodeSelector: kubernetes.io/hostname: node1 containers: - name: container image: kubetm/init
Create
-> yaml 파일을 생성
#kubectl create -f ./pod.yaml
-> 명령어 실행과 함께 작성
#kubectl create -f <<END
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: container
image: kubetm/init
END
Apply
#kubectl appy -f ./pod.yaml
Get
-> 기본 Pod 리스트 조회
#kubectl get pods -n default
-> 세부 정보 조회
#kubectl get pods -o wide
->Pod 이름 지정
#kubectl get pod pod1
-> Json 형태로 출력
#kubectl get pod pod1 -o json
Desribe
#kubectl describe pod pod1
Delete
#kubectl delete -f ./pod.yaml
Exec
#kubectl exec pod1 -it /bin/bash
-> 컨테이너가 둘 이상일 때
#kubectl exec pod1 -c con1 -it /bin/bash