리꾸므

[Kubenetes] manifest 본문

발걸음/일지

[Kubenetes] manifest

리꾸므 2023. 5. 9. 18:03

manifest 파일이란?

쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML이나 JSON으로 기술한 파일,

manifest 파일에 기재된 내용에 따라 파드를 생성한다. 파일의 내용을 쿠버네티스에 업로드하면 그 내용이 데이터 베이스(etcd)에 '바람직한 상태'로 등록됩니다.

 

특징

  • docker-compose와 달리 매니페스트 파일이름이 지정되어 있지 않습니다.
  • 리소스 단위로 작성합니다.(서비스, 디플로이먼트 등)
  • 한 파일로 작성시 각 리소스를 '---'로 구분합니다.
  • 디플로이먼트 항목에 레플리카세트와 파드가 포함되어 있습니다.
  • 매니페스트 파일은 여러 파일로 분할할 수 있습니다.

 

*오브젝트 : 파드, 서비스, 디플로이먼트

 

 

manifest 작성 내용

항목명 설명
apiVersion API 그룹 및 버전
kind 리소스 유형
metadata 메타데이터, 오브젝트 구분
spec 리소스 내용, 오브젝트가 어떤 상태를 의도하는지

 

리소스 API 그룹 / 버전 리소스 유형
파드 core/v1(v1로 축약 가능) Pod
서비스 core/v1(v1로 축약 가능) Service
디플로이먼트 apps/v1 Deployment
레플리카세트 apps/v1 ReplicaSet

 

Pod

apiVersion:
kind:
metadata:
  name:			// 파드의 이름
  labels:		// 레이블
spec:
  containers:	// 컨테이너 구성
    - name: 	// 컨테이너 이름
      image: 	// 이미지 이름
      ports:	// 포트 설정
  • 파드는 중항목이 3개입니다. 메타데이터 아래 'name', 'labels', 스펙 항목아래에 'containers' 항목입니다.
  • spec아래에 컨테이너 구성을 기재합니다.
  • metadata 항목 name은 파드의 이름이고 spec 밑 containers 항목 name은 컨테이너 이름입니다.
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    app: nginx
spec:
  containers:
    - name: nginx01
      image: nginx
       ports:
         - containerPort: 80

 

 

Deployment

apiVersion:
kind:
metadata:
  name:		        // 디플로이먼트 이름
spec:
  selector:			// 셀렉터 설정
    matchLabels:	// 셀렉터가 선택할 관리 대상 레이블
  replicas: 		// 레플리카 설정
  template: 		// 템플릿-파드의 정보
    metadata:		// 파드의 메타데이터를 기재
    spec:			// 파드의 스펙을 기재
  • 디플로이먼트는 중항목은 메타데이터 아래 'name', 'seletor', 'replicas', 'template' 총 4개이다.
  • selector : 디플로이먼트가 특정한 레이블이 부여된 파드를 관리할 수 있도록 하는 설정입니다.
    • 'matchLabels' 항목에 레이블을 기재합니다. 이 레이블은 template 아래의 metadata에 기재된 것입니다.
  • replica : 파드의 레플리카에 대한 관리입니다. 파드 수를 '몇 개로 유지'할 것인지를 설정합니다. 이 값이 0일경우 파드는 사라집니다.
  • template : 생성할 파드의 정보를 기재합니다. 기재 내용은 파드에 기재된 내용(메타데이터 및 스펙)과 거의 같습니다.
    • 파드의 수가 늘어나면 레이블로 관리하기때문에 파드 이름을 잘 설정안합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx01
        image: nginx
        ports:
        - containerPort: 80

 

 

 

Service

apiVersion: 
kind: 
metadata:
  name:				// 서비스의 이름
spec:				
  type: 			// 서비스의 유형
  ports:			// 포트 설정
  - port:			// 서비스의 포트
    targetPort: 	// 컨테이너의 포트
    protocol: 		// 통신에 사용되는 프로토콜
    nodePort: 		// 워커 노드의 포트
  selector:			// 셀렉터 설정
  • 서비스의 중항목은 메타데이터 아래 'name', 스펙 아래 'type', 'ports', seletor'
  • type : 서비스의 종류를 말합니다. 외부로부터 서비스에 어떤 유형의 IP 주소로 접근할지를 설정합니다.
    • ClusterIP : 클러스터IP를 통해 서비스에 접근하도록 합니다.(외부접근불가)
    • NodePort : 워커 노드의 IP를 통해 서비스에 접근하도록 합니다. 30000~32767 사이의 값으로만 설정할 수 있습니다.
    • LoadBalancer : 로드밸런서의 IP를 통해 서비스에 접근하도록 합니다.
    • ExternalName : 파드에서 서비스를 통해 외부로 나가기 위한 설정입니다.
  • port는 서비스, nodeport는 워커 노드, targetPort는 컨테이너 포트를 각각 설정합니다.
  • selector : 특정 레이블이 부여된 파드를 특정하여 관리하기 위한 설정입니다. 다만 서비스에서는 'matchLabels'를 사용해서는 안됩니다.
    • 내부동작이 다르기 때문입니다. 디플로이먼트는 셀렉터를 지정하면 레이블 셀렉터를 사용하여 '이 조건에 부합할 때'와 같은 설정이 가능하지만 서비스는 리소스를 직접 지정하기 때문에 해당 레이블을 그대로 기재해야합니다.
apiVersion: v1
kind: Service
metadata:
  name: service01
spec:
  type: NodePort
  ports:
  - port: 8090
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: nginx