Kubernetes발행일 2025. 7. 21.원본 https://blog.naver.com/jword_/223938600187 ↗

Kubernetes Pod & Object

Kubernetes Pod & Object — #개발자의도구들 #쿠버네티스 #쿠버네티스오브젝트 #Kubernetesobject #k8sobject #k8spod #쿠버네티스포...

#DevOps/cloudOps#Naver Blog

#개발자의도구들 #쿠버네티스 #쿠버네티스오브젝트 #Kubernetesobject #k8sobject #k8spod #쿠버네티스포드 #쿠버네티스pod

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다

\* 현재 Spring x 프로젝트를 진행하고 있습니다. 전체 목차를 보시려면 여기를 눌러주세요.

\* Devops stack: 여기

\* 리눅스 기본기: 여기

Object

앞서 k8s 아키텍처를 소개하면서 컴포넌트들에 대해서만 다뤘습니다. 사실 기존에 다뤘던 부분은 크게 우리가 관여할게 없습니다. 하지만, 이번글에서 다룰 부분은 매우 중요하며, 우리가 직접적으로 컨트롤 하기 때문에 꼭 잘 이해하는 것이 중요합니다.

​

👉 Object란 무엇인가?

일반적으로 프로그래밍 언어에서 다루는 오브젝트와는 조금 다른, 그렇다고 완전히 다르다고는 볼 수 없는 존재입니다.

​

공식 문서의 표현을 빌리자면 "의도를 담은 레코드"입니다. 그럼 중요한 것은 어떤 의도를 가지고 있냐인데, 이 의도는 사실상 우리가 k8s에서 다뤄야할 대부분을 포함합니다.

​

앞서 우리가 왜 k8s를 사용했는지 되짚어 봅시다. 다음과 같은 이유가 있을 것입니다.

text 코드 예제
                                    1. 서버를 자동으로 켜기 위해

2. 서버를 자동으로 확장하기 위해

3. LB를 자동으로 구성 및 조정하기 위해

4. 서버가 사용할 리소스를 조정하기 위해

...

여기서 알 수 있듯 우리는 서버에 초점을 맞춰서 k8s를 다뤄야 합니다. 즉 우리가 k8s를 사용하는 궁극적인 목적은 우리의 서버를 잘 운영하기 위해서입니다. 네, 여기서 의도가 뭔지 나왔습니다. Object는 서버를 정상적으로 운영하기 위해 사용자의 의도를 담은 문서입니다.

​

Pods

그전에, 우리는 Pod을 먼저 이해해야합니다. 그전에 아래 사항을 참고해주세요,

text 코드 예제
                                    ⚠️ k8s는 구글 만큼이나 거대한 글로벌 서비스를 안정적으로 운영하기 위해 고안된
시스템이기 때문에, 그만큼 매우 다양한 기능을 가지며, 매우 복잡한 구조를 가지고 있다.

우리가 배우는 이런 개념들은 직접 부딪혀 보지 않으면 잘 와닿지 않는다.
(부딪혀도 잘 안와닿음... 글로벌 대규모 서비스를 다룰 기회가 인생에 몇번이나 있을까?)

또한 해가 거듭날 수 록 개념들이 새로 등장하거나 사라지기도 하기 때문에 너무 모든 것을 구체적
으로 기억하려고 하지 말자.

Pods는 쿠버네티스에서 배포될 수 있는 가장 작은 단위의 유닛들을 의미합니다. 하나의 Pod에는 컨테이너 단 하나만 포함될 수도 있고, 혹은 여러개의 컨테이너를 묶어 하나의 배포 단위로 간주할 수 있습니다.

​

"하나의 기능을 수행하는 컨테이너 집합"으로 이해하시면 좀 더 직관적이지 않을까 생각합니다. 아래 그림을 머릿속에 그려두세요.(docker은 지원 안돼니 귀여운 podman으로 대체)

이미지

YAML

k8s에서 사용는 Obejct는 모두 yaml파일 형태로 저장합니다. k8s는 object yaml 파일을 읽어 들여 pod를 관리합니다.

