1. 程式人生 > >31 管理應用 部署持續執行的應用

31 管理應用 部署持續執行的應用

在前面的章節裡,我們瞭解瞭如何用 kubectl run 快速部署一個簡單的複製的應用以及如何用pods(configuring-containers.md)配置並生成單次執行的容器。本文,我們將使用基於配置的方法來部署一個持續執行的複製的應用。

用配置檔案生成複製品集合

Kubernetes用 Replication Controllers 建立並管理複製的容器集合(實際上是複製的Pods) 。 Replication Controller 簡單地確保在任一時間裡都有特定數量的pod副本在執行。如果執行的太多,它會殺掉一些;如果執行的太少,它會啟動一些。這和谷歌計算引擎的Instance Group Manager以及AWS的Auto-scaling Group(不帶擴充套件策略)類似。在快速開始章節裡用 kubctl run 建立的用來跑Nginx的 Replication Controller 可以用下面的YAML描述:
apiVersion : v1 kind : ReplicationController metadata : name : my - nginx spec : replicas : 2 template : metadata : labels : app : nginx spec : containers
: - name : nginx image : nginx ports : - containerPort : 80 和指定一個單獨的Pod相比,不同的是設定了這裡的kind域為ReplicationController,設定了需要的副本(replicas)數量以及把Pod的定義放到了template域下面。pods的名字不需要顯示指定,因為它們是由 replication controller 的名字生成的。要檢視支援的域列表,可以看replication controller API object。 和建立pods一樣,也可以用 create 命令來建立這個replication controller:
$ kubectl create - f ./ nginx - rc . yaml replicationcontrollers / my - nginx replication controller 會替換刪除的或者因不明原因終止的(比如節點失敗)pods,這和直接建立的pods的情況是不一樣。基於這樣的考量,對於一個需要持續執行的應用,即便你的應用只需要一個單獨的pod,我們也推薦使用 replication controller 。對於單獨的pod,在配置檔案裡可以省略 replicas 這個域,因為不設定的時候預設就只有一個副本。

檢視replication controller的狀態

可以用 get 命令檢視你建立的replication controller: $ kubectl get rc CONTROLLER CONTAINER ( S ) IMAGE ( S ) SELECTOR REPLICAS my - nginx nginx nginx app = nginx 2 這說明你的controller會確保有兩個nginx的副本。和直接建立的pod一樣,也可以用 get 命令檢視這些副本: $ kubectl get pods NAME READY STATUS RESTARTS AGE my - nginx - 065jq 1 / 1 Running 0 51s my - nginx - buaiq 1 / 1 Running 0 51s

刪除replication controllers

如果想要結束你的應用並且刪除repication controller。和在快速開始裡一樣,用下面的命令: $ kubectl delete rc my - nginx replicationcontrollers / my - nginx 這個操作預設會把由replication controller管理的pods一起刪除。如果pods的數量比較大,這個操作要花一些時間才能完成。如果想要pods繼續執行,不被刪掉,可以在delete的時候指定引數 –cascade=false 。 如果在刪除replication controller之前想要刪除pods,pods只是被替換了,因為replication controller會再起新的pods,確保pods的數量。

Labels

Kubernetes使用自定義的鍵值對(稱為Labels)分類資源集合,例如pods和replicationcontroller。在前面的例子裡,pod的模板裡只設定了一個單獨的label,鍵是 app ,值為 nginx 。所有被建立的pod都帶有這個label,可以用帶-L引數的命令檢視: $ kubectl get pods - L app NAME READY STATUS RESTARTS AGE APP my - nginx - afv12 0 / 1 Running 0 3s nginx my - nginx - lg99z 0 / 1 Running 0 3s nginx pod模板帶的label預設會被複製為replication controller的label。Kubernetes中所有的資源都支援labels: $ kubectl get rc my - nginx - L app CONTROLLER CONTAINER ( S ) IMAGE ( S ) SELECTOR REPLICAS APP my - nginx nginx nginx app = nginx 2 nginx 更重要的是,pod模板的label會被用來建立 selector ,這個 selector 會匹配所有帶這些labels的pods。用 kubectl get 的go語言模板輸出格式就可以看到這個域: $ kubectl get rc my - nginx - o template -- template = "{{.spec.selector}}" map [ app : nginx ] 如果你想要在pod模板裡指定labels,但是又不想要被選中,可以顯示指定 selector 來解決,不過需要確保 selector 能夠匹配由pod模板創建出來的pod的label,並且不能匹配由其他replication controller建立的pods。對於後者,最直接最保險的方法是給replication controller分配一個獨特的label,並且在pod模板和selector裡都進行指定。