DevOps/Kubernetes

[Kubernetes] 쿠버네티스 오브젝트 정리

연향동큰손 2025. 7. 30. 23:53

쿠버네티스 오브젝트란?

- 클러스터 내부에서 사용자가 관리하고자 하는 리소스의 실체를 의미한다.

- 클러스터의 원하는  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