Kubernetes Pod & Object
Kubernetes Pod & Object — #개발자의도구들 #쿠버네티스 #쿠버네티스오브젝트 #Kubernetesobject #k8sobject #k8spod #쿠버네티스포...
#개발자의도구들 #쿠버네티스 #쿠버네티스오브젝트 #Kubernetesobject #k8sobject #k8spod #쿠버네티스포드 #쿠버네티스pod
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 Spring x 프로젝트를 진행하고 있습니다. 전체 목차를 보시려면 여기를 눌러주세요.
\* Devops stack: 여기
\* 리눅스 기본기: 여기
Object
앞서 k8s 아키텍처를 소개하면서 컴포넌트들에 대해서만 다뤘습니다. 사실 기존에 다뤘던 부분은 크게 우리가 관여할게 없습니다. 하지만, 이번글에서 다룰 부분은 매우 중요하며, 우리가 직접적으로 컨트롤 하기 때문에 꼭 잘 이해하는 것이 중요합니다.
👉 Object란 무엇인가?
일반적으로 프로그래밍 언어에서 다루는 오브젝트와는 조금 다른, 그렇다고 완전히 다르다고는 볼 수 없는 존재입니다.
공식 문서의 표현을 빌리자면 "의도를 담은 레코드"입니다. 그럼 중요한 것은 어떤 의도를 가지고 있냐인데, 이 의도는 사실상 우리가 k8s에서 다뤄야할 대부분을 포함합니다.
앞서 우리가 왜 k8s를 사용했는지 되짚어 봅시다. 다음과 같은 이유가 있을 것입니다.
1. 서버를 자동으로 켜기 위해
2. 서버를 자동으로 확장하기 위해
3. LB를 자동으로 구성 및 조정하기 위해
4. 서버가 사용할 리소스를 조정하기 위해
...
여기서 알 수 있듯 우리는 서버에 초점을 맞춰서 k8s를 다뤄야 합니다. 즉 우리가 k8s를 사용하는 궁극적인 목적은 우리의 서버를 잘 운영하기 위해서입니다. 네, 여기서 의도가 뭔지 나왔습니다. Object는 서버를 정상적으로 운영하기 위해 사용자의 의도를 담은 문서입니다.
Pods
그전에, 우리는 Pod을 먼저 이해해야합니다. 그전에 아래 사항을 참고해주세요,
⚠️ 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 파일 양식을 보면서 설명하는게 더 쉬워보이네요.
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를 어떻게 실행하냐인데, 아래 부분만 주목해서 보시면 됩니다.
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을 사용한 코드라서, 처음 하시는 분들은 해당 코드 대신 다른 블로그 코드를 참고해주세요.
설명이 길어질 수록 좀 더 복잡해질 것 같아서 아래 몇가지만 기억해두시면 될 것 같습니다.
- pod를 몇개로 유지할 것인지?
- 어떤 이미지를 사용할 것인지?
만약 replicas를 3으로 지정하고 임의로 pod하나를 제거한다면, k8s는 자동으로 하나를 다시 생성합니다.
Service.yaml
Service는 통신에 사용됩니다. 우리가 Pod를 띄운 후 해당 서버에 접속하기 위해서 필요한게 바로 이 Object입니다. Service는 3개의 종류가 있습니다.
- Cluster IP
- Cluster 내부 전용 서비스로 클러스터 내부의 Pod간 통신을 위한 서비스
- Node Port
- 외부 통신을 가능하게 함
- Node의 특정 고정 포트를 열어 Pod와 외부와의 접속이 가능하게 해준다.
- LB
- 앞서 배운 LoadBalancer
실제 서비스를 하는 경우 대부분 LB를 사용하기 때문에 LB 동작 원리만 잘 이해하시면 될 것 같습니다.
Service를 온전히 이해하기 위해서는 클러스터 내부 네트워크를 이해해야해서, 이부분은 넘어가도록 하겠습니다.
Object file 예시입니다.
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/)

