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
如下所示:
通過kubectl get deployment可以看到nginx-deployment的狀態
通過kubectl describe deployment瞭解更詳細的信息。
在NewreplicaSet,可以看到創建了一個nginx-deployment-754846b88c的replicatset,說明deployment是通過replicaset來管理POD的。執行kubectl describe replicaset 查看詳細信息。
Controller By指明此ReplicaSet是由Deployment/nginx-deployment創建的。
執行kubectl get pod和kubectl describe pod查看更詳細的信息。
Controlled By指明瞭POD由誰創建,EVENT記錄了pod的啓動過程。
整個過程如下所示:
1.用戶通過 kubectl 創建 Deployment。
2.Deployment 創建 ReplicaSet。
3.ReplicaSet 創建 Pod。
對象命令的方式是”子對象的名字=父對象名字+隨機字符串或者數字"
配置文件
- 用 kubectl 命令直接創建,比如:
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
在命令行中通過參數指定資源的屬性。
- 通過配置文件和 kubectl apply 創建,要完成前面同樣的工作,可執行命令:
kubectl apply -f nginx.yml
nginx.yml 的內容爲:
資源的屬性寫在配置文件中,文件格式爲 YAML。
下面對這兩種方式進行比較。
基於命令的方式:
簡單直觀快捷,上手快。
適合臨時測試或實驗。
基於配置文件的方式:
配置文件描述了 What,即應用最終要達到的狀態。
配置文件提供了創建資源的模板,能夠重複部署。
可以像管理代碼一樣管理部署。
適合正式的、跨環境的、規模化部署。
這種方式要求熟悉配置文件的語法,有一定難度。
kubectl apply 不但能夠創建k8s資源,也能對資源進行更新,k8s還提供了kubectl create,kubectl reploace,kubectl edit和kubeclt path命令。
配置文件
配置文件主要是yaml格式,其他的controler跟deployment的配置文件方式類似
簡單的配置文件如下所示:
① 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進行刪除
伸縮
配置文件如下
伸縮是指在線增加或者減少Pod的副本數
初始是1個副本,如下所示:
現在修改new_nginx,yml文件,將副本修改成5個。
再次執行kubectl -f apply,結果如下所示:
在dashboard上也能確認
用label控制pod的位置
默認情況下,sxhedulet會將pod調度到所有可用的node上,不過有些情況需要將pod部署到指定的node上,k8s使用label來實現這個功能的。
label是key-value對,各種資源都可以設置label,靈活添加各種自定義的屬性,如下所示,標註k8s-node1是配置了ssd的節點
kubectl label node docker-1 disktype=ssd
其他的node還有k8s自己維護的label
有了disktype這個自定義的label,接下來就可以指定將pod部署node-1上
在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運行系統組件
kube-proxy的配置文件,如下所示:
① 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配置文件
① batch/v1 是當前 Job 的 apiVersion。
② 指明當前資源的類型爲 Job。
③ restartPolicy 指定什麼情況下需要重啓容器。對於 Job,只能設置爲 Never 或者 OnFailure。對於其他 controller(比如 Deployment)可以設置爲 Always 。
通過 kubectl apply -f myjob.yml 啓動 Job。
通過kubectl get job來查看job的狀態
通過kubectl get pod查看pod的狀態
因爲Pod執行完畢後,容器已經退出,需要用--show all才能查看completed狀態的pod,通過kubectl logs可以查看pod的標準輸出。
job的並行性
在同時運行多個pod,可以提高job的執行效率,可以通過parallelism設置。
將並行的pod數量設置爲2
定時job
linux中有cron程序定時執行任務,k8s的cronjob提供了類似的功能,可以執行job,配置文件如下所示:
① batch/v2alpha1 是當前 CronJob 的 apiVersion。
② 指明當前資源的類型爲 CronJob。
③ schedule 指定什麼時候運行 Job,其格式與 Linux cron 一致。這裏 /1 * 的含義是每一分鐘啓動一次。
④ jobTemplate 定義 Job 的模板,格式與前面 Job 一致。