玩k8s?----Pod 的调度策略
文章目录一: 调度策略1.1、nodeName1.2、nodeSelector1.3:故障排除一: 调度策略先看下创建一个Pod的工作流程:kubectl–>create pod–>apiserver–>etcdapiserver—>schedule (bind pod to node) 请求绑定调度资源绑定pod —> etcd(绑定的资源pod网段写到etcd)a
·
一: 调度策略
先看下创建一个Pod的工作流程:
kubectl–>create pod–>apiserver–>etcd
apiserver—>schedule (bind pod to node) 请求绑定调度资源绑定pod —> etcd(绑定的资源pod网段写到etcd)
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 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。 |
Pending | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。创建pod的请求已经被k8s接受,但是容器并没有启动成功,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED, Modified这两个事件的产生. |
Succeeded | Pod中的所有的容器已经正常的自行退出,并且k8s永远不会自动重启这些容器,一般会是在部署job的时候会出现。 |
Failed | Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。 |
Unknown | 出于某种原因,无法获得Pod的状态,通常是由于与Pod主机通信时出错。 |
//查看pod事件
kubectl describe TYPE NAME_PREFIX
//查看pod日志(Failed状态下)
kubectl logs POD_NAME
//进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
更多推荐
已为社区贡献9条内容
所有评论(0)