zoukankan      html  css  js  c++  java
  • kubernetes node管理

    Node的扩缩容

    在实际生产系统中经常遇到服务器容量不足的情况,这时候就需要购买新的服务器,对应用系统进行水平扩展以实现扩容。
    在k8s中,对一个新的node的加入非常简单,只需要在node节点上安装docker、kubelet和kube-proxy服务,然后将kubelet和kube-proxy的启动参数中的master url指定为当前kubernetes集群master的地址,然后启动服务即可。基于kubelet的自动注册机制,新的node会自动加入现有的kubernetes集群中,如下图:

    Kubernetes Node

    kubernetes master在接受了新node的注册之后,会自动将其纳入当前集群的调度范围内,在之后创建容器时,就可以向新的node进行调度了。

    删除node节点

    kubectl delete node k8s-node1
    

    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
    

    通过命令行的方式实现

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

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

    kubectl label nodes k8s-node1 project=gcxt
    

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

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: memcached-gcxt
      labels:
        name: memcached-gcxt
    spec:
      replicas: 1
      selector:
        name: memcached-gcxt
      template:
        metadata:
          labels:
            name: memcached-gcxt
        spec:
          containers:
          - name: memcached-gcxt
            image: myhub.fdccloud.com/library/memcached
            command:
            - memcached
            - -m 64
            ports:
            - containerPort: 11211
          nodeSelector:
            project: gcxt
    

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

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

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

  • 相关阅读:
    Hibernate官方文档翻译-(第二章,入门)
    关于我的Blog
    退役记
    考场上要写的emacs
    关于在linux下将caps lock键改成ctrl的方法
    SXOI2020退役记
    min_25筛学习笔记
    带花树学习笔记
    [CF438E] 小朋友和二叉树
    多项式中步
  • 原文地址:https://www.cnblogs.com/breezey/p/8849472.html
Copyright © 2011-2022 走看看