본문 바로가기
개발공부 개발새발/Kubernetes

Kubernetes ) 선언적 접근 방식으로 쿠버네티스 사용해보기

by 휴일이 2024. 4. 22.

명령적 접근 방식의 단점

  1. 명령을 외워야 한다.
  2. 반복 명령을 해야 한다. docker run 명령을 일일히 입력해야하는 것처럼..
    1. deployment 구성 파일이 있으면 좋겠다!!!?
  • 쿠버에도 리소스 정의 파일이 있으며, 이용 가능함!

선언적 접근 방식

일반적으로 사용되는 방식

  • apply 명령을 실행하여 클러스터에 적용하려는 구성이 포함된 yml 파일을 가리킨다.
  • 야물 파일을 이용해서 원하는 상태를 정의한다.
  • 구성파일이 변경되어도 쿠버네티스가 변경 사항을 살펴보고 적절한 변경을 수행한다.
  • docker-compose 와 비슷하다!

장점

  • 매번 명령을 다시 입력할 필요가 없고 오류가 덜 발생.
    • 유지 관리가 더 쉽다.
  • 변경해도 반복 필요 없음.
  • 하나만 변경할 수 있고 공유도 매우 쉽다.
  • 동료가 작성한 파일을 보며 구성 방법 빠르게 확인 가능
    • 다음에 어떻게 실행하는지 안 물어봐도 됨 ㅋㅋ굿

선언적 접근 방식 사용

일단 yaml 파일을 생성한다. 이름은 자기 맘이다. 나는 deployment.yml 이라고 정의하겠다.

최소한의 구성

deployment.yml

# 쿠버네티스 구성 파일에서 사용해야하는 구문이다.
# apiVersion 키를 차장보려면 document 나 kubernetes deployment yaml 등을 검색해보자.
apiVersion: apps/v1
# 생성하려는 쿠버네티스 객체 종류 정의 , 여기서는 deployment
kind: Deployment
# 생성하는 객체의 이름 등의 정보
metadata:
  # 객체 이름
  name: second-app-deployment
# 사양
spec:
  # 디폴트 값으로 가지고 있는 pod 의 수 (설정 안 하면 1)
  replicas: 1
  # pod 정의
  template:
    # 위에서 이미 deployment 에 대해 정의했기 때문에, deployment의 template 은 무조건 pod 임. 그래서 따로 추가 X
    # kind: Pod
    # 쿠버의 세 객체니까 metadata 필요
    metadata:
      # 레이블
      labels: 
        # 내가 원하는 키밸류 추가 가능
        app: second-app
    # pod 구성 방법 정의 (pod 사양)
    spec:
      # 파드 구성 컨테이너
      # 여러 컨테이너 정할 수 있으니 컨테이너 추가 가능
      containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
        # - name: ...
          # image: ...

# delployment.yml 를 기반으로 실행
kubectl apply -f=deployment.yml
  • 하지만 이렇게 실행하면 selector 가 없다는 오류가 뜬다.

yml 수정 → selector 추가

# 쿠버네티스 구성 파일에서 사용해야하는 구문이다.
# apiVersion 키를 차장보려면 document 나 kubernetes deployment yaml 등을 검색해보자.
apiVersion: apps/v1
# 생성하려는 쿠버네티스 객체 종류 정의 , 여기서는 deployment
kind: Deployment
# 생성하는 객체의 이름 등의 정보
metadata:
  # 객체 이름
  name: second-app-deployment
# 사양
spec:
  # 디폴트 값으로 가지고 있는 pod 의 수 (설정 안 하면 1)
  replicas: 1
  # 쿠버네티스가 관리해야하는 pod 중에서 제어할 pod 를 선택한다.
  # 만약 deployment 가 생성된 후 pod 수를 확장한다면 새 pod 는 이미 존재하는 deployment 에 의해 관리되어야 할 것.
  # 그래서 deployment 는 외부에 있는 모든 pod 를 지속적으로 감시하고 제어해야하는 pod 가 있는지 살펴야 한다..
  # 거의 모든 리소스와 작동한다. like Azure
  selector: 
    # Label 일치하는 파드
    matchLabels:
      app: second-app
      tier: backend
    # 표현 일치
    # matchExpressions:

  # pod 정의
  template:
    # 위에서 이미 deployment 에 대해 정의했기 때문에, deployment의 template 은 무조건 pod 임. 그래서 따로 추가 X
    # kind: Pod
    # 쿠버의 세 객체니까 metadata 필요
    metadata:
      # 레이블
      labels: 
        # 내가 원하는 키밸류 추가 가능
        # 여러 레이블 추가 가능
        app: second-app
        tier: backend
    # pod 구성 방법 정의 (pod 사양)
    spec:
      # 파드 구성 컨테이너
      # 여러 컨테이너 정할 수 있으니 컨테이너 추가 가능
      containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
        # - name: ...
          # image: ...

  • kubectl apply -f=deployment.yaml 하면 deployment 생성됨.
  • 이제 서비스를 만들어보자!

