一、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
[root@master yaml]# kubectl create namespace test
namespace/test created
[root@master yaml]# kubectl get namespace
NAME STATUS AGE
default Active 55d
kube-public Active 55d
kube-system Active 55d
quizii Active 42d
test Active 9s
[root@master yaml]# kubectl delete namespace test
namespace "test" deleted
[root@master yaml]cat namespace-devlopment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
# kubectl create -f namespace-development.yaml
namespaces/developmentx