25/10/30 쿠버네티스 실습 1

344th·2025년 12월 11일

AWS AI

목록 보기
36/48

1

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

2

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

3

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

4

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

5

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 [파일 이름]
profile
새싹 개발자

0개의 댓글