
기존 배포 시대: 초기에 조직은 물리적 서버에서 애플리케이션을 실행했습니다. 물리적 서버에서는 애플리케이션에 대한 리소스 경계를 정의할 방법이 없었으며 이로 인해 리소스 할당 문제가 발생했습니다. 예를 들어, 여러 애플리케이션이 물리적 서버에서 실행되는 경우 한 애플리케이션이 대부분의 리소스를 차지하여 결과적으로 다른 애플리케이션의 성능이 저하되는 경우가 있을 수 있습니다. 이에 대한 해결책은 각 애플리케이션을 서로 다른 물리적 서버에서 실행하는 것입니다. 그러나 리소스 활용도가 낮기 때문에 확장이 불가능했고 조직에서 많은 물리적 서버를 유지하는 데 비용이 많이 들었습니다.(너무 리소스 활용이 안좋음)
가상화 배포 시대: 솔루션으로 가상화가 도입되었습니다. 이를 통해 단일 물리적 서버의 CPU에서 여러 가상 머신(VM)을 실행할 수 있습니다. 가상화를 사용하면 VM 간에 애플리케이션을 격리할 수 있으며, 한 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스할 수 없으므로 보안 수준을 제공합니다.(가상화의 대표적인 장점이다.)
가상화를 사용하면 물리적 서버의 리소스 활용도가 향상되고 애플리케이션을 쉽게 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있으므로 확장성이 향상됩니다. 가상화를 사용하면 일련의 물리적 리소스를 일회용 가상 머신 클러스터로 제공할 수 있습니다.
각 VM은 가상화된 하드웨어 위에 자체 운영 체제를 포함한 모든 구성 요소를 실행하는 완전한 시스템입니다.(VM이 무거움 좀 더 가볍고 확장성을 늘리고 싶음)
컨테이너 배포 시대: 컨테이너는 VM과 유사하지만 애플리케이션 간에 운영 체제(OS)를 공유하기 위한 완화된 격리 속성을 가지고 있습니다. 따라서 컨테이너는 경량으로 간주됩니다. VM과 유사하게 컨테이너에는 자체 파일 시스템, CPU 공유, 메모리, 프로세스 공간 등이 있습니다. 기본 인프라에서 분리되므로 클라우드와 OS 배포판 간에 이식 가능합니다.(Docker가 최초로 Linux Ciontainers라는 제목으로 세상에 알렸다. 하나의 환경, 도커 엔진에서 여러 APP들이 충돌되지 않고 돌아감 기존 여러 VM을 만들어야할 때와 다르고 가볍고 APP간의 충돌도 일어나지 않아서 배포도 훨씬 쉬워짐)

도커의 등장으로 컨테이너 기반 배포 방식이 보편화 되고, 많은 서비스들이 도커라이징 되어 이미지로 관리되기 시작했다.
점점 이미지가 많아지면서, 관리해야할 컨테이너와 서버들이 많아지게 되면서, 엔지니어의 일이 많아지게 되었다.
컨테이너를 배포할 서버, 죽은 컨테이너 살리기 등등 잡스러운 일이 많아져 역시나 자동화 시키고 싶은 개발들,,,
컨테이너들 의 관리를 자동화할 도구(컨테이너 오케스트레이션 툴)의 필요성이 대두되었다.

Kubernetes를 배포하면 클러스터가 생성된다. Kubernetes 클러스터는 Worker mechine set로 구성됩니다. 노드, 컨테이너화된 애플리케이션을 실행합니다. 모든 클러스터에는 하나 이상의 worker node가 있다.
Worker node는 다음을 호스팅한다. Pod이는 애플리케이션 워크로드의 구성 요소이다. 그만큼 제어 평면에서 클러스터는 작업자 노드와 Pod를 관리한다. 프로덕션 환경에서 제어 평면은 일반적으로 여러 컴퓨터에서 실행되고 클러스터는 일반적으로 여러 노드를 실행하여 내결함성과 고가용성을 제공다.
쿠버네티스'제어 평면’(Control plane)의 핵심은 API 서버이다. API 서버는 최종 사용자와 클러스터의 여러 부분, 외부 구성 요소가 서로 통신할 수 있는 HTTP API를 제공한다.
Kubernetes API를 사용하면 Kubernetes에서 API 개체(예: Pod, 네임스페이스, ConfigMap 및 이벤트)의 상태를 쿼리하고 조작할 수 있다.
쿠버네티스에는 workload라는 오브젝트/컴포넌트/어떤 종류의 구성요소도 존재하지 않는다. 보통 이 단어는 클러스터에서 실행하려는 작업이나 서비스 등을 가리키는 말로 종종 사용된다. (쿠버네티스에서는 "쿠버네티스 상에서 작동되는 애플리케이션"을 의미하며, 클라우드 분야에서는 "어떤 애플리케이션을 실행할 때 필요한 IT 리소스의 집합"이라는 의미로 통용된다. )
워크로드가 단일 컴포넌트든 함께 작동하는 컴포넌트 집합이든 관계없이, 쿠버네티스에서는 워크로드를 일련의 파드 집합 내에서 실행한다. 사용자를 대신하여 파드 집합을 관리하는 워크로드 리소스를 사용할 수 있는데, 이러한 리소스는 지정한 상태와 일치하도록 올바른 수의 올바른 파드 유형이 실행되고 있는지 확인하는 컨트롤러를 구성한다.
Kubernetes API를 사용하여 Pod보다 높은 추상화 수준을 나타내는 워크로드 object를 생성한 다음 정의한 워크로드 개체의 규격에 따라 Kubernetes 제어 평면(control plane)에서 자동으로 Pod 개체를 관리한다.
워크로드 관리를 위한 기본 제공 API는 다음과 같다.





데몬셋은 모든 노드, 또는 특정 레이블을 가진 노드에 하나씩의 동일한 파드를 구동하게 해주는 리소스다.
해당되는 노드에 오직 하나씩만 배치한다는 점에서 디플로이먼트 또는 스테이트풀셋과 다르며, 따라서 별도의 레플리카 설정을 하지 않는다. 데몬셋이 구동 중인 클러스터에서 노드가 추가되면 해당 노드에도 데몬셋의 파드가 배치되지만, 삭제된 노드에 있던 데몬셋 파드가 다른 노드로 옮겨지지는 않는다.
데몬셋은 주로 워커 노드에 리소스 모니터링용 애플리케이션, 또는 로그 수집기를 배포할 때 쓰인다.
쿠버네티스는 하나의 동일한 물리 클러스터를 공유하는 가상 클러스터를 지원하는데, 이것을 네임스페이스(Namespace)라고 한다. 클러스터의 자원을 여러 사용자나 용도에 따라 나누는 기능이 필요할 때 쓴다. 네임스페이스는 워크로드 리소스는 아니지만, 하나의 클러스터 안에서 다양한 워크로드 리소스들을 필요에 따라 격리하는 데에 쓰인다.
실제 프로젝트에서는 개발 단계에 따라 여러 환경(Dev, Staging, Production, etc...)을 동시 운영하게 될 수 있다. 네임스페이스는 별도로 물리적인 호스트 환경의 격리 없이, 이처럼 상호 다른 환경의 특성에 맞게 정책과 리소스량을 정하여 격리된 환경을 만들 수 있는 것이다.
예를 들어, 같은 네임스페이스 안에서 리소스의 명칭은 반드시 고유해야 하지만, 다른 네임스페이스들을 함께 통틀어서 고유할 필요는 없다. 정책(Policy), 리소스 호출 등도 네임스페이스 범위를 기준으로 적용된다.
kubectl get 명령어로 특정 유형의 리소스 목록을 조회할 때, 이 명령은 현재 유효한 네임스페이스의 범위 안에서만 적용된다. 별도로 특정 네임스페이스를 현재 작업 환경으로 지정한 상태가 아니라면, 기본값인 default 네임스페이스에 속한 리소스만 조회된다.
default : 다른 네임스페이스가 없는 오브젝트를 위한 기본 네임스페이스kube-system : 쿠버네티스 시스템에서 생성한 오브젝트를 위한 네임스페이스kube-public : 모든 사용자(인증되지 않은 사용자 포함)가 읽기 권한으로 접근할 수 있는 네임스페이스다. 주로 전체 클러스터 중에 공개적으로 드러나서 읽을 수 있는 리소스를 위해 예약되어 있다. 다만 이 특성은 단지 관례로서 적용되어 있을 뿐, 필수적인 사항은 아니다.kube-node-lease : 클러스터가 스케일링될 때 노드 하트비트의 성능을 향상시키는 각 노드와 관련된 리스(lease) 오브젝트에 대한 네임스페이스컨테이너화란 소프트웨어 코드를 라이브러리, 프레임워크 및 기타 종속성과 같은 필수 요소와 함께 패키지에 포함하여 각자의 "컨테이너"로 분리하는 것을 뜻합니다.
이렇게 컨테이너화된 소프트웨어 또는 애플리케이션은 어떤 환경과 인프라에서든 해당 환경이나 인프라의 운영 체제와는 상관없이 이동할 수 있으며 일관성있게 실행됩니다. 즉, 컨테이너는 애플리케이션을 둘러싼 일종의 버블 또는 컴퓨팅 공간으로, 그 주위와 분리해주는 역할을 하는 것입니다. 기본적으로 완전한 기능을 갖춘 이식성이 있는 컴퓨팅 환경입니다.(←핵심 내용)
컨테이너는 하나의 플랫폼 또는 운영 체제에서 코드를 작성하는 방식을 대체합니다. 이러한 방식은 해당 코드가 새로운 환경과 호환되지 않을 경우 애플리케이션의 이동을 어렵게 만드는 원인이었으며 수정이 필요한 버그, 오류, 결함 등이 생겼습니다. 이렇게 되면 시간은 더 많이 소요되고, 생산성은 줄어들며, 사기도 꺾이게 됩니다.
플랫폼과 인프라 전반에서 이동이 가능한 컨테이너로 애플리케이션을 패키징하는 경우 해당 애플리케이션을 어디에서든 사용할 수 있습니다. 실행하는 데 필요한 요소는 이미 패키지 안에 모두 포함되어 있기 때문입니다.
프로세스를 분리하는 아이디어는 수년간 존재했지만, 2013년 Docker가 Docker Engine을 소개하면서 비로소 개발자가 사용하기 쉬운 툴을 갖춘 컨테이너 사용의 기준이 정해졌고 패키징에 대한 범용적 접근 방식이 제시되었습니다. 그러면서 컨테이너 기술 도입이 가속화되었습니다. 오늘날 개발자는 Docker가 개척한 Open Container Initiative 표준을 지원하는 Podman, Buildah, Skopeo같은 다양한 컨테이너화 플랫폼과 툴을 선택할 수 있습니다.

FastAPI 서버를 준비했다.

Dockerfile을 작성해준다.(트러블 슈팅이라고 할 것까지는 아니지만, fastapi는 서버 실행을 위한 cmd실행을 dockerfile에 작성해주어야하고, 연습삼아 FastAPI 객체의 이름을 world로 했다가 시간을 너무 잡아 먹었다. 다들 조심하기를,,,,)

빌드를 해준다. 처음 빌드할때 tag 지정 가능



버전과 이름을 지정하지 못해서 해당 IMAGE ID를 선택해서 이름과 tag을 지정해줌

dockerhub에 로그인을 해준다.


dockerhub에서 확인했을 때 이상없이 잘 올라갔다.

docke image를 삭제 (상관은 없음)


docke hub에서 pull을 하여 이미지가 생성되었지만, container는 존재하지 않는다.


docker run -d -p 3000:8080 fastapi-tutorial:latest
분리 모드(-d)의 fastapi-tutorial이미지에서 새 컨테이너를 시작한다. -p 로 포트 매핑을 설정할 수 있다. -p 3000:8080이라고 기술하면 처음 3000 현재 로컬 컴퓨터의 포트이고 콜론(:)다음의 8080은 앱이 컨테이너에서 수신 대기하는 포트다.

3000번 포트로 연결했다. 서버가 제대로 작동하는 것을 볼 수 있다.
https://www.samsungsds.com/kr/insights/220222_kubernetes1.html
https://velog.io/@mingy1206/CICD-공부
https://velog.io/@tom990422/간단하게-kubernetes-cluster-구축하기
https://www.redhat.com/ko/topics/cloud-native-apps/what-is-containerization
https://velog.io/@junnn0021/쿠버네티스-워크로드
https://velog.io/@hanblueblue/쿠버네티스-2.-워크로드-파드