쿠버네티스 yaml

Vorhandenheit ·2022년 7월 11일
1

Kubernetes

목록 보기
2/3

쿠버네티스 yaml 작성

쿠버네티스를 docker를 통해 설치했습니다. 하지만 Pod를 생성하는데 yaml 파일이 필요합니다.
docker 다룰 때 yaml파일이 필요했었는데 쿠버네티스 역시 필요하네요! 그래서 쿠버네티스에서는 yaml 어떻게 다루어야하는지 한번 알아보았습니다.

Kubernetes 기본개념

  • namespace : cluster 내부를 논리적인 단위로 구분
  • pod : k8s 컨테이너가 실행되는 최소단위
  • controller : pod를 관리하는 역할
  • servicee : pod에 고정된 주소로 접근할 수 있게하는 역할
  • ingress : kubernetes 클러스터 외부에서 클러스터 내부 pod로 서비스 접근할 때 사용

1. yaml 파일 작성

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: python-sample-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: python-sample-app
  replicas: 1
  template:
    metadata:
      labels:
        app: python-sample-app
    spec:
      containers:
      - name: python-sample
        image: dockerimage주소:태그
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        ports:
        - containerPort: 8000

(1) apiVersion

이 오브젝트를 생성하기 위해서 사용할 쿠버네티스 API 버전을 명세합니다.

  • apps/v1
    쿠버네티스의 common API 모음입니다.
    Deployment, RollingUpdate, ReplicaSet을 포함합니다.

  • autoscaling/v1
    pod의 autoscale 기능을 포함하는 API, 현재는 CPU metric을 사용한 scaling만 가능합니다

(2) kind

어떤 종류의 오브젝트를 생성하고자 하는지, 생성할 k8s obejct 타입

  • Deployment
    코드 배포를 세밀하게 제어할 수 있는 object입니다. pod 복제, 배포 일시중지, 재개 및 롤백이 가능합니다

  • Service
    k8s에 다양한 어플리케이션을 올리고 어플리케이션간 통신이 필요한 경우에 Service를 오픈하여 외부에 오픈하거나 다른 어플레케이션 간 통신에 활용할 수 있습니다.

  • Ingress
    클러스터 내의 서비스에 대한 외부접근을 관리하는 오브젝트이며, 일반적으로 HTTP를 관리합니다.

  • Job
    배치 오브젝트, 주기적으로 스케쥴링된 테스크를 수행할 때 사용됩니다

(3) metadata

오브젝트의 이름을 부여합니다. 오브젝트를 구분지어줄 데이터입니다

  • name : namespace 상에서 유일한 값
  • labels : 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value쌍
  • spec : 생성할 오브젝트의 구체적 내용을 정의하는 spec, spec에 대한 포맷은 k8s object종류마다 다릅니다.

2. 예시

  • Pod API
apiVersion : v1 설정
kind : 오브젝트를 지정
metadata : 오브젝트의 정보를 입력, name은 필수, 
spec : 
	initContainers : 초기화 전용 컨테이너의 명세를 기술
	nodeSelector : Pod가 배포될 노드의 이름을 지정
	volumes : Pod 내 컨테이너 간에 공유할 수 있는 볼륨을 지정
    containers : 컨테이너의 명세를 배열(대쉬'-')로 기술

			image : 컨테이너 생성시 사용할 이미지
			name : 컨테이너 이름
			livenessProbe : 컨테이너 내의 프로그램이 정상적으로 동작 중인지 검사하는 프로브
			readinessProbe : 컨테이너 내의 프로그램이 사용자의 요청을 받을 준비가 되었는지 검사하는 프로브
			ports : 외부 요청을 전달하기 위한 포트 목록
			resources : CPU와 메모리 제한
			volumeMounts : 파드에 정의한 볼륨을 컨테이너의 마운트할 경로
			command : 컨테이너 생성 시 마지막에 실행할 명령어
			args : command의 매개변수
			env : 환경변수 설정

3. Namespace

namespace란 쿠버네티스 오브젝트를 묶는 하나의 가상공간 또는 그룹을 말합니다.

  • Create
kubectl apply -f test-namespace.yaml
or
kubectl create namespace test

명령어를 통해 만들 수 있습니다.

apiVersion: v1
kind: Namespace
metadata:  
	name: test  
spec:  
	limits:  
	- default:
    	cpu: 1
	defaultRequest:
		cpu: 0.5
		type: Container

4. Service

서비스는 지정된 IP로 생성이 가능하고, 여러 Pod를 묶어서 로드밸런싱이 가능하며, 고유한 DNS 이름을 가질 수 있습니다.

apiVersion: v1
kind: Service
metadata:  
	name: hello-node-svc
spec:
	selector: // 여기서 설정한 라벨과 일치하는 파드에 요청을 전송합니다.
		app: hello-node
	type: NodePort // 서비스 공개 방법을 설정
	ports:    // 서비스에 의해 공개되는 포트번호
		- name: http
          port: 80 
		  protocol: TCP      
          targetPort: 8080    
        - name: https      
          port: 443      
	      protocol: TCP
          targetPort: 8082

(1) Type

  • Cluster IP
    디폴트 설정으로, 서비스에 클러스터 IP를 할당합니다.

  • Load Balacner
    클라우드 벤더에서 제공하는 설정 방식으로, 외부 IP를 가지고 있는 로드밸런서를 할당합니다. 외부 IP를 가지고 있기 때문에, 클러스터 외부에서 접근이 가능합니다.

  • NodePort
    클러스터 IP로만 접근이 가능한 게 아니라, 모든 노드의 IP와 포트를 통해서 접근이 가능하게 됩니다.

  • External name
    외부 서비스를 쿠버네티스 내부에서 호출하고자 할 때 사용할 수 있습니다.

(2) ExternalIP

쿠버네티스상의 파드에서 외부의 애플리케이션에 접속하는 하이브리드 구성의 애플리케이션을 개발할 때 유용합니다.

5. Deployment

deployment의 주된 역할은 파드의 개수를 관리하는 것입니다.
처리 능력을 올리고 싶으면 이 파드의 수를 늘리면됩니다. 디플로이먼트는 요청한 개수 만큼 이 파드를 기동하며, 장애 등의 이유로 파드의 개수가 줄어들면 새롭게 파드를 만들어 기동합니다.

apiVersion: apps/v1
kind: Deployment
metadata: //deployment의 이름을 설정
  name: test-deployment
  labels: // label을 설정
    app: test-deployment
spec: // 파드의 개수를 몇개 유지할지 설정
  replicas: 3// 기동할 파드의 개수, 디플로이먼트는 이 개수를 유지하도록 동작합니다.
  selector: // 어떤 레이블의 파드를 선택하여 관리할지에 대한 설정
    matchLabels:
      app: test-deployment // 파드에 해당하는 라벨
  template: // 파드 템플릿
    metadata:
      labels:
        app: test-deployment // 파드의 레벨, 컨트롤러의 matchLabels와 일치해야합니다.
    spec:
      containers:
      - name: test-deployment
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  • spec.selector : 디플로이먼트 제어하의 레플리카셋과 파드를 대응시키기위해 matchLabels의 라벨이 사용됩니다. 이 라벨이 파드 템플릿 레이블과 일치하지않으면 ,kubectl create/apply시에 에러가 발생합니다.
  • metadata : selector와 지정하는 라벨과 일치해야합니다

6. Job

Job Controller에서 Job 이란 배치 처리라고 불리며, 한 묶음의 프로그램을 실행하는 걸 말합니다.

(1) 특징

  1. 지정한 실행 횟수와 병행 개수에 따라 한 개 이상의 파드를 실행
  2. 파드 내에 있는 모든 컨테이너가 정상 종료한 경우에 파드를 정상 종료한 것으로 취급
  3. 잡에 기술한 파드의 실행 횟수를 전부 정상 종료하면, 잡은 종료
  4. 노드 장애등에 의해 파드가 제거된 경우, 다른 노드에서 파드를 재실행합니다.
  5. 잡에 의해 실행된 파드는 잡이 삭제될 떄까지 유지, 잡을 삭제하면 모든 파드가 삭제

(2) CronJob

크론잡은 지정된 시각에 Job을 만듭니다. 생성된 다의 개수가 정해진 수를 넘어가면, 가비지 수집 컨트롤러가 파드를 삭제합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: normal-end
spec: // 잡의 사양
  template: // 구동하는 파드에 대해 기술하는 파드 템플릿
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["sh",  "-c", "sleep 5; exit 0"]
      restartPolicy: Never
  completions: 6 // 총 실행 횟수
  parallelism: 2 // 동시 실행을 하는 파드의 개수

7. Ingress

클러스터 외부에서의 요청을 K8s 클러스터 내부의 애플리케이션에 연결하기 위한 API 오브젝트입니다.

  • 공개 URL과 애플리케이션 매핑
  • 복수의 도메인 이름을 가지는 가상 호스트 기능
  • 클라이언트의 요청을 여러 파드에 분산
  • SSL/TLS 암호화 통신 HTTPS
  • 세션 어피니티
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-ingress // ingress 오브젝트 이름
  annotations:
    kubernetes.io/ingress.class: 'nginx' // 인그레스 컨트롤러 설정
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: // dns명과 백엔드 서비스를 대응시키는 규칙 목록, 규칙에 맞지 않는 요청은 디폴트 백엔드라는 파드에 전송
  - host: abc.sample.com
    http:
      paths:
      - path: /
        backend:
          serviceName: helloworld-svc
          servicePort: 8080
      - path: /apl2
        backend: // 대응하는 서비스명과 포트번호
          serviceName: nginx-svc
          servicePort: 9080
  - host: xyz.sample.com
    http:
      paths:
      - path: /
        backend:
          serviceName: java-svc
          servicePort: 9080

출처

https://blog.voidmainvoid.net/138
https://junghyeonsu.tistory.com/29

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글

관련 채용 정보