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

相關文章
相關標籤/搜索