도커같은 경우 도커 compse 같은 다중 서비스 관리 시스템이 있으나,
여러 컨테이너를 수동으로 만들어야 하는게 취약점이 된다.
그래서 서비스를 올리기 전 컨테이너를 자동적으로 만드는 기술인 
구글사의 쿠바네틱스를 배울 것이다.

//실무에서는 도커를 하나의 컨테이너를 관리할때 사용하고,
					쿠바네티스를 여러개의 컨테이너를 관리할때 사용한다. 

설치환경

vagrant를 이용한 vm 설치.txt

vimrc 파일 내용.txt

위의 텍스트 파일형식으로 vagrant를 이용해 vm 환경을 설치한다.

마이크로서비스

모놀로식 아키텍처(참고:29,30일차)가 크기가 커짐에따라 발생하는 문제점을 극복하기 위해 대안으로 나온 서비스로 
기능적으로 세분화되고 독립적으로 작동하는 방식을 사용
장점: 향상된 유지,보수성
			독립된 개발 및 배포

devops

애플리케이션을 개발 및 운영 관리를 독립적으로 시행하는 것이 아닌 통합적으로 이해하고 관리하는 환경
소프트웨어 개발, 품질, 운영 팀의 소통 협업 및 통합을 강조하는 개발 문화

도커

단일 시스템에서 다수의 컨테이너를 구동하는 방식
/단일 시스템으로 구성하는 자원이 한정되어 있어, 구동 가능한 서비스가 한계가 존재
이때, 다수 시스템과 그 안의 컨테이너를 쉽게 설정하고 유지관리 할 수 있는 도커스웜이 지원됨

쿠버네티스

다수의 시스템과 애플리케이션을 쉽게 설정하고 유지관리 할 수 있는 대표적인 도구
기본적으로 도커플랫폼을 사용한다.

쿠버네티스 아키텍쳐 : 클러스터로 구성
쿠버네티스 클러스터 : 마스터(1개) + 노드(여러개) + 추가(애드온)

마스터: 쿠버네티스 클러스터를 구성하기 위한 핵심 요소 모음
				클러스터를 조정하는 컨트롤 플레인을 제공
				스케쥴링(노트에 작업을 자동적으로 분배) 등 클러스터에서 전반적인 결정을 수행하는 역할
마스터의 기능: API서버(여러 인터페이스를 연결), etcd, 스케쥴러, 쿠버네티스 컨트롤러 관리자, 클라우드 컨트롤러 관리자

API 서버(Application Promgramming Interface) 
: 서로 다르게 구성되어있는 기능들이 데이터를 주고 받는 방식 : 인터페이스

/쿠버네티스의 구성요소들은 마스터의 API서버와 메세지를 주고받고 API서버가 허브역할을 수행함

etcd
: 쿠버네티스 클러스터의 모든 데이터를 저장하는 저장소
/데이터 저장시 'key-value'형태로 데이터를 저장한다.

스케쥴러
: 클러스터 내에서 생성되는 파드(컨테이너)를 감지하고 이를 실행할 노드를 자동적으로 선택하는 역할
/노드의 리소스 상태에 따라 무작위로 배치함

쿠버네티스 컨트롤러 관리자
: API서버를 통해 클러스터 상태를 감시하고 유지 및 보수하는 기능을 수행함

컨트롤러 종류
1. 노트컨트롤러 : 노드를 관리하고 다운됬을때 대응
2. 애플리케이션 컨트롤러: 래플리카 컨트롤러를 사용하는 모든 오브젝트를 관리 및 파드를 유지하는 기능
3. 앤드포인트 컨트롤러: 서비스와 파드를 연결
4. 서비스 어카운트 및 토큰 컨트롤러: 쿠버네티스의 네임스페이스,계정,토큰을 담당

클라우드 컨트롤러 관리자
: AWS 같은 클라우드 서비스와 클라우드에서 동작하는 쿠버네티스 구성요소가 상호작용하도록 해주는 기능
/쿠버네티스 1.6에서 도입된 알파 기능이다.
클라우드 환경에서 쿠버네티스 컨트롤러 관리자 역할을 수행한다.

노드
: 쿠버네티스의 컨테이너가 동작하는 런타임 환경을 제공하고 동작중인 파드를 유지하는 기능
역할: 큐블릿, 프록시, 컨테이너 런타임

큐블릿
: 노드가 수행하여야할 작업을 전달받아 파드가 확실히 동작하도록 보장하는 역할

프록시
: 각 노드에서 실행되는 네트워크 프록시로 '서비스'를 구현하기 위한 기능을 함
/ 내부 통신, 외부-내부 통신 등 네트워크 통신을 역할

컨테이너 런타임
: 각 노드에서 실제 실행되는 파드의 동작을 책임지는 구성요소
구성요소: DOCKER, containerd, CRI-O, rktlet, kubenetes CRI

