쿠버네티스

윤이령·2026년 4월 23일

쿠버네티스

  • 컨테이너 오케스트레이션 도구
  • 여러개의 컨테이너를 시스템 전체에서 통괄 관리
  • 대규모 시스템에서 사용
  • 번거로운 컨테이너 생성이나 관리의 수고를 덜어주는 도구
  • 도커랑 독립된 소프트웨어 -> 따로 설치 필요
  • 정의된 바람직한 상태를 유지 -> 사람이 개입해서 컨테이너를 삭제해서는 안된다 -> 임의로 컨테이너를 삭제하거나 하면 안됨

마스터 노드와 워커 노드

마스터 노드

  • 전체 제어 담당
  • 컨테이너를 직접 실행 x
  • 워커 노드의 컨테이너를 관리
  • 컨테이너 엔진 불필요
  • 컨트롤 플레인으로 워커 관리
  • etcd DB로 클러스터 정보 저장 -> 컨테이너 등의 상태 관리

워커 노드

  • 컨테이너 실제 실행 담당
  • 컨테이너 엔진 필수 설치
  • kube-let -> 파드배치 실행
  • kube-proxy -> 네트워크 라우팅
  • 마스터의 명령에 따라 동작
  • 사람 개입 없이 자율 관리

클러스터 = 마스터 노드 + 워커 노드들의 집합
-> 사람 개입없이 자율 동작

구성

  • 파드 : 볼륨 + 컨테이너 묶은것. 단위
  • 서비스: 같은 종류의 파드를 관리하는 로드 밸런서. 내부 통신 배분 담당
  • 레플리카세트 : 파드의 수를 관리
  • 레플리카 : 레플리카세트가 관리하는 동일한 구성의 파드. 파드 수 변경 시 자동 조절
  • 디플로이먼트 : 레플리카세트를 관리. 파드 업데이트, 롤백 관리. 실제 운영에서 주로 사용
  • 서비스 / 디플로이먼트 > 레플리카세트 > 파드 > 컨테이너 + 볼륨

Deployment
→ “어떤 상태로 앱을 유지할지” 정의 (버전, replica 수 등)
ReplicaSet
→ 지정된 개수만큼 Pod가 유지되도록 관리
Pod
→ 실제 컨테이너가 실행되는 최소 단위
Deployment → (자동 생성/관리) ReplicaSet → Pod
Service
→ Pod들을 묶어서 네트워크로 접근 가능하게 해주는 “별개의 리소스”

[Deployment]

[ReplicaSet]

[Pod]
(Service는 옆에서 Pod들을 선택해서 트래픽 연결)

설치 및 사용법

매니페스트 파일(정의파일) 작성

  • 파드나 서비스에 대한 설정
  • YAML 또는 JSON 형식으로 기재함
  • 리소스 단위로 작성(파드, 디플로이먼트, 서비스)
    • 파드 항목에는 자동으로 설정된 개수를 유지하는 기능이 없음
    • 개수를 유지하는 기능은 디플로이먼트나 레플리카세트에서 담당
    • 레플리카세트 역시 디플로이먼트에서 개수 관리
    • 파드가 아닌 디플로이먼트를 만들어야 함
    • 디플로이먼트 항목에 리플리카세트와 파드가 포함돼있음

파드 매니페스트

apiVersion: # API그룹 및 버전 (apps/v1, core/v1)
kind: # 리소스 유형 (Deployment, Service, Pod)
metadata: # 메타데이터 (name, labels, namespace)
	name: # (중항목) 파드의 이름
    labels: # (중항목) 레이블 
spec: # 리소스 내용 (컨테이너 정보, 개수 등)
	containers: # (중항목) 컨테이너 구성
    - name: # (소항목) 컨테이너 이름
      iamge: # (소항목) 이미지 이름
      ports: # (소항목) 포트 설정
  • 레이블 : 리소스에 키-값 쌍으로 부여하는 임의 태그(system:penguin, rank:gold)
  • 셀렉터: 특정 레이블이 붙은 파드만 선택해 배포, 관리(rank:gold인 파드만 선택)
