쿠베르네트스는 통속적이고 알기 쉬운 영어로 이야기를 했다
"Where should the pods be deployed?"
Pods always execute inside a Node.
But but.. there are so many Nodes - which one should node should I deploy this pod to ??!
Hello - "Kubernetes Scheduler"
Kubernetes 스케줄러가 어떻게 작동하는지, 그리고 간단한 영어로 노드를 선택하는 방식을 클래스별로 분석해 봅시다.
만약에 우리가'사교 식당'을 하나 가지고 있다면 거기에 우리는 몇 개의 테이블과 각 테이블 주위의 몇 개의 좌석이 있고 많은 고객과 호텔 종업원이 있다.'사교 식당'은 좌석이 충분하고 모든 조건이 충족되면 서로 다른 고객이 같은 테이블 옆에 둘러앉을 수 있다는 뜻이다.
표 = 노드(VM 또는 물리적 시스템)
자리 = 가상 시스템의 리소스 가용성
종업원 = 쿠버 스케줄러
고객 기반 = Pod
그룹 내 단일 고객 = 컨테이너
1. 리소스 요구사항 및 가용성
한 **고객군*식당에 들어가서 간단하게 테이블 하나를 앉으라고 요구한다.종업원은 고객층의 수요를 분석하고 좌석이 얼마나 필요한지 확인한다.그리고 그는 사용할 수 있는 모든 탁자를 살펴보고'배치'가 불가능한 탁자를 선별하여 좌석 요구를 충족시킬 수 있는 탁자를 분배(귀속)했다.*
이것은 기본적인 스케줄링 방식입니다. kube 스케줄러가 API 서버를 계속 감시하여 스케줄링되지 않은 POD가 있는지 확인합니다.POD의 각 컨테이너에 대한 리소스 요구사항을 봅니다.
Remember the containers are the ones which have the resource requirement in the spec not the pods themselves.
다음 예에서pod배치된 용기 규범에 따라 CPU와 메모리 수요가 있습니다.500밀리 CPU 및 128 MiB 메모리가 필요합니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
resources:
requests:
memory: "128Mi"
cpu: "500m"
이제 충분한 용량을 확보하기 위해 그 중 하나 (식당 테이블) 를 살펴보자.Dell의 접근 방식은 다음 명령을 실행하는 것입니다.kubectl describe nodes <node-name>
그것은 노드의 모든 속성을 출력하지만, 우리가 흥미를 느끼는 것은 용량과 분배성이다.CPU와 메모리는 유일한 선별 기준이 아니라 지구성 저장소, 네트워크 포트와 같은 요구 사항도 많다는 것을 명심하십시오.여기에 상세한 명세서가 있다.
2. 노드 선택기
또 다른 **고객층*은 식당에 와서 그 어떤'파란색'탁자 위에 놓아 달라고 요구했다.종업원은 그의 재고를 살펴보고 모든 라벨이 파란색인 탁자를 찾아 고객군을 상응하는 탁자에 배치한다*
이 경우,pod는 노드 선택기 (키 값 쌍) 를 지정합니다. 이 선택기는pod를 키 값과 일치하는 모든 노드에 배치할 것을 요청합니다.
다음은 새 YAML 파일의 모양입니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-blue
spec:
containers:
- name: nginx
image: nginx:1.7.9
nodeSelector:
color: blue
모든 my 노드를 조회해서 탭이 '파란색' 인지 확인하기 위해서 다음 명령을 실행합니다.kubectl get nodes --show-labels
목록에서'worker-2'의 라벨이color=blue인 것을 볼 수 있습니다.Kubernetes도 내장 탭을 제공합니다.위대하다만약 지금 그것을 배치한다면, 스케줄러는 자동으로 그것을 정확한 노드에 분배할 것이다.(일꾼2).우리는 아래 명령을 실행해서 이 점을 확인할 수 있다.
kubectl get pod -o wide
Note that if you did not have a node with the appropriate label the deployment would be Pending.
3. 노드 친화력과 반친화력
노드 친화력과 반친화력은 노드 선택기와 매우 유사하지만 표현적 언어와 소프트/하드 선호를 지원하여 하드 수요가 아니라 더욱 큰 유연성을 제공합니다.
다른 **고객군이 식당에 온다고 가정해 보세요.그들은 어떤 해경의 책상 위에 놓는 것을 좋아하지만, 반드시 필요한 것은 아니다.종업원은 그의 재고를 살펴보고 "ocean"라벨이 표시된 모든 탁자를 찾아 고객군을 상응하는 탁자에 분배한다*
이 예에서pod는 nodeAffinity를 정의하여 키 값이 -->view:ocean과 일치하는'노드'를 더 좋아한다는 것을 나타낸다. (우리는 아래의 일치 표현식을 통해 실현한다)
여기에는 두 가지 옵션이 있습니다.
preferredDuringSchedulingIgnoredDuringExecution: 조건에 맞는 노드를 우선적으로 선택하지만 노드에 분배될 때에는 보장되지 않습니다.
requiredDuringSchedulingIgnoredDuringExecution: 노드를 선택할 때 조건에 맞는 노드가 필요하다는 것을 의미합니다.IgnoreDuringExecution은 이전과 같습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-oceanview
spec:
containers:
- name: nginx
image: nginx:1.7.9
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: view
operator: In
values:
- ocean
The operator in this case can also be other values such as In, NotIn, Exists, DoesNotExist, Gt, Lt. NotIn and DoesNotExist will create the opposite effect of nodeAntiAffinity
4. Pod 친화력과 반친화력
또 다른 채식 소녀 길드 * 고객군 * 식당에 왔습니다.그들은 이미 육식자가 앉은 탁자 위에 놓아서는 안 된다는 요구가 있었다.그들은 약간 까다롭다. 그들은 아직도 남자아이가 앉은 책상 위에 앉고 싶어 한다.다시 말하면 그들은 육식자에게는 친화력이 없지만 남자아이에게는 친화력이 있다*
실제 장면을 예로 들겠습니다. 이 장면에서 리디스 캐시와 웹 서버 배치가 있습니다.조건은 다음과 같습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
apptype: redis-cache
replicas: 3
template:
metadata:
labels:
apptype: redis-cache
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: apptype
operator: In
values:
- redis-cache
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
위의 예에서는 다음과 같이 설명합니다.이제 웹 서버 배치 YAML 파일을 살펴보겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
apptype: web-server
replicas: 3
template:
metadata:
labels:
apptype: web-server
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: apptype
operator: In
values:
- web-server
topologyKey: "kubernetes.io/hostname"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: apptype
operator: In
values:
- redis-cache
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.12-alpine
위의 예에서는 다음과 같이 설명합니다.5. 오점과 용인
이번에는 식당 테이블 하나가 땅콩 유출 사고로 오염됐다.그래서 알레르기 반응을 피하기 위해 이 테이블에 새로운 ** 고객군을 배치하지 않겠다고 합니다.따라서 이 오염된 표를 제외한 모든 새로운 고객팀은 다른 표에 놓여 있습니다.*
지금까지 우리는pod의 관점에서 스케줄을 연구해 왔다.그러나 노드의 다른 측면에서 새로운pod를 배치하지 않기로 결정한다면?이것이 바로 오점의 근원이다.일단 노드 하나를 오염시키면 두 가지 선택이 있다.
NoSchedule - 이것은pod가 오염되면 이pod에 새로운pod를 배치하지 말아야 한다는 것을 의미합니다 *그들이 용인할 수 없다면
NoExecute - 기존의 크레인이 오염되면 크레인에서 쫓겨납니다*그들이 용인하지 않는 한
kubectl taint nodes <nodename> mytaintkey=mytaintvalue:NoSchedule
이 집합을 설정하면 노드가 다음 키 값에 의해 오염됩니다. (mytaintkey=mytaintvalue)그래서 새로운 기중기를 배치할 수 없다.그러나 노드에서 기존pod를 제거하려면 어떻게 해야 합니까?
kubectl taint nodes <nodename> mytaintkey=mytaintvalue:NoExecute
이렇게 하면 현재 노드에서 모든 POD가 제거되고 사용 가능한 다른 노드로 이동합니다.그러나 잠시 후 한 고객 단체가 와서 "오, 괜찮아요. 땅콩 알레르기가 있어요.*'내수성'**그러니까 계속 오염된 책상 위에 놓으세요."라고 말했다.Kube 스케줄러는 허용도를 확인하고 오염된 테이블에 넣습니다*
현재pod가 노드에서 지정한 오점 키 값에 대해 용인도가 있다면 이pod는 오점의 영향을 받지 않고 필요할 때 노드에 놓입니다.
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: web-app
image: nginx:1.12-alpine
tolerations:
- key: "mytaintkey"
operator: "Equal"
value: "mytaintvalue"
effect: "NoExecute"
이것은 카슨 앤더슨 (Carson Anderson) 이 그의본문은 최초로 발표되었다www.azuremonk.com
Reference
이 문제에 관하여(쿠베르네트스는 통속적이고 알기 쉬운 영어로 이야기를 했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ranand12/kubernetes-scheduler-visually-explained-in-plain-english-with-a-story-5h0g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)