k8s學習-運行應用

Deployment

Deployment是k8s最常用的controller,通常k8s不會直接創建pod,而是通過controller來管理POD的。Controller中定義了POD的部署特性,比如有幾個副本,在什麼樣的NODE上運行等,它可以管理pod的多個副本,並確保pod按照期望的狀態運行。

運行Deployment

按照如下方式,運行一個Deployment

kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=3

上面的命令將部署包含三個副本的Deployment nginx-deployment,容器的image爲nginx:1.7.9

如下所示:
k8s學習-運行應用

通過kubectl get deployment可以看到nginx-deployment的狀態

通過kubectl describe deployment瞭解更詳細的信息。

k8s學習-運行應用

在NewreplicaSet,可以看到創建了一個nginx-deployment-754846b88c的replicatset,說明deployment是通過replicaset來管理POD的。執行kubectl describe replicaset 查看詳細信息。

k8s學習-運行應用

Controller By指明此ReplicaSet是由Deployment/nginx-deployment創建的。

執行kubectl get pod和kubectl describe pod查看更詳細的信息。

k8s學習-運行應用

k8s學習-運行應用

Controlled By指明瞭POD由誰創建,EVENT記錄了pod的啓動過程。

整個過程如下所示:
k8s學習-運行應用

1.用戶通過 kubectl 創建 Deployment。

2.Deployment 創建 ReplicaSet。

3.ReplicaSet 創建 Pod。

對象命令的方式是”子對象的名字=父對象名字+隨機字符串或者數字"

配置文件

  1. 用 kubectl 命令直接創建,比如:

kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
在命令行中通過參數指定資源的屬性。

  1. 通過配置文件和 kubectl apply 創建,要完成前面同樣的工作,可執行命令:

kubectl apply -f nginx.yml
nginx.yml 的內容爲:

k8s學習-運行應用

資源的屬性寫在配置文件中,文件格式爲 YAML。

下面對這兩種方式進行比較。

基於命令的方式:

簡單直觀快捷,上手快。

適合臨時測試或實驗。

基於配置文件的方式:

配置文件描述了 What,即應用最終要達到的狀態。

配置文件提供了創建資源的模板,能夠重複部署。

可以像管理代碼一樣管理部署。

適合正式的、跨環境的、規模化部署。

這種方式要求熟悉配置文件的語法,有一定難度。
kubectl apply 不但能夠創建k8s資源,也能對資源進行更新,k8s還提供了kubectl create,kubectl reploace,kubectl edit和kubeclt path命令。

配置文件

配置文件主要是yaml格式,其他的controler跟deployment的配置文件方式類似

簡單的配置文件如下所示:
k8s學習-運行應用

① apiVersion 是當前配置格式的版本。
② kind 是要創建的資源類型,這裏是 Deployment。
③ metadata 是該資源的元數據,name 是必需的元數據項。
④ spec 部分是該 Deployment 的規格說明。
⑤ replicas 指明副本數量,默認爲 1。
⑥ template 定義 Pod 的模板,這是配置文件的重要部分。
⑦ metadata 定義 Pod 的元數據,至少要定義一個 label。label 的 key 和 value 可以任意指定。
⑧ spec 描述 Pod 的規格,此部分定義 Pod 中每一個容器的屬性,name 和 image 是必需的






執行kubectl apply -f niginx.yml即可。
執行kubectl delete deploymet nginx-deployment或者kubectl delete -f nginx.yml進行刪除

伸縮

配置文件如下
k8s學習-運行應用
伸縮是指在線增加或者減少Pod的副本數

初始是1個副本,如下所示:

k8s學習-運行應用

現在修改new_nginx,yml文件,將副本修改成5個。

k8s學習-運行應用

再次執行kubectl -f apply,結果如下所示:

k8s學習-運行應用

在dashboard上也能確認

k8s學習-運行應用

用label控制pod的位置

默認情況下,sxhedulet會將pod調度到所有可用的node上,不過有些情況需要將pod部署到指定的node上,k8s使用label來實現這個功能的。
label是key-value對,各種資源都可以設置label,靈活添加各種自定義的屬性,如下所示,標註k8s-node1是配置了ssd的節點

kubectl label node docker-1 disktype=ssd

k8s學習-運行應用

其他的node還有k8s自己維護的label
有了disktype這個自定義的label,接下來就可以指定將pod部署node-1上

k8s學習-運行應用

在pod模板的spec裏通過nodeSelector指定將此pod部署到具有label disktype=ssd的node上。

DaemonSet

Deployment部署的副本pod會分佈在各個node上,每個node都可以運行好幾個副本。
DaemonSet的不通之處在於每個node上最多隻能運行一個副本。
它的典型應用場景有:
1.在集羣的每個幾點上運行存儲deamon,比如glusterd後者ceph
2.在每個節點上運行日誌收集deamon,比如flunentd或者logstash
3.在每個幾點上運行監控daemon,比如prometheus node exploer




其實k8s自己就在用DaemonSet運行系統組件
k8s學習-運行應用

kube-proxy的配置文件,如下所示:

k8s學習-運行應用

① kind: DaemonSet 指定這是一個 DaemonSet 類型的資源。

② containers 定義了 kube-proxy 的容器。

③ status 是當前 DaemonSet 的運行時狀態,這個部分是 kubectl edit特有的。其實 Kubernetes 集羣中每個當前運行的資源都可以通過 kubectl edit 查看其配置和運行狀態,比如 kubectl edit deployment nginx-deployment。

job

容器按照持續運行的時間可分爲兩類:服務類容器和工作類容器
服務類容器通常持續提供服務,需要一直運行,比如http server,daemon等,工作容器是一次性人物,比如批處理程序,完成後容器就退出
k8s的deployment,replicaSet和daemonset都用於管理服務類容器,對工作類容器,使用job
以下是個簡單的job配置文件
k8s學習-運行應用



① batch/v1 是當前 Job 的 apiVersion。

② 指明當前資源的類型爲 Job。

③ restartPolicy 指定什麼情況下需要重啓容器。對於 Job,只能設置爲 Never 或者 OnFailure。對於其他 controller(比如 Deployment)可以設置爲 Always 。

通過 kubectl apply -f myjob.yml 啓動 Job。

通過kubectl get job來查看job的狀態

k8s學習-運行應用

通過kubectl get pod查看pod的狀態

k8s學習-運行應用

因爲Pod執行完畢後,容器已經退出,需要用--show all才能查看completed狀態的pod,通過kubectl logs可以查看pod的標準輸出。

k8s學習-運行應用

job的並行性

在同時運行多個pod,可以提高job的執行效率,可以通過parallelism設置。

k8s學習-運行應用

將並行的pod數量設置爲2

定時job

linux中有cron程序定時執行任務,k8s的cronjob提供了類似的功能,可以執行job,配置文件如下所示:

k8s學習-運行應用

① batch/v2alpha1 是當前 CronJob 的 apiVersion。

② 指明當前資源的類型爲 CronJob。

③ schedule 指定什麼時候運行 Job,其格式與 Linux cron 一致。這裏 /1 * 的含義是每一分鐘啓動一次。

④ jobTemplate 定義 Job 的模板,格式與前面 Job 一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章