前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes对node label管理

Kubernetes对node label管理

作者头像
kubernetes中文社区
发布2019-08-15 17:53:26
5.5K1
发布2019-08-15 17:53:26
举报

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

Node的隔离与恢复

在硬件升级、硬件维护的情况下,我们需要将某些Node进行隔离,脱离k8s的调度范围。k8s提供了一套机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。

通过配置文件实现

创建配置文件unschedule_node.yml,内容如下:

apiVersion: v1
kind: Nodemetadata:
  name: k8s-node1  
  labels:    
    namne: k8s-node1spec:  
    unschedulable: true

然后执行该配置文件,即可将指定的node脱离调度范围:

kubectl replace -f unschedule_node.yml

通过命令行的方式实现

kubectl patch node k8s-node1 -p '{"spec":"{"unschedulable":"true"}"}'

恢复

无论上面哪一种方法,其实都是将unsechdulable的值改为true,实现 了隔离,同理,恢复时,只需要将unschedulable的值改为false即可。

当然这里还有另一种更简单的方式:

kubectl cordon k8s-node1    #将k8s-node1节点设置为不可调度模式
kubectl drain k8s-node1     #将当前运行在k8s-node1节点上的容器驱离
kubectl uncordon k8s-node1  #执行完维护后,将节点重新加入调度

更新资源对象的label

label作为用户可灵活定义的对象属性,在已创建的对象上仍然可以通过kubectl label命令对其进行增删改等操作

给一个node添加一个label

kubectl label node k8s-node1 role=kube-node

查看label

kubectl get node -a -l "role=kube-node"

删除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 <node-name> <label-key>=<label-value>

下面的示例,为k8s-node1打上一个project=gcxt的标签:

kubectl label nodes k8s-node1 role=k8s-node

在pod中加入nodeSelector定义,示例如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: mongo
spec:
  replicas: 1 
  template:
    metadata:
      labels:
        run: mongo
spec:
  containers:
  - name: mongo
    image: daocloud.io/library/mongo:3.2.4
    ports:
      - containerPort: 27017
    volumeMounts:
      - mountPath: /data/db
        name: mongo
  volumes: [{"name":"mongo","hostPath":{"path":"/root/volumes/mongo"}}]
  nodeSelector:
    node: kube-node

运行kubectl create -f命令创建pod,scheduler就会将该pod调度到拥有role=kube-node标签的node上去。

这种基于Node标签的调度方式灵活性很高,比如我们可以把一组Node分别贴上“开发环境” “测试环境” “生产环境”这三组标签中的一种,此时一个Kubernetes集群就承载了3个环境,这将大大提高开发效率。

需要注意的是,如果我们指定了Pod的nodeSelector条件,且集群中不存在包含相应标签的Node时,即使还有其他可供调度的Node,这个Pod也最终会调度失败。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kubernetes中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Node的扩缩容
    • 删除node节点
    • Node的隔离与恢复
      • 通过配置文件实现
        • 通过命令行的方式实现
          • 恢复
          • 更新资源对象的label
            • 给一个node添加一个label
              • 将pod调度到指定的node
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档