Kubernetes 기본개념
Container
컨테이너는 이식 가능하고, 가벼운 운영 체제 레벨에서의 가상화 기술입니다. 네임 스페이스를 사용하여 다른 소프트웨어 운영 환경을 격리하고 소프트웨어가 포함된 운영 환경을 미러링하여 어디서나 컨테이너를 쉽게 실행할 수 있습니다.
컨테이너가 작고 빠르게 실행할 수 있으므로, 각 컨테이너 이미지에 어플리케이션을 패키지화할 수 있습니다. 미러링되는 일대일 어플리케이션에는 많은 이점이 있습니다. 컨테이너를 사용하는 경우 외부 인프라 환경과의 바인딩이 필요하지 않습니다. 각 어플리케이션은 외부 종속성을 필요로하지 않으며 외부 인프라 환경에 종속될 필요가 없기 때문입니다. 개발에서 프로덕션까지의 일관성(consistency)을 확보하기 위한 완벽한 솔루션입니다.
컨테이너는 모니터 및 관리에 도움이 되는 가상 머신(virtual machine)보다 더 투명합니다. 특히 컨테이너 프로세스의 라이프 사이클은 컨테이너 내의 프로세스에 의해 숨겨지기보다는 인프라에 의해 관리됩니다. 마지막으로, 각 어플리케이션은 컨테이너로 랩핑되어져 어플리케이션을 개발 관리하는 것과 컨테이너를 개발 관리하는 것은 동일합니다.
Kubernetes는 컨테이너를 관리하기 위해 팟(Pod)을 사용해야하며 각 팟에는 하나 이상의 컨테이너가 포함될 수 있습니다.
Pod
팟은 PID, IPC, 네트워크 및 UTS 네임 스페이스를 공유하는 긴밀하게 압축된 컨테이너들의 모음이며 Kubernetes 스케줄링의 기본 단위입니다. 팟의 디자인 철학은 하나의 팟에서 네트워크와 파일 시스템을 공유하도록 여러 컨테이너를 지원하는 것인데, 이로 인해 컨터이너들은 프로세스간 통신 및 파일 공유를 통해 간단하고 효율적인 방식으로 결합될 수 있습니다.
Kubernetes에서는 모든 객체가 매니페스트 (yaml 또는 json)를 사용하여 정의됩니다. 예를 들어, 간단한 nginx 서비스는 nginx를 반영하는 컨테이너가 포함된 nginx.yaml로 정의 할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Node
노드는 실제로 호스트를 실행하는 팟입니다. 물리적인 머신이 될 수도 있고 가상 머신이 될 수도 있습니다. 여러 팟을 다루기 위해서는 최소한 각 노드에서는 컨테이너 런타임 (예: 도커 또는 rkt), kubelet 및 kube-proxy 서비스를 실행해야 합니다.
Namespace
네임 스페이스는 시스템 내의 객체를 서로 다른 프로젝트 그룹 또는 사용자 그룹으로 나눌 수 있는 리소스 및 객체의 추상 콜렉션입니다. 일반적인 팟, 서비스, 복제 컨트롤러 및 배포는 네임 스페이스(기본값은 default)에 속하며 node, persistentVolumes 등은 네임 스페이스에 속하지 않습니다.
Service
서비스는 레이블을 통해 응용 프로그램에 대한로드 균형 조정 및 서비스 검색을 제공하는 응용 프로그램 서비스 추상화입니다. 레이블과 일치하는 팟 IP 및 포트 목록은 엔드 포인트를 구성하며, kube-proxy에 의해 서비스 IP 로드와 엔드 포인트 사이의 균형을 조정합니다.
각 서비스는 백엔드 컨테이너 작업에 대해 알 필요없이 다른 컨테이너가 서비스에 액세스 할 수 있는 클러스터 IP (클러스터 내에서만 액세스 할 수 있는 가상 주소)와 DNS 이름을 자동으로 할당합니다.
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 8078 # the port that this service should serve on
name: http
# the container on each pod to connect to, can be a name
# (e.g. 'www') or a number (e.g. 80)
targetPort: 80
protocol: TCP
selector:
app: nginx
Label
레이블은 Kubernetes 객체를 식별하고 객체에 key/value 형식으로 첨부되는 표입니다 (키의 최대 길이는 63 바이트를 초과할 수 없으며 값은 null 또는 최대 253 바이트의 문자열일 수 있음).
레이블은 고유성을 제공하지 않으며 사실 많은 객체 (예: 팟)는 특정 레이블을 사용하여 특정 어플리케이션임을 나타냅니다.
Label을 정의한 후에 다른 객체는 Label Selector를 사용하여 동일한 레이블을 가진 객체 그룹을 선택할 수 있습니다 (예: ReplicaSet 및 Service 사용 레이블을 사용하여 팟 그룹을 선택).
Label Selector는 다음과 같은 방법을 지원합니다.
app=nginx
및env!=production
와 같은 방식env in (production, qa)
와 같은 집합app=nginx,env=test
처럼 여러 라벨 (AND인 객체들)
Annotations
어노테이션은 key/value 형식으로 첨부된 주석입니다. 객체를 표시하고 선택하는 데 사용되는 레이블과 달리 어노테이션은 어플리케이션을 배포하고, 보안 정책 및 예약 정책을 지원하기 위한 추가 정보를 기록하는 데 사용됩니다. 예를 들어, deployment 객체는 주석을 사용하여 롤링 업데이트 상태를 기록합니다.