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
'docker & kubernetes' 카테고리의 다른 글
쿠버네티스 사용하기 5 | Docker&Kubernetes 학습 37 (0) | 2025.01.01 |
---|---|
쿠버네티스 사용하기 4 | Docker&Kubernetes 학습 36 (0) | 2025.01.01 |
쿠버네티스 사용하기 2 | Docker&Kubernetes 학습 34 (2) | 2024.12.23 |
쿠버네티스 사용하기 1 | Docker&Kubernetes 학습 33 (0) | 2024.12.18 |
컨테이너 사용법 9 | Docker&Kubernetes 학습 32 (0) | 2024.12.14 |