어제의 실습에서는 파드를 직접 생성하고 다루는 실습이었다.

실무에선 이러는 경우가 거의 없다고 한다.

Deployment 리소스를 통해 파드를 관리한다.

오늘의 실습은 Deployment를 다뤄보는 실습이다.

또한 지금까지의 실습환경은 VMware의 VM을 만들어 실습하고있다.

워밍업 CKA에서 나오는 문제 유형

kubectl get node -o wide --no-headers | awk '{print $6}'
172.16.0.128
172.16.0.133
172.16.0.136
172.16.0.137

awk 명령어

awk '{print $1}'
입력된 텍스트에서 첫 번째 필드만 출력
기본 구분자는 공백/탭

ps aux | awk '$2 < 10  {print $1, $2, $3, $11}
이건 pid가 10보다 작은 프로세스의 사용자이름 pid cpu 사용량, 실행 명령어 출력

삭제 명령어

[root@master ~]# kubectl delete pod nginx-pod --grace-period 0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx-pod" force deleted

[root@master ~]# kubectl delete svc --all
service "clusterip" deleted
service "kubernetes" deleted
service "loadbalancer" deleted
service "loadbalancer8080-1" deleted
service "nodeport" deleted

Deployment 리소스 사용

[root@master ~]# kubectl create deployment nginx-app --replicas=3 --image=nginx
deployment.apps/nginx-app created

[root@master ~]# kubectl get all -n default
NAME                             READY   STATUS    RESTARTS   AGE
pod/nginx-app-7df7b66fb5-8qn6m   1/1     Running   0          16s
pod/nginx-app-7df7b66fb5-q65gl   1/1     Running   0          16s
pod/nginx-app-7df7b66fb5-xx8wv   1/1     Running   0          16s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   3m27s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-app   3/3     3            3           16s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-app-7df7b66fb5   3         3         3       16s

궁금증: Deployment 가 있을 때 ReplicaSet, Pod을 지웠을때는?

[root@master ~]# kubectl delete replicasets --all -n default
replicaset.apps "nginx-app-7df7b66fb5" deleted
[root@master ~]# kubectl get rs
NAME                   DESIRED   CURRENT   READY   AGE
nginx-app-7df7b66fb5   3         3         3       12s

다시 생성된다.

[root@master ~]# kubectl delete pods -n default --all
pod "nginx-app-7df7b66fb5-gdpb4" deleted
pod "nginx-app-7df7b66fb5-n7jqd" deleted
pod "nginx-app-7df7b66fb5-sk6qt" deleted

[root@master ~]# kubectl get Pods -n default
NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-7df7b66fb5-9dqv9   1/1     Running   0          21s
nginx-app-7df7b66fb5-c5lqt   1/1     Running   0          21s
nginx-app-7df7b66fb5-lhkgl   1/1     Running   0          21s

다시 생성된다.

Deploymen와 Service 연결

Service --type ClusterIP

[root@master ~]# kubectl expose deployment nginx-app --name clusterip-app --type ClusterIP --port 8080 --target-port 80
service/clusterip-app exposed
  • nginx-app이라는 deployment에
  • clusterip-app이라는 Service를 만드는데
  • --type은 ClusterIP이고 → Pod끼리만 접속 가능한 고정된 IP 주소 할당하는 서비스
    • 내부용이므로 안전
    • 프론트 ↔ 백엔드
    • 백엔드 ↔ DB 또는 인증 서버
  • 서비스에서 들어올 때의 포트는 8080
  • 파드로는 80 포트로 간다.

Pod의 컨테이너에 직접 명령어를 통해 변경하기

[root@master ~]# kubectl exec -it nginx-app-7df7b66fb5-9dqv9 -- sh -c "echo 'worker' > /usr/share/nginx/html/index.html"

[root@master ~]# curl 10.101.49.221:8080
worker

Service --type Loadbalancer

외부 IP를 만들어서 그 곳으로 들어오는 요청을 Deployment의 Pod들에게 분배해주는 역할을 해줌

[root@master ~]# kubectl expose deployment nginx-app --name loadbalancer-app --type LoadBalancer --external-ip 172.16.0.128 --port 80
service/loadbalancer-app exposed
[root@master ~]# kubectl get svc
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
clusterip-app      ClusterIP      10.101.49.221   <none>         8080/TCP       28m
kubernetes         ClusterIP      10.96.0.1       <none>         443/TCP        59m
loadbalancer-app   LoadBalancer   10.104.91.150   172.16.0.128   80:31224/TCP   10s

[root@master ~]# curl 172.16.0.128
worker2
[root@master ~]# curl 172.16.0.128
worker1
[root@master ~]# curl 172.16.0.128
worker1

롤링 업데이트 해보기

kubectl edit deployments nginx-app
-> 이미지 변경
--- 업데이트 진행 ---

