본문 바로가기
docker & kubernetes

쿠버네티스 사용하기 3 | Docker&Kubernetes 학습 35

by 그갸거겨 2025. 1. 1.
728x90
반응형
쿠버네티스 정의 파일을 작성하는 방법에 대해 알아보자.
복잡해보일 순 있어도 직접 따라 적성해보거나, 실습을 보면서 친해져보자.

매니페스트 파일이란

  • 쿠버네티스는 매니페스트 파일(정의 파일)에 기재된 내용에 따라 파드를 생성한다.
  • 매니페스트 파일의 내용을 쿠버네티스에 업로드  → 데이터베이스(etcd)에 '바람직한 상태'로 등록됨
    → 서버 환경을 이 바람직한 상태로 유지

매니페스트 파일의 작성방법

1. YAML 형식으로 매니페스트 파일 작성

  • 파드나 서비스에 대한 설정을 쿠버네티스에서는 매니페스트(manifest)라고 한다.
  • 이를 적은 파일을 매니페스트 파일(정의 파일)이라고 하고, YAML 또는 JSON 형식으로 기재한다.
  • JSON 형식은 컴퓨터로 처리하는 것이 목적이고, 사람이 설정 파일을 읽고 쓴다면 YAML파일을 주로 사용한다.
  • 도커 컴포즈와 달리 쿠버네티스에서는 매니페스트 파일의 이름이 지정되어 있지 않다.

2. 매니페스트 파일은 리소스 단위로 작성

  • 리소스: 파드나 서비스, 디플로이먼트, 레플리카세트 등을 가리킴
  • 파드를 사용하긴 할 텐데, '파드' 항목을 작성하지 않고 파드만을 만들 때 사용하는 항목이다.
  • '파드' 항목에는 쿠버네티스의 최대 특징인 '자동으로 설정된 개수를 유지하는 기능'이 없다.
  • 개수를 유지하는 기능은 '디플로이먼트'에서 담당하므로, '파드'가 아닌 '디플로이먼트'에서 만들어야 한다.
  • '레플리카세트' 역시 디플로이먼트에 의해 개수가 관리되므로 항목으로 작성하지 않는다.
  • 요약하자면, '디플로이먼트' 항목에 레플리카세트와 파드가 포함돼 있는 것이다.
  • 예를 들면, 아파치 파드를 만들려면 '아파치 디플로이먼트'와 '아파치 서비스' 이렇개 두 개의 리소스를 작성하면 된다.

3. 매니페스트 파일은 여러 파일로 분할할 수 있다.

  • 매니페스트 파일은 리소스 단위로 분할해 작성해도 되고, 한 파일에 합쳐 작성해도 된다.
  • 한 파일로 작성할 때는 각 리소스를 '---'로 구분한다.
  • 리소스 단위로 파일을 나눌 때는 각 리소스를 구별할 수 있도록 이름을 붙인다.

매니페스트 파일에 작성할 내용
  • 컴포즈 파일과 마찬가지로 주 항목이 있으며, 네 가지다.
  • 'apiVersion:'과 'kind:'는 리소스를 정의하며, 'metadata:'는 메타데이터 작성,
    'spec:'은 리소스의 내용을 작성하는 데 사용한다.
  • 매니페스트 파일의 예(주 항목만)
apiVersion:		← API 그룹 및 버전
kind			← 리소스 유형
metadata:		← 메타데이터
spec:			← 리소스 내용

리소스 설정(API 그룹 및 유형)

  • 리소스를 정의하려면 API 그룹과 리소스 유형을 지정해야 한다.
  • 자주 사용되는 리소스의 API 그룹 및 리소스 유형
리소스 API 그룹 / 버전 리소스 유형
파드 core/v1(v1으로 축약 가능) Pod
서비스 core/v1(v1으로 축약 가능) Service
디플로이먼드 apps/v1 Deployment
레플리카세트 apps/v1 ReplicaSet

메타데이터와 스펙

  • 메니페스트 파일에는 메타데이터(metadata)와 스펙(spec)을 기재한다.
  • 메타데이터에는 리소스의 이름이나 레이블을 기재한다.
  • 주요 메타데이터
