
1. Pod
Pod는 한 개 이상의 컨테이너로 구성된 쿠버네티스 기본 배포 단위이다. 하나의 Pod에 여러 개의 컨테이너가 있는 경우 파드 내의 컨테이너들은 같은 가상머신에 배치되며, 같은 네트워크 네임스페이스, IP 주소 및 포트 공간을 공유한다. 파드 내의 컨테이너들은 서로를 localhost로 찾아 통신할 수 있다.
2. Controller

Pod는 Controller를 통해 배포될 수 있다. Controller에는 ReplicaSet, Deployment, DaemonSet, Job, Cron Jobs, StatefulSet이 있다.
Replicaset
Pod는 ReplicaSet을 통해 배포가 된다. ReplicaSet은 지정된 수의 Pod 복제본을 유지하도록 관리하고 Probe를 적용해 일정주기로 컨테이너의 상태를 확인할 수 있다. Probe에는 livenessProbe와 readinessProbe가 있다.
livenessProbe는 컨테이너가 실행 중인지 확인한다. 이 Probe가 실패하면 컨테이너를 자동으로 재시작한다.
readinessProbe는 컨테이너가 클라이언트 요청을 처리할 준비가 되었는지 확인한다. Probe가 성공하면 컨테이너가 트래픽을 받고 실패하면 트래픽을 받지 않는다. 또한 Pod가 배포될 컨테이너의 하드웨어 스펙을 명시할 수 있다.
Deployment
Deployment는 Replicaset의 상위 개념으로 desire state를 선언하고 쿠버네티스는 상태를 유지하기 위해 동작한다. Deployment를 통해 애플리케이션의 지속적인 업데이트와 롤백이 가능하다.
새로운 버전으로 업데이트를 할 때 두 가지 방식이 있다. 파드를 하나씩 교체하는 롤링 업데이트 방식과 새로운 파드가 준비되면 기존 파드의 트래픽을 한 번에 새로운 파드로 돌리는 Blue/Green 방식이 있다. 롤링업데이트 방식은 이전 버전과 현재 버전이 같이 동작되어도 될 때만 사용한다.
Deployment와 Replicaset은 다음과 같은 yml을 작성하여 실행할 수 있다.
apiVersion: apps/v1
# 파일이 정의 하는 쿠버네티스 리소스는 Deployment 이다.
kind: Deployment
metadata:
name: kubespring
labels:
app: kubespring
spec:
# 3개의 파드를 배포
replicas: 3
# kubespring 이라는 레이블을 가진 파드를 관리
selector:
matchLabels:
app: kubespring
template:
metadata:
labels:
app: kubespring
spec:
containers:
- name: kubespring
# 컨테이너 이미지 선택
image: [도커허브 이미지 주소]
ports:
# 컨테이너 포트 번호는 8080
- containerPort: 8080
# 이 Pod의 8080포트 경로는 /api/check/health로 livenessProbe 동작
livenessProbe:
httpGet:
path: /api/check/health
port: 8080
# 처음시작하고 15초뒤부터 프로브 가동
initialDelaySeconds: 15
# 20초 주기로 가동
periodSeconds: 20
# 이 Pod의 8080포트 경로는 /api/check/health로 livenessProbe 동작
readinessProbe:
httpGet:
path: /api/check/health
port: 8080
# 처음시작하고 5초뒤부터 프로브 가동
initialDelaySeconds: 5
# 20초 주기로 가동
periodSeconds: 20
# 컨테이너가 필요로 하는 최소 리소스와 최대 사용할 리소스 설정
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
StatefulSet

Replicaset으로 배포한 애플리케이션은 stateless 한 애플리케이션들이다. DB와 같이 statefull 한 애플리케이션을 배포할 때는 StatefullSet을 이용하여 배포한다. Stateless 한 앱과 달리 랜덤 액세스 할 수 없기 때문에 각각의 파드의 IP 주소를 통해 접근한다.
StatefullSet은 Volume을 바인딩해서 배포한다. PersistentVolumeClaim을 사용하여, 애플리케이션이 필요로 하는 볼륨의 스펙을 정의할 수 있으며 이를 통해 PersistentVolume과 Pod가 동적으로 바인딩되어 데이터 지속성을 보장한다.
DaemonSet
DaemonSet은 Pod가 각각의 노드에서 하나씩만 동작되게 하는 형태로 Pod를 관리하는 컨트롤러이다. Daemonset에서 관리하는 Pod는 모든 노드에 균등하게 하나씩만 배포된다. 노드단위로 로그추적, 모니터링을 할 때 사용된다. Daemonset은 Pod의 node selector를 이용해서 특정 노드에만 Pod를 배포할 수 있도록 지원한다.
Job
한번 실행되고 끝나는 형태의 작업을 배포할 때 사용된다. Job에 의해서 관리되는 Pod는 Job이 종료되면 Pod를 같이 종료한다. 장애발생 시 중간에 멈춘 작업을 처음부터 다시 실행해도 이상이 없는지 여부에 따라 다시 시작할지, 안 할지를 결정할 수 있다. 병렬로 여러 Pod들을 실행하는 기능을 지원한다. 반복적으로 해야 할 Job은 Cron Job을 이용해서 scheduling 할 수 있다.
3. Service

