1.Node的扩缩容
在实际生产系统中,经常遇到服务器容量不足的情况,这时就需要购买新的服务器,对应用系统进行水平扩展以实现扩容。
在k8s中,对一个新的node的加入非常简单,只需要在node节点上安装Docker、kubelet和kube-proxy服务,然后将kubelet和kube-proxy的启动参数中的master url指定为当前Kubernetes集群master的地址,然后启动服务即可。基于kubelet的自动注册机制,新的Node会自动加入现有的Kubernetes集群中。
Kubernetes master在接受了新Node的注册后,会自动将其纳入当前集群的调度范围内,在之后创建容器时,就可以向新的Node进行调度了。删除Node节点的代码为:kubectl delete node k8s-node1。
2.Node的隔离与恢复
在硬件升级、硬件维护的情况下,需要将某些Node进行隔离,脱离k8s的调度范围。k8s提供了一套机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。
通过配置文件实现,创建配置文件unschedule_node.yml,内容如下。
apiVersion: v1
kind: Node
metadata:
name: k8s-node1
labels:
namne: k8s-node1
spec:
unschedulable: true
然后执行该配置文件,即可将指定的Node脱离调度范围,代码如下。
kubectl replace -f unschedule_node.yml
3.更新资源对象的Label
Label作为用户可灵活定义的对象属性,在已创建的对象上仍然可以通过kubectl label命令对其进行增删改等操作。
给一个Node添加一个label。
kubectl label node k8s-node1 role=backend
要想删除Label,只需要在命令行最后指定Label的key名,并加一个减号即可。
kubectl label node k8s-node1 role-
将Pod调度到指定的Node,Kubernetes的Scheduler服务(kube-scheduler进程)负责实现Pod的调度,整个调度过程通过执行一系列复杂的算法最终为每个Pod计算出一个最佳的目标节点,这一过程是自动完成的,无法知道Pod最终会被调度到哪个节点上。
可能需要将Pod调度到一个指定的Node上,此时,可以通过Node的标签(Label)和Pod的nodeSelector属性相匹配,来达到上述目的。
使用kubectl label给Node打标签的用法如下。
kubectl label nodes =
下面示例为k8s-node1打上一个project=gcxt的标签。
kubectl label nodes k8s-node1 project=gcxt
在Pod中加入nodeSelector定义,示例如下。
apiVersion: v1
kind: ReplicationController
metadata:
name: memcached-gcxt
运行kubectl create -f命令创建Pod,scheduler就会将该Pod调度到拥有project=gcxt标签的Node上去。
这种基于Node标签的调度方式灵活性很高,比如可以把一组Node分别贴上“开发环境”“测试环境”“生产环境”这3组标签中的一种,此时一个Kubernetes集群就承载了3个环境,大大提高了开发效率。
需要注意的是,如果指定了Pod的nodeSelector条件,且集群中不存在包含相应标签的Node时,即使还有其他可供调度的Node,这个Pod也最终会调度失败。
标签:Node,kubectl,k8s,管理,调度,node1,Pod,K8S From: https://blog.51cto.com/key3feng/11930063