まず、基本的な概念
1、3ノード選択スケジューラー
- 事前選択:リソース要件、ポートの競合、除外およびその他の汚れを含め、ノードと完全に矛盾する最初のルールアウト
- 好ましくは、各ノードの優先度算出及び発注の最良一致(最高スコア)を同定するためのノード
- ノードはその後、最高得点、ランダムに選択されていない場合、スケジューリング完了:選択
2、一般的なスケジューリングポリシーは、事前に選択されました
- CheckNodeCondition:ノードの状態を確認することは正常です
- GeneralPredicates:ユニバーサル事前ポリシー
- ホスト名:pod.spec.hostnameが定義されているかどうかのチェック、およびポッドとチェックノードの競合で同じ名前かどうか
- PodFitsHostPortsは:pod.spec.containers.ports.hostPortプロパティ(結合ノード上のポート)定義するかどうか、およびノードポートチェックノードの競合がかどうかをチェックします
- MatchNodeSelector:pods.spec.nodeSelector、チェックノードセレクタ
- PodFitsResources:ノードをチェックリソース要件に沿ったものであるポッド
- NoDiskConflict:満たす需要へのストレージボリュームは、デフォルトではチェックされていないかどうかにポッドが依存チェック
- PodToletatesNodeTaints:pods.spec.tolerations許容汚れ、ポッドチェックノード上の汚れが許容できるかどうか
- PodToletatesNodeExecuteTaints:後半ポッド耐え難い汚れノード追放された場合、デフォルトではチェックされません
- CheckNodelabelPresence:ラベルノードの存在を確認します
- CheckServiceAffinity:ポッド応じてサービスが属し、デフォルトがチェックされていないのと同じノードで同じサービスに属しています
- CheckVolumeBinging:VPCへの準拠を確認します
- NoVolumeZoneConflict:ストレージ・ボリューム領域を確認してください
- CheckNodeMemoryPressure:チェックノードメモリ圧力がある場合
- CheckNodePODPressure:圧力がある場合、ノードPIDの数を確認してください
- CheckNodeDiskPressure:ディスクIOノードチェック圧力があるか否か
- MatchInterPodAffinity:ノードはポッドの親和性を満たすためにかどうかをチェック
3、好ましくは機能
- LeastRequested:ハイアイドル資源ノード好ましく
ノードを使用した限り、完成できるだけ、およびLeastRequested反する:MostRequested
- BalanceResourceAllocation:CPUとメモリのリソースは、好ましくは、同様の占有されています
- NodePreferAvoidPods:注釈ノードが(scheduler.alpha.kubernetes.io/preferAvoidPods)、好ましくは高いノードのスコアの傾向を決定します
- TaintToleration:は汚染さリスト項目ノードとリスト項目spec.tolerationsポッドマッチングオブジェクトがチェックされ、より優先度のマッチング
- SeletorSpreading:OBJECTタグからできるだけ遠いノードセレクタ広がりに属するとしてセレクタノードは、小さなに分布していることにより、選択されたタグをチェックします。
- InterPodAffinity:ポッド親和性、好ましくはより高い親和性マッチングを横切ります
- NodeAffinity:ノードの親和性
- NodeLabel:ノードが特定のタグを持っているかどうかに応じて、その後のスコアがあります
ImageLoclity:ノードがスコアを計算するために使用されるローカル・ポッドの画像サイズを有します
第二に、例のスケジューリング構成リスト
1、nodeSelector:ノードセレクター
# kubectl label nodes node01 disktype=ssd
# kubectl label nodes node02 disktype=harddisk
# kubectl get nodes --show-labels
# vim pod-demo-ssd.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-ssd
namespace: default
labels:
app: myapp
tier: frontend
annotations:
dongfei.tech/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: dongfeimg/myapp:v1
imagePullPolicy: IfNotPresent
nodeSelector: #节点选择器
disktype: ssd #调度到拥有disktype=ssd的标签的node上
2、nodeaffinity:ノードの親和性
# kubectl label nodes master zone=Beijing
# kubectl label nodes node01 zone=Shanghai
# kubectl label nodes node02 zone=Guangzhou
# cat pod-demo-nodeaffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-nodeaffinity
namespace: default
labels:
app: myapp
tier: frontend
annotations:
dongfei.tech/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: dongfeimg/myapp:v1
imagePullPolicy: IfNotPresent
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬亲和
nodeSelectorTerms:
- matchExpressions: #选择zone在Beijing或Shanghai
- key: zone
operator: In
values:
- Beijing
- Shanghai
3、podaffinity:ポッド親和性
# cat pod-demo-podaffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-podaffinity-1
namespace: default
labels:
app: myapp
tier: frontend
annotations:
dongfei.tech/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: dongfeimg/myapp:v1
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Pod
metadata:
name: pod-demo-podaffinity-2
namespace: default
labels:
app: db
tier: backend
annotations:
dongfei.tech/created-by: "cluster admin"
spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 3600"]
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["myapp"]}
topologyKey: kubernetes.io/hostname
図4は汚染さ:ノード染色
- 汚染さ
- 効果:許容範囲
- NoSchedule:あなたはオーバースケジュール容認することはできません、だけで、既存のポッドには影響をスケジューリングプロセスに影響を与えません
- PreferNoSchedule:スケジュール上容認しないようにしてください
- NOEXECUTE:あなたが来ることを予定し、それがスケジューリングプロセスに影響を与える容認するだけでなく、既存のポッドに影響を与えることができません
- 効果:許容範囲
# kubectl taint node node01 node-type=production:NoSchedule #打污点
# kubectl describe node node01 |grep Taints
# cat deploy-damo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp-container
image: dongfeimg/myapp:v2
ports:
- name: http
containerPort: 80
tolerations:
- key: "node-type"
operator: "Equal" #完全相同
value: "production"
effect: "NoSchedule"