쿠버네티스를 docker를 통해 설치했습니다. 하지만 Pod를 생성하는데 yaml 파일이 필요합니다.
docker 다룰 때 yaml파일이 필요했었는데 쿠버네티스 역시 필요하네요! 그래서 쿠버네티스에서는 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
이 오브젝트를 생성하기 위해서 사용할 쿠버네티스 API 버전을 명세합니다.
apps/v1
쿠버네티스의 common API 모음입니다.
Deployment, RollingUpdate, ReplicaSet을 포함합니다.
autoscaling/v1
pod의 autoscale 기능을 포함하는 API, 현재는 CPU metric을 사용한 scaling만 가능합니다
어떤 종류의 오브젝트를 생성하고자 하는지, 생성할 k8s obejct 타입
Deployment
코드 배포를 세밀하게 제어할 수 있는 object입니다. pod 복제, 배포 일시중지, 재개 및 롤백이 가능합니다
Service
k8s에 다양한 어플리케이션을 올리고 어플리케이션간 통신이 필요한 경우에 Service를 오픈하여 외부에 오픈하거나 다른 어플레케이션 간 통신에 활용할 수 있습니다.
Ingress
클러스터 내의 서비스에 대한 외부접근을 관리하는 오브젝트이며, 일반적으로 HTTP를 관리합니다.
Job
배치 오브젝트, 주기적으로 스케쥴링된 테스크를 수행할 때 사용됩니다
오브젝트의 이름을 부여합니다. 오브젝트를 구분지어줄 데이터입니다
apiVersion : v1 설정
kind : 오브젝트를 지정
metadata : 오브젝트의 정보를 입력, name은 필수,
spec :
initContainers : 초기화 전용 컨테이너의 명세를 기술
nodeSelector : Pod가 배포될 노드의 이름을 지정
volumes : Pod 내 컨테이너 간에 공유할 수 있는 볼륨을 지정
containers : 컨테이너의 명세를 배열(대쉬'-')로 기술
image : 컨테이너 생성시 사용할 이미지
name : 컨테이너 이름
livenessProbe : 컨테이너 내의 프로그램이 정상적으로 동작 중인지 검사하는 프로브
readinessProbe : 컨테이너 내의 프로그램이 사용자의 요청을 받을 준비가 되었는지 검사하는 프로브
ports : 외부 요청을 전달하기 위한 포트 목록
resources : CPU와 메모리 제한
volumeMounts : 파드에 정의한 볼륨을 컨테이너의 마운트할 경로
command : 컨테이너 생성 시 마지막에 실행할 명령어
args : command의 매개변수
env : 환경변수 설정
namespace란 쿠버네티스 오브젝트를 묶는 하나의 가상공간 또는 그룹을 말합니다.
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
서비스는 지정된 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
Cluster IP
디폴트 설정으로, 서비스에 클러스터 IP를 할당합니다.
Load Balacner
클라우드 벤더에서 제공하는 설정 방식으로, 외부 IP를 가지고 있는 로드밸런서를 할당합니다. 외부 IP를 가지고 있기 때문에, 클러스터 외부에서 접근이 가능합니다.
NodePort
클러스터 IP로만 접근이 가능한 게 아니라, 모든 노드의 IP와 포트를 통해서 접근이 가능하게 됩니다.
External name
외부 서비스를 쿠버네티스 내부에서 호출하고자 할 때 사용할 수 있습니다.
쿠버네티스상의 파드에서 외부의 애플리케이션에 접속하는 하이브리드 구성의 애플리케이션을 개발할 때 유용합니다.
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
Job Controller에서 Job 이란 배치 처리라고 불리며, 한 묶음의 프로그램을 실행하는 걸 말합니다.
크론잡은 지정된 시각에 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 // 동시 실행을 하는 파드의 개수
클러스터 외부에서의 요청을 K8s 클러스터 내부의 애플리케이션에 연결하기 위한 API 오브젝트입니다.
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