K8S简历(十九)

Pod被创建后被部署到哪个节点上是有这几个要素组成的:节点要满足Pod运行时的硬件要求和端口要求,Pod对节点的亲和性,Pod对Pod的亲和性,还有节点上的污点Pod是否可以容忍。

Pod对node的亲和性:

亲和性又分硬亲和和软亲和。
硬亲和:如果所用节点上没有指定的亲和键值对就不部署(Pod会处于挂起状态);
软亲和:如果全部节点没有指定的亲和键值对还是会部署到节点上。

硬亲和:

apiVesion: v1
kind: Pod
metadata:
  name: www
  namespace: default
spec:
   containers:
   - name: nginx
      image: wlzyr/nginx:v1.12
   affinity:
    nodeaffinity
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeselectorTerms:
        - matchExpression:
          key: app
          operator: In
          values: 
          - www
#这个Pod只会部署在有www标签的node上,如果没有就挂起。

软亲和:

apiVersion: v1
kind: Pod
metadata:
  name: www
  namespace: default
spec:
  containers:
  - name: nginx
    image: wlzyr/nginx:v1.12
 affinity:
  nodeAffinity:
  - preference:
      matchExpressions:
      - key: api
        operator: In
        values:
        - www
    weight: 80
#Pod会优先去部署在标签为api:www的node,如果有多个规则会根据权重判断优先级。

Pod对Pod的亲和性:

和Pod对node的亲和性差不多只是目标换成了Pod对Pod。

软亲和:

apiVersion: v1
kind: Pod
metadata:
  name: www
spec:
  containers:
  - name: nginx
    image: wlzyr/nginx:v1.12
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - www
        topologyKey: kubernetes.io/hostname
#Pod只部署到有app:www且主机名和自己一样的node上。
#topologyKey:条件必须和已有的即将匹配的那个pod在一个主机里(必须是同台机器)。

反亲和:

[root@master qinhe]# vim b3-podAntiAffinity.yaml
apiVersion: v1
kind: Pod
metadata:
  name: www
spec:
  containers:
  - name: nginx
    image: wlzyr/nginx:v1.12
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - www
        topologyKey: kubernetes.io/hostname
#不和app:www标签的Pod部署在一起。

污点和包容:

Pod部署时node检测Pod能否容忍自己的污点可以就部署不可以就拒绝,检查规则有只在部署时检查也有运行也检查两种。

kubectl taint node node01.wl.com app=mysql:NoSchedule
#给node01.wl.com节点上添加污点并设置为部署时检查。
#如果要运行时也检查需要把NoSchedule换成NoExecute。

Pod容忍污点:

apiVersion: apps/v1beta1
kind: Pod
metadata:
  name: www
spec:
  containers:
  - name: nginx
    image: wlzyr/nginx:v1.12
  tolerations:
  - key: "api"
    operator: "Equal"
    value: mysql
    effect: "NoSchedule"
#如果value字段为空则可以容key为api的污点,value可以为如何字符。
#effect字段必须指清是NoSchedule还是NoExecute,不然会判断失败,如果为空则两则都可以容忍。

你可能感兴趣的:(K8S简历(十九))