클라우드/Docker & Kubernetes

k8s core concepts & setup (2)

mini'scloud 2025. 8. 7. 23:55

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