1. 쿠버네티스 동작 과정

  1. User - 개발자 or 운영자 (컨테이너를 쿠버네티스 상에 올려 사용하려는)
    • 컨테이너 빌드(ex. main UI, log-in, pay 기능 컨테이너)
  2. 사내 or Public 허브에 공유(push)
  3. 쿠버네티스 명령을 통해 원하는 컨테이너 실행을 요청(kubectl)
    • yaml / CLI 형태로
  4. Master node의 API server가 요청을 수신
  5. scheduler는 컨테이너 실행을 위한 최적의 Worker node 정보 출력
  6. API server 가 최적의 node에게 컨테이너 실행 요청
  7. kubelet을 통해 Docker에게 명령 전달
  8. Docker 명령으로 해당 이미지 검색 후 컨테이너 실행
    • 쿠버네티스는 이런 컨테이너를 pod 로 관리함

2. 쿠버네티스 컴포넌트

마스터 컴포넌트(Control-Plane)

  1. etcd
    • key-value 타입의 저장소
  2. kube-apiserver
    • k8s API를 사용하도록 요청을 받고 요청이 유효한지 검사
  3. kube-scheduler
    • 파드를 실행할 노드 선택
  4. kube-controller-manager
    • 파드를 관찰하며 개수를 보장

 

워커 노드 컴포넌트(Worker node)

  1. kubelet(마스터에도 있으나 운영환경의 역할일 뿐)
    • 모든 노드에서 실행되는 k8s 애이전트
    • 데몬 형태로 동작
  2. kube-proxy
    • k8s의 network 동작을 관리
    • iptables rule을 구성
  3. 컨테이너 런타임
    • 컨테이너를 실행하는 엔진
    • docker, container, runc

Master Component

  • API(전체 관리)
    1. kubectl 요청을 수신
    2. 문법/권한 등 명령 검토
    3. 여러 컴포넌트와 유기적으로 소통 후 실행
  • etcd(모든 상태 보장)
    • key : value 형식으로 저장하는 저장소
    • kubelet(데몬, cAdvisor - 컨테이너 모니터링 툴, 정보수집)을 통해 Worker 노드의 H/W 리소스 상태, Docker 컨테이너 상태, 다운로드 받은 이미지 상태 등의 정보를 저장
    • Deploy 진행시 쿠버네티스 상태도 저장
  • 명령이 들어오면 API는 명령 검토를 진행하고 etcd 저장소에 담긴 워커노드들의 정보를 수집하여 scheduler로 전송
    • scheduler(최적의 노드 선택 보장)
      • API가 준 etcd 정보를 통해 명령에 대한 최적의 노드를 응답

Worker Node

  • 응답이 들어오면 API는 해당 노드의 kubelet을 통해 컨테이너 작업 명령 전달
    • kubelet 
      1. kubelet은 명령을 docker 명령어로 변환 후 전달
      2. docker는 docker hub에 있는 해당 명령 컨테이너를 가져와 실행
    • controller(개수 보장)
      • 노드 및 컨테이너 상태 모니터링 후 작업 최적화(자동)

  • 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