kubernetes node管理

Node的扩缩容

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

Kubernetes Node

kubernetes master在接受了新node的注册以后,会自动将其归入当前集群的调度范围内,在以后建立容器时,就能够向新的node进行调度了。算法

删除node节点

kubectl delete node k8s-node1

Node的隔离与恢复

在硬件升级、硬件维护的状况下,咱们须要将某些Node进行隔离,脱离k8s的调度范围。k8s提供了一套机制,既能够将Node归入调度范围,也能够将Node脱离调度范围。docker

经过配置文件实现

建立配置文件unschedule_node.yml,内容以下:api

apiVersion: v1
kind: Node
metadata:
  name: k8s-node1
  labels:
    namne: k8s-node1
spec:
  unschedulable: true

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

kubectl replace -f unschedule_node.yml

经过命令行的方式实现

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

恢复

不管上面哪种方法,其实都是将unsechdulable的值改成true,实现 了隔离,同理,恢复时,只须要将unschedulable的值改成false便可。服务器

固然这里还有另外一种更简单的方式:memcached

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名,并加一个减号便可:url

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

相关文章
相关标签/搜索