쿠버네티스에서는 직접 사용자가 개별 파드를 만들일이 많지 않다. 왜냐면 파드는 일시적이고, 언제나 삭제될 수 있음을 감안하고 만들기 때문이다. 마치 가상 클라우드서버의 별명인 가축과 같은 개념인 것이다. 하나가 없어지면 하나의 요소가 사라진 것이지 본질이 없어진게 아니기 때문이다.
쿠버네티스의 디플로이먼트는 번역하지 않는게 좋다. 이것은 파드의 교체/배치와 관련된 명세이다.
쿠버네티스의 핵심은 컨테이너를 오케스트레이션하는 것으로, 파드 장애시 자동 복구 하거나 복제 하거나 하는 등의 일을 자동으로 처리하는 데에 있다. AWS로 따지면 ECS가 하는 일과 비슷하다.
파드는 디플로이먼트, 스테이스풀셋, 데몬셋을 이용해 관리하는 것이 바람직하다.
쿠버네티스의 오브젝트는 하나의 의도를 담은 래코드이다. 오브젝트를 생성하게 되면, kube시스템은 그 오브젝트 생성을 보장하기 위해 지속적으로 작동한다.
오브젝트를 생성함으로써 클러스터의 워크로드를 어떤 형태로 보이고자 하는지 효과적으로 쿠버네티스 시스템에 전한다.
생성이든 수정이든 삭제든 오브젝트를 동작시키려면 쿠버네티스 api를 이용해야 한다.
거의 모든 쿠버네티스 오브젝트는 오브젝트의 구성을 결정해주는 두 개의 중첩된 오브젝트 필드를 포함한다.
예)
쿠버네티스 디플로이먼트는 클러스터에서 동작하는 애플리케이션을 표현해줄 수 있는 오브젝트이다. 디플로이먼트를 생성할 때, 디플로이먼트 spec에 3개의 애플리케이션 레플리카가 동작되도록 설정할 수 있다.그래서 status
와 spec
간의 차이를 끊임없이 대응한다.
대부분의 경우 정보를 .yaml파일로 kubectl
에 제공한다.
다음은 쿠버네티스 디플로이먼트를 위한 필수 오브젝트 .yaml파일의 예이다.
apiVersion: apps/v1 # 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
kind: Deployment # 어떤 종류의 오브젝트를 생성하고자 하는지
metadata: # 이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
name: nginx-deployment
spec: # 오브젝트에 대해 어떤 상태를 의도하는지
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
yaml파일을 이용해서 디플로이먼트를 생성하기 위해서는 kubectl apply
커맨드를 이용하면된다.
쿠버네티스에서 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다.
네임스페이스는 여려 개의 팀이나 프로젝트에 걸쳐서 많은 사용자가 있는 환경에서 사용하도록 만들어졌다. 사용자가 거의 없거나 수 십명 정도인 경우에는 네임스페이스를 전혀 고려할 필요가 없다.
네임스페이스는 이름의 범위를 제공한다. 리소스의 이름은 네임스페이스 내에서 유일해야 하지만 네임스페이스를 통틀어서 유일할 필요는 없다.
kubectl get namespace
:사용중인 클러스터의 현재 네임스페이스를 나열할 수 있다.
쿠버네티스는 처믕 네 개의 초기 네임스페이스를 갖는다.
default
: 다른 네임스페이스가 없는 오브젝트를 위한 기본 네임스페이스kube-system
: 쿠버네티스 시스템에서 생성한 오브젝트를 위한 네임스페이스kube-public
: 자동으로 생성되며, 모든 사용자가 읽기 권한으로 접근할 수 있다.kube-node-lease
: 클러스터가 스케일링될 때 노드 하트비트의 성능을 향상 시키는 각 노드와 관련된 리스(lease) 오브젝트에 대한 네임스페이스현재 요청에 대한 네임스페이스를 설정하기 위해 --namespace
플래그를 사용한다.
다음은 --namespace
의 예시다
kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>
대부분의 쿠버네티스 리소스(예를 들어, 파드, 서비스, 레플리케이션 컨트롤러 외)는 네임스페이스에 속한다.
하지만 네임스페이스 리소스 자체는 네임스페이스에 속하지 않는다. 그리고 노드나 퍼시스턴트 볼륨과 같은 저수준 리소스는 어느 네임스페이스에도 속하지 않는다.