kubernetes concept
Kubernetes 기본
쿠버네티스는 대부분의 리소스를 오브젝트 형태로 관리한다.
1
kubectl api-resources
쿠버네티스를 잘 사용하는 방법은 YAML파일을 잘 작성하는 것이다!
쿠버네티스 노드 -> 마스터노드 / 워커노드 마스터 노드: 쿠버네티스가 제대로 동작할 수 있게 클러스터를 관리하는 역할 API 서버(kube-apiserver), 컨트롤러 매니저(kube-controller-manager), 스케줄러(kube-scheduler), DNS서버(coreDNS) 워커 노드: 어플리케이션 컨테이너가 생성 모든 노드에서는 오버레이 네트워크 구성을 위해 프락시(kube-proxy), 네트워크 플러그인(calico, flannel)
쿠버네티스 클러스터 구성을 위해서는 kubelet이라는 에이전트가 필요하다
Pod, 컨테이너를 다루는 기본 단위
컨테이너 어플리케이션을 구동하기 위해 반드시 알아야 할 오브젝트는 다음과 같다.
- Pod(포드)
- Replica Set(레플리카셋)
- Service(서비스)
- Deployment(디플로이먼트)
쿠버네티스에서는 컨테이서 어플리케이션의 기본 단위를 Pod라 부르며, 1개이상의 컨테이너로 구성된 컨테이너의 집합이다. 도커엔진은 컨테이너, 도커스웜은 서비스, 쿠버네티스는 포드.
쿠버네티스 YAML
- apiVersion : YAML 파일에서 정의한 오프젝트의 API버전.
- kind : 이 리소스의 종류. 예를들어 Pod
- metadata : 라벨, 주석, 이름 등
- spec : 리소스를 생성하기 위한 자세한 정보를 입력
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
yaml파일로 생성
1
kubectl apply -f {name_of_yaml_file}
생성 확인
1
kubectl get pods
1
kubectl describe pods my-nginx-pod
1
2
3
kubectl exec -it my-nginx-pod bash
kubectl exec -it my-nginx-pod -c {컨테이너명} bash # 어떤 컨테이너에 대해 명령을 내릴 지 정할 수 있다.
1
kubectl logs my-nginx-pod
1
kubectl delete -f nginx-pod.yaml
그렇다면 왜 도커가 아닌 포드인가?
여러 리눅스 네임스페이스(namespace)를 공유하는 여러 컨테이너들을 추상화된 집합으로 사용하기 위해서이다. 포드 내의 컨테이너들은 네트워크 네임스페이스와 같은 리눅스 네임스페이스를 공유한다. 따라서 컨테이너가 실행중이 아니더라도 접속이 가능한 경우가 생길 수 있다.
포드에 정의된 부가적인 컨테이너를 사이드카(side car) 컨테이너라고 부른다.
Replica Set, 일정 개수의 포드를 유지하는 컨트롤러
- 정해진 수의 동일한 포드가 항상 실행되도록 관리한다.
- 노스 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성한다.
포드와 레플리카셋의 정의 중 라벨 셀렉터(Label Selector)를 통해 느슨한 연결이 이루어진다.