service.yml 추가

service 를 정의하자

# 공식 문서에서는 v1 이 core 그룹인데, core 는 생략 가능함
apiVersion: v1
# 서비스를 만들기 위해
kind: Service
metadata:
  name: backend
spec:
  # 이 리소스에게 제어되거나, 연결되어야 하는 다른 리소스, (이 service 의 일부가 되는 pod 정의)
  # service 는 pod 를 클러스터나 외부에게 노출함.
  # service 로는 deployment 를 제어하는 것이 아니라 pod 제어
  selector: 
    # 레이블 지정
    # 다른 티어를 가져도 app:second-app 레이블이 있다면 제어
    # app: second-app 레이블이 있는 모든 pod 를 노출,
    app: second-app
    # tier: backend
    # 노출 포트 지정 (다중 지정 가능)
  ports:
      # 프로토콜
    - protocol: 'TCP'
      # 외부 포트
      port: 80
      # 컨테이너 내부 포트
      targetPort: 8080
  # 외부 엑세스를 원하면 LoadBalancer
  type: LoadBalancer
# service 생성
kubectl apply -f service.yaml

# minikube 에 노출
minikube service backend(서비스이름)

 

 

minikube 로 노출한 서비스 호에엥~~

 

 

리소스 업데이트

deplyment 및 service 변경은, yml 에서 간단하게 변경하고 파일을 적용하면 클러스터에서 변경한다!

# 쿠버네티스 구성 파일에서 사용해야하는 구문이다.
# apiVersion 키를 차장보려면 document 나 kubernetes deployment yaml 등을 검색해보자.
apiVersion: apps/v1
# 생성하려는 쿠버네티스 객체 종류 정의 , 여기서는 deployment
kind: Deployment
# 생성하는 객체의 이름 등의 정보
metadata:
  # 객체 이름
  name: second-app-deployment
# 사양
spec:
  **# 파드 수를 3으로 변경
	replicas: 3**
  # 쿠버네티스가 관리해야하는 pod 중에서 제어할 pod 를 선택한다.
  # 만약 deployment 가 생성된 후 pod 수를 확장한다면 새 pod 는 이미 존재하는 deployment 에 의해 관리되어야 할 것.
  # 그래서 deployment 는 외부에 있는 모든 pod 를 지속적으로 감시하고 제어해야하는 pod 가 있는지 살펴야 한다..
  # 거의 모든 리소스와 작동한다. like Azure
  selector: 
    # Label 일치하는 파드
    matchLabels:
      app: second-app
      tier: backend
    # 표현 일치
    # matchExpressions:

  # pod 정의
  template:
    # 위에서 이미 deployment 에 대해 정의했기 때문에, deployment의 template 은 무조건 pod 임. 그래서 따로 추가 X
    # kind: Pod
    # 쿠버의 세 객체니까 metadata 필요
    metadata:
      # 레이블
      labels: 
        # 내가 원하는 키밸류 추가 가능
        # 여러 레이블 추가 가능
        app: second-app
        tier: backend
        
    # pod 구성 방법 정의 (pod 사양)
    spec:
      # 파드 구성 컨테이너
      # 여러 컨테이너 정할 수 있으니 컨테이너 추가 가능
      containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
        # - name: ...
          # image: ...

# 변경된 yml 을 다시 적용한다.
kubectl apply -f=deployment.yaml
  • 이 후 파드를 가져오면 3개의 파드가 정상 실행되는 것을 확인 가능.
  • 이미지 변경 등도 파일만 바꾸면 된당.

리소스 삭제

이름으로 대상을 지정해서 삭제할 수도 있지만, 관련 파일 이름을 호출도 가능하다.

# 이 파일에 의해 생성된 리소스들 삭제
kubectl delete -f=deployment.yaml -f=service.yaml

단일 파일로 합치기

deployment + service 파일을 하나로 합쳐보자.

  • service 를 먼저 배치하는 것이 낫다
# 공식 문서에서는 v1 이 core 그룹인데, core 는 생략 가능함
apiVersion: v1
# 서비스를 만들기 위해
kind: Service
metadata:
  name: backend
