The Imperative vs The Declarative Approach
- 앞에서 했던 배포 방법들은 매번 실행을 해줘야함
- 프로젝트가 많으면 도커를 그만큼 많이 실행해줘야함
- docker compose yaml처럼 클러스터에 대한 정보를 담은 파일도 있음
- 그 파일을 yaml 파일이라고 함
Imperative (명령형 접근 방식)
- 개별 명령을 실행하여 k8s 클러스터에서 다른 작업을 트리거해야 했음
The Declarative Approach (선언형 접근 방식)
- apply 명령어를 사용해 yaml 파일을 실행함
앞에서 했던 실습 파일에서 deployment.yaml 파일을 추가하자
apiVersion: apps/v1
kind: Deployment #k8s object를 정의함
metadata:
name: second-app-deployment
spec: #배포의 사양
replicas: 1
selector:
matchLabels:
app: second-app
tier: backend
template: #pod에서 사용한 컨테이너에 어떤 이미지를 붙일지를 정의함
metadata:
labels:
app: second-app
tier: backend
spec: #pod에 대한 설정을 하면됨
containers:
- name: second-node # dash는 여러 컨테이너 항목을 담는 리스트를 말함
image: devminii/kube-first-app:2
# - name: ...
# image: ...
- 공식 docs에 내용있어서 그거 참고해서 하면 됨
Working with Labels & Selectors
- selector
- Deployment가 어떤 pod들을 관리할지 지정하는 부분임
- k8s는 selector 조건에 따라 pod들을 관리하고 그 수를 replica만큼 관리할려함
- matchLabels는 key-value 형식을 가짐
- app(key) : second-app(value) 와 tier: backend 형식이 모두 일치하는 pod를 찾음
- 즉, selector에서 정의한거랑 template에서 붙인 라벨이 같아야한다는 말임
- 아래 명령어를 통해 yaml파일을 실행시킴
kubectl apply -f=deployment.yaml

Creating Service Declaratively
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: second-app
ports:
- protocol: 'TCP'
port: 80 #외부에서 접근할때 80으로 service에 들어옴
targetPort: 8080 #80으로 들어온 요청을 8080 포트를 가지는 pod로 전달함
# - protocol: 'TCP'
# port: 443
# targetPort: 443
type: LoadBalancer
- Service의 selector
- 클러스터 네트워크에서 어떤 Pod들로 트래픽을 라우팅할지 결정하는 라벨 selector임
- 조건에 맞는 Pod들을 Endpoint로 등록해, 클러스터 내부 또는 외부에서 오는 요청을 해당 Pod로 전달함
- 보통 이 서비스가 담당할 애플리케이션의 Pod 라벨만 지정함
kubectl apply -f service.yaml

Updating & Deleting Resources
- deployment.yaml에서 replicas 수를 맞게 선택하고
- kubectl apply -f=deployment.yaml만 실행해주면 됨
- 삭제할때는
- kubectl delete -f=deployment.yaml
- 이때 삭제되는 것은 yaml 파일이 아니라 파일 기반으로 생성된 리소스가 삭제됨
- kubectl delete -f=deployment.yaml -f=service.yaml 이렇게 여러개도 됨
Multiple vs Single Config Files
- 위에서 deployment.yaml과 service.yaml 파일을 하나로 작성할 수 있음
- --- 이걸로 구분을 해주면됨
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: second-app
ports:
- protocol: 'TCP'
port: 80
targetPort: 8080
# - protocol: 'TCP'
# port: 443
# targetPort: 443
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: second-app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: second-app
tier: backend
template:
metadata:
labels:
app: second-app
tier: backend
spec:
containers:
- name: second-node
image: devminii/kube-first-app:2
# - name: ...
# image: ...
- matchLabels 대안으로 matchExpressions: 이 있음
matchExpressions:
- {key: app, operator: In, values: [second-app, first-app]}
- operator 연산자를 사용해서 values에 있는 값중에 매칭되는걸 선택하게됨
'클라우드 > Docker & Kubernetes' 카테고리의 다른 글
| Virtualization (0) | 2025.08.19 |
|---|---|
| k8s-Deployment (AWS EKS) (0) | 2025.08.11 |
| Managing Data & Volumes with k8s (0) | 2025.08.08 |
| k8s Core Concepts & setup (0) | 2025.08.07 |
| Kubernetes Concepts (0) | 2025.08.06 |