1. 쿠버네티스 동작 과정
- User - 개발자 or 운영자 (컨테이너를 쿠버네티스 상에 올려 사용하려는)
- 컨테이너 빌드(ex. main UI, log-in, pay 기능 컨테이너)
- 사내 or Public 허브에 공유(push)
- 쿠버네티스 명령을 통해 원하는 컨테이너 실행을 요청(kubectl)
- yaml / CLI 형태로
- Master node의 API server가 요청을 수신
- scheduler는 컨테이너 실행을 위한 최적의 Worker node 정보 출력
- API server 가 최적의 node에게 컨테이너 실행 요청
- kubelet을 통해 Docker에게 명령 전달
- Docker 명령으로 해당 이미지 검색 후 컨테이너 실행
- 쿠버네티스는 이런 컨테이너를 pod 로 관리함
2. 쿠버네티스 컴포넌트
마스터 컴포넌트(Control-Plane)
- etcd
- key-value 타입의 저장소
- kube-apiserver
- k8s API를 사용하도록 요청을 받고 요청이 유효한지 검사
- kube-scheduler
- 파드를 실행할 노드 선택
- kube-controller-manager
- 파드를 관찰하며 개수를 보장
워커 노드 컴포넌트(Worker node)
- kubelet(마스터에도 있으나 운영환경의 역할일 뿐)
- 모든 노드에서 실행되는 k8s 애이전트
- 데몬 형태로 동작
- kube-proxy
- k8s의 network 동작을 관리
- iptables rule을 구성
- 컨테이너 런타임
- 컨테이너를 실행하는 엔진
- docker, container, runc
Master Component
- API(전체 관리)
- kubectl 요청을 수신
- 문법/권한 등 명령 검토
- 여러 컴포넌트와 유기적으로 소통 후 실행
- etcd(모든 상태 보장)
- key : value 형식으로 저장하는 저장소
- kubelet(데몬, cAdvisor - 컨테이너 모니터링 툴, 정보수집)을 통해 Worker 노드의 H/W 리소스 상태, Docker 컨테이너 상태, 다운로드 받은 이미지 상태 등의 정보를 저장
- Deploy 진행시 쿠버네티스 상태도 저장
- 명령이 들어오면 API는 명령 검토를 진행하고 etcd 저장소에 담긴 워커노드들의 정보를 수집하여 scheduler로 전송
- scheduler(최적의 노드 선택 보장)
- API가 준 etcd 정보를 통해 명령에 대한 최적의 노드를 응답
- scheduler(최적의 노드 선택 보장)
Worker Node
- 응답이 들어오면 API는 해당 노드의 kubelet을 통해 컨테이너 작업 명령 전달
- kubelet
- kubelet은 명령을 docker 명령어로 변환 후 전달
- docker는 docker hub에 있는 해당 명령 컨테이너를 가져와 실행
- controller(개수 보장)
- 노드 및 컨테이너 상태 모니터링 후 작업 최적화(자동)
- kubelet
- ADD-On = Core DNS, CLI, cAdvisor(kubelet 내), 대시보드
- kube-proxy = 실제 쿠버네티스 네트워크
- 컨테이너 런타임 = 도커(실제 컨테이너 실행 담당)
- 클러스터 로깅 = 컨테이너 로그, k8s 운영 로그 등을 수집해서 중앙화
- ELK(ElasticSearch(데이터 정제), Logstash(데이터 수집), Kibana(웹UI로 지원))
- EFK(ElasticSearch(데이터 정제), Fluentd(데이터 수집), Kibana(웹UI로 지원))
- DataDog(통합)
3. K8s namespace
namespace
- K8s API 종류 중 하나
- 클러스터 하나를 여러 개의 논리적인 단위로 나눠서 사용 - namespace별로 관리 용이(버전, 종류 등)
- 쿠버네티스 클러스터 하나를 여러 팀이나 사용자가 함께 공유
- 용도에 따라 실행해야 하는 앱을 구분할 때 사용
#namespace 생성
#CLI
kubectl create namespace [name]
kubectl get namespace
#YAML
kubectl create namespace [name] --dry-run -o yaml > green-ns.yaml
vim green-ns.yaml
kubectl create -f green-ns.yaml
#namespace 관리
kubectl get namespace
kubectl delete namespace
kubectl get nodes #노드 상태 확인
kubectl get namespace #namespace 상태 확인
kubectl get pod #base namespace(default) 확인
kubectl get pod --namespace default #default 이름의 namespace 확인
kubectl get pod -n default #-n = --namespace
cat > nginx.yaml
#kubectl의 경우 yaml파일에서 tab키 들여쓰기는 인식하지 못하므로 주의
```
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
- containerPort: 443
```
kubectl create -f nginx.yaml #파일(-f)을 불러들여와 오브젝트 생성 in default namespace
kubectl get pods -n default #default namespace 확인
kubectl get namespaces #(default) namespace 확인
kubectl get pods -n kube-system #kube-system namespace 확인(컴포넌트에서 배운 내용 확인 가능)
kubectl get pods --all-namespaces #전체 namespace 확인 가능
kubectl create namespace blue
ls
kubectl create namespace orange --dry-run -o yaml > orange-ns.yaml #namespace가 만들어질 수 있는지 확인하고 해당 내용을 yaml 내용으로 만든 후 yaml 파일 생성
ls
vi orange-ns.yaml
```
apiVersion: v1
kind: Namespace
metadata:
name: orange
```
kubectl create -f orange-ns.yaml
kubectl get namespaces
+
kubectl create -f nginx.yaml -n blue #blue namespace에서 yaml 실행
vi nginx.yaml
```
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: orange #또는 yaml파일에서 namespace 고정도 가능
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
- containerPort: 443
```
kubectl create -f nginx.yaml
kubectl get pods -n blue
기본으로 사용하는 namespace를 default가 아닌 다른 namespace로 switch
#kubernetes의 config에 namespace 등록
#등록을 위한 공간을 context라고 지칭
kubectl config --help
kubectl config view
#클러스터, 유저, 네임스페이스를 지정해 context 생성
kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue
kubectl config view
kubectl config current-context
kubectl config use-context blue@kubernetes #base namespace 변경
kubectl config current-context
kubectl get pods
kubectl get pods -n default
kubectl delete pods mypod -n default #pod 삭제
kubectl get pods
kubectl config use-context kubernetes-admin@kubernetes
Namespace 삭제하기
#namespace를 삭제하면 내부에 있는 API도 모두 종료
kubectl delete namespaces blue
4. yaml 템플릿
- 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식(Top down 방식이 아님!)
- 기본 문법
- 구조화된 데이터를 표현하기 위한 데이터 포맷
- Python처럼 들여쓰기로 데이터 계층을 표기
- 들여쓰기 시 Tab이 아닌 스페이스바를 사용
- 가독성이 좋아 설정 파일에 적합한 형식
- Scalar 문법 : ' : '을 기준으로 key: value를 설정
- 배열 문법 : ' - ' 문자로 여러개를 나열
- 공식 사이트 : http://yaml.org/
- kubernetes yaml example : cat nginx-pod.yaml
apiVersion: v1
kind: Pod
parent:
child1: first child
key2:
child-1: kim
key3:
- grandchild1:
name: kim
- grandchild2:
name: lee
5. API version
- alpha → beta → stable
- kubernetes Object 정의 시 apiVersion 필요(잘못된 경우 실행 불가)
- kubernetes가 API를 update하면 새로운 AIP가 생성
#버전확인을 위해 리소스 정보 출력
kubectl explain [오브젝트명]
- API Object 종류 및 버전 예시
- Deployment - apps/v1
- Pod - v1
- ReplicaSet - apps/v1
- ReplicationController - v1
- Service - v1
- PersistentVolume - v1
'Cloud Native > Kubernetes' 카테고리의 다른 글
쿠버네티스(Kubernetes) - 유튜브 'TTABAE-LEARN' 따라하기 6(쿠버네티스 Pod) (0) | 2022.04.08 |
---|---|
쿠버네티스(Kubernetes) - 유튜브 'TTABAE-LEARN' 따라하기 5(쿠버네티스 Pod) (0) | 2022.04.05 |
쿠버네티스(Kubernetes) - 유튜브 'TTABAE-LEARN' 따라하기 3(kubectl 실습환경 구성 및 실습) (0) | 2022.03.10 |
쿠버네티스(Kubernetes) - 유튜브 'TTABAE-LEARN' 따라하기 2(쿠버네티스 설치) (0) | 2022.03.03 |
쿠버네티스(Kubernetes) - 유튜브 'TTABAE-LEARN' 따라하기 1(쿠버네티스 시작) (0) | 2022.03.03 |