pod是kubernetes的最小單元,自主式創建的pod刪除就沒有了,但是通過資源控制器創建的pod如果刪除還會重建。pod控制器就是用於實現代替我們去管理pod的中間層,並幫我們確保每一個pod資源處於我們所定義或者所期望的目標狀態,pod資源出現故障首先要重啟容器,如果一直重啟有問題的話會基於某種策略重新編排。自動適應期望pod數量
pod控制器類型簡介:
1.ReplicaSet:
代用戶創建指定數量的pod副本數量,確保pod副本數量符合用戶期望的數量狀態,如果少了多退少補,並且支持滾動式自動擴容和縮容機制。
ReplicaSet主要三個組件組成:
(1)用戶期望的pod副本數量
(2)標簽選擇器,判斷哪個pod歸自己管理
(3)pod資源模板(當現存的pod數量不足,會根據pod資源模板進行新建幫助用戶管理無狀態的pod資源,精確反應用戶定義的目標數量。不直接使用)
Deployment:(無狀態,守護進程類,只關注群體不關注個體)
工作在ReplicaSet之上,用於管理無狀態應用,目前來說最好的控制器。支持滾動更新和回滾功能,還提供聲明式配置。(pod數量和node沒有精確的配比,沒有一對一的關系)
DaemonSet:(無狀態,守護進程類,只關注群體不關注個體)
確保集群中的每一個節點上只運行一個特定的pod副本,系統級的后台任務。新增節點他都會自動添加pod。也可以是滿足條件的節點上運行特定的副本。比如ELK服務特性:服務是無狀態的服務必須是守護進程(pod資源模板,標簽選擇器)
Job:(有狀態,一次性任務)
只要完成就立即退出,不需要重啟或重建,沒有完成重構job。只能執行一次性任務
Cronjob:(有狀態,周期性任務)
周期性任務控制,不需要持續后台運行
StatefulSet:(管理有狀態應用)
管理有狀態應用(redis cluster)針對管理的應用器配置管理是不一樣的,沒有什么共通的規律,需要人為的封裝在腳本中實行,相當之大的邏輯處理。(運維技能封裝到運維腳本中)
TPR:(third party resource)1.7以后就不支持了
第三方資源
CDR:(custom defined resource) 1.8+以后
用戶自定義資源
控制器ReplicaSet應用:
獲取replica的字段命令===>kubectl explain rs
實例yaml:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-server
namespace: default
spec:
replicas: 2
selector:
matchLabels: app: web-nginx release: canary
template:
metadata:
name: web-nginx-pod
labels:
app: web-nginx release: canary environment: qa
spec:
containers:
- name: web-nginx-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
~template中創建的container必須包含控制器中標簽選擇器中要選擇的標簽,如果不包含控制器就發現不了他已經存在pod,會一直創建下去
動態修改replicaset的副本數量 1. kubectl edit rs web-server 或者 kubectl edit -f replicaSet_demo.yaml
2.kubectl scale --replicas=5 rs/web-server 或者 kubectl scale -f replicaSet_demo.yaml
通過kubectl edit可以修改pod資源的鏡像,但是只有是重建的pod才會使用修改過得鏡像
控制器deployment應用:
deployment是建構在rs之上的,可以控制多個rs滾動式自定義,自控制的更新。
同時在實現自動更新時還能實現控制更新節奏和更新邏輯
獲取deployment的字段命令===>kubectl explain deploy
實例deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 5
selector:
matchLabels:
app: myapp
release: canary
strategy:
rollingUpdate: maxSurge: 1 maxUnavailable: 0
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v2
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
紅色部分是更新策略,可以多出一個,不能少於replica定義的5個
deployment啟動可以用kubectl apply -f deploy_demo.yaml
可以用打補丁的方式進行修改:kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}' 相對來說要對文件的嵌套關系了解清楚
kubectl rollout pause deployment myapp-deploy 暫停一個deployment
kubectl rollout resume deployment myapp-deploy 重新啟動一個暫停的deployment
kubectl rollout history deployment myapp-deploy 查看歷史版本
kubectl rollout undo deployment myapp-deploy --to-revision=1 回滾到以前版本
控制器daemonset應用:
獲取daemonset的字段:kubectl explain ds
實例daemonset
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeta-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
imagePullPolicy: IfNotPresent
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local
- name: REDIS_LOG_LEVEL
value: info
通過kubectl get pod -o wide 可以看出一個節點上只有一個filebeat的pod
daemonset也支持滾動式更新,有兩個選項1.OnDelete 在刪除時更新
2.RollingUpdate 只有做多不可用,最多有幾個不工作,根據節點數量
通過修改containers的image鏡像來測試滾動更新 ,先刪除一個pod,再新建一個,滾動式更新。一次滾動幾個根據maxUnavailable的值是多大(kubectl explain ds.spec.updateStrategy.rollingUpdate)
kubectl set image ds filebeta-ds filebeta=ikubernetes/filebeta:5.6.6-alpine kubectl get pod -w