이 글은 쿠버네티스 공부한 흔적을 남기기 위한 글입니다.
기본 오브젝트로 쿠버네티스 클러스터를 구성할 수 있지만 한계가 있습니다. 이러한 한계를 극복하고자 기본 오브젝트 외 다양한 오브젝트들이 존재하는데 이번엔 디플로이먼트 오브젝트에 대해 알아보겠습니다.
디플로이먼트
디플로이먼트는 한마디로 파드 + 레플리카셋입니다.
* 참고 : 레플리카셋은 파드의 수를 보장해주는 오브젝트입니다.
쿠버네티스 클러스터에서의 API 서버와 컨트롤러 매니저는 단순히 파드의 감시가 아닌 디플로이먼트처럼 다양한 오브젝트를 감시합니다.
디플로이먼트를 생성할 때 사용하는 명령어로는 기본적으로 create, apply 을 사용합니다.
디플로이먼트로 생성한 파드를 늘리고 싶으면 scale 명령어를 다시 쳐야하지만 yaml을 사용하여 디플로이먼트의 spec을 정해주면 처음부터 원하는대로 디플로이먼트를 생성할 수 있습니다.
yaml 작성이 좀 복잡하긴 하지만 디플로이먼트를 유동적으로 생성할 수 있습니다.
yaml으로 디플로이먼트 spec 작성하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
이 예시에 대한 설명은 다음과 같다.
- .metadata.name 필드에 따라 nginx-deployment 이름으로 디플로이먼트가 생성된다.
- .spec.replicas 필드에 따라 디플로이먼트는 3개의 레플리카 파드를 생성한다.
- .spec.selector 필드는 디플로이먼트가 관리할 파드를 찾는 방법을 정의한다. 이 사례에서는 파드 템플릿에 정의된 레이블(app: nginx)을 선택한다. 그러나 파드 템플릿 자체의 규칙이 만족되는 한, 보다 정교한 선택 규칙의 적용이 가능하다.
추가로 .metadata.labels의 app은 향후 어느 리소스가 이 app 값을 디플로이먼트를 참고하려할때 필요한 값을 지정해주기 위한 것이고, .spec.selector.matchLabels의 app은 .spec.template.metadata.labels의 app을 참조하는 것이다.
.spec.template.metadata.labels의 app을 지정해줌으로써 .selector.matchLabels에서 리소스를 찾을 수 있다.
참고:
.spec.selector.matchLabels 필드는 {key,value}의 쌍으로 매핑되어있다. matchLabels 에 매핑된 단일 {key,value}은 matchExpressions 의 요소에 해당하며, key 필드는 "key"에 그리고 operator는 "In"에 대응되며 value 배열은 "value"만 포함한다. 매칭을 위해서는 matchLabels 와 matchExpressions 의 모든 요건이 충족되어야 한다.
- template 필드에는 다음 하위 필드가 포함되어있다.
- 파드는 .metadata.labels 필드를 사용해서 app: nginx 라는 레이블을 붙인다.
- 파드 템플릿의 사양 또는 .template.spec 필드는 파드가 도커 허브의 nginx 1.14.2 버전 이미지를 실행하는 nginx 컨테이너 1개를 실행하는 것을 나타낸다.
- 컨테이너 1개를 생성하고, .spec.template.spec.containers[0].name 필드를 사용해서 nginx 이름을 붙인다.
시작하기 전에, 쿠버네티스 클러스터가 시작되고 실행 중인지 확인한다. 위의 디플로이먼트를 생성하려면 다음 링크를 따른다.
디플로이먼트
디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다. 디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의
kubernetes.io
'...' 카테고리의 다른 글
[Kubernetes] kubectl exec -it 명령어에서 -- 의미 (0) | 2021.08.24 |
---|---|
[Node.js] Ubuntu에서 Node.js 버전업 하기 (0) | 2021.08.24 |
[Kubernetes] 오브젝트(Object)란? (0) | 2021.08.20 |
[Kubernetes] 오브젝트 생성시 run, create, apply 차이 (0) | 2021.08.20 |
[JS] 자바스크립트 쿠키 생성, 저장, 삭제 구현하기 (0) | 2021.08.20 |