一: 调度策略

先看下创建一个Pod的工作流程:

  1. kubectl–>create pod–>apiserver–>etcd

  2. apiserver—>schedule (bind pod to node) 请求绑定调度资源绑定pod —> etcd(绑定的资源pod网段写到etcd)

  3. apiserver—>kubelete (bound self pod) —>docker run —>apiserver (update pod status) --> etcd

Pod根据调度器默认算法将Pod分配到合适的节点上,一般是比较空闲的节点。但有些情况我们希望将Pod分配到指定节点,该怎么做呢?

这里给你介绍调度策略:nodeName、nodeSelector和污点

1.1、nodeName

nodeName用于将Pod调度到指定的Node名称上((跳过调度器直接分配))。

例如:下面示例会绕过调度器,直接分配到k8s-node1节点。

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.100.180 "指定后端节点"
  containers:
  - name: nginx
    image: nginx:1.15

[root@master demo]# vim nodename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.100.180
  containers:
  - name: nginx
    image: nginx:1.15

[root@master demo]# kubectl create -f nodename.yaml 
pod/pod-example created
[root@master demo]# kubectl get pods
NAME          READY   STATUS              RESTARTS   AGE
pod-example   0/1     ContainerCreating   0          10s
[root@master demo]# kubectl get pods -w
NAME          READY   STATUS              RESTARTS   AGE
pod-example   0/1     ContainerCreating   0          16s
pod-example   1/1   Running   0     38s

[root@master demo]# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          4m45s   172.17.96.3   192.168.100.180   <none>

[root@master demo]# kubectl describe pod pod-example
Name:               pod-example
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               192.168.100.180/192.168.100.180
Start Time:         Wed, 14 Oct 2020 18:58:36 +0800
Labels:             app=nginx
Annotations:        <none>
Status:             Running
IP:                 172.17.96.3
Containers:
  nginx:
    Container ID:   docker://edbb93681e6dc9cf6748886a3abf78cec37e9592904930e1b533ea7c3f39d103
    Image:          nginx:1.15
    Image ID:       docker-pullable://nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 14 Oct 2020 18:59:14 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mpxqj (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-mpxqj:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mpxqj
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason   Age    From                      Message
  ----    ------   ----   ----                      -------
  Normal  Pulling  5m20s  kubelet, 192.168.100.180  pulling image "nginx:1.15"
  Normal  Pulled   4m43s  kubelet, 192.168.100.180  Successfully pulled image "nginx:1.15"
  Normal  Created  4m43s  kubelet, 192.168.100.180  Created container
  Normal  Started  4m43s  kubelet, 192.168.100.180  Started container
"看日志跳过调度器, 直接下载镜像,跳过调度器"

1.2、nodeSelector

nodeSelector用于将Pod调度到匹配Label的Node上

//获取标签帮助
[root@localhost demo]# kubectl label --help
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]

//需要获取node上的NAME名称
//给对应的node设置标签分别为kgc=a和kgc=b
[root@master demo]# kubectl label nodes 192.168.100.180 li=a
node/192.168.100.180 labeled
[root@master demo]# kubectl label nodes 192.168.100.190 li=b
node/192.168.100.190 labeled
[root@master demo]# kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.100.180   Ready    <none>   15d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.100.180,li=a
192.168.100.190   Ready    <none>   15d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.100.190,li=b

//删除资源,打标签
[root@master demo]# kubectl delete pod pod-example
pod "pod-example" deleted
[root@master demo]# vim nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector: "选择nodeselecor调度"
    li: b "指定分配的标签节点"
  containers:
  - name: nginx
    image: nginx:1.15
[root@master demo]# kubectl apply -f nodeselector.yaml 
pod/pod-example created
[root@master demo]# kubectl describe pod pod-example
Name:               pod-example
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               192.168.100.190/192.168.100.190
Start Time:         Wed, 14 Oct 2020 19:15:03 +0800
Labels:             app=nginx
Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"pod-example","namespace":"default"},"spec":{...
Status:             Running
IP:                 172.17.71.2
Containers:
  nginx:
    Container ID:   docker://c05f3664f91da2bbdb62f7c1471a74e20462483d19afe4b74ee1a28c54c96169
    Image:          nginx:1.15
    Image ID:       docker-pullable://nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 14 Oct 2020 19:22:05 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mpxqj (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-mpxqj:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mpxqj
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  li=b
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age    From                      Message
  ----    ------     ----   ----                      -------
  Normal  Scheduled  10m    default-scheduler         Successfully assigned default/pod-example to 192.168.100.190
  Normal  Pulling    10m    kubelet, 192.168.100.190  pulling image "nginx:1.15"
  Normal  Pulled     3m17s  kubelet, 192.168.100.190  Successfully pulled image "nginx:1.15"
  Normal  Created    3m16s  kubelet, 192.168.100.190  Created container
  Normal  Started    3m16s  kubelet, 192.168.100.190  Started container
"经过schedule调度器指定调度到lable=b的节点"

1.3: 故障排除

状态描述
Running该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
PendingPod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。创建pod的请求已经被k8s接受,但是容器并没有启动成功,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED, Modified这两个事件的产生.
SucceededPod中的所有的容器已经正常的自行退出,并且k8s永远不会自动重启这些容器,一般会是在部署job的时候会出现。
FailedPod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
Unknown出于某种原因,无法获得Pod的状态,通常是由于与Pod主机通信时出错。
//查看pod事件
kubectl describe TYPE NAME_PREFIX  
//查看pod日志(Failed状态下)
kubectl logs POD_NAME
//进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