写点什么

K8S 中的 Node 管理

  • 2023-06-20
    青海
  • 本文字数:1170 字

    阅读完需:约 4 分钟

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 也最终会调度失败。


发布于: 刚刚阅读数: 2
用户头像

InfoQ签约作者 2018-11-30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
K8S中的Node管理_6 月优质更文活动_穿过生命散发芬芳_InfoQ写作社区