Object. 컨테이너를 이용한 쿠버네티스 아키텍처 파악
개요
본 문서는 Container 기술을 기반으로 Kubernetes의 핵심 아키텍처를 이해하고, 로컬 환경에서 Minikube를 활용해 직접 실습함으로써 k8s의 구성 요소와 명령어 사용법을 체득하는 것을 목표로 한다.
📦 Container란?
컨테이너는 애플리케이션과 그 의존성을 격리된 환경에서 실행할 수 있도록 해주는 기술이다. 주로 Docker를 통해 컨테이너를 생성하고, 실행하며, 배포할 수 있다. `docker pull` 명령어 등을 통해 불러온 이미지를 기반으로 컨테이너라는 실행 가능한 단위를 생성한다.
☸️ Kubernetes란?
쿠버네티스 (Kubernetes, k8s)는 대표적인 Container orchestration 도구로, 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈소스 플랫폼이다.
특징
1) 선언적 구성 (Declarative Configuration)
쿠버네티스는 사용자가 원하는 상태를 선언하면, 이를 만족하도록 현재 상태를 자동으로 조정한다.
- 명령형(Imperative) : “nginx 컨테이너를 실행해줘. 그리고 80 port로 개방해줘.”
- 선언형 (Declarative) : “80 port를 개방한 nginx 컨테이너를 1개 유지해줘.”
2) 오브젝트 (Object)
쿠버네티스는 다양한 리소스를 객체 형태로 관리한다. 주요 객체는 다음과 같다.
Object | Description |
Pod | - 하나 이상의 컨테이너를 포함한 가장 작은 배포 단위. - Pod 내의 컨테이너들은 네트워크와 스토리지를 공유한다. |
ReplicaSet | - 지정된 수의 동일한 Pod를 유지하도록 관리한다. |
Deployment | - Pod와 ReplicaSet을 관리 - rolling update 및 rollback 기능을 제공한다. |
Service | - Pod에 대한 네트워크 접근을 추상화함. - Load balancing을 지원한다. |
Volume | - 데이터를 영속적으로 저장하기 위한 스토리지. |
3) YAML을 통한 구성
쿠버네티스의 리소스는 YAML 파일을 통해 정의된다.
apiVersion: v1 kind: Pod metadata: name: example spec: containers: - name: busybox image: busybox:1.25 |
구조
Object | Description |
Pod | - 하나 이상의 컨테이너를 포함한 가장 작은 배포 단위 |
Node | - 클러스터 내에 있는 물리/가상 머신으로 pod를 실행한다. - Controlplane node와 worker node로 구성됨. |
Cluster | - 일련의 노드들로, 쿠버네티스를 실행한다. |
Namespace | - 클러스터 리소스를 사용자/팀 별로 격리하는 방법 |
🖥️ Minikube란?
Minikube는 로컬 환경에서 단일 노드 K8s 클러스터를 실행할 수 있는 도구로, 개발 및 테스트 용도에 적합하다.
Key Result. Minikube를 활용한 Kubernetes 아키텍처 파악
- Minikube 설치 및 시작:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube minikube start |
1. 리소스 생성 및 관리
기본 리소스 생성과 네트워크 노출을 이해한다.
- Deployment 생성 - Pod의 복제 및 업데이트를 관리하는 Deployment 생성
Kubectl create deployment nginx –image=nginx |
- Service 생성 - Deployment를 외부에 노출하는 Service 생성
Kubectl expose deployment nginx –type=NodePort –port=80 |
- 노출된 Deployment 확인
minikube service <서비스명> –url # 예시 : minikube service nginx –url # 출력 예시 : http://127.0.0.1:57123 curl http://127.0.0.1:57123 # 또는 웹 브라우저에서 http://127.0.0.1:57123 접속 |
2. 접근 제어 실습 (RBAC)
ServiceAccount를 만들고, Role과 RoleBinding을 통해 특정 리소스에 대한 권한을 제한한다.
- ServiceAccount 생성 - 사용자 계정 생성
Kubectl create serviceaccount viewer-sa -n default |
- Role 생성 - 특정 리소스에 대한 권한 정의
Kubectl create role pod-reader –verb=get,list,watch –resource=pods -n default |
- RoleBinding 생성 - Role과 ServiceAccount 연결
Kubectl create rolebinding viewer-binding –role=pod-reader –serviceaccount=default:viewer-sa -n default |
- ServiceAccount의 권한 확인
Kubectl auth can-i <verb> <resource> –as <subject> # 예시1 : kubectl auth can-i list pod –as viewer-sa # 출력 예시: no # –as=viewer-sa : 일반 사용자로 처리되기 때문에 실제 권한과 무관한 결과를 출력한다. # 예시2 : kubectl auth can-i get pods --as=system:serviceaccount:default:viewer-sa # 출력 예시: yes |
3. 네트워크 실습
기존에 생성한 deployment에 대해 특정 label을 가진 pod만 접근 가능하도록 네트워크 정책을 생성한다.
- Minikube를 Calico CNI로 재시작 : NetworkPolicy를 지원하는 CNI로 재설정
Minikube start –cni=calico |
- Server, Client Pod 생성
kubectl run client --image=busybox --restart=Never -l run=client -- sleep 3600 kubectl run stranger --image=busybox --restart=Never -l run=stranger -- sleep 3600 |
- NetworkPolicy 생성 : ‘run:client’ 태그를 가진 pod만 진입 가능하도록 설정
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-client-only spec: podSelector: matchLabels: app: nginx # <-- 대상이 되는 Pod (즉, nginx Deployment의 Pod) policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: run: client # <-- 이 레이블을 가진 Pod만 접근 허용 |
- 결과 확인
Kubectl exec -it client – wget –spider –timeout=1 nginx # 출력 결과 (허용) # Connecting to nginx (10.x.x.x:80) # remote file exists Kubectl exec -it stranger – wget –spider –timeout=1 nginx # 출력 결과 (차단) # wget: bad address 'nginx' |
4. 모니터링 및 리소스 현황 실습
metrics-server를 활성화한 후, ‘kubectl autoscale’을 통해 HPA 구성
- Metrics 서버 활성화 : 리소스 사용량 모니터링을 위한 Metrics 서버 활성화
Minikube addons enable metrics-server |
- HPA 생성: CPU 사용률에 따라 pod 수를 조정
Kubectl create deployment nginx –image=nginx Kubectl autoscale deployment nginx –cpu-percent=50 –min=1 –max=5 |
- 결과 확인
>kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS nginx Deployment/nginx cpu: <unknown>/50% 1 5 1 |
5. Trivy 이미지 취약점 확인
- 이미지 보안 스캔 : 사용하는 Docker 이미지에 취약점(CVE)이 있는지 확인
winget install trivy.trivy
Trivy image nginx:latest
- nginx 이미지 취약점 검사 결과
6. CrashLoopBackOff Pod 만들고 디버깅
`exit 1` 등을 사용해 CrashLoopBackOff 상태 유도 후 ‘logs’, ‘describe’ 로 원인을 분석한다.
- 문제 Pod 생성 : Deployment가 관리하는 pod가 종료되면 재시작 → 실패 → 재시작 .. 반복
kubectl create deployment crashloop --image=busybox -- /bin/sh -c "echo Crashing... && sleep 2 && exit 1"
- 상태 확인
Kubectl get pods
NAME READY STATUS
crashloop-576b74459c-j77jd 0/1 CrashLoopBackOff
Kubectl logs <crashloop-pod-name>
Crash
- 해결 방법
Kubectl edit deployment crashloop
# 수정 전 : command: ["/bin/sh", "-c", "echo Crash && sleep 2 && exit 1"]
# 수정 후 : command: ["/bin/sh", "-c", "echo Solved && sleep 3600"]
Kubectl get pods
NAME READY STATUS
crashloop-576b74459c-j77jd 1/1 Running
7. k9s에서 리소스 트러블 슈팅
- k9s 설치 및 시작:
Winget install k9s
K9s # k9s 대시보드 실행

'Cloud Security 7기' 카테고리의 다른 글
[Cloud Security] 쿠버네티스 보안 및 CI/CD 환경 분석 - CI 구현 (0) | 2025.06.10 |
---|---|
[Cloud Security] 9주차. 쿠버네티스 보안 및 CI/CD 환경 분석 (0) | 2025.06.08 |
[Cloud Security] 7주차. Okta를 활용한 GitHub Organization 연동 가이드 (0) | 2025.05.31 |
[Cloud Security] 7주차. Zero Trust & CNAPP (0) | 2025.05.26 |
[Cloud Security] 6주차. AWS 클라우드 보안 (0) | 2025.05.22 |