티스토리 뷰
여러가지 pod 스케쥴링 기법을 적절하게 잘 활용하여야 한다
- 일반적인 배포방법 (deploy,statefulset,daemonset)
각각의 pod 컨트롤러를 사용하여 기본적으로 배치
deployment = 수량에 맞게 적절하게 배포됨
statefulset = 수량에 맞게 순서대로 headless서비스와 pv를 붙힐수 있음
daemonset = 모든 노드에(혹은 노드셀렉터 사용) 원하는 파드를 배치
- 일반적인 배포 + 노드셀렉터 사용
파드를 배치할때 노드 셀럭터를 이용하여 특정 노드나 특정 노드그룹에만 파드를 스케쥴 할 수 있음
- 일반적인 배포 + 어피니티 사용
어피니티를 사용하면 좀더 복잡한 전략을 사용하여 파드를 스케쥴링 할 수 있음
어피니티도 기본은 레이블링 이지만 노드/파드를 다 선택하여 파드를 배치 할 수 있는데
이는 특정 파드가 생성된 노드에 배치를 시키거나 특정 파드가 있는 노드를 회피하는 등으로 파드의 스케쥴링 방법을 크게 확장 시킬 수 있다
노드어피티니
노드어피니티는 기본적으로는 노드셀렉터와 비슷하지만 아래의 두가지 옵션으로 차이점이 있다
requiredDuringSchedulingIgnoredDuringExecution
required는 규칙을 반드시 만족해야 하는 조건으로 노드셀렉터와 비슷하게 사용 할수 있다
preferredDuringSchedulingIgnoredDuringExecution
preferred의 경우 가능하면 조건의 만족하는 노드에 배치되나 만족하지 않는 경우 조건에 맞지 않는 노드에도 배치 될수 있다
required를 hard로 preferred를 soft로 생각하면 이해가 쉽다
- 사용예제
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
위 예제로 배포한 파드는 노드의 레이블을 체크하여 kubernetes.io/e2e-az-name 키의 값이 e2e-az1 e2e-az2인 노드에만 배포가 된다 해당 키와 값이 있는 노드가 없다면 파드는 그 어디에도 배치되지 않는다
또한 해당 값이 있는 노드들 중 키가 another-node-label-key이고 값이 another-node-label-value를 가진 노드를 선호하도록 선언했다 해당값이 없는 노드라도 파드는 배치될수 있으나 있는 노드가 있다면 해당 노드에 배치가 된다
파드 어피니티와 안티어피니티
파드의 경우 어피니티와 안티어피니티 두가지를 사용 할 수 있다
어피니티는 노드와 동일하게 사용하고 안티어피니티는 특정 pod가 배치된 노드를 회피하기 위해 사용 한다
- 사용예제
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: k8s.gcr.io/pause:2.0
위 예제로 배포되는 파드는 어피니티+required로 인해 security: S1값이 레이블링 되어있는 하나이상의 이미 실행중인 파드와 동일한 노드에만 스케쥴 할수 있다
해당 파드가 없다면 이 파드는 스케쥴링 되지 않는다
안티어피니티+preferred로 인하여 파드의 레이블 중 security: S2값이 있는 파드가 배치되어있는 노드를 회피하도록 설정 하였다
- 어피니티를 잘 활용하는 예제 중 하나다
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: web-store
replicas: 3
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-store
topologyKey: "kubernetes.io/hostname"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.16-alpine
위의 디플로이먼트는
redis와 web서버 파드를 각각 배포하는 디플로이먼트 이다
어피니티와 안티어피니티를 적절하게 사용하여 레디스는 노드가 겹치지 않도록 (안티어피니티로 자신의 label을 선택했기때문) 분배되어 배포되고 웹서버의 경우도 동일한 안티어피니티로 각각의 노드에 배치되지만 어피니티로 레디스의 레이블을 지정하였기때문에 레디스와 동일한 노드에 배치된다
- taint tolerations
테인트와 톨러레이션은 파드가 아닌 노드에 설정하는 속성이다
아래와 같이 노드에 taint를 설정하면
kubectl taint nodes node-1-hostname gpu=good:Noschedule
파드의 속성중 gpu: good톨러레이션이 없다면 파드는 해당 노드에 배치되지 않는다
위 테인트가 설정된 노드에 파드를 배치하려면 아래와 같이 배포하여야 한다
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "gpu"
operator: "Equal"
value: "good"
effect: "NoSchedule"
위처럼 톨러레이션이 없는 파드의 경우 해당 노드에 배치되지 않는다
'클라우드 > 쿠버네티스' 카테고리의 다른 글
secret data 수동으로 base64인코딩시 주의점 (0) | 2022.05.24 |
---|---|
PVC Extend (0) | 2022.05.24 |
Configmap과 Secret (0) | 2022.05.24 |
Internal LoadBalancer 생성하기 (0) | 2022.05.24 |
엘라스틱 서치 security 설정 (0) | 2022.05.24 |