Kubernets 调度 常用的命令

网友投稿 807 2022-11-30

Kubernets 调度 常用的命令

Kubernets 调度 常用的命令

节点添加删除标签

添加标签

[root@master ~]# kubectl label node master node-role.kubernetes.io/etcd=node/master labeled[root@master ~]# kubectl get nodeNAME STATUS ROLES AGE VERSIONmaster Ready etcd,master 79d v1.19.8node1 Ready pg,worker 79d v1.19.8node2 Ready worker 79d v1.19.8

删除标签

[root@master ~]# kubectl label node master node-role.kubernetes.io/etcd-node/master labeled[root@master ~]# kubectl get nodeNAME STATUS ROLES AGE VERSIONmaster Ready master 79d v1.19.8node1 Ready pg,worker 79d v1.19.8node2 Ready worker 79d v1.19.8

污点的设置、查看和去除

taints 内容包括 key、value、effect:

key 就是配置的键值value 就是内容effect 是标记了这个 taints 行为是什么

目前 Kubernetes 里面有三个 taints 行为:

NoSchedule 禁止新的 Pod 调度上来PreferNoSchedul 尽量不调度到这台NoExecute 会 evict 没有对应 toleration 的 Pods,并且也不会调度新的上来。这个策略是非常严格的,大家在使用的时候要小心一点

k8s的master节点本身就带有effect类型为NoSchedule的污点,这也是为什么k8s在调度Pod时,不会调度到master节点的原因,具体查看如下:(Kubeadm在安装初始化init的时候给master打上了污点,其余节点是没有该污点的。Master节点主要任务是管理集群的,不应该跑具体的业务应用。所以不允许pod落在master节点)

如果不让pod调度到某个节点,那么可以对该节点打污点

[root@k8s-master ~]# kubectl describe node k8s-master Taints: node-role.kubernetes.io/master:NoSchedule kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule

注意⚠️ : 为master设置的这个taint中, ​​node-role.kubernetes.io/master​​​为​​key​​​, ​​value​​​为空, ​​effect​​​为​​NoSchedule,​​

如果输入命令时, 你丢掉了​​=​​​符号, 写成了​​node-role.kubernetes.io/master:NoSchedule​​​, 会报​​error: at least one taint update is required​​错误

过程介绍:

# 设置污点kubectl taint nodes [node name] key1=value:NoSchedule# 节点说明中,查看Taint字段kubectl describe node [node name]# 去除污点kubectl taint nodes [node name] key1:NoSchedule-

迁移Pod

驱逐节点是一种有损操作,驱逐的原理 :

封锁节点 (设为不可调度,避免新的 Pod 调度上来)。将该节点上的 Pod 删除。ReplicaSet 控制器检测到 Pod 减少,会重新创建一个 Pod,调度到新的节点上。

这个过程是先删除,再创建,并非是滚动更新,因此更新过程中,如果一个服务的所有副本都在被驱逐的节点上,则可能导致该服务不可用。

1. 设置节点是否可调度

确定需要迁移和被迁移的节点,将不允许被迁移的节点设置为不可调度。

在 node 节点上有一个 NodeUnschedulable 的标记,我们可以通过 kube-controller 对这个节点直接标记为不可调度,那这个节点就不会被调度了。在 1.16 的版本里,这个 Unschedulable 已经变成了一个 Taints。也就是说需要校验一下 Pod 上打上的 Tolerates 是不是可以容忍这个 Taints;

[root@k8s-master ~]# kubectl cordon k8s-node1[root@k8s-master ~]# kubectl describe node k8s-node1node.kubernetes.io/unschedulable:NoSchedule

# 查看节点kubectl get nodes# 设置节点为不可调度kubectl cordon # 设置节点为可调度kubectl uncordon

2. 执行kubectl drain命令

kubectl drain --force --ignore-daemonsets[root@master ~]# kubectl drain node2 --force --ignore-daemonsetsnode/node2 already cordonedWARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-vwtrf, kube-system/kube-proxy-fpjpd, kube-system/nodelocaldns-v6fsqnode/node2 drained[root@master ~]# kubectl get pod -A -o wide | grep node2kube-system calico-node-vwtrf 1/1 Running 0 8d 192.168.179.104 node2 kube-system kube-proxy-fpjpd 1/1 Running 0 8d 192.168.179.104 node2 kube-system nodelocaldns-v6fsq 1/1 Running 0 8d 192.168.179.104 node2

示例

$ kubectl drain bjzw-prek8sredis-99-40 --force --ignore-daemonsetsnode "bjzw-prek8sredis-99-40" already cordonedWARNING: Deleting pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet: kube-proxy-bjzw-prek8sredis-99-40; Ignoring DaemonSet-managed pods: calicoopsmonitor-mfpqs, arachnia-agent-j56n8pod "pre-test-pro2-r-0-redis-2-8-19-1" evictedpod "pre-test-hwh1-r-8-redis-2-8-19-2" evictedpod "pre-eos-hdfs-vector-eos-hdfs-redis-2-8-19-0" evicted

3. 特别说明

对于statefulset创建的Pod,kubectl drain的说明如下:

kubectl drain操作会将相应节点上的旧Pod删除,并在可调度节点上面起一个对应的Pod。当旧Pod没有被正常删除的情况下,新Pod不会起来。例如:旧Pod一直处于​​Terminating​​状态。

对应的解决方式是通过重启相应节点的kubelet,或者强制删除该Pod。

示例:

# 重启发生`Terminating`节点的kubeletsystemctl restart kubelet# 强制删除`Terminating`状态的Podkubectl delete pod --namespace= --force --grace-period=0

4. kubectl drain 流程

5. TroubleShooting

1、存在不是通过​​ReplicationController​​​, ​​ReplicaSet​​​, ​​Job​​​, ​​DaemonSet​​​ 或者​​StatefulSet​​​创建的Pod(即静态pod,通过文件方式创建的),所以需要设置强制执行的参数​​--force​​。

$ kubectl drain bjzw-prek8sredis-99-40node "bjzw-prek8sredis-99-40" already cordonederror: unable to drain node "bjzw-prek8sredis-99-40", aborting command...There are pending nodes to be drained: bjzw-prek8sredis-99-40error: DaemonSet-managed pods (use --ignore-daemonsets to ignore): calicoopsmonitor-mfpqs, arachnia-agent-j56n8; pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet (use --force to override): kube-proxy-bjzw-prek8sredis-99-40

2、存在DaemonSet方式管理的Pod,需要设置​​--ignore-daemonsets​​参数忽略报错。

$ kubectl drain bjzw-prek8sredis-99-40 --forcenode "bjzw-prek8sredis-99-40" already cordonederror: unable to drain node "bjzw-prek8sredis-99-40", aborting command...There are pending nodes to be drained: bjzw-prek8sredis-99-40error: DaemonSet-managed pods (use --ignore-daemonsets to ignore): calicoopsmonitor-mfpqs, arachnia-agent-j56n8

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:计算机网络 网络层 内部网关协议-OSPF协议
下一篇:SpringBoot validator参数验证restful自定义错误码响应方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~