[root@master ~]# kubectl get rs
NAME                   DESIRED   CURRENT   READY   AGE
nginx-app-7df7b66fb5   2         2         2       50m
nginx-app-864794d46b   2         2         1       9s

[root@master ~]# kubectl get rs
NAME                   DESIRED   CURRENT   READY   AGE
nginx-app-7df7b66fb5   0         0         0       52m
nginx-app-864794d46b   3         3         3       104s

[root@master ~]# kubectl get pods
NAME                         READY   STATUS              RESTARTS   AGE
nginx-app-7df7b66fb5-lhkgl   1/1     Running             0          49m
nginx-app-864794d46b-9t8ng   1/1     Running             0          28s
nginx-app-864794d46b-pxd7v   1/1     Running             0          21s
nginx-app-864794d46b-xbk7c   0/1     ContainerCreating   0          10s
[root@master ~]# kubectl get pods
NAME                         READY   STATUS      RESTARTS   AGE
nginx-app-7df7b66fb5-lhkgl   0/1     Completed   0          49m
nginx-app-864794d46b-9t8ng   1/1     Running     0          31s
nginx-app-864794d46b-pxd7v   1/1     Running     0          24s
nginx-app-864794d46b-xbk7c   1/1     Running     0          13s

ReplicaSet 교체

새로 ReplicaSet이 생성되고 교체됨

이전의 것은 그대로 파드가 0개로 유지를 해둠

Pod 교체

파드가 하나씩 새로운 ReplicaSet이 만드는 파드가 대체하고 있음

결국 전부 대체 되었다.

Scale-Out, In 해보기

Scale-Out

[root@master ~]# kubectl scale deployment nginx-app --replicas=6
deployment.apps/nginx-app scaled
[root@master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-864794d46b-9t8ng   1/1     Running   0          24m
nginx-app-864794d46b-fbgjt   1/1     Running   0          8s
nginx-app-864794d46b-p9j5z   1/1     Running   0          8s
nginx-app-864794d46b-pxd7v   1/1     Running   0          24m
nginx-app-864794d46b-xbk7c   1/1     Running   0          24m
nginx-app-864794d46b-z8qb8   1/1     Running   0          8s

Scale-In

[root@master ~]# kubectl scale deployment nginx-app --replicas=3
deployment.apps/nginx-app scaled

[root@master ~]# kubectl get pod
NAME                         READY   STATUS        RESTARTS   AGE
nginx-app-864794d46b-9t8ng   1/1     Running       0          25m
nginx-app-864794d46b-fbgjt   1/1     Terminating   0          88s
nginx-app-864794d46b-p9j5z   1/1     Terminating   0          88s
nginx-app-864794d46b-pxd7v   1/1     Running       0          25m
nginx-app-864794d46b-xbk7c   1/1     Running       0          25m
nginx-app-864794d46b-z8qb8   1/1     Terminating   0          88s

[root@master ~]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-864794d46b-9t8ng   1/1     Running   0          26m
nginx-app-864794d46b-pxd7v   1/1     Running   0          26m
nginx-app-864794d46b-xbk7c   1/1     Running   0          25m

Deployment 삭제

[root@master ~]# kubectl delete deploy nginx-app
deployment.apps "nginx-app" deleted
[root@master ~]# kubectl get pod
NAME                         READY   STATUS        RESTARTS   AGE
nginx-app-864794d46b-9t8ng   1/1     Terminating   0          27m
nginx-app-864794d46b-pxd7v   1/1     Terminating   0          27m
nginx-app-864794d46b-xbk7c   1/1     Terminating   0          27m

[root@master ~]# kubectl get rs
No resources found in default namespace.
[root@master ~]# kubectl get pod
No resources found in default namespace.

Service 삭제

[root@master ~]# kubectl get svc
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
clusterip-app      ClusterIP      10.101.49.221   <none>         8080/TCP       66m
kubernetes         ClusterIP      10.96.0.1       <none>         443/TCP        97m
loadbalancer-app   LoadBalancer   10.104.91.150   172.16.0.128   80:31224/TCP   37m
[root@master ~]# kubectl delete svc --all
service "clusterip-app" deleted
service "kubernetes" deleted
service "loadbalancer-app" deleted
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2s

kubernetes는 기본 서비스이므로 삭제되어도 자동으로 다시 만들어짐

'공부일지 > 클라우드 SA 교육' 카테고리의 다른 글

Kubernetes 설치 및 실습 on VMware  (1) 2025.07.07
Docker Swarm 실습해보기  (3) 2025.07.05
도커파일, 도커 컴포즈 실습 + cAdvisor 활용  (1) 2025.07.04
Ansible 실습2  (1) 2025.06.26
Ansible 실습  (1) 2025.06.25

+ Recent posts