이 글은 김태민님의 대세는 쿠버네티스 강의를 참고하여 정리하였습니다!
도커 이미지는 김태민님께서 만들어두신 이미지를 사용합니다.
먼저, Pod는 기본적으로 한 개 이상의 컨테이너들로 구성괴어 있습니다.
Pod안의 컨테이너들은 서비스가 서로 연결될 수 있도록 포트를 가지고 있습니다.
여기서, 한 컨테이너는 하나 이상의 포트를 가질 수 있지만, 한 포트를 여러 컨테이너가 공유하지는 못하게 됩니다.
Pod는 또한 생성될 때 고유의 IP가 생성됩니다.
Pod를 IP를 통해서 접근할 경우 쿠버네티스 클러스터 내에서만 접근이 가능하고, 외부에서는 접근이 불가능하게 됩니다.
한번 직접해 보도록 하겠습니다.
vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container1
image: kubetm/p8000
ports:
- containerPort: 8000
- name: container2
image: kubetm/p8080
ports:
- containerPort: 8080
kubectl create -f ./pod.yaml
kubectl apply -f ./pod.yaml
이제 Pod로 접근하여 포트에 따른 컨테이너 이름을 출력하여 봅시다. (도커 이미지에 따른 기능입니다.)
Pod IP확인
kubectl get pods -o wide
Pod 접속
kubectl exec -it pod-1 /bin/bash
curl 명령어로 Container Port 확인
curl 10.244.0.5:8000
curl 10.244.0.5:8080
Pod내의 컨테이너들이 잘 만들어 진 것을 확인하였습니다.
지금 부터는 Pod내의 컨테이너들의 포트가 같을 때 에러가 발생하는지 살펴 봅시다.
pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-2
spec:
containers:
- name: container1
image: kubetm/p8000
ports:
- containerPort: 8000
- name: container2
image: kubetm/p8000
ports:
- containerPort: 8000
더욱 더 눈에 띄는 결과를 위해 대시보드에 접속해 보도록 하겠습니다!
컨테이너 생성이 잘 안된 모습을 확인할 수 있습니다!
Pod뿐만이 아니라 모든 오브젝트에서 다 쓰입니다.
하지만, Pod에서 가장 많이 사용한다고 합니다.
Label을 쓰는 이유는 목적에 따라 오브젝트들을 분류할 수 있으며, 오브젝트들을 따로 연결하기 위해서 사용합니다.
구성은 Key와 Value형태로 만들어집니다.
이제 Pod2개를 만들어서 실습해 봅시다.
pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
type: web
spec:
containers:
- name: container
image: kubetm/init
pod4.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-4
labels:
type: database
spec:
containers:
- name: container
image: kubetm/init
생성된 Label을 선택하기 위한 Service입니다.
service1.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
- port: 8080
service2.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
type: database
ports:
- port: 8080
서비스 1과 서비스 2는 각각 type이 web과 database인 Pod를 가리키고 있습니다.
dashboard에 접근하여 각각의 서비스가 각각의 Pod를 잘 연결 하였는지 확인해 봅시다.
이렇게 잘 지칭하고 있는 것을 볼 수 있습니다!
Pod는 여러 노드들 중에 한 노드에 올라가야 합니다.
직접 노드를 선택하는 방법, 쿠버네티스가 자동으로 선택하는 방법이 존재합니다.
쿠버네티스의 스케쥴러가 판단 하여 노드를 고를 수 있습니다.
하지만, 제가 사용하고 있는 minikube환경은 단일 노드 클러스터이기 때문에 실습을 진행할 수 없기에 여기서 마치겠습니다!