항목 내용
name 리소스의 이름. 문자열로 된 유일 식별자.
namespace 리소스를 세분화한 DNS 호환 레이블
uid 유일 식별자
resourceVersion 리소스 버전
generation 생성 순서를 나타내는 번호
creationTimestamp 생성 일시
deletionTimestamp 삭제 일시
labels 임의의 레이블
anotation 리소스에 설정할 값. 선택 대상은 되지 못한다.

 

레이블과 셀렉터

  • 파드나 서비스 같은 리소스에 원하는 레이블을 붙일 수 있다.
  • 레이블은 키-값 쌍의 형태로 메타데이터로 설정한다.
  • 레이블을 부여하면 셀렉터 기능을 사용해 특정 레이블이 부여된 파드만을 배포하는 등
    특정 파드를 선택해 결정할 수 있다.

 

메타데이터와 스펙 작성 - 파드
  • 매니페스트 파일의 API 그룹(apiVersion)이나 리소스 유형(kind)은 작성할 내용이 정형화 돼 있지만,
    메타데이터(metadata)나 스펙(spec)은 리소스의 유형이나 설정 내용에 따라 작성 내용이 달라진다.
  • 지금 설명하는 내용
apiVersion:
kind:
metadata:	← 여기
spec:		← 여기
  • 위에서 얘기했듯이, 파드는 단독으로 매니페스트 파일이 기재되는 경우가 드물며,
    대부분 디플로이먼트에 포함되는 형태로 기재된다.
  • 그러므로 디플로이먼트의 매니페스트 파일은 여러 계층으로 복잡해서 한 번에 작성하려고 하면 혼란스럽다.
metadata:
	name:			←(중항목) 파드의 이름
    labels:			←(중항목) 레이블
spec:
	containers:		←(중항목) 컨테이너 구성
		- name:		←(소항목) 컨테이너 이름
		  	image:	←(소항목) 이미지 이름
		  	ports:	←(소항목) 포트 설정
  • 여기서 주의할 점은 containers 항목에서 지정한 이름은 컨테이너의 이름이다.
  • 그 위에 있는, metadata 아래의 name은 파드의 이름이다. 파드는 컨테이너 + 볼륨이다.

파드의 작성 항목

파드 속의 볼륨

  • 파드 속에 있는 볼륨은, 파드에 포함된 컨테이너끼리 데이터를 공유하기 위한 것이다.
  • 예를 들어, 주 프로그램이 있고, 이 프로그램이 어떤 로그를 출력한다고 하자. 그리고 이 로그를 모니터링하면서 문제가 발생하면 알려주는 프로그램이 있다고 하자.
  • 이 상황에서 '주 프로그램이 들어있는 컨테이너'와 '로그 모니터링 프로그램이 들어있는 컨테이너'를 하나의 파드로 구성하고, 로그를 출력할 볼륨을 만들어 이 볼륨을 공유하게 하면 두 컨테이너가 로그 정보를 공유할 수 있다.
  • 파드 속의 볼륨은 파드 밖에서는 접근할 수 없으므로 위의 예에서 보듯 컨테이너 간의 데이터 공유를 위해 주로 사용됨

 

파드의 매니페스트 파일을 작성해보자

실습 내용

생성할 파드와 컨테이너 정보

항목
API 그룹/버전 v1(그룹 생략)
리소스 유형 Pod
파드 이름 apa00pod
레이블 app: apa00kube
컨테이너 이름 apa00ex91
이미지 이름 httpd
포트 설정 containerPort: 80

생성할 매니페스트 파일의 이름 및 파일 배치 경로

항목
파일 이름 apa00pod.yml
파일 경로(Windows) C:\Users\사용자명\Docouments\kube_folder

1. apa00pod.yml 파일 생성

  • 메모장 등의 텍스트 에디터로 매니페스트 파일을 작성한다. 경로는 kube_folder로 한다.

2. 주 항목 기재

  • apa00pod.yml 파일에 필요한 주 항목(apiVersion, kind, metadata, spec)을 기재한다.