ex) my-server-deployment.yaml, my-service.yaml ....

​

구체적인 파일 예시는 아래에 object 설명하면서 개별로 정리하겠습니다.

​

Deployment.yaml

Deployment는 Pod를 실행 및 관리하는 가장 기본적인 오브젝트 파일입니다. 구체적인 yaml 파일 양식을 보면서 설명하는게 더 쉬워보이네요.

yaml 코드 예제
                                    apiVersion: apps/v1
kind: Deployment
metadata:
  name: x-front
spec:
  replicas: 3
  selector:
    matchLabels:
      app: x-front
  template:
    metadata:
      labels:
        app: x-front
    spec:
      containers:
        - name: x-front
          image: docker.io/toolod/x-frontserver:1.0.0-20250420-fbc5533
          args: ["--spring.profiles.active=beta"]
          ports:
            - containerPort: 8080

이건 제가 직접 작성한 spring 서버를 실행하는 deployment.yaml 파일입니다. 여기서 주목해야할 부분은 pod를 어떻게 실행하냐인데, 아래 부분만 주목해서 보시면 됩니다.

​

yaml 코드 예제
                                    spec:
  replicas: 3 // 👉 3개의 pod로 유지하겠다.
  ---
  ---
spec:
  template:
      spec:
          containers:
            - name: x-front
              image: docker.io/toolod/x-frontserver:1.0.0-20250420-fbc5533 // 👉 컨테이너에 사용할 이미지
              args: ["--spring.profiles.active=beta"]
              ports:
                - containerPort: 8080 // 👉 사용할 컨테이너 port

해당 코드는 helm을 사용한 코드라서, 처음 하시는 분들은 해당 코드 대신 다른 블로그 코드를 참고해주세요.

​

설명이 길어질 수록 좀 더 복잡해질 것 같아서 아래 몇가지만 기억해두시면 될 것 같습니다.

​

  1. pod를 몇개로 유지할 것인지?
  1. 어떤 이미지를 사용할 것인지?

​

만약 replicas를 3으로 지정하고 임의로 pod하나를 제거한다면, k8s는 자동으로 하나를 다시 생성합니다.

​

Service.yaml

Service는 통신에 사용됩니다. 우리가 Pod를 띄운 후 해당 서버에 접속하기 위해서 필요한게 바로 이 Object입니다. Service는 3개의 종류가 있습니다.

​

  1. Cluster IP
  • Cluster 내부 전용 서비스로 클러스터 내부의 Pod간 통신을 위한 서비스

​

  1. Node Port
  • 외부 통신을 가능하게 함
  • Node의 특정 고정 포트를 열어 Pod와 외부와의 접속이 가능하게 해준다.

​

  1. LB
  • 앞서 배운 LoadBalancer

​

실제 서비스를 하는 경우 대부분 LB를 사용하기 때문에 LB 동작 원리만 잘 이해하시면 될 것 같습니다.

Service를 온전히 이해하기 위해서는 클러스터 내부 네트워크를 이해해야해서, 이부분은 넘어가도록 하겠습니다.

​

Object file 예시입니다.

yaml 코드 예제
                                    apiVersion: v1
kind: Service
metadata:
  name: x-front-service
spec:
  type: LoadBalancer  // 👉 타입 지정
  selector:
    app: x-front
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

REF

이미지

[쿠버네티스 오브젝트 이해하기
이 페이지에서는 쿠버네티스 오브젝트가 쿠버네티스 API에서 어떻게 표현되고, 그 오브젝트를 어떻게 .yaml 형식으로 표현할 수 있는지에 대해 설명한다. 쿠버네티스 오브젝트 이해하기 쿠버네티스 오브젝트 는 쿠버네티스 시스템에서 영속성을 가지는 오브젝트이다. 쿠버네티스는 클러스터의 상태를 나타내기 위해 이 오브젝트를 이용한다. 구체적으로 말하자면, 다음같이 기술할 수 있다. 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지) 그 애플리케이션이 이용할 수 있는 리소스 그 애플리케이션이 어떻게 재구동 정책,...
kubernetes.io](https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/)

​