Q1. Pod를 생성하여 단일 애플리케이션을 배포하시오.
목표
쿠버네티스 클러스터에 기본 Pod를 생성하고,
애플리케이션이 정상적으로 동작하는지 확인한다.
시나리오
개발팀은 간단한 헬스체크용 웹 서버를 테스트하려고 한다.
nginx:latest 이미지를 이용하여 단일 Pod를 생성하고,
/var/www/html에 기본 페이지를 호스팅해야 한다.
**~/k8s/test$ vim nginx-pod.yml**
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
**$ kubectl apply -f nginx-pod.yml**
pod/nginx-pod created
**$ kubectl get pods**
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 26s
Q2. ReplicaSet을 사용해 애플리케이션을 확장하시오.
목표
동일한 Pod를 여러 개 배포하고,
자동으로 복제 관리가 가능한 ReplicaSet을 생성한다.
시나리오
운영팀은 트래픽 증가에 대비해 nginx 서버를 3개로 확장하려고 한다.
app=nginx-rs 라벨을 기준으로 ReplicaSet을 구성하시오.
검증 코드도 작성해야 한다
$ **vim nginx-replicaset.yml**
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: nginx-rs
template:
metadata:
labels:
app: nginx-rs
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
**$ kubectl get pods --show-labels**
NAME READY STATUS RESTARTS AGE LABELS
nginx-replicaset-6p9jz 0/1 ContainerCreating 0 11s app=nginx-rs
nginx-replicaset-hlfdl 1/1 Running 0 11s app=nginx-rs
nginx-replicaset-v7dlm 0/1 ContainerCreating 0 11s app=nginx-rs
**$ kubectl get pods -l app=nginx-rs**
NAME READY STATUS RESTARTS AGE
nginx-replicaset-6p9jz 1/1 Running 0 64s
nginx-replicaset-hlfdl 1/1 Running 0 64s
nginx-replicaset-v7dlm 1/1 Running 0 64s
Q3. DaemonSet을 생성하여 모든 노드에 로그 수집기를 배포하시오.
목표
클러스터의 모든 노드에 동일한 Pod가 1개씩 배포되도록 DaemonSet을 구성한다.
주로 로그 수집기나 모니터링 에이전트에 활용되는 구조다.
시나리오
운영팀은 모든 노드에 fluentd 로그 수집기를 설치하려 한다.
각 노드마다 한 개의 Fluentd Pod가 실행되어야 한다.
검증 코드도 작성해야 한다
**$ vim fluentd-daemonset.yml**
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-daemon
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
nodeSelector:
node: fluentd
containers:
- name: fluentd
image: fluent/fluentd:v1.16
resources:
limits:
memory: 100Mi
cpu: 100m
**$ kubectl apply -f fluentd-daemonset.yml**
daemonset.apps/fluentd-daemon created
**$ kubectl label nodes kube-node1 node=fluentd --overwrite**
node/kube-node1 labeled
**$ kubectl get nodes --show-labels**
NAME ... LABELS
...
kube-node1 ... ...node=fluentd
...
**$ kubectl get daemonsets.apps**
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-daemon 1 1 1 1 1 node=fluentd 3m39s
# 레이블에서 node로 시작하는 부분 삭제
**$ kubectl label nodes kube-node1 node-**
node/kube-node1 unlabeled
Q4. Job을 생성하여 일회성 데이터 처리 작업을 수행하시오.
목표
일회성 실행이 필요한 배치 작업을 Job 리소스로 관리한다.
Job은 완료 후 자동 종료된다.
시나리오
데이터 분석팀은 하루에 한 번 DB 백업 스크립트를 실행해야 한다.
테스트 목적으로, ubuntu 컨테이너에서 “백업 완료” 메시지를 출력하는 Job을 실행하시오.
검증 코드도 작성해야 한다
**$ vim backup-job.yml**
apiVersion: batch/v1
kind: Job
metadata:
name: backup-job
spec:
backoffLimit: 3
template:
spec:
restartPolicy: OnFailure
containers:
- name: ubuntu
image: ubuntu:latest
command: ["sh", "-c", "echo 'backup complete'"]
**$ kubectl apply -f backup-job.yml**
job.batch/backup-job created
**$ kubectl get jobs.batch**
NAME STATUS COMPLETIONS DURATION AGE
backup-job Complete 1/1 6s 9s
**$ kubectl logs jobs/backup-job**
backup complete
Q5. CronJob을 생성하여 정기적인 로그 정리 작업을 수행하시오.
목표
CronJob을 이용해 주기적인 작업을 자동으로 실행한다.
Linux의 cron처럼 주기적 스케줄을 적용한다.
시나리오
운영팀은 매 1분마다 로그 정리 스크립트를 실행하려 한다.
ubuntu 이미지를 사용하여 로그 정리 메시지를 출력하시오.
검증 코드도 작성해야 한다
**$ vim log-cronjob.yml**
apiVersion: batch/v1
kind: CronJob
metadata:
name: log-cronjob
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: log-cleaner
image: ubuntu:latest
command: ["sh", "-c", "echo 'backup complete'"]
**$ kubectl apply -f log-cronjob.yml**
cronjob.batch/log-cronjob created
**$ kubectl get cronjobs.batch**
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
log-cronjob * * * * * <none> False 0 <none> 19s
**$ kubectl get pods**
No resources found in default namespace.
**$ kubectl get cronjobs.batch**
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
log-cronjob * * * * * <none> False 1 0s 52s
**$ kubectl get pods**
NAME READY STATUS RESTARTS AGE
log-cronjob-29363121-zmmbd 0/1 ContainerCreating 0 2s
**$ kubectl get pods**
NAME READY STATUS RESTARTS AGE
log-cronjob-29363121-zmmbd 0/1 Completed 0 5s
**$ kubectl get pods --watch**
NAME READY STATUS RESTARTS AGE
log-cronjob-29363121-zmmbd 0/1 Completed 0 2m46s
log-cronjob-29363122-fbs8r 0/1 Completed 0 106s
log-cronjob-29363123-wzljr 0/1 Completed 0 46s
# 타이밍 잘 맞춰야 함
**$ kubectl logs jobs/log-cronjob-29363125**
backup complete
삭제
kubectl delete -f [파일 이름]