Imperative vs Declarative

zuckerfrei·2023년 6월 22일
0

Kubernetes

목록 보기
17/63

명령형 접근 vs 선언형 접근



1. Imperative (명령형 접근)

목적지까지 도달하기 위해 하나하나 동작을 지정하는 접근법.

목표에 도달하려면 어떻게(how) 해야하는지에 집중한다.

다음과 같은 명령어를 사용하는 경우, 명령형 접근이라 볼 수 있다.

# create
kubectl run --image=nginx nginx
kubectl create deployment --image=image nginx
kubectl expose deploy nginx --port 80

# update
kubectl edit deploy nginx
kubectl scale deploy nginx --replicas=5
kubectl set image deploy nginx nginx=nginx:1.18
kubectl replace -f nginx.yaml

# etc
kubectl expose deploy nginx --port 80
kubectl delete -f nginx.yaml

장점

cli 명령어를 사용하면 빠르게 객체를 생성할 수도 있다. 여기까지는 좋다.

단점

그러나 운영 도중 변경 사항이 생긴다면?

이렇게 명령형으로 관리하면 변경 이력을 파악하기 어렵다. 처음부터 히스토리를 알고 있는 관리자라면 몰라도, 다른 사람들은 관리 난이도가 올라간다.

그리고 명령형으로는 복잡한 객체에 대한 관리가 까다로워서 한계가 있다.
어떻게 커맨드창에 입력하는 방식으로 관리를 하겠는가. 속터지겠다.


2. Declarative (선언형 접근)

목적지까지 도달하기 위해 최종 목적지만 선언하고, 나머지는 시스템이 알아서 동작하기를 바라는 접근법.

목표가 무엇(what)인지에 집중한다.

장점

아래처럼 yaml 파일로 요구 사항을 선언한다.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end-service
spec:
  containers:
  - name: nginx-container
    image: nginx:1.18

그리고 이를 구성하기 위해 필요한 모든 작업은 시스템이 알아서 처리한다.

또한 운영 도중 변경 사항이 생기면, 이것 역시 yaml 파일 수정을 통해 적용시킨다.


선언형 접근에서는 다음과 같은 명령어를 사용할 수 있다.
kubectl apply -f file_name.yml

apply 명령어는 존재할 경우 업데이트를, 존재하지 않을 경우 생성을 수행하는 똑똑한 명령어이다.


결론은…

클러스터 관리자 입장에서 선언형 접근 방식을 지향해야 할 것이다.
단지 yaml 파일 수정 및 apply 명령만으로 객체를 관리하고 추적할 수 있다는 것은 선언형 접근의 큰 장점이다.
덕분에 누구든지 yaml 파일만으로도 현재 클러스터의 구성 및 객체 상태를 파악할 수 있게 된다.

그러나 명령형 접근도 빠르게 수행하는 작업이나 시험에서는 유용하게 사용될 수 있다.
cka를 앞둔 나로서는 사용하는 방법을 충분히 알아두는 것이 좋을 것 같다.

profile
무설탕 음료를 좋아합니다

0개의 댓글