쿠버네티스 추가요소
1. 클러스터 DNS : 쿠버네티스 클러스터 내의 여러 오브젝트(파드,컨테이너,서비스)에 대해 주소기반으로 오브젝트를
접근할 수 있도록 DNS서비스를 제공한다.
2. 대시보드 : 쿠버네티스 클러스터 구성 및 모니터링을 위한 웹 기반 인터페이스 제공
3. 컨테이너 리소스 모니터링 : 컨테이너 리소스 사용량을 기록
4. 클러스터 로깅 : 컨테이너 로그를 중앙로그저장소(etcd안에) 저장하고 관리

쿠버네티스 API
종류 : 
1. 알파 버전 : 테스트버전
2. 베타 버전 : 알파버전 + 불안정한 상태
3. 안정 버전 : 실제로 사용하는 서비스

메니페스트 [오브젝트 객체들의 정의된 파일]
문법 : YAML, JSON 문법 사용
오브젝트 정의시 필수 요구 필드 값
1. apiVersion : 오브젝트 API 버전 지정
2. kind: 오브젝트의 종류를 명시
3. metadata: name,label,namespace 등 기본적인 정보를 기술
4. spec : 오브젝트의 세부 상태를 정의 

메니페스트 예시
---------------------------------------------------------=
apiVersion: v1
kind: Pdds
metadata:
	name:testapp-pod
spec: 
	xxx:
		- a: 1                         
		- b: 2
-----------------------------------------------------------

클러스터 내의 구성요소(파드,노드 등)

파드 : 쿠버네티스의 기본 요소 
/파드는 1개 이상의 컨테이너를 구성할 수 있음

파드 리소스의 주요 필드
.spec.containers: 컨테이너 정의
.spec.containers.image: 컨테이너에 사용할 이미지
.spec.containers.name : 컨테이너 이름
.spec.containers.ports: 노출할 포트 정의
.spec.containers.containerPort: 노출한 컨테이너 포트번호
.spec.containers.porotocol: 노출할 컨테이너 포트의 프로토콜 ex) TCP

레이블 : 클러스터의 모든 오브젝트에 키/값 쌍으로 리소스를 식별 및 속성을 지정하는데 사용
예: 
∙ release: stable / canary / A / B 
∙ environment: dev / qa / production
∙ tier: frontend / backend / cache / database
∙ partition: customerA / customerB
∙ track: daily / weekly
∙ app: webapp / middleware

어노테이션 : 주석

네임스페이스 : 오브젝트를 논리적으로 분리하는 파티션

레플리카셋: 파드를 실행하는 메니페스트

여러 기능 ( 잡, 크론잡, 여러 서비스)

잡 : 파드의 애플리케이션이 실행되고 종료되지 않는 파드의 단점을 보완하여 애플리케이션 종료시 파드를 종료
잡 컨트롤러는 파드의 애플리케이션 실행이 완료 및 종료되는 것에 초점을 맞춘다.

다중 잡 컨트롤러 : 여러 파드를 실행을 순차적으로 실행하고 종료시킨다.

병렬 다중 잡 컨트롤러 : 여러 파드를 동시에 생성시키고 completions의 개수에 따라 parallelism 값을 비교해 실행 및 완료시킴

크론 잡 : 잡 컨트롤러가 한 번만 실행된다면 크론 잡 컨트롤러는 주기적으로 실행시킴
/리눅스 시스템의 crontab 도구와 기능이 같다.

서비스 : 쿠버네티스 시스템에서 애플리케이션을 실행하는 컨트롤러의 파드 그룹에 네트워크 연결을 제공한다.

서비스의 종류
● ClusterIP
  ∙ 클러스터 내부용 서비스
● NodePort
  ∙ NodePort + ClusterIP
  ∙ 쿠버네티스 모든 노드(호스트)에 외부 접근용 포트를 할당함
  ∙ 노드의 포트를 사용하여 외부에서 접근 가능
  ∙ 노드의 포트로 접근하면 서비스에 의해 파드로 리다이렉션 함
  ∙ 파드를 실행하고 있지 않는 노드에도 포트가 할당되고, 접근 가능함
● LoadBalancer
  ∙ LoadBalancer + NodePort + ClusterIP
  ∙ NodePort의 확장
  ∙ 클러스터 외부의 로드 밸런서를 사용하여 외부에서 접근 가능
  ∙ 외부 로드 밸런서로 접근하면 서비스를 통해 파드로 리다이렉션 함
  ∙ 클라우드 공급업체(AWS, GCP 등)나 MetalLB에서 지원
● ExternalName[내부에서 사용하는 통신 서비스]
  ∙ 외부에서 접근하기 위한 종류 아님
  ∙ 외부의 특정 FQDN에 대한 CNAME 매핑을 제공
  ∙ 파드가 CNAME을 이용해 특정 FQDN과 통신하기 위함

세션 어피니티 구성 : 파드를 배치할때 자동적으로 노드가 배치하는 것이 아닌 선택된 노드에 있는 파드에 연결 하는 서비스를 사용


29일차 Vagrant 환경 구축