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
위 커맨드를 수행하면 외부로 노출된 포트가 몇번인지 확인할 수 있다.
'[정리] 기능별 개념 정리 > Kubernetes' 카테고리의 다른 글
쿠버네티스 입문 정리 - 00 - 아키텍쳐 (0) | 2020.04.03 |
---|---|
쿠버네티스 helm 저장소 추가 (0) | 2019.06.24 |
쿠버네티스 helm (0) | 2019.06.21 |
쿠버네티스 강의 정리 ( 3강 : Scaling ) (0) | 2019.06.01 |
쿠버네티스 강의 정리 ( 1강 : 오버뷰, Deployment) (0) | 2019.06.01 |