K8S 中的 Node 管理
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 也最终会调度失败。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/dd10b6d078875a6dbccd193b1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论