서비스는 파드의 집합에 단일 접근 지점을 제공하여 파드에 접근할 수 있도록 한다. 특히 파드가 스케일링되거나 재생성될 때 IP 주소가 변경되는데 이때 레이블을 통해 파드로 연결되기 때문에 연속적인 서비스 제공이 가능하다. 서비스는 멀티포트 기능으로 여러 포트에서 접근할 수 있고 로드밸런싱을 통해 서비스로 들어온 트래픽을 파드에 분산하여 전달할 수 있다.
서비스의 타입으로는 ClusterIP, ExternalName, NodePort, LoadBalancer가 있다.
ClusterIP
ClusterIP는 클러스터 내부에서만 접근 가능한 고유한 IP 주소를 할당받아, 파드 그룹에 접근할 수 있다.
ExternalName
쿠버네티스 내부에서 외부서비스를 호출할 때 사용한다. 클러스터 내의 Pod들은 ClusterIP를 가지고 있기 때문에 ClusterIP 대역 밖의 서비스를 호출하고자 하면 설정이 필요하다.
NodePort
NodePort는 ClusterIP 뿐만 아니라 노드의 IP와 포트로 외부에서 접속할 수 있게 만든 서비스이다.
LoadBalancer
LoadBalancer는 클라우드 제공자(GKE)가 자동으로 프로비저닝 하여 사용되며 할당된 외부 IP를 통해 클러스터 내부 서비스를 배포시켜 준다.
아래 yml은 GKE상에 위에서 Deployment를 통해 만든 Pod를 LoadBalancer 타입의 서비스를 사용하여 배포하는 스크립트이다.
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service
spec:
type: LoadBalancer
selector:
app: kubespring
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30000
Headless Service
요청이 서비스를 통해 파드로 전달되는 것이아닌 서비스에 연결된 Pod에 바로 전달되는 서비스이다. StatefulSet Controller에 사용되는 서비스이다.
4. Ingress

Ingress는 클러스터 외부에서 내부의 서비스로 HTTP, HTTPS 트래픽을 라우팅하는 규칙을 관리하는데 사용된다. Ingress를 사용하면 URL, 호스트이름, 경로 등을 기반으로 라우팅 규칙을 생성할 수 있으며 이를 통해 외부요청을 적절한 서비스로 전달할 수 있다. Nginx와 유사하다. Ingress 컨트롤러는 Ingress 규칙을 실제로 구현하고, 외부 트래픽을 적절한 서비스로 전달하는 역할을 한다.
5. Volume
emptyDir
Pod가 생성될때 생성되고, Pod가 삭제될때 같이 삭제되는 임시 Volume이다. 컨테이너가 재시작되어도 emptyDir의 LifeCycle은 Pod단위이기 때문에 계속사용이 가능하다.
hostPath
hostPath는 노드의 로컬 디스크의 경로를 Pod에서 마운트해서 사용한다. 같은 hostPath에 있는 볼륨은 여러 Pod 사이에서 공유되어 사용된다. 노드단위의 디스크이다.
PV, PVC
PV(Persistent Volume), PVC(Persistent Volume Claim)
PVC에 원하는 볼륨의 스펙을 정의하고 pod를 만들 때 PVC를 설정하면 PVC에 적은 스펙을 기반으로 PV를 만들어 동적으로 바인딩을 해준다.
6. ConfigMap, Secret
ConfigMap과 Secret은 애플리케이션의 설정정보나 보안에 관련된 정보를 관리하는데 사용되는 리소스 이다.

애플리케이션의 설정파일을 관리하는데 사용될 수 있다.
ConfigMap은 주로 애플리케이션의 일반적인 구성 정보를 저장하는 데 사용되며
Secret은 인증서, 토큰, DB 접속 계정 및 비밀번호와 같은 민감한 정보를 저장하는데 사용된다.
Secret으로 저장할 경우 암호화 되어 저장된다.
환경변수를 통해 주입하는방법과 File형태로 전달하는 방법이 있다.
7. Namespace
Namespace는 쿠버네티스에서 리소스를 격리하여 관리하는 방법중하나로 네임스페이스를 분리하면 하나의 클러스터 내에서 여러 프로젝트간의 리소스를 분리하여 사용할 수 있다.
'Kubernetes' 카테고리의 다른 글
| Kubernetes Architecture (0) | 2024.01.31 |
|---|---|
| Kubernetes Intro (0) | 2024.01.30 |