쿠버네티스 오브젝트란?
- 클러스터 내부에서 사용자가 관리하고자 하는 리소스의 실체를 의미한다.
- 클러스터의 원하는 spec(스펙, 명세)과 status(상태)를 선언적으로 정의해두면 쿠버네티스가 이를 실제 상태로 맞추려고 지속적으로 관리한다.
쿠버네티스의 주요 오브젝트들이 어떤 역할을 하는지 정리해보자.
Namespace
- 쿠버네티스 클러스터에서 사용되는 리소소들을 구분해서 관리하는 그룹이다.
apiVersion: v1
kind: Namespace
metadata:
name: anotherclass-123
labels:
part-of: k8s-anotherclass
managed-by: dashboard
위 YAML파일은 쿠버네티스 클러스터 안에 새로운 격리 공간 (anotherclass - 123 )을 만드는 역할을 한다.
Deployment
- Deployment는 ReplicaSet의 상위 개념으로, Pod와 ReplicaSet에 대한 배포를 관리한다.
- 운영 중에 어플리케이션의 새 버전을 배포해야하거나 부하가 증가하면서 Pod를 추가하는 등 여러 가지 동작을 Deployment로 관리할 수 있다.
<Deployment>
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: anotherclass-123 # 이 Deployment가 속한 네임스페이스
name: api-tester-1231 # Deployment의 이름 (클러스터에서 유일)
labels: #식별/분류용 태그 정보
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec: # Deployment 동작 정의
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
replicas: 2 # 항상 2개의 Pod가 살아있도록 유지하라는 의미! (중요!!)
strategy:
type: RollingUpdate # 배포 방식. RollingUpdate를 사용해서 배포/업데이트 중에도 다운타임 없이 순차적으로 파드를 교체
template: # template => 생성할 Pod 설계도
metadata:
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
spec:
nodeSelector:
kubernetes.io/hostname: k8s-master # 해당 Pod가 k8s-master 노드에 배포된다.
containers: # containers => Pod 안에서 실행될 컨테이너 목록
- name: api-tester-1231
image: 1pro/api-tester:v1.0.0
ports:
- name: http
containerPort: 8080
envFrom:
- configMapRef:
name: api-tester-1231-properties
startupProbe: # startupProbe => Pod가 완전히 시작 했는지 검사
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 36
readinessProbe: # readinessProbe => 트래픽을 받을 준비가 됐는지 검사
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
livenessProbe: # livenessProbe => 정상적으로 살아있는지 검사
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 10
failureThreshold: 3
resources: # 자원 설정
requests: # 최소 확보
memory: "100Mi" #Pod가 반드시 100Mi 메모리를 확보 해야한다.
cpu: "100m" #Pod가 반드시 100m cpu를 확보 해야한다.
limits: #최대 허용
memory: "200Mi" # Pod가 최대 200Mi 메모리 허용
cpu: "200m" # Pod가 최대 200m cpu 까지 허용
volumeMounts:
- name: files #files 이라는 볼륨과 연결
mountPath: /usr/src/myapp/files/dev
- name: secret-datasource
mountPath: /usr/src/myapp/datasource
volumes:
- name: files
persistentVolumeClaim:
claimName: api-tester-1231-files
- name: secret-datasource
secret:
secretName: api-tester-1231-postgresql
Service
- 파드들을 통해 실행되고 있는 애플리케이션을 네트워크에 노출(expose)시키는 가상의 컴포넌트다.
https://seongjin.me/kubernetes-service-types/
쿠버네티스에서 반드시 알아야 할 서비스(Service) 유형
파드는 특성상 생성될 때마다 내부 IP 주소가 계속 변화하게 된다. 쿠버네티스의 서비스(Service)는 이러한 파드에 탑재된 애플리케이션이 외부와 상호 통신이 가능하도록 만들어준다. 이번 글에
seongjin.me
apiVersion: v1
kind: Service
metadata: # 서비스 기본정보
namespace: anotherclass-123
name: api-tester-1231
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
selector:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
ports:
- port: 80 # 외부에서 이 Service로 접속할 때 사용할 포트 넘버
targetPort: http # 이 서비스가 받은 트래픽을 해당 파드의 8080포트로 전달한다.
nodePort: 31231 # 클러스터에 소속된 모든 노드의 31231번 포트로 들어오는 모든 트래픽을 이 서비스로 라우팅
type: NodePort
ConfigMap
- 애플리케이션 설정값(환경 변수 등)을 저장한다.
- ex) spring profile, role등 비밀이 아닌 데이터 저장
Secret
- Password, OAuth Token, SSH KEY와 같은 민감한 정보를 저장하는 용도로 사용
- StringData는 쿠버네티스가 자동으로 base64로 인코딩해 저장
- ex) DB 접속 정보(아이디/비번)
apiVersion: v1
kind: ConfigMap
metadata:
namespace: anotherclass-123
name: api-tester-1231-properties
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
data:
spring_profiles_active: "dev" #스프링 프로필(실행 환경)값
application_role: "ALL" #애플리케이션 role
postgresql_filepath: "/usr/src/myapp/datasource/postgresql-info.yaml" #DB 연결정보가 파일로 마운트될 경로
---
apiVersion: v1
kind: Secret
metadata:
namespace: anotherclass-123
name: api-tester-1231-postgresql
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
stringData: # StringData는 쿠버네티스가 자동으로 base64로 인코딩해 저장한다.
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
PV/PVC
쿠버네티스는 PV,PVC라는 두 가지 리소스를 통해, 스토리지가 제공되는 방법에 대한 세부사항을 추상화하는 API를 제공한다.
- PV는 쿠버네티스 클러스터에 미리 등록되어 있는 실제 스토리지를 추상화한 오브젝트를 말한다.
- PVC(Persistent Volume Claim, 영구 볼륨 청구서)는 Pod 또는 사용자가 "이렇게 생긴 스토리지가 필요해요!"라고 클러스터에 요청하는 오브젝트이다.
apiVersion: v1
kind: PersistentVolumeClaim #PVC
metadata:
namespace: anotherclass-123
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: kubectl
spec:
resources:
requests:
storage: 2G # 최소 2GB 크기의 저장공간을 요청
accessModes:
- ReadWriteMany # 여러 노드에서 읽고 쓸 수 있는 저장소 형태를 원함
selector:
matchLabels: # 특정 레이블이 붙은 PV를 찾도록 지정하여 PVC와 PV를 연결한다.
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
---
apiVersion: v1
kind: PersistentVolume #PV
metadata:
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
version: 1.0.0
managed-by: dashboard
spec:
capacity:
storage: 2G # 2GB 용량 제공
volumeMode: Filesystem
accessModes:
- ReadWriteMany
local:
path: "/root/k8s-local-volume/1231" # 해당 PV가 클러스터 내 특정 노드의 로컬 디스크 경로(/root/k8s-local-volume/1231)를 스토리지로 사용
nodeAffinity: # 해당 PV가 반드시 특정 노드인 k8s-master에 붙여지는 저장소임을 지정
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}
HPA( HorizontalPodAutoscaler )
- HPA는 Pod 개수를 자동으로 조절 해주는 기능을 한다.
- 메모리,CPU 사용량과 같은 리소스 사용량을 모니터링하여 임계치를 초과할 경우 Pod수를 늘리고, 임계치 이하로 떨어지면 Pod수를 줄인다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler # Pod수를 자동으로 수평 증감하는 오브젝트
metadata:
namespace: anotherclass-123
name: api-tester-1231-default
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
scaleTargetRef: # 자동 스케일링 대상 리소스 지정
apiVersion: apps/v1
kind: Deployment
name: api-tester-1231
minReplicas: 2 # 최소 파드 개수 지정
maxReplicas: 4 # 최대 파드 개수 지정
metrics: # 어떤 기준으로 스케일링을 할지 지정
- type: Resource
resource:
name: cpu # CPU 사용률을 기준으로 스케일링
target:
type: Utilization
averageUtilization: 60 # CPU 사용률이 60%를 넘으면 파드를 늘리고 그 밑으로 떨어지면 줄이는 방식
behavior:
scaleUp:
stabilizationWindowSeconds: 120
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Jenkins를 활용한 Blue/Green 배포 구현 (3) | 2025.08.05 |
---|---|
[Kubernetes] 배포 전략(Recreate/ RollingUpdate / BlueGreen / Canary) (2) | 2025.08.04 |
[kubernetes] Probe (2) | 2025.07.31 |
쿠버네티스 자동화 모니터링 환경 만들기: Loki-Stack과 Grafana 연동, 쿠버네티스 대표기능 테스트 (2) | 2025.07.29 |
Kubernetes란?, Kubernetes 설치 (2) | 2025.07.29 |