一、pod控制器概要
Pod控制器是什麼呢?簡單的來說Pod控制器就是用來管理pod的。大量部署過docker的同學,有一點會感同身受,難針對、難管理而,今天我們學習的核心組件pod就可以解決這個問題。官方點來說Pod控制器是用於實現管理pod的中間層,確保pod資源符合預期的狀態,pod的資源出現故障時,會嘗試 進行重啓,當根據重啓策略無效,則會重新新建pod的資源。那麼pod控制器包含哪些呢?如下|:
- ReplicationController:1.2以前的老版本管理工具,後續會被Replicaset取代,這裏我們就瞭解一下,有這樣一個東西即可。
- Replicaset:用作pod 創建、刪除和更新,ReplicaSet能確保運行指定數量的pod ,通過label selector來確定pod數量是否滿足用戶指定的副本數量。(管理副本)
- Deployment:將 Pod 和ReplicaSet 的實際狀態改變到用戶的目標狀態。支持擴容、回滾、更新等功能;管理無狀態應用最好的控制器;守護進程類(作用於replicaset上,支持回滾等操作)
- Daemonset:確保每個節點上運行一個Pod副本。無狀態服務;守護進程類
- Job: 執行一次性運行任務。不需要持續運行
- Cronjob: 週期性運行任務。不需要持續運行
- StatefulSet: 管理有狀態應用,每一個應用都被單獨管理。管理比較麻煩
二、Replicaset
replicaset用作pod 創建、刪除和更新,ReplicaSet能確保運行指定數量的pod ,通過label selector來確定pod數量是否滿足用戶指定的副本數量。(管理副本)
那麼它是如何定義的呢?請參考下文yaml文件。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rsdemo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: rsdemo
release: can
template:
metadata:
name: rsdemo1
labels:
app: rsdemo
release: can
spec:
containers:
- name: resdemocontainers
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
三、Deployment(重點)
Pod 和ReplicaSet 的實際狀態改變到用戶的目標狀態。支持擴容、回滾、更新等功能;管理無狀態應用最好的控制器;守護進程類(作用於replicaset上,支持回滾等操作),定義的yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
version: v1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
版本更新和回滾
版本更新修策略改:(少用)
如果您要選擇更新策略,如您希望更新時 不停止原容器,可以修改maxUnavailable參數爲0,具體如何使用可在master節點上執如下命令,查看解釋:
kubectl explain deployment.spec.strategy.rollingUpdate
查看回滾版本:
kubectl rollout history deploy myapp-deploy
回滾到上一個版本:
kubectl rollout undo deployment/nginx-test
kubectl rollout undo deployment myapp
也可以使用 --revision參數指定某個歷史版本:
kubectl rollout undo deployment/nginx-test --to-revision=2
kubectl rollout undo deployment myapp --to-revision=1
當您回滾到第一個版本時,再選擇回滾一個版本 就會回滾到最後一個修改的版本。
資源更新
當您需要修改鏡像時,最簡單的方式是選擇修改yaml文件,然後apply -f 重新加載文件,deployment會自動讀取滾動升級。但如果您要通過腳本等方式來實現修改deployment,修改配置文件就不是明智的選擇了,我們可以使用patch命令:
kubectl patch
語法
$ patch (-f FILENAME | TYPE NAME) -p PATCH
示例
使用patch更新Node節點。
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
更新容器的鏡像
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
更新deployment
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1, "maxUnavailable":0}}}}'
當然,如果只是修改容器的話 ,我們可以使用更簡單的命令 set image
kubectl set image
更新現有的資源對象的容器鏡像。
可使用資源對象包括(不區分大小寫):
pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)
語法
$ image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
示例
將deployment中的nginx容器鏡像設置爲“nginx:1.9.1”。
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
所有deployment和rc的nginx容器鏡像更新爲“nginx:1.9.1”
kubectl set image deployments,rc nginx=nginx:1.9.1 --all
將daemonset abc的所有容器鏡像更新爲“nginx:1.9.1”
kubectl set image daemonset abc *=nginx:1.9.1
從本地文件中更新nginx容器鏡像
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
四、Daemonset
本部分參考:https://www.cnblogs.com/breezey/p/6582519.html
在有種場景下,我們需要在所有的kubernetes節點上都運行同一個應用的一個副本,比如在後續我們會說如何收集kubernetes中的pod日誌,在收集日誌的時候,需要在每個k8s node節點上運行一個收集日誌的進程 ,如fluentd。我們知道在通常情況下,kubernetes基於它內部的調度算法來自動分配pod運行在哪個節點上,沒有辦法保證在每個node上運行一個fluentd pod。這個時候,daemonsets的調度方式就派上了用場。簡單來說,daemonsets就是讓一個應用在所有的k8s集羣節點上都運行一個副本。
我們直接看下面的示例,在所有節點上都啓動一個busybox:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: busybox
spec:
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: myhub.mingyuanyun.com/library/busybox
command:
- sleep
- "3600"
我們通過kubectl get daemonset可以看到啓動了6個busybox的pod,因爲我們有6個kubernetes節點。而事實上,我們並沒有指定複製的個數,這就是daemonsets的作用:
NAME DESIRED CURRENT READY NODE-SELECTOR AGE busybox 6 6 6 <none> 1m
您還可以參考:https://www.cnblogs.com/xzkzzz/p/9553321.html (啓動一個redis配置一下filebeat)
此部分 後續還會更新,