개념 정리
쿠버네티스의 핵심 개념인 Pod, Service, Volume, ConfigMap 및 Secret을 중심으로 이해하기 쉽게 정리해보고자 한다!
Pod - Container, Label, NodeSchedule
Pod의 기본 개념
Pod는 쿠버네티스에서 배포할 수 있는 가장 작은 단위로, 하나 이상의 컨테이너를 포함한다. 같은 Pod 내의 컨테이너들은 스토리지와 네트워크를 공유하며 서로 로컬호스트처럼 통신할 수 있다.
노드 스케줄링
쿠버네티스는 자동으로 Pod를 노드에 배치하지만, 특정 노드에 Pod를 배치해야 하는 경우가 있다. 이를 위한 방법으로는:
- nodeSelector: Pod 명세의 spec 섹션에 특정 레이블을 가진 노드를 지정하는 방법
- Node Affinity: 노드 선택에 더 유연한 표현식을 제공하는 방법
- nodeName: 직접 노드 이름을 지정하는 방법
- Pod 토폴로지 스프레드 제약조건: Pod를 클러스터 전체에 분산하는 방법
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
pod: nginx # 이 레이블을 가진 노드에만 Pod 배치
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
노드 Affinity
Node Affinity는 nodeSelector보다 더 세밀한 제어를 제공한다. 두 가지 유형이 있다:
- requiredDuringSchedulingIgnoredDuringExecution: 조건을 만족하는 노드에만 Pod 배치
- preferredDuringSchedulingIgnoredDuringExecution: 조건을 만족하는 노드를 선호하지만, 필수는 아님
Service - ClusterIP, NodePort, LoadBalancer
Service의 필요성
Pod는 일시적이라 IP 주소가 변경될 수 있어서 직접적인 연결에 의존할 수 없다. Service는 안정적인 IP 주소와 포트를 제공해 Pod에 접근할 수 있게 한다.
Service 유형
쿠버네티스는 다음과 같은 Service 유형을 제공한다:
ClusterIP
- 클러스터 내부에서만 접근 가능한 서비스
- 클러스터 내 Pod 간 통신에 사용
- 기본 Service 유형
NodePort
- 모든 워커 노드의 특정 포트를 통해 서비스 노출
- 외부 네트워크와 연결됨
- 30000-32767 범위의 포트 사용
- 내부적으로 ClusterIP 서비스를 생성
LoadBalancer
- NodePort의 확장으로, 외부 로드 밸런서를 생성
- 단일 외부 IP를 통해 서비스에 접근 가능
- 트래픽을 여러 노드에 분산
- 클라우드 제공자의 로드 밸런싱 기능 활용
ExternalName
- 외부 서비스에 대한 내부 별칭 생성
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- port: 80 # 서비스 포트
targetPort: 8080 # 대상 애플리케이션 포트
nodePort: 30036 # 노드 포트 (NodePort 유형인 경우)
type: ClusterIP # 서비스 유형 (ClusterIP, NodePort, LoadBalancer)
Volume - emptyDir, hostPath, PV/PVC
Volume의 필요성
쿠버네티스의 Pod는 일시적이므로 데이터 지속성을 위해 볼륨이 필요하다. 볼륨은 Pod의 컨테이너 간 데이터 공유나 영구 저장소 역할을 한다.
emptyDir
- 초기에 비어있는 디렉토리로 시작
- 같은 Pod 내 컨테이너 간 데이터 공유에 사용
- Pod가 삭제되면 emptyDir 데이터도 삭제됨
- 일시적인 데이터 사용에 적합
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
spec:
containers:
- name: container1
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: container2
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name: empty-dir
emptyDir: {}
hostPath
- 노드의 파일시스템을 Pod에 마운트
- Pod가 삭제되어도 데이터 유지
- 단, Pod가 다른 노드에 재생성되면 이전 데이터 접근 불가
- 노드의 시스템 파일이나 데이터를 Pod에서 사용할 때 적합
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: host-path
mountPath: /mount1
volumes:
- name: host-path
hostPath:
path: /node-v
type: DirectoryOrCreate
PV/PVC (Persistent Volume/Persistent Volume Claim)
- PV: 관리자가 프로비저닝한 저장소
- PVC: 사용자가 PV에 대한 요청을 정의
- Pod는 PVC를 통해 PV에 접근
- 클라우드 제공자의 저장소 등 다양한 백엔드 지원
- Pod의 생명주기와 독립적으로 데이터 유지
ConfigMap, Secret - Env, Mount
ConfigMap과 Secret의 필요성
애플리케이션 설정과 민감 정보를 컨테이너 이미지와 분리하여 관리할 필요가 있다. 환경별로 다른 설정을 적용할 때 유용하다.
ConfigMap
- 키-값 쌍으로 구성된 비민감 데이터 저장
- 환경 변수, 명령줄 인자, 설정 파일 등에 사용
Secret
- 민감한 정보(비밀번호, API 키 등) 저장
- base64 인코딩으로 저장
- 메모리에 유지되어 보안성 향상
- 크기는 1MB로 제한
사용 방법
- 환경 변수(Literal)로 사용
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-dev
data:
SSH: 'false'
User: dev
---
apiVersion: v1
kind: Secret
metadata:
name: sec-dev
data:
Key: MTIzNA== # base64로 인코딩된 값
---
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: kubetm/init
envFrom:
- configMapRef:
name: cm-dev
- secretRef:
name: sec-dev
- 파일 내용을 ConfigMap/Secret으로 사용
# ConfigMap 생성
echo "Content" >> file-c.txt
kubectl create configmap cm-file --from-file=./file-c.txt
# Secret 생성
echo "Content" >> file-s.txt
kubectl create secret generic sec-file --from-file=./file-s.txt
- 볼륨 마운트로 사용
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: registry.k8s.io/busybox:1.27.2
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
restartPolicy: Never
728x90
반응형
'기록 > Kubenetes' 카테고리의 다른 글
Kubernetes (6) (0) | 2025.04.16 |
---|---|
Kubernetes (5) (1) | 2025.04.15 |
Kubernetes (4) (0) | 2025.04.14 |
Kubernetes (3) (0) | 2025.04.11 |
Kubernetes (1) (0) | 2025.04.08 |