一、Node的隔离与恢复
在硬件升级、维护等情况下,我们需要将某些Node进行隔离,脱离k8s集群的调度范围。k8s提供了一种机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。
创建配置文件unschedule_node.yaml,在spec部分指定unschedulable 问true:
[root@master node]# cat unschedule_node.yaml
apiVersion: v1
kind: Node
metadata:
name: 192.168.0.222
labels:
kubernetes.io/hostname: k8s-node-1
spec:
unschedulable: true
然后,通过 kubectl replace 命令完成对Node 状态的修改:
[root@master node]# kubectl replace -f unschedule_node.yaml
node/192.168.0.222 replaced
[root@master node]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.144 Ready <none> 25d v1.11.6
192.168.0.148 Ready <none> 25d v1.11.6
192.168.0.222 Ready,SchedulingDisabled <none> 5d v1.11.6
查看Node的状态,可以观察到在Node的状态中增加了一项SchedulingDisabled,对于后续创建的Pod,系统将不会再向该Node进行调度。也可以不使用配置文件,直接使用 kubectl patch 命令完成:
kubectl patch node k8s-node-1 -p '{"spec": {"unschedulaable": true}}'
需要注意的是,将某个Node脱离调度范围时,在其上运行的pod并不会自动停止,管理员需要手动停止在改Node是上运行的pod.
同样,如果需要将某个node重新纳入集群调度范围,则将unschedulable 设置为false,再次执行 kubectl replace 或者kubectl patch 命令就能恢复系统对改node的调度。
第三种方法:
使用kubectl cordon <node_name> 对某个Node 进行隔离调度操作
[root@master node]# kubectl cordon 192.168.0.148
node/192.168.0.148 cordoned
[root@master node]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.144 Ready <none> 25d v1.11.6
192.168.0.148 Ready,SchedulingDisabled <none> 25d v1.11.6
192.168.0.222 Ready,SchedulingDisabled <none> 5d v1.11.6
恢复调度操作:
[root@master node]# kubectl uncordon 192.168.0.222
node/192.168.0.222 uncordoned
[root@master node]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.0.144 Ready <none> 25d v1.11.6
192.168.0.148 Ready <none> 25d v1.11.6
192.168.0.222 Ready <none> 5d v1.11.6
二、Node扩容
在k8s集群中,一个新node的加入是非常简单的。在新的node节点上安装Docker、kubelet和kube-proxy服务,然后配置kubelet和kube-proxy的启动参数,拷贝证书,最后启动这些服务。荣国kubelet默认的自动注册机制,新的node将会自动加入现有的k8s集群中。
k8s master在接受了新Node的注册之后,会自动将其纳入当前集群的调度范围内,在之后创建容器时,就可以像新的Node进行调度了。
通过这种机制,实现集群中Node的扩容。
三、Namespace: 集群环境共享与隔离
1.创建namespace
namespace-devlopment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
# kubectl create -f namespace-development.yaml
namespaces/developmentx