ex)
apiVersion: v1
kind: Pod
metadata:
  name: apa000pod
  labels:
    app: apa000kube
spec:
  containers:
    - name: apa000ex91
      image: httpd
      ports:
      - containerPort: 80

디플로이먼트 매니페스트

apiVersion:
kind:
metadata:
  name: # (중항목) 디플로이먼트 이름
spec:
  selector: # (중항목) 셀렉터 설정
    matchLabels: # (소항목) 셀렉터가 선택할 관리 대상 레이블
  replicas: # (중항목) 레플리카 설정
  template: # (중항목) 템플릿(파드의 정보)
    metadata: # (소항목) 파드의 메타데이터를 기재
    spec: # (소항목) 파드의 스펙을 기재
ex)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apa000dep
spec:
  selector:
    matchLabels:
      app: apa000kube
  replicas: 3
  template:
    metadata:
      labels:
        app: apa000kube
    spec:
      containers:
      - name: apa000ex91
        image: httpd
        ports:
        - containerPort: 80

서비스 매니페스트

apiVersion:
kind:
metadata:
  name: # (중항목) 서비스 이름
spec:
  type: # (중항목) 서비스의 유형
  ports: # (중항목) 포트 설정
  - port: # (중항목) 서비스의 포트
    targetPort: # (소항목) 컨테이너의 포트
    protocol: # (소항목) 통신에 사용되는 프로토콜
    nodePort: # (소항목) 워커 노드의 포트
  selector: # (중항목) 셀렉터 설정
  • 실무에서는 LoadBalancer로설정하는 경우가 대부분
ex)
apiVersion: v1
kind: Service
metadata:
  name: apa000ser
spec:
  type: NodePort
  ports:
  - port: 8099
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: apa000kube

쿠버네티스 명령어

kubectl 커맨드 옵션
  • 커맨드
    • create : 리소스 생성
    • delete : 리소스 삭제
    • get : 리소스 상태 출력
    • set : 리소스 값 설정
    • apply : 리소스 변경 사항 반영
    • scale : 레플리카 수 변경
    • logs : 컨테이너의 로그를 화면에 출력
    • 등등
# 1. 디플로이먼트의 매니페스트 파일 읽기 (얌파일 저장한 경로)
kubectl apply -f C:\work\kube_folder\apa000dep.yml
# 2. 생성됐는지 확인
kubectl get pods
# 3. 서비스의 매니페스트 파일 읽기 (얌파일 저장한 경로)
kubectl apply -f C:\work\kube_folder\apa000ser.yml
# 4. 생성됐는지 확인
kubectl get services
# 5. 동작 확인
# localhost:30080 접근해서 확인
# 접근 안될때는 포트포워딩 사용
kubectl port-forward service/apa000ser 8099:8099
# 포워딩 후 localhost:8099 로 접속해서 확인

여러가지 실습

파드 개수 늘리기

# 디플로이먼트 매니페스트 파일 수정
...
  replicas: 5 # 레플리카 수 5로 증가
...

# 수정한 파일 읽어들이기
kubectl apply -f C:\work\kube_folder\apa000dep.yml
# 확인
kubectl get pods

아파치 nginx로 변경

# 디플로이먼트 매니페스트 수정
...
        image: nginx
...

# 수정한 파일 읽어들이기
kubectl apply -f C:\work\kube_folder\apa000dep.yml
# localhost:300080 또는 localhost:8099들어가서 확인

# 안되면
docker pull nginx
# 로 수동으로 nginx이미지 다운받고 확인

수동으로 파드 삭제 후 자동복구 확인

# 파드 목록 확인
kubectl get pods

# delete로 커맨드로 파드 하나 삭제
kubectl delete pod apa000dep-...(파드 이름)

# 파드 확인
kubectl get pods

디플로이먼트와 서비스 삭제

# 디플로이먼트 삭제
kubectl delete -f C:\work\kube_folder\apa000dep.yml
# 확인
kubectl get deployment
# 서비스 삭제
kubectl delete -f C:\work\kube_folder\apa000ser.yml
# 확인
kubectl get service

0개의 댓글