Pod 수동 스케줄링 : Scheduler를 사용하지 않고 Pod를 특정 노드에 수동으로 할당 (권장되진 않음)
apiVersion: v1
kind: Binding
metadata:
name: nginx
target:
apiVersion: v1
kind: Node
name: node02
Label과 Selector
kubectl get pods -l app=nginx,env=production
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx # <-- 파드에 라벨을 붙임
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.14.2
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # <-- 'app: nginx' 라벨을 가진 파드로 트래픽을 전달
ports:
- protocol: TCP
port: 80
targetPort: 80
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx # <-- 'app: nginx' 라벨을 가진 파드를 찾음
template:
metadata:
labels:
app: nginx # <-- 파드 템플릿에 라벨을 정의
spec:
containers:
- name: nginx
image: nginx
Annotation
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-with-annotations
labels:
app: nginx
annotations:
kubernetes.io/change-cause: "Initial deployment for version 1.0"
deployment.website.com/build-date: "2023-10-27"
deployment.website.com/commit-sha: "a1b2c3d4e5f6g7h8"
spec:
containers:
- name: nginx
image: nginx:latest
Taint와 Toleration
kubectl taint nodes node1 app=blue:NoSchedule
apiVersion: v1
kind: Pod
metadata:
name: special-pod
spec:
containers:
- name: my-container
image: nginx
tolerations:
- key: "app"
operator: "Equal"
value: "blue"
effect: "NoSchedule"
Node Selector
kubectl label nodes <노드이름> disktype=ssd
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
nodeSelector:
disktype: ssd
containers:
- name: my-container
image: my-image
Node Affinity
apiVersion: v1
kind: Pod
metadata:
name: my-pod-with-affinity
spec:
# Node Affinity 규칙을 정의합니다.
affinity:
nodeAffinity:
# 필수 규칙: 스케줄링 시 반드시 일치하는 노드가 필요합니다.
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: my-container
image: nginx
Taint & Toleration과 Node Affinity 를 같이 사용하여 특정 Node를 특정 Pod 전용으로 만들기
Resource Requests & Resource Limits
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
apiVersion: v1
kind: LimitRange
metadata:
name: limit-range-example
namespace: test-limit-range # 생략시 default 네임스페이스
spec:
limits:
- default: # 기본 Limit
cpu: 500m
memory: 512Mi
defaultRequest: # 기본 Request
cpu: 200m
memory: 256Mi
max: # namespace에서 설정할 수 있는 최대 리소스
cpu: 1
memory: 1Gi
min: # namespace에서 설정할 수 있는 최소 리소스
cpu: 100m
memory: 128Mi
type: Container
apiVersion: v1
kind: ReesourceQuota
metadata:
name: my-resource-quota
spec:
hard:
requests.cpu: 4
requests.memory: 4Gi
limits.cpu: 10
limits.memory: 10Gi
DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-daemon
spec:
selector:
matchLabels:
app: monitoring
template:
metadata:
labels:
app: monitoring
spec:
containers:
- name: my-container
image: nginx
Static Pod
Priority Class
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for high priority service pods."
apiVersion: v1
kind: Pod
metadata:
name: my-high-priority-pod
spec:
containers:
- name: my-container
image: nginx
priorityClassName: high-priority # <-- 여기에 priority class 이름을 지정
Custom Scheduler
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
schedulerName: my-custom-scheduler # <-- 스케줄러 이름 지정
containers:
- name: my-container
image: nginx
Scheduler Profiles
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: "/etc/kubernetes/scheduler.conf"
profiles:
- schedulerName: default-scheduler
- schedulerName: batch-scheduler
plugins:
preFilter:
disabled:
- name: "TaintToleration"
filter:
disabled:
- name: "TaintToleration"
score:
disabled:
- name: "ImageLocality"
Admission Controller
쿠버네티스 API 서버에서 인증(Authentication) 및 인가(Authorization)를 통과한 요청을 최종적으로 처리하기 전에, 요청을 검증하거나 수정하는 역할
RBAC(역할 기반 접근 제어)와 같은 인가(Authorization) 메커니즘은 "어떤 사용자가 어떤 종류의 API 작업(예: 파드 생성, 삭제 등)을 수행할 수 있는가?"를 정의합니다. 하지만 "사용자가 생성하려는 파드에 특정 정책을 적용하는가?"와 같은 더욱 세부적인 제어는 불가능. 이런 상황에 Admission Controller가 필요
동작 과정

내장된 Admission Controller
웹훅을 기반으로 한 Custom Admission Controller를 사용할 수도 있음