spec:
  # 이 리소스에게 제어되거나, 연결되어야 하는 다른 리소스, (이 service 의 일부가 되는 pod 정의)
  # service 는 pod 를 클러스터나 외부에게 노출함.
  # service 로는 deployment 를 제어하는 것이 아니라 pod 제어
  selector: 
    # 레이블 지정
    # 다른 티어를 가져도 app:second-app 레이블이 있다면 제어
    # app: second-app 레이블이 있는 모든 pod 를 노출,
    app: second-app
    # tier: backend
    # 노출 포트 지정 (다중 지정 가능)
  ports:
      # 프로토콜
    - protocol: 'TCP'
      # 외부 포트
      port: 80
      # 컨테이너 내부 포트
      targetPort: 8080
  # 외부 엑세스를 원하면 LoadBalancer
  type: LoadBalancer

      
# 완전히 새로운 객체가 시작됨을 의미하는 구문 (대시 3개)
---
# 쿠버네티스 구성 파일에서 사용해야하는 구문이다.
# apiVersion 키를 차장보려면 document 나 kubernetes deployment yaml 등을 검색해보자.
apiVersion: apps/v1
# 생성하려는 쿠버네티스 객체 종류 정의 , 여기서는 deployment
kind: Deployment
# 생성하는 객체의 이름 등의 정보
metadata:
  # 객체 이름
  name: second-app-deployment
# 사양
spec:
  # 디폴트 값으로 가지고 있는 pod 의 수 (설정 안 하면 1)
  replicas: 3
  # 쿠버네티스가 관리해야하는 pod 중에서 제어할 pod 를 선택한다.
  # 만약 deployment 가 생성된 후 pod 수를 확장한다면 새 pod 는 이미 존재하는 deployment 에 의해 관리되어야 할 것.
  # 그래서 deployment 는 외부에 있는 모든 pod 를 지속적으로 감시하고 제어해야하는 pod 가 있는지 살펴야 한다..
  # 거의 모든 리소스와 작동한다. like Azure
  selector: 
    # Label 일치하는 파드
    matchLabels:
      app: second-app
      tier: backend
    # 표현 일치
    # matchExpressions:

  # pod 정의
  template:
    # 위에서 이미 deployment 에 대해 정의했기 때문에, deployment의 template 은 무조건 pod 임. 그래서 따로 추가 X
    # kind: Pod
    # 쿠버의 세 객체니까 metadata 필요
    metadata:
      # 레이블
      labels: 
        # 내가 원하는 키밸류 추가 가능
        # 여러 레이블 추가 가능
        app: second-app
        tier: backend
    # pod 구성 방법 정의 (pod 사양)
    spec:
      # 파드 구성 컨테이너
      # 여러 컨테이너 정할 수 있으니 컨테이너 추가 가능
      containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
        # - name: ...
          # image: ...

서비스를 먼저 배치하는 것이 나은 이유

  • 리소스는 위에서 아래로 생성된다.
  • service 의 selector 때문에 이후 생성되는 모든 부분이 동적으로 추가된다.
  • 서비스가 생성될 때 레이블과 일치하는 새로운 부분이 생성되면 서비스에 동적으로 추가되기 때문에 서비스를 먼저 배치하는 것이 오히려 권장된다.
# 합쳐진 파일을 apply 해도 정상 동작한다.
kubectl apply -f=master-deployment.yaml

selector

다른 리소스를 리소스에 연결한다.

# 기본
selector:
	app: second-app
	
# 신식 : 라벨 매칭
selector:
	# 라벨이 매치되는가?
	matchLabels:
		app: second-app
	
# 신식 : 표현 매칭
selector:
	# 표현이 매치되는가?
	matchExpressions:
		app: second-app
			# operator: 조건 설정
			# 여기서는 app 에서 values 범위에 있는 모든 값을 선택한다는 뜻.
			# 자세한 건 documentation ㄱㄱ
			- {key: app, operator: In, values: [second-app, first-app]}

# selector 로 삭제 가능
# deployment, service 를 레이블별로 삭제
kubectl delete deployments,service -l group=example

활성 프로브

컨테이너가 정상 실행하는지 확인하는 것=활성프로브, 자체 정의 가능하다.

    spec:
      # 파드 구성 컨테이너
      # 여러 컨테이너 정할 수 있으니 컨테이너 추가 가능
      containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
          # 컨테이너 정상 실행인지 확인하는 자체 활성 프로브 정의
          livenessProbe: 
            # get 요청으로
            httpGet: 
              # 이쪽에다 해봐
              path: /
              # 8080 포트써서
              port: 8080
            # n 초마다 확인
            periodSeconds: 3
            # 쿠버가 처음으로 상태를 확인할 때까지 기다려야되는 시간 n 초
            initialDelaySeconds: 5
  • 여러 옵션이 있음.

언제나 최신 이미지 가져오기

containers: 
        - name: second-node
          image: holidaykang/kube-first-app:3
					# 이미지 당겨오는 전략
					# 태그를 지정하지 않아도 항상 최신 이미지 가져오기
					# 아님 이미지에 태그 :lastest 쓰기
					imagePullPolicy: Always
728x90