1. 程式人生 > >Kubernetes(k8s)中文文件 管理應用:部署持續執行的應用_Kubernetes中文社群

Kubernetes(k8s)中文文件 管理應用:部署持續執行的應用_Kubernetes中文社群

譯者:it2afl0rd

在前面的章節裡,我們瞭解瞭如何用 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裡都進行指定。

K8S中文社群微信公眾號