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也最終會調度失敗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM