[docker] 쿠버네티스 정의 파일 By starseat 2023-01-30 20:45:40 server/oss Post Tags [그림과 실습으로 배우는 도커 & 쿠버네티스](https://wikibook.co.kr/dkkb/) 책에서 설명하는 쿠버네티스에 대한 내용을 정리한 내용이다. # 정의 파일 (매니페스트 파일) - 쿠버네티스는 매니페스트 파일(정의 파일)에 기재된 내용에 따라 파드를 생성함. - 즉, 파드나 서비스에 대한 설정을 매니페스트(manifest)라고 함. - `YAML` 또는 `JSON` 형식으로 기재함. - 매니페스트 파일의 내용을 쿠버네티스에 업로드하면 그 내용이 데이터베이스(etcd)에 '바람직한 상태'로 등록되며, - 서버환경을 이 바람직한 상태로 유지함. ## 리소스 단위로 작성 - 매니페스트 파일은 리소스 단위로 작성 - 리소스는 파드, 서비스, 디플로이먼트, 레플리카세트 등 임. - 디플로이먼트 항목을 작성하면 레플리카세트와 파드도 함꼐 설정 함. - 디플로이먼트 > 레플리카세트 > 파드 ## 여러 파일로 분할 - 매니페스트 파일은 리소스 단위로 분할하여 한 파일에 합쳐 작성할 수 있음. - 한 파일로 작성할 떄는 각 리소스를 `---`로 구분. - 각 리소스를 구별할 수 있도록 이름을 붙이는 것을 권고. ## 매니페스트 파일의 주요 설정 ### 주 항목 ```text apiVersion: # API 그룹 및 버전 kind: # 리소스 유형 metadata: # 메타데이터 spec: # 리소스 내용 ``` ### API 그룹 및 버전 (apiVersion) - `kubectl api-resources` 명령을 사용하여 확인 - 공식 사이트에서 업데이트사항 확인 필요! - 자주 사용되는 리소스의 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 | 리소스에 설정할 값선택 대상은 되지 못함 | ### 레이블(label) - 파드나 서비스 같은 리소스에 원하는 `레이블(label)` 지정 가능 - 레이블은 `Key-Value` 형태로 메타데이터로 설정 - 레이블을 부여하면 `셀렉터` 기능을 사용해 특정 레이블이 부여된 파드만을 배포하는 등 **특정 파드를 선택해 설정 가능** ### 셀렉터(selector) - 서비스가 특정 레이블이 부여디ㅗㄴ 파드를 선택적으로 관리하기 위한 설정 - 이블은 파드나 디플로이먼트에서 컨테이너 부분의 설정에 지정된 레이블을 사용 - 디플로이먼트에서는 `matchLabels:` **필수** - 서비스에서는 `matchLabels:` 를 사용해서는 안됨. - 셀렉터는 디플로이먼트와 서비스에서 동작 방식이 다름 - 디플로이먼트는 '레이블 셀렉터'를 사용하여 '이 조건에 부합할 때'와 같은 설정 - 서비스는 리소스를 직접 지정하기 때문에 해당 레이블을 그대로 기재해야 함 ### 유형(type) - 서비스의 종류 - 외부로부터 서비스에 `어떤 유형의 IP 주소(또는 DNS)로 접근할지`를 설정 | 유형 | 내용 | | -- | -- | | ClusterIP | 클러스터 IP 를 통해 서비스에 접근하도록 함 (외부에서는 접근 불가) | | NodePort | 워커 노드의 IP 를 통해 서비스에 접근하도록 함 | | LoadBalancer | 로드밸런서의 IP를 통해 서비스에 접근하도록 함 | | ExternalName | 파드에서 서비스를 통해 외부로 나가기 위한 설정 | ### 포트 설정 - 일반적으로 `TCP` 사용 | 항목 | 내용 | | -- | -- | | port | 서비스의 포트 | | nodePort | 워커 노드의 포트30000~32767 사이의 값 지정유형(type)을 NodePort 로 사용하였을 경우 많이 사용함 | | targetPort | 컨테이너 포트 | # 매니페스트 파일 작성 실습 ## POD - apa000pod.yml ```yaml apiVersion: v1 # API 그룹/버전 kind: Pod # 리소스 유형 metadata: name:P apa000pod # 파드 이름 labels: app: apa000kube # 레이블 spec: containers: - name: apa000ex01 # 컨테이너 이름 image: httpd # 이미지 이름 pots: - containerPort: 80 # 포트 설정 ``` ## Deployment - apa000dep.yml ```yaml apiVersion: apps/v1 # API 그룹 / 버전 kind: Deployment # 리소스 유형 metadata: name: apa000dep # 파드 이름 spec: selector: matchLabels: app: apa000kube # 셀렉터로 대상을 지정할 레이블 replicas: 3 # 레플리카(파드) 수 template: metadata: labels: app: apa000kube spec: containers: - name: apa000ex91 image: httpd # 컨테이너 이름 ports: - containerPort: 80 # 컨테이너 포트 ``` ## Service - apa000ser.yml ```yaml apiVersion: v1 # API 그룹/버전 kind: Service # 리소스 유형 metadata: name: apa000ser # 서비스 이름 spec: type: NodePort # 서비스 유형 ports: - port: 8099 # 서비스 포트 targetPort: 80 # 컨테이너 포트 protocol: TCP # 프로토콜 nodePort: 30080 # 노드 포트 selector: app: apa000kube # 셀렉터로 대상을 지정할 레이블 ``` # 출처 * [그림과 실습으로 배우는 도커 & 쿠버네티스](https://wikibook.co.kr/dkkb/) * [실습 (github)](https://github.com/wikibook/dkkb/tree/main/sample_files/chapter08) Previous Post [docker] 쿠버네티스 간단 정리 Next Post [docker] 쿠버네티스 명령어