Kubernetes Objects
workload
- Pod - Kubernetes에서 배포 가능한 가장 작은 단위로, 하나 이상의 컨테이너를 포함한다.
- Controller
- Deployment: ReplicaSet을 관리하여 원하는 Pod 수를 보장
- ReplicaSet : 일반적으로 Deployment를 통해 관리되며 특정 수 의 Pod 복제본을 유지
- StatefulSet : 각 Pod에 고유한 ID를 부여하며 상태를 가진 애플리케이션을 관리
- DaemonSet : 클러스터의 모든 노드에서 단일 Pod를 실행
- Job : 특정 작업을 한 번 실행하고 완료
- CronJob : 정기적으로 반복되는 작업을 스케줄링
- HorizontalPodAutoscaler(HPA) : 파드의 오토스케일링을 수행
Storage
- ConfigMap : 애플리케이션 설정 데이터를 관리
- Secret : 민감한 데이터를 암호화하여 저장
- PersistentVolume (PV) : 클러스터에서 관리하는 스토리지 리소스
- PersistentVolumeClaim (PVC) : Pod가 스토리지를 요청하는 방법
Network
- Ingress
- 외부 HTTP(S) 트래픽을 클러스터 내부 서비스로 라우팅
- URL 경로 기반 트래픽 분배 가능
- SSL/TLS 인증서 관리 지원
- Service - 클러스터 내에서 실행 중인 Pod 간의 네트워크 접근을 관리
- ClusterIP : 클러스터 내부에서만 접근 가능
- NodePort : 클러스터 외부에서 접근 가능 (각 노드의 특정 포트를 통해)
- LoadBalancer : 클라우드 제공자의 로드 밸런서를 생성하여 외부 트래픽 처리
Authentication(~/.kube/config 파일로 관리)
- ServiceAccount (SA) - Kubernetes에서 실행되는 Pod가 API 서버에 접근할 때 사용하는 계정
- RBAC - Kubernetes에서 리소스 접근 권한을 정의하고 계정 또는 그룹에 할당(역할 기반 접근 제어)
- Role : 특정 네임스페이스 내에서 리소스에 대한 권한을 정의
- ClusterRole : 클러스터 범위의 리소스 접근 권한을 정의, 네임스페이스에 관계없이 클러스터 전역에서 사용
- RoleBinding : Role과 사용자(ServiceAccount, User)를 연결, 특정 네임스페이스 내에서 사용자의 역할을 설정
- ClusterRoleBinding : ClusterRole과 사용자(ServiceAccount, User)를 연결, 클러스터 전역에서 권한을 설정
Namespace
- Kubernetes 리소스를 논리적으로 분리하는 단위
Resource Limits
- Limits : 컨테이너가 사용할 수 있는 리소스의 상한선
- Requests : 컨테이너가 보장받을 최소 리소스
- ResourceQuota : 네임스페이스 단위에서 리소스 사용량 제한
- LimitRange : 네임스페이스 내에서 리소스 제한 및 기본값 설정
Scheduling
- NodeName : 특정 노드에 Pod를 강제로 배치
- NodeSelector: Pod를 특정 라벨이 있는 노드에만 배치.
- Affinity
- Node Affinity : Pod가 특정 노드에서 실행되도록 제어
- Pod Affinity : Pod가 특정 Pod와 가까운 노드에 배치되도록 제어
- Pod Anti-Affinity : Pod가 특정 Pod와 같은 노드에 배치되지 않도록 제어
- Taints/Tolerations
- Taints : 특정 노드에 Pod가 스케줄링되지 않도록 설정.
- Tolerations : Taints를 무시하고 특정 Pod를 노드에 스케줄링.
- Drain/Cordon
- Drain : 노드에서 실행 중인 Pod를 다른 노드로 이동(배출).
- Cordon : 노드를 유지하면서 새로운 Pod가 스케줄링되지 않도록 막음. -> Drain 실행 시 자동으로 Cordon이 활성화됨
Kubernetes 오브젝트 개요 및 구성 요소
공식문서: https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/
- apiVersion: 사용 중인 Kubernetes API 버전을 명시
- kind: 생성하려는 오브젝트의 종류를 지정
- metadata: 오브젝트를 고유하게 식별할 데이터를 포함 (ex: 이름, UID, 네임스페이스 등)
- spec: 오브젝트의 의도된 상태를 선언
Deployment 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
labels:
app: redis
spec:
replicas: 3 # 3개의 Pod 실행
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:6.2.10 # Redis 컨테이너 이미지
ports:
- containerPort: 6379 # Redis 기본 포트
resources: # 리소스 요청 및 제한 설정
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1"
Kubectl explain 명령어 사용법
특정 오브젝트의 사용 가능한 필드를 확인한다.
- 예시: kubectl explain <오브젝트_이름>
- 하위 필드 탐색 (재귀적으로 사용 가능)
- kubectl explain <오브젝트_이름>.<필드명>
- kubectl explain <오브젝트_이름>.<필드명>.<필드명>...
kubectl explain pods
kubectl explain pods.spec
kubectl explain pods.spec.containers
kubectl explain pods.spec.containers.ports
Kubernetes API 버전 체계
- kubectl api-versions: 현재 사용 가능한 API 버전을 확인한다.
버전 단계특징리스크
| Stable | vX, v1, v2 - 안정화 완료, 변경 가능성 없음 | 안정적, 즉시 사용 가능 |
| Beta | v1betaX, v2betaX - 충분히 검증되었지만, 일부 기능 변경 가능 | 변경 시 downtime 발생 가능 |
| Alpha | v1alphaX, v2alphaX - 기본적으로 비활성화, 실험적인 기능 제공 | 높은 불안정성 |
API 발전 단계
Dev → Alpha → Beta → Stable
Kubernetes 오브젝트 관리 방법
- 명령형 커맨드
- kubectl create
- kubectl run
- kubectl expose
- 명령형 오브젝트 구성 - YAML 파일 기반으로 절차적으로 오브젝트 생성 및 관리
- kubectl create -f a.yml
- kubectl apply -f a.yml
- kubectl replace -f a.yml
- 선언형 오브젝트 구성 - 한 번에 여러 YAML 파일을 디렉토리 단위로 실행
- kubectl apply -f resources/
'kubernetes' 카테고리의 다른 글
| [Kubernetes] Label, Select & Annotation (0) | 2024.12.03 |
|---|---|
| [Kubernetes] Namespace (0) | 2024.11.29 |
| [kubernetes] Pod (0) | 2024.11.27 |
| [Kubernetes] Kubernetes architecture (0) | 2024.11.21 |
| [Kubernetes] Kubernetes Cluster 환경 구축 (0) | 2024.11.20 |