하위 태스크 1

Pod YAML 작성

기본 Pod 리소스를 정의하는 YAML 파일 작성

Control Plane 노드에 SSH로 접속한다.

vagrant ssh cp-k8s-1.30.0

pod.yaml을 작성한다.

pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: po-nginx
  labels:
    run: po-nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
      - containerPort: 80

하위 태스크 2

Pod 생성 및 확인

kubectl apply로 Pod 생성하고 상태 확인

작성한 pod.yaml을 클러스터에 적용해 Pod를 생성한다.

$ kubectl apply -f pod.yaml
 
# 결과:
# pod/po-nginx created

Pod 상태를 확인한다.

$ kubectl get pods
 
# 결과:
# NAME       READY   STATUS    RESTARTS   AGE
# po-nginx   0/1     Pending   0          104s

하위 태스크 3

Deployment YAML 작성

ReplicaSet과 Pod 템플릿을 포함한 Deployment 작성

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deploy-nginx
  name: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: po-nginx
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - name: nginx
        image: nginx

하위 태스크 4

Deployment 생성

Deployment를 생성하고 관련 리소스 확인

Deployment를 생성한다.

$ kubectl apply -f deployment.yaml
 
# 결과:
# deployment.apps/deploy-nginx created

생성된 리소스를 확인한다.

$ kubectl get deploy,rs,pods
 
# 결과:
# NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
# deployment.apps/deploy-nginx   0/3     3            0           11m
# 
# NAME                                      DESIRED   CURRENT   READY   AGE
# replicaset.apps/deploy-nginx-7d4bb44bd6   3         3         0       11m
# 
# NAME                                READY   STATUS    RESTARTS   AGE
# pod/deploy-nginx-7d4bb44bd6-9rczx   0/1     Pending   0          11m
# pod/deploy-nginx-7d4bb44bd6-wwtvt   0/1     Pending   0          11m
# pod/deploy-nginx-7d4bb44bd6-zgn7q   0/1     Pending   0          11m
# pod/po-nginx                        0/1     Pending   0          22m

하위 태스크 5

스케일링 실습

kubectl scale 명령어로 파드 개수 조정

현재 Pod의 개수를 확인한다.

$ kubectl get pods
 
# 결과:
# NAME                            READY   STATUS    RESTARTS   AGE
# deploy-nginx-7d4bb44bd6-9rczx   0/1     Pending   0          16m
# deploy-nginx-7d4bb44bd6-wwtvt   0/1     Pending   0          16m
# deploy-nginx-7d4bb44bd6-zgn7q   0/1     Pending   0          16m
# po-nginx                        0/1     Pending   0          28m

Pod의 개수를 5개로 늘린다.

kubectl scale deployment deploy-nginx --replicas=5
 
# 결과:
# deployment.apps/deploy-nginx scaled

다시 Pod의 개수를 조회한다. deploy-nginx-* 관련 Pod가 5개로 늘었다.

$ kubectl get pods
 
# 결과:
# NAME                            READY   STATUS    RESTARTS   AGE
# deploy-nginx-7d4bb44bd6-9rczx   0/1     Pending   0          18m
# deploy-nginx-7d4bb44bd6-vslbh   0/1     Pending   0          37s
# deploy-nginx-7d4bb44bd6-wrsr7   0/1     Pending   0          37s
# deploy-nginx-7d4bb44bd6-wwtvt   0/1     Pending   0          18m
# deploy-nginx-7d4bb44bd6-zgn7q   0/1     Pending   0          18m
# po-nginx                        0/1     Pending   0          30m

하위 태스크 6

롤링 업데이트

kubectl set image로 이미지 업데이트

nginx 이미지를 1.28 버전으로 업데이트한다.

$ kubectl set image deployment/deploy-nginx nginx=nginx:1.28
 
# 결과:
# deployment.apps/deploy-nginx image updated

사용 중인 이미지가 변경되었음을 확인한다.

$ kubectl get deploy deploy-nginx -o yaml | grep "image:"
 
# 결과:
#       - image: nginx:1.28

하위 태스크 7

롤백 실습

kubectl rollout undo로 이전 버전으로 되돌리기

배포 이력을 확인한다.

$ kubectl rollout history deployment/deploy-nginx
 
# 결과:
# deployment.apps/deploy-nginx
# REVISION  CHANGE-CAUSE
# 1         <none>
# 2         <none>

이전 버전으로 롤백한다.

$ kubectl rollout undo deployment/deploy-nginx
# 결과:
# deployment.apps/deploy-nginx rolled back

이전 버전으로 롤백되어 nginx 버전 라벨이 사라졌음을 확인한다.

$ kubectl get deploy deploy-nginx -o yaml | grep "image:"
# 결과:
#       - image: nginx

하위 태스크 8

Job 생성

일회성 작업을 위한 Job 리소스 생성

job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: job-curl-succ
spec:
  template:
    spec:
      containers:
      - name: net-tools
        image: sysnet4admin/net-tools
        command: ["curlchk",  "nginx"]
      restartPolicy: Never

Job을 생성한다.

$ kubectl apply -f job.yaml
 
# 결과:
# job.batch/job-curl-succ created

생성된 Job의 상태를 확인한다.

$ kubectl get jobs
 
# 결과:
# NAME            STATUS    COMPLETIONS   DURATION   AGE
# job-curl-succ   Running   0/1           49s        49s

하위 태스크 9

CronJob 생성

주기적 작업을 위한 CronJob 리소스 생성

cronjob.yaml:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cj-1m-hist10-curl 
spec:
  schedule: "*/1 * * * *"  
  successfulJobsHistoryLimit: 10
  jobTemplate:             # Template for job 
    spec:                  # same as before 
      template:
        spec:
          containers:
          - name: net-tools
            image: sysnet4admin/net-tools
            command: ["curlchk",  "nginx"]
          restartPolicy: Never

CronJob을 생성한다.

$ kubectl apply -f cronjob.yaml
 
# 결과:
# cronjob.batch/cj-1m-hist10-curl created

CronJob 목록을 확인한다.

$ kubectl get cronjobs
 
# 결과:
# NAME                SCHEDULE      TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
# cj-1m-hist10-curl   */1 * * * *   <none>     False     0        <none>          31s

하위 태스크 10

DaemonSet 생성

모든 노드에 실행되는 DaemonSet 생성

daemonset.yaml:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: ds-nginx 
  name: ds-nginx
spec:
  selector:
    matchLabels:
      app: po-nginx 
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - name: nginx 
        image: nginx 

DaemonSet을 생성한다.

$ kubectl apply -f daemonset.yaml
 
# 결과:
# daemonset.apps/ds-nginx created

하위 태스크 11

StatefulSet 생성

상태를 가진 애플리케이션을 위한 StatefulSet 생성

statefulset.yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-chk-hn
spec:
  replicas: 3
  serviceName: sts-svc-domain #statefulset need it
  selector:
    matchLabels:
      app: sts
  template:
    metadata:
      labels:
        app: sts
    spec:
      containers:
      - name: chk-hn
        image: sysnet4admin/chk-hn

StatefulSet 리소스를 생성한다.

$ kubectl apply -f statefulset.yaml
 
# 결과:
# statefulset.apps/sts-chk-hn created