3. apiVersion, kind 항목의 설정값 기재

  • apiVersion의 설정값은 'v1', kind의 설정값은 'Pod'를 기재한다.

4. metadata 설정값 기재

  • metadata 항목 아래로 파드의 이름(name)을 설정한다. 파드의 이름은 apa00pod다.
  • 레이블은 'app: apa00kube'로 한다.

5. spec 설정값 기재

  • spec 항목 아래로 생성할 컨테이너의 정보(name, image, image, ports)를 설정한다.
  • 컨테이너의 이름은 'apa00ex91', 이미지는 'httpd', 포트 설정은 'containerPort:80'으로 설정한다.
apiVersion: v1
kind: Pod
metadata:
  name: apa00pod
  labels:
    app: apa00kube
spec:
  containers:
    - name: apa00ex91
      image: httpd
      ports:
      - containerPort: 80

6. 파일 저장

  • 공백의 개수나 위치, 콜론의 유무에 주의해서 파일을 저장한다.

 

메타데이터와 스펙 작성 - 디플로이먼트
  • 디플로이먼트의 스펙은 템플릿의 형태로 파드의 설정을 기재한다
apiVersion:
kind:
metadata:
  name:			← (중항목) 디플로이먼트 이름
spec:
  selector:		← (중항목) 셀렉터 설정
    matchLabels:	← (소항목) 셀렉터가 선택할 관리 대상 레이블
  replicas:		← (중항목) 페플리카 설정
  template:		← (중항목) 템블릿 (파드의 정보)
    metadata:		← (소항목) 파드의 메타데이터를 기재
    spec:		← (소항목) 파드의 스펙을 기재

셀렉터(selector)의 설정

  • 디플로이먼트가 특정한, 레이블이 부여된, 파드를 관리할 수 있도록 하는 설정이다.
  • 'matchLabels:' 뒤로 레이블을 기재한다. 이 레이블은 template 아래의 metadata에 기재된 것이다.

레플리카(Replica)의 설정

  • 파드의 레플리카에 대한 관리로, 파드 수를 '몇 개로 유지'할 것인지를 설정한다.
  • 이 값을 0으로 설정하면 파드가 사라진다.

템플릿(template) 작성

  • 생성할 파드의 정보를 여기에 기재한다. 내용은 파드에 기재된 내용(메타데이터 및 스펙)과 거의 같다.
  • 다만 파드에서 지정했던 '파드 이름'은 설정하지 않는다.
  • 설정해도 문제 없지만, 파드의 수가 늘어나면  레이블로 관리하는 경우가 많기 때문에 그리 필요없다.

디플로이먼트의 기재 항목

 

디플로이먼트의 매니페스트 파일을 직접 작성해보자

실습 내용

생성할 디플로이먼트와 컨테이너 정보/매니페스트 파일의 이름

항목
API 그룹 / 버전 apps/v1
리소스 유형 Deployment
파드 이름 apa00dep
셀렉터로 대상을 지정할 레이블 app: apa00kube
레플리카(파드) 수 3
컨테이너 이름 apa00ex91
이미지 이름 httpd
컨테이너 포트 설정 containerPort: 80
매니페스트 파일 이름 apa00dep.yml

1. apa00dep.yml 파일 생성

  • 메모장 등의 텍스트 에디터로 매니페스트 파일을 작성하고, 파일 이름은 apa00dep.yml로 한다. 폴더는 kube_folder

2. 주 항목 기재

  • 필요한 주 항목(apiVersion, kind, metadata, spec)을 기재한다.

3. apiVersion, kind 항목의 설정값 기재

  • apiVersion의 설정값은 'apps/v1', kind의 설정값은 'Deployment'를 기재한다.

4. metadata 설정값 기재

  • metadata 항목 아래로 디플로이먼트의 이름(name)을 apa00dep로 설정한다.

5. spec 항목에 셀렉터와 레플리카 수 설정

6. spec 아래의 template 항목에 파드 매니페스트 파일 내용을 옮기기

apiVersion: /v1
kind: Deployment
metadata:
  name: apa00dep
spec:
  selector:
    matchLabels:
      app: apa00kube
  replicas: 3
  template:
    metadata:
      labels:
        app: apa00kube
    spec:
      containers:
      - name: apa00ex91
        image: httpd
        ports:
        - containerPort: 80

7. 파일 저장

  • 공백의 개수나 위치, 콜론의 유무에 주의해서 파일을 저장하자.

 

메타데이터와 스펙 작성 - 서비스
  • 디플로이먼트와 서비스는 거의 세트라고 생각해도 좋다.
  • 서비스의 역할은 파드로 들어오는 요청을 관리하는 것이므로, 설정 내용도 통신과 관련된 것이다.
apiVersion:
kind:
metadata:
  name:			← (중항목) 서비스의 이름
spec:
    type:		← (중항목) 서비스의 유형
    ports:		← (중항목) 포트 설정
    - port:		← (중항목) 서비스의 포트
      targetPort:	← (소항목) 컨테이너의 포트
      protocol:		← (소항목) 통신에 사용되는 프로토콜
      nodePort:		← (소항목)  워커 노드의 포트
    selector:		← (중항목) 셀렉터 설정

유형(type) 설정

  • 외부로부터 서비스에 어떤 유형의 IP 주소(또는 DNS)로 접근할지를 설정한다.
유형 이름 내용
ClusterIP 클러스터IP를 통해 서비스에 접근하도록 함(외부에서는 접근 불가)
NodePort 워커 노드의 IP를 통해 서비스에 접근하도록 함
LoadBalancer 로드밸런서의 IP를 통해 서비스에 접근하도록 함(대부분의 실무에서 사용)
ExternalName 파드에서 서비스를 통해 외부로 나가기 위한 설정

포트 설정

  • port는 서비스, nodePort는 워커 노드, targetPort는 컨테이너의 포트를 각각 설정한다.
  • nodePort에는 30000과 32767 사이의 값을 설정할 수 있다.
  • protocol은 통신 프로토콜을 말하고 일반적으로 TCP를 사용한다.

셀렉터(selector) 설정

  • 세레렉터는, 서비스가 특정 레이블이 부여된 파드를 선택적으로 관리하기 위한 설정이다.
  • 레이블은 파드나 디플로이먼트에서 컨테이너 부분의 설정에 지정된 레이블을 사용한다.
  • 다만 디플로이먼트에서는 'matchLabels:'가 필수 항목이지만, 서비스에서는 'matchLabels:'를 사용해서는 안된다.
서비스의 매니페스트 파일을 직접 작성해보자

실습내용

생성할 서비스와 컨테이너 정보/매니페스트 파일의 이름

항목
API 그룹/버전 v1
리소스 유형 Service
서비스 이름 apa00ser
셀렉터로 대상을 지정할 레이블 app: apa00kube
서비스 유형 NodePort
서비스 포트 8099
컨테이너 포트 80
노트 포트 30080
프로토콜 TCP
매니페스트 파일 이름 apa00ser.yml

1. apa00ser.yml 파일 생성

  • 메모장 등의 텍스트 에디터로 매니페스트 파일을 작성하고, 파일 이름은 apa00ser.yml로 한다. 폴더는 kube_folder

2. 주 항목 기재

  • 필요한 주 항목(apiVersion, kind, metadata, spec)을 기재한다.

3. apiVersion, kind 항목의 설정값 기재

  • apiVersion의 설정값은 'v1', kind의 설정값은 'Service'를 기재한다.

4. metadata 설정값 기재

  • metadata 항목 아래로 서비스의 이름(name)을 설정하고, 서비스의 이름은 apa00ser이다.

5. spec 설정값 기재

  • spec 항목 아래에 type, ports, selector의 설정값을 기재한다.
  • type은 'NodePort', ports는 '8099', targetPort는 80, protocol은 'TCP', nodePort는 '30080'으로 설정한다.
  • selector에는 'app: apa00kube'(파드에 지정한 레이블)을 지정한다.
apiVersion: v1
kind: Service
metadata:
  name: apa00ser
spec:
  type: NodePort
  ports:
  - port: 8099
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: apa00kube

6. 파일 저장

  • 공백의 개수나 위치, 콜론의 유무에 주의해서 저장하자.
728x90