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

  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/breezey/p/8849472.html
Copyright © 2011-2022 走看看