YAML 파일 작성 법 및 세부 내용 설명
yaml
앞에서 설명드린 "간단한 웹서버 구축"에서 간단한 yaml 파일을 작성하였는데 이 번장에서는 각각의 상세 내용을 설명 드리겠습니다.
Yaml 파일 기본 구조
apiVersion :
kind :
metadata :
spec :
Pod API
apiVersion : v1 설정(apps/v1, autoscaling/v1..)
kind : 오브젝트를 지정(Deployment, Pod, Service, Ingress, Job..)
metadata : 오브젝트의 정보를 입력,
name: 필수 값(namespace 상에서 유일한 값)
namespace: default,
labels: 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value쌍
spec :
initContainers : 초기화 전용 컨테이너의 명세를 기술
nodeSelector : Pod가 배포될 노드의 이름을 지정
volumes : Pod 내 컨테이너 간에 공유할 수 있는 볼륨을 지정
containers : 컨테이너의 명세를 배열(대쉬'-')로 기술
image : 컨테이너 생성시 사용할 이미지
name : 컨테이너 이름
livenessProbe : 컨테이너 내의 프로그램이 정상적으로 동작 중인지 검사하는 프로브
readinessProbe : 컨테이너 내의 프로그램이 사용자의 요청을 받을 준비가 되었는지 검사하는 프로브
ports : 외부 요청을 전달하기 위한 포트 목록
resources : CPU와 메모리 제한
volumeMounts : 파드에 정의한 볼륨을 컨테이너의 마운트할 경로
command : 컨테이너 생성 시 마지막에 실행할 명령어
args : command의 매개변수
env : 환경변수 설정
apiVersion
이 오브젝트를 생성하기 위해서 사용할 쿠버네티스 API 버전을 명세합니다.
- apps/v1
쿠버네티스의 common API 모음입니다.
Deployment, RollingUpdate, ReplicaSet을 포함합니다.
- autoscaling/v1
pod의 autoscale 기능을 포함하는 API, 현재는 CPU metric을 사용한 scaling만 가능합니다
kind
어떤 종류의 오브젝트를 생성하고자 하는지, 생성할 k8s obejct 타입
리소스 타입 | 주요 용도 | 특징 | 상세보기 |
---|---|---|---|
Pod | 컨테이너 실행 단위 | 가장 기본 단위, 관리 기능 없음 | [Pod] |
Deployment | 무상태 앱 자동화 관리 | 롤링 업데이트, 복구, 스케일링 지원 | [Deployment] |
Service | 고정된 가상 IP생성 | Pod 앞단에 고정된 가상 IP를 만들어 일관된 접근 방식을 제공 | [Service] |
StatefulSet | 상태 저장 앱 관리 | 고유 ID, 저장소 보장, 순차적 배포 | [StatefulSet] |
ReplicaSet | Pod 개수 유지 | 직접 잘 안 씀, Deployment 내부 사용 | [ReplicaSet] |
DaemonSet | 노드마다 하나씩 배포 | 로그 수집, 모니터링 등 데몬용 | [DaemonSet] |
Job | 일회성 작업 | 성공/실패 상태 추적, 자동 종료 | [Job] |
CronJob | 주기적 작업 | Job + 스케줄 기능 | [CronJob] |
- Service
ExternalIP
쿠버네티스상의 파드에서 외부의 애플리케이션에 접속하는 하이브리드 구성의 애플리케이션을 개발할 때 유용합니다.
- 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
- Job
Job Controller에서 Job 이란 배치 처리라고 불리며, 한 묶음의 프로그램을 실행하는 걸 말합니다.
특징
- 지정한 실행 횟수와 병행 개수에 따라 한 개 이상의 파드를 실행
- 파드 내에 있는 모든 컨테이너가 정상 종료한 경우에 파드를 정상 종료한 것으로 취급
- 잡에 기술한 파드의 실행 횟수를 전부 정상 종료하면, 잡은 종료
- 노드 장애등에 의해 파드가 제거된 경우, 다른 노드에서 파드를 재실행합니다.
- 잡에 의해 실행된 파드는 잡이 삭제될 떄까지 유지, 잡을 삭제하면 모든 파드가 삭제
CronJob
크론잡은 지정된 시각에 Job을 만듭니다. 생성된 다의 개수가 정해진 수를 넘어가면, 가비지 수집 컨트롤러가 파드를 삭제합니다.
apiVersion: batch/v1
kind: Job
metadata:
name: normal-end
spec: // kind(여기서는 Job)의 세부 사양
template: // 구동하는 파드에 대해 기술하는 파드 템플릿
spec:
containers:
- name: busybox
image: busybox:latest
command: ["/bin/sh", "-c", "sleep 5; exit 0"]
restartPolicy: Never
completions: 6 // 총 실행 횟수
parallelism: 2 // 동시 실행을 하는 파드의 개수
- ConfigMap
metadata
오브젝트의 이름을 부여합니다. 오브젝트를 구분지어줄 데이터입니다
- name : namespace 상에서 유일한 값
- namespace : (defulat: default)
- labels : 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value쌍
spec
생성할 오브젝트의 구체적 내용을 정의하는 spec, spec에 대한 포맷은 k8s object종류마다 다릅니다.
replicas
selector
template
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 # ? docker hub에 없을 경우 local 에서 참조
resources:
requests:
cpu: 500m
memory: 200Mi
ports:
- containerPort: 8000
Namespace
namespace란 쿠버네티스 오브젝트를 묶는 하나의 가상공간 또는 그룹을 말합니다.
Create
kubectl apply -f test-namespace.yaml
kubectl create namespace test
apiVersion: v1
kind: Namespace
metadata:
name: test
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container