kok202
쿠버네티스 강의 정의 ( 2강 : Pod, Node, Service )

2019. 6. 1. 04:58[정리] 기능별 개념 정리/Kubernetes

Pod

- Deployment를 만들면 쿠버네티스는 Pod를 만들어서 어플리케이션 인스턴스를 호스팅해준다.

Pod 는 기본적으로 클러스터 밖에서 접근이 불가능하다.

- Pod 는 클러스터 안에서만 서로 접근이 가능한 private 하고 isolated 된 쿠버네티스의 개념이다.

- Pod 는 하나 또는 그 이상의 어플리케이션 컨테이너 그룹의 추상화된 개념이다. 

- Deployment를 만들면 쿠버네티스는 Pod를 만들어서 어플리케이션 인스턴스를 호스팅해준다.

- 도커나 리소스(volume...)를 통틀어서 pod라고 한다.

- Pod 하나당 IP 주소 하나다. (클러스터 내부 IP)

- 같은 Pod 안에 있는 컨테이너는 IP 주소와 Port 번호를 공유한다.

- 같은 Pod 안에 있는 컨테이너는 같이 스케줄링이된다.

 

 

 

 

 

 

Node

- 노드안에는 여러개의 pod 가 있을 수 있다.

- 노드가 실패하면 동일한 Pod를 다른 노드로 이동한다. (컨테이너 단위로 이동하는게 아니라 Pod 단위로 이동한다.)

- 마스터는 Pod 들을 어떤 노드에 올릴지 스케줄링한다.

 

 

 

 

 

 

kubectl 으로 trouble shooting 이 가능하다.

 

알 수 있는 것

1. 언제 어플리케이션이 배포가 되었다.

2. 배포된 어플리케이션의 상태가 ~하다.

3. 어플리케이션의 설정 파일은 ~하다.

 

주요  커맨드

kubectl get ~

kubectl describe ~

kubectl logs ~

kubectl exec ~

kubectl get pods

실행중인 pods 의 리스트를 알 수 있다.

kubectl describe pods

실행중인 pods 들의 상세 정보를 알 수 있다.

kubectl proxy

이 과정을 계속 해주는 이유

1. minikube 에는 node js 로 만들어진 kubernetes-bootcamp 라는 샘플 어플리케이션 프로젝트가 하나 존재한다.

2. minikube 에서 클러스터에 kubernetes-bootcamp를 띄웠다.

3. Host 를 이 어플리케이션에 연결하고 싶다.

4. 이 어플리케이션은 pod 안에서 돌고있다.

5. 그런데 pod 는 private 한 공간이다.

6. 그래서 proxy 를 통해서 host -> proxy -> pod 로 연결해주려한다.

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

쿠버네티스 Pod들의 정보를 환경변수 POD_NAME 에 저장한다.

kubectl logs $POD_NAME

환경변수 $POD_NAME 에 저장된 이름의 pod log 를 불러온다.

kubectl exec $POD_NAME env

환경변수 $POD_NAME 에 저장된 이름의 pod 안의 컨테이너에 특정 명령(env)을 수행하고 싶으면 사용한다.

kubectl exec -ti $POD_NAME bash

환경변수 $POD_NAME 에 저장된 이름의 pod 안의 컨테이너에 bash 를 실행하도록 명령을 내린다.

 

 

 

 

 

Service

- Service 도 하나의 IP를 할당 받는다.

- Service 는 pod 의 집합을 논리적으로 추상화 한 것이다. 이를 통해 pod 의 결합도를 낮출 수 있다.

- Service 에대한 정의는 yml 이나 json 을 통해서 가능하다.

- Service 는 Label selector 라는 것에 의해서 구분되어진다.

 

pod 는 각각 IP를 하나씩 소유하고 있지만 이 IP는 클러스터 내부의 IP 이기 때문에 외부에 노출이 될 수 없다. (그래서 이제껏 proxy 를 사용해가며 minikube 를 실행해보았었다. host -> proxy -> pod )

Service 도 마찬가지로 IP를 하나씩 소유하고 있는데, 이를 이용하면 pod를 내부, 외부에 노출시킬 수 있다. ( host -> service -> pod )Service에는 타입을 명시함으로서 여러가지 방법으로 노출할 수 있다.

 

 

Service IP 타입

1. [내부 노출] ClusterIP : 기본값이다. 서비스를 클러스터 내부의 IP로 노출한다. 클러스터 안에서만 사용 가능한 IP 다.

2. [외부 노출] NodePort : 서비스를 클러스터 외부에서 Node IP + Node port 를 통해서 접근하도록 하는 방식이다.

3. [외부 노출] LoadBalancer : 외부 LB를 만들어서 고정된 외부 IP를 배정하는 방법

4. [외부 노출] ExternalName : 임의의 이름을 이용해서 외부에 노출하는 방법

 

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

deployment/kubernetes-bootcamp 를 노출시켜서 생성한다. 타입은 NodePort 로 하라. 즉 새롭게 생성된 deployment -> service -> kubernetes-bootcamp 는 8080이라는 컨테이너의 포트는 임의의 포트로 외부 노출되었다. (30000~32767 중 하나로 랜덤으로 생성)

kubectl describe services/kubernetes-bootcamp

위 커맨드를 수행하면 외부로 노출된 포트가 몇번인지 확인할 수 있다.