사용자가 늘어나고 서버가 늘어나면 일관성을 유지하는 것이 중요 -> 눈송이서버 방지 (=여러 사람이 만져 설정의 일관성 떨어진 서버)
3장에서 배울 내용
최종적으로 배우는 내용
❓쿠버네티스는
컨테이너 오케스트레이션을 위한 솔루션이다.
시작하는데 어려움이 있지만 (사용을 쉽게 해주는 도구들이 나오고있음) 다양한 형태의 쿠버네티스가 지속적으로 계속발전되고 있다.
거의 모든 벤터와 오픈 소스 진영에서 쿠버네티스를 지원하고 그에 맞게 통합개발한다. == 컨테이너 오케스트레이션에서 it 인프라 자체를 컨테이너화하고 컨테이너화된 인프라 제품군을 쿠버네티스에서 동작하게 만든다. ==> 컨테이너 오케스트레이션 학습 / 도입 목표라면 쿠버네티스 우선 고려
- k8s == 쿠버네티스
k8s 는 쿠버네티스의 약자
k8(ubernete, 8글자)s의 형식
1 퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스인 EKS. AKS, GKE 등 사용 but 구성이 이미 갖춰져있어 학습용으로 부적합
2 수세의 Rancher, 레드햇의 OpenShift와 같은 플랫폼에서 제공하는 설치형 쿠버네티스를 사용 but 유료
3 쿠버네티스 클러스터를 자동으로 구성해주는 솔루션을 사용 (kubeadm)
https://github.com/sysnet4admin/_Book_k8sInfra 에서 코드 다운 받고
vagrant up
: 현재 호스트 내부에 Vagrantfile에 정의된 가상 머신들을 생성하고 생성한 가상 머신에 쿠버네티스 클러스트를구성하기 위한 파일들을 호출해 쿠버네티스 클러스터를 자동으로 구성긴 시간이 지나 드디어 완료
이렇게 클러스터 구성을 완료했음
슈퍼 푸티 로 확인
앞에 나온 kubectl, kubelet, API 서버, 캘리코 등 + 그 외에도 etcd, 컨트롤러 매니저, 스케줄러, kube-proxy, 컨테이너 런타임, 파드등이 클러스터 구성요소다.
쿠버네티스 클러스터를 이루는 구성 요소들은 파드 형태로 이루어져 있음!
쿠버네티스 구성요소는 동시에 여러개 존재시 -> 뒤에 해쉬코드(무작위 문자열)를 삽입해서 이름을 생성함
쿠버네티스의 구성 요소의 유기적인 연결 관계
쿠버네티스의 구성 요소간 통신
마스터 노드
0 kubectl: 쿠버네티스 클러스터에 명령을 내리는 역할
1 API 서버: 쿠버네티스 클러스터의 중심 역할을 하는 통로
2 etcd: 구성 요소들의 상태 값이 모두 저장되는 곳
3 컨트롤러 매니저: 컨트롤러 매니저는 쿠버네티스 클러스터의 오브젝트 상태를 관리
4 스케줄러: 노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 어떤 워커 노드에 생성 할 것인지를 결정하고 할당
etcd는 약어가 아님
etcd는 리눅스의 구성 정보를 주로 가지고 있는 etc 디렉터리와 distributed(퍼뜨렸다)의 합성어
워커 노드
5 kubelet: 파드의 구성 내용(PodSpec)을 받아서 컨테이너 런타임으로 전달하고, 파드 안의 컨테이너들이 정상적으로 작동하는지 모니터링
6 컨테이너 런타임(CRI, Container Runtime Interface): 파드를 이루는 컨테이너의 실행을 담당
7 파드(Pod): 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위
== 웹 서버 역할을 할 수도 있고 로그나 데이터를 분석도 가능
파드는 언제라도 죽을 수 있는 존재!
가상 머신은 언제라도 죽을 수 있다고 가정하고 디자인하지 않지만, 파드는 언제라도 죽을 수 있다고 가정하고 설계됐기 때문에 쿠버네티스는 여러 대안을 디자인되어있음
(0-7은 쿠버네티스에서 이루어지는 통신 단계, 선택적 배포는 순서와 연관이 없어서 10번대로 구분해서 표시했다고 함)
파드가 생성, 수정,삭제되는 과정을 나타낸 파드의 생명주기
1 kubectl을 통해 API 서버에 파드 생성을 요청 ->2 (업데이트가 있을 때마다 매번) 각 요소가 상태를 업데이트할 때마다 모두 API 서버를 통해 etcd에 기록 -> 3. API 서버에 파드 생성이 요청된 것을 컨트롤러 매니저가 인지하면 -> 컨트롤러 매니저는 파드를 생성하고, 이 상태를 API 서버에 전달(어떤 워커 노드 적용할지 아직 미결정)-> 4. API 서버에 파드가 생성됐다는 정보를 스케줄러가 인지 -> 스케줄러는 파드를 어떤 워커 노드에 적용할지 결정->해당 워커 노드에 파드를 띄우도록 요청 -> 5. API 서버에 전달된 정보대로 지정한 워커 노드에 파드가 속해 있는지 스케줄러가 kubelet으로 확인 -> 6. kubelet에서 컨테이너 런타임으로 파드 생성을 요청 ->7. 파드가 생성 -> 8. 파드가 사용 가능한 상태
꼭 마스터 노드에 위치할 필요 없다
kubectl이 어디에 있더라도 API 서버의 접속 정보만 있다면 어느 곳에서든 쿠버네티스 클러스터에 명령을 내릴 수 있다!
kubelet은 쿠버네티스에서 파드의 생성과 상태 관리 및 복구 등을 담당
명령으로 nginx 웹 서버 파드를 배포
kubelet에 문제가 생기면 파드가 제대로 관리되지 않음
kube-proxy는 파드의 통신을 담당
kubectl run
명령을 실행하면 쉽게 파드를 생성가능
파드와 디플로이먼트는 스펙(spee)과 상태(status) 등의 값을 가지고 있다
이러한 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 부르는 단위를 오브젝트Object 라고 한다.
기본 오브젝트에서 효율적으로 작동을 위해 기능 조합 구현한 것
API 서버와 컨트롤러 매니저는 단순히 파드가 생성되는 것을 감시하는 것X, Deployment처럼 레플리카셋을 포함하는 오브젝트의 생성을 감시O
디플로이먼트는 이미지를 받아서 생성 가능
kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname
삭제는
kubectl delete deployment dpy-hname
많은 사용자를 대상으로 웹 서비스를 하려면 다수의 파드가 필요 -> 쿠버네티스에서는 다수의 파드를 만드는 레플리카셋 오브젝트를 제공
< 디플로이먼트를 생성하면서 한꺼번에 여러 개의 파드를 만들기 위해서 >
create - replicas 옵션을 사용불가 , scale은 이미 만들어진 디플로이먼트에서만 사용가능
=> 오브젝트 스펙 파일 작성해야함
설정을 적용을 위한 필요한 내용을 파일로 작성. 오브젝트 스펙은 일반적으로 YAML 문법으로 작성
사용 가능한 API 버전을 확인하려면 : kubectl api-versions
명령으로 확인 가능
쿠버네티스는 API 버전마다 포함되는 오브젝트(kind)도 다르고 요구하는 내용도 다름
run : 단일 파드 생성
create :디플로이먼트를 생성 + 파일의 변경 사항을 바로 적용할 수 없다는 단점 존재
apply : 오브젝트 관리 +파일의 변경 사항도 쉽게 적용 가능
쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되어있음 특히 파드의 자동 복구 기술 (=Self-Healing) 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 함
노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할
3.2절에서는 쿠버네티스 클러스터 내부에서 파드를 사용
이번에는 외부 사용자가 파드를 이용하는 방법
쿠버네티스에서 서비스(service): 외부에서 쿠버네티스 클러스터에 접속하는 방법. 서비스를 '소비를 위한 도움을 제공한다'는 관점으로 바라본다면 쿠버네티스가 외부에서 쿠버네티스 클러스터에 접속하기 위한 '서비스'를 제공한다고 볼 수 있다
외부에서 쿠버네티스 클러스터의 내부에 접속하는 가장 쉬운 방법: 노드포트(NodePort) 서비스를 이용하는 것
노드포트 서비스를 설정-> 모든 워커 노드의 특정 포트(노드포트)를 열고 -> 오는 모든 요청을 노드포트 서비스로 전달-> 노드포트 서비스는 해당 업무를처리할 수 있는 파드로 요청을 전달
외부 웹브라우저에서 접속 확인
오브젝트 스펙 파일로만 노드포드를 생성하는게 아니라 expose
로도 생성 가능
무작위 생성 포트번호에도 나온다
노드포트 서비스는 포트를 중복 사용할 수 없어서 1개의 노드포트에 1개의 디플로이먼트만 적용함
-> 여러개의 디플로이먼트 있을 때 노드포트 서비스를 그 수만큼 해야하나 ==> 인그레스 사용
로드밸런서를 사용하려면 로드밸런서를 이미 구현해 둔 서비스업체의 도움을 받아 쿠버네티스 클러스터 외부에 구현해야 함
왜 안되나 봤드만
mk8s가 아니라 cloud_cmd에서 해야했었다
MetalLB는 베어메탈(bare metal, 운영 체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트
이부분은 내용정리 중점으로 들어가겠음
디플로이먼트 외에도 용도에 따라 사용할 수 있는 다양한 오브젝트가 이미 정의되어있음 -> 쿠버네티스 활용하고 추가 개발하는 오브젝트에도 쉽게 적용 가능
종류와 목적, 작동 방식 중심으로 확인
쿠버네티스는 필요할 때 PVC(PersistentVolumeClaim= 지속적으로 사용 가능한 볼륨 요청)를 요청해 사용
PVC를 사용하려면--> PV( = PersistentVolume= 지속적으로 사용 가능한 볼륨)로 볼륨을 선언이 필요 .
파드가 만들 어지는 이름과 순서를 예측해야 할 때가 존재 (이제까지는 replicas에 선언된 만큼 무작위 생성)
사용목적 : 파드의 이름과 순서를 예측해야 할 때 + ex) Redis, Zookeeper, 카산드라(Cassandra), MongoDB 등의 마스터-슬레이브 구조 시스템에서 필요
단점 : 효율성 면에서 좋은 구조가 아니므로 요구 사항에 맞게 적절히 사용 필요
지금 하고있는 마이크로서비스 스터디에서 젠킨스까지 다루는 내용이 있는데 쿠버네티스까지 해야하는지 아직은 의문이 든다!
물론 장점은 있는데 프로젝트의 기간내에 할 수 있을지...?