apiVersion: v1 kind: Pod #建立的资源类型能够是,Deployment、Job、Ingress、Service等 metadata: #包含Pod的一些meta信息,好比名称、namespace、标签等信息 name: ng1 #Podname labels: #标签 app: web spec: containers: - name: ng1 #容器name image: hub.c.163.com/library/nginx #镜像拉取地址 imagePullPolicy: IfNotPresent #镜像拉取策略,Always,(不管本地是否有每次都拉取) Never,(每次都不拉取,即便本地没有也不拉取) IfNotPresent(本地有就用,没有就去拉) ports: #对外开放端口 - containerPort: 80
节点选择器: nodeSelector、nodeName
基于node_name调度node
apiVersion: v1 kind: Pod metadata: name: ng2 spec: nodeName: cs25 #指定调度到"cs25" node节点上 containers: - name: ng2 image: hub.c.163.com/library/nginx
基于node标签来调度
kubectl label nodes cs25 disk=ssd
#给节点cs25 添加标签nginx
apiVersion: v1 kind: Pod metadata: name: ng2 spec: nodeSelector: disk: ssd #表示要只有node节点上有"disk=ssd",才能被调度上去 containers: - name: ng2 image: hub.c.163.com/library/nginx
节点亲和性调度: nodeAffinityweb
apiVersion: v1 kind: Pod metadata: name: ng2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: #requiredDuringSchedulingIgnoredDuringExecution 硬亲和性 必须知足亲和性,知足不调用 #preferredDuringSchedulingIgnoredDuringExecution 软亲和性 能知足最好,不知足也不要紧。 nodeSelectorTerms: - matchExpressions: - key: disk operator: In #表示上面那个字段必须包含下面两个值, 还能够换成"NotIn"取反 values: - jx - ssd #表示 只能调度到node有"disk=jx" 或"node=ssd" containers: - name: ng2
POD调度 podAffinity 和 podAntiAffinityapi
apiVersion: v1 kind: Pod metadata: name: ng2 labels: app: nginx spec: containers: - name: ng2 image: hub.c.163.com/library/nginx --- apiVersion: v1 kind: Pod metadata: name: ng3 spec: containers: - name: ng3 image: hub.c.163.com/library/nginx affinity: podAntiAffinity: #反亲和,表示知足条件的,让两个主机不在同一台node主机上运行,换成"podAffinity:"功能相反 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["nginx"]} topologyKey: kubernetes.io/hostname
labelSelector : 选择跟那组Pod亲和
namespaces : 选择哪一个命名空间
topologyKey : 指定节点上的哪一个键
假如在反亲和场景"topologyKey: type" 这个node标签全部主机都有,则第二台容器没法被调度到任何主机app
kubectl taint nodes cs25 key=value:NoSchedule
NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
NoExecute:既影响调度过程,也影响显著的Pod对象;不容忍的Pod对象将被驱逐
PreferNoSchedule: 表示尽可能不调度ide
建立污点
kubectl taint node cs25 rongren=true:NoSchedule
#表示在cs25节点上建立一个 rongren的键 键值为"true",调度策略为NoSchedule
kubectl taint node cs25 rongren-
#删除污点,指定键名加"-"便可ui
apiVersion: v1 kind: Pod metadata: name: ng6 spec: containers: - name: ng6 image: nginx tolerations: #设置容忍性 - key: "rongren" operator: "Equal" #若是操做符为Exists,那么value属性可省略,表示key这个存在即经过,若是不指定operator,则默认为Equal,value必定要和设置的值相等,不然没法经过 value: "true" effect: "NoSchedule" #意思是这个Pod要容忍的有污点的Node的key是”rongren“ Equal true,效果是NoSchedule, #tolerations属性下各值必须使用引号,容忍的值都是设置Node的taints时给的值。
若是在设置node的Taints(污点)以前,就已经运行了一些Pod,那么这些Pod是否还能继续在此Node上运行? 这就要看设置Taints污点时的effect(效果)了。spa
若是effect的值是NoSchedule或PreferNoSchedule,那么已运行的Pod仍然能够运行,只是新Pod(若是没有容忍)不会再往上调度。 而若是effect的值是NoExecute,那么此Node上正在运行的Pod,只要没有容忍的,马上被驱逐。 虽然是马上被驱逐,可是K8S为了彰显人性化,又给具备NoExecute效果的污点, 在容忍属性中有一个可选的 tolerationSeconds字段,用来设置这些Pod还能够在这个Node之上运行多久,给它们一点宽限的时间,到时间才驱逐。 若是是以Pod来启动的,那么Pod被驱逐后, 将不会再被运行,就等于把它删除了。 若是是deployment/rc,那么删除的pod会再其它节点运行。 若是是DaemonSet在此Node上启动的Pod,那么也不会再被运行,直到Node上的NoExecute污被去除或者Pod容忍。