DaemonSet?控制器:概念、原理
1.1?DaemonSet 概述
DaemonSet 控制器能夠確保?k8s?集群所有的節(jié)點都運行一個相同的?pod?副本,當(dāng)向?k8s?集群中增
加?node?節(jié)點時,這個?node?節(jié)點也會自動創(chuàng)建一個?pod?副本,當(dāng)?node?節(jié)點從集群移除,這些?pod?也 會自動刪除;刪除?Daemonset?也會刪除它們創(chuàng)建的?pod
1. 2 ? Daemonset?工作原理:如何管理?Pod?
daemonset?的控制器會監(jiān)聽?kuberntes?的?daemonset?對象、pod?對象、node?對象,這些被監(jiān) 聽的對象之變動,就會觸發(fā)?syncLoop?循環(huán)讓?kubernetes?集群朝著?daemonset?對象描述的狀態(tài)進行 演進。
1.3 Daemonset?典型的應(yīng)用場景
在集群的每個節(jié)點上運行存儲,比如:glusterd?或?ceph。?
在每個節(jié)點上運行日志收集組件,比如:flunentd?、?logstash、filebeat?等。
?在每個節(jié)點上運行監(jiān)控組件,比如:Prometheus、?Node Exporter?、collectd?等。
?1.4 DaemonSet?與?Deployment?的區(qū)別
Deployment?部署的副本?Pod?會分布在各個?Node?上,每個?Node?都可能運行好幾個副本。?DaemonSet?的不同之處在于:每個?Node?上最多只能運行一個副本。
DaemonSet?資源清單文件編寫技巧
kubectl explain ds
apiVersion <string> #當(dāng)前資源使用的?api?版本,跟?VERSION: app/v1保持一致
kind <string> #資源類型,跟?KIND: DaemonSet?保持一致?
metadata<Object> #元數(shù)據(jù),定義?DaemonSet?名字的
spec <Object> #定義容器的
status <Object> #狀態(tài)信息,不能改
DaemonSet?的?spec?字段kubectl explain ds.spec
FIELDS:
minReadySeconds <integer> #當(dāng)新的?pod?啟動幾秒種后,再?kill?掉舊的?pod。?revisionHistoryLimit <integer> #歷史版本
selector <Object> -required- #用于匹配?pod?的標(biāo)簽選擇器
template <Object> -required-
#定義?Pod?的模板,基于這個模板定義的所有?pod?是一樣的?
updateStrategy #daemonset?的升級策略
#查看?DaemonSet?的?spec.template?字段如何定義?
#對于?template?而言,其內(nèi)部定義的就是?pod,pod?模板是一個獨立的對象
kubectl explain ds.spec.template
KIND: DaemonSet
VERSION:? apps/v1
RESOURCE: template <Object>
FIELDS:
? ?metadata? ? <Object>
? ?spec <Object> ??
FIELDS:
? metadata? ? <Object>
DaemonSet 部署日志收集組件?fluentd
把?fluentd-2-5-1.tar.gz?上傳到 所有節(jié)點上. ? ?
#編寫一個?DaemonSet?資源清單
cat daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
? labels:
? ? k8s-app: fluentd-logging
? name: fluentd-elasticsearch
? namespace: kube-system
spec:
? selector:
? ? matchLabels:
? ? ? name: fluentd-elasticsearch
? template:
? ? metadata:
? ? ? name: fluentd
? ? ? labels:
? ? ? ? name: fluentd-elasticsearch
? ? spec:
? ? ? tolerations:
? ? ? - key: node-role.kubernetes.io/master
? ? ? ? effect: NoSchedule
? ? ? containers:
? ? ? - name: fluentd-elasticsearch
? ? ? ? image: god/fluentd:v2.5.1
? ? ? ? resources:
? ? ? ? ? limits:
? ? ? ? ? ? memory: 500Mi
? ? ? ? ? requests:
? ? ? ? ? ? cpu: 100m
? ? ? ? ? ? memory: 200Mi
? ? ? ? volumeMounts:
? ? ? ? - name: varlog
? ? ? ? ? mountPath: /var/log
? ? ? ? - name: varlibdockercontainers
? ? ? ? ? mountPath: /var/lib/docker/containers
? ? ? ? ? readOnly: true
? ? ? terminationGracePeriodSeconds: 30
? ? ? volumes:
? ? ? - name: varlog
? ? ? ? hostPath:
? ? ? ? ? path: /var/log
? ? ? - name: varlibdockercontainers
? ? ? ? hostPath:
? ? ? ? ? path: /var/lib/docker/containers
更新
kubectl apply -f daemonset.yaml
指定 kube-system名稱空間
kubectl get daemonset -n kube-system
NAME? ? ? ? ? ? ? ? ? ? DESIRED? CURRENT? READY? UP-TO-DATE? AVAILABLE? NODE SELECTOR? ? ? ? ? ? AGE
calico-node? ? ? ? ? ? 3? ? ? ? 3? ? ? ? 3? ? ? 3? ? ? ? ? ? 3? ? ? ? ? kubernetes.io/os=linux? 18d
fluentd-elasticsearch? 3? ? ? ? 3? ? ? ? 3? ? ? 3? ? ? ? ? ? 3? ? ? ? ? <none>? ? ? ? ? ? ? ? ? 3m9s
kube-proxy? ? ? ? ? ? ? 3? ? ? ? 3? ? ? ? 3? ? ? 3? ? ? ? ? ? 3? ? ? ? ? kubernetes.io/os=linux? 18d
kubectl get pods -n kube-system ? ? ??
萬一沒有fluentd-elasticsearch的話,看daemonset詳細信息或者重啟kubelet

systemctl restart Kubelet ?重啟對pod沒有影響。跟apiserver交互的
kubectl describe daemonset fluentd-elasticsearch -n kube-system
kubectl get pods -n kube-system -o wide

#通過上面可以看到在?k8s?的三個節(jié)點均創(chuàng)建了?fluentd?這個?pod?
#pod?的名字是由控制器的名字-隨機數(shù)組成的
#資源清單詳細說明
apiVersion: apps/v1 #DaemonSet?使用的?api?版本
kind: DaemonSet #?資源類型?
metadata:
name: fluentd-elasticsearch ? ? ? ?#資源的名字
namespace: kube-system ? ?#資源所在的名稱空間
labels:?
k8s-app: fluentd-logging. ??#資源具有的標(biāo)簽
?spec:
selector: #標(biāo)簽選擇器
?matchLabels:
name: fluentd-elasticsearch
?template:
metadata:
labels: ? ? ? ? ?#?基于這回模板定義的?pod?具有的標(biāo)簽
name: fluentd-elasticsearch?
spec:
tolerations: #定義容忍度
- key: node-role.kubernetes.io/master
effect: NoSchedule?
containers: ? ? ? ? ? ?#定義容器
- name: fluentd-elasticsearch
image: god/fluentd:v2.5.1 ? ??
resources: ? ?#資源配額
limits:
memory: 200Mi
requests:
cpu: 100m memory: 200Mi
volumeMounts: - name: varlog?
mountPath: /var/log ? ? ? ? ? ?#把本地的/var/log目錄掛在到容器
?- name: varlibdockercontainers
mountPath: /var/lib/docker/containers ? ? ?#把/var/lib/docker/containers/掛載到容器里
readOnly: true #掛載目錄是只讀權(quán)限
terminationGracePeriodSeconds: 30 #優(yōu)雅的關(guān)閉服務(wù)?
volumes:
- name: varlog hostPath:
path: /var/log #基于本地目錄創(chuàng)建一個卷?
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers ? ? #基于本地目錄創(chuàng)建一個卷
Daemonset?管理?pod:滾動更新
#DaemonSet?實現(xiàn)?pod?的滾動更新
#查看?daemonset?的滾動更新策略
kubectl explain ds.spec.updateStrategy
#查看?rollingUpdate?支持的更新策略?
kubectl explain ds.spec.updateStrategy.rollingUpdate
KIND: DaemonSet
VERSION:? apps/v1
RESOURCE: rollingUpdate <Object>
DESCRIPTION:
? ? Rolling update config params. Present only if type = "RollingUpdate".
? ? Spec to control the desired behavior of daemon set rolling update.
#上面表示?rollingUpdate?更新策略只支持?maxUnavailabe,先刪除在更新;因為我們不支持一 個節(jié)點運行兩個?pod,因此需要先刪除一個,在更新一個。
vim daemonset.yaml

kubectl apply -f daemonset.yaml
查看名稱空間# kubectl get daemonset -n kube-system
NAME ? ? ? ? ? ? ? ?DESIRED? CURRENT? READY? UP-TO-DATE? AVAILABLE? NODE SELECTOR? ? ? ? ? ? AGE
calico-node ? ? ? ? ? ? ? ? ? 3 ? ? ? ? ? ? 3? ? ? ? 3 ? ? ? ? ?3? ? ? ? ? ? 3? ? ? ? ? kubernetes.io/os=linux? 18d ?
fluentd-elasticsearch ? ? ?3 ? ? ? ? ?3 ? ? ? ? 2 ? ? ? ?1? ? ? ? ? ? 2? ? ? ? ? <none>? ? ? ? ? ? ? ? ? 53m
?kube-proxy ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? 3 ? ? ? ? ?3 ? ? ? ? ?3? ? ? ? ? ? 3? ? ? ? ? kubernetes.io/os=linux? 18d
就緒只有2個,可能是控制節(jié)點沒有

排錯思路看describe和logs
kubectl describe pods fluentd-elasticsearch-dvl8g -n kube-system

kubectl logs fluentd-elasticsearch-dvl8g -n kube-system ?#在查看日志
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
2021/05/16 11:44:04 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
#更新鏡像版本,可以按照如下方法:
kubectl set image daemonsets fluentd-elasticsearch=ikubernetes/filebeat:5.6.6- alpine -n kube-system
Job?和?CronJob?控制器:概念、原理
Job?控制器用于管理?Pod?對象運行一次性任務(wù),比方說我們對數(shù)據(jù)庫備份,可以直接在?k8s?上啟動
一個?mysqldump?備份程序,也可以啟動一個?pod,這個?pod?專門用來備份用的,備份結(jié)束?pod?就可 以終止了,不需要重啟,而是將?Pod?對象置于"Completed"(完成)狀態(tài),若容器中的進程因錯誤而終 止,則需要按照重啟策略配置確定是否重啟,對于?Job?這個類型的控制器來說,需不需要重建?pod?就看 任務(wù)是否完成,完成就不需要重建,沒有完成就需要重建?pod。?Job?控制器的?Pod?對象的狀態(tài)轉(zhuǎn)換

Job?三種使用場景:
1、非并行任務(wù):只啟一個?pod,pod?成功,job?正常結(jié)束?
2、并行任務(wù)同時指定成功個數(shù):.spec.completions?為指定成功個數(shù),可以指定也可以不指 定.spec.parallelism(指定>1,會有多個任務(wù)并行運行)。當(dāng)成功個數(shù)達到.spec.completions, 任務(wù)結(jié)束。
3、有工作隊列的并行任務(wù):.spec.completions?默認為?1,.spec.parallelism?為大于?0?的整數(shù)。 此時并行啟動多個?pod,只要有一個成功,任務(wù)結(jié)束,所有?pod?結(jié)束
CronJob?概念、原理
? ? ? ?CronJob?跟?Job?完成的工作是一樣的,只不過?CronJob?添加了定時任務(wù)能力可以指定時間,實現(xiàn)周期性運行。Job,CronJob?和?Deployment,DaemonSet?顯著區(qū)別在于不需要持續(xù)在后臺運行 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Deployment?主要用于管理無狀態(tài)的應(yīng)用(kubernetes?集群有一些?pod,某一個?pod?出現(xiàn)故障, 刪除之后會重新啟動一個?pod,那么?kubernetes?這個集群中?pod?數(shù)量就正常了,更多關(guān)注的是群體,這就是無狀態(tài)應(yīng)用)。
使用場景:?
1、在給定時間點只運行一次。?
2、在給定時間點周期性地運行。
CronJob?的典型用法如下:?
1、在給定的時間點調(diào)度?Job?運行。
2、創(chuàng)建周期性運行的?Job,例如數(shù)據(jù)庫備份、發(fā)送郵件
Job?控制器:資源清單編寫
#查看?Job?資源對象由哪幾部分組成
kubectl explain Job
Job represents the configuration of a single job. FIELDS:
apiVersion ? ? ? ? ? ? ? #當(dāng)前?Job?的?api?版本
kind ? ? ? ? ? ? ? ? ? ? ? ???#指定當(dāng)前的資源類型
metadata ? ? <Object>? ? ? ? ? ? #元數(shù)據(jù),定義資源的名字和所在名稱空間?
spec ? ? ? ? ? ? ?<Object> ? ? ? ??#查看?Job?下的?spec?字段
kubectl explain Job.spec
FIELDS:
activeDeadlineSeconds #
通過指定job存活時間,來結(jié)束一個job。當(dāng)
job?運行時間達到?activeDeadlineSeconds?指定的時間后,job?會停止由它啟動的所有任務(wù) (如:pod),并設(shè)置?job?的狀態(tài)為?failed
backoffLimit #job?建議指定?pod?的重啟策略為?never, 如:.spec.template.spec.restartPolicy = "Never",然后通過?job?的?backoffLimit?來指 定失敗重試次數(shù),在達到?backoffLimit?指定的次數(shù)后,job?狀態(tài)設(shè)置為?failed(默認為?6?次)
completions <integer> #指定?job?啟動的任務(wù)(如:pod)成功運行?completions?次,job?才算成功結(jié)束
manualSelector <boolean>
parallelism <integer> #指定?job?同時運行的任務(wù)(如:pod)個數(shù),Parallelism?默認為?1,如果設(shè)置為?0,則?job?會暫定
selector。<object>
template <object>.?-required-
ttlSecondsAfterFinished<integer> #默認情況下,job?異?;蛘叱晒Y(jié)束后,包括
job?啟動的任務(wù)(pod),都不會被清理掉,因為你可以依據(jù)保存的?job?和?pod,查看狀態(tài)、
日志,以及調(diào)試等。這些用戶可以手動刪除,用戶手動刪除?job,job controller?會級聯(lián)刪除 對應(yīng)的?pod,除了手動刪除,通過指定參數(shù)?ttlSecondsAfterFinished?也可以實現(xiàn)自動刪除?job,以及級聯(lián)的資源,如:pod。如果設(shè)置為?0,job?會被立即刪除。如果不指定,job?則 不會被刪除
#查看?Job?下的?spec.template?字段
#template?為定義?Pod?的模板,Job?通過模板創(chuàng)建?Pod
kubectl explain Job.spec.template.spec
restartPolicy ?#重啟策略,對于?Job,只能設(shè)置為?Never?或者OnFailure。對于其他?controller(比如?Deployment)可以設(shè)置為?Always?。
?使用Job創(chuàng)建一個一次性任務(wù)
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
? name: my-busybox-job
spec:
? completions: 6
? parallelism: 3
? backoffLimit: 6
? template:
? ? spec:
? ? ? restartPolicy: Never
? ? ? containers:
? ? ? - name: my-container-job
? ? ? ? image: busybox
? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? command: ['sh','-c']
? ? ? ? args: ['echo "Welcome xuexi"; sleep 60 ; echo "Next to Meet you"']
更新
kubectl apply -f job.yaml
查看?Job?狀態(tài):
kubectl get Job
kubectl get job
NAME? ? ? ? ? ? COMPLETIONS? DURATION? AGE
my-busybox-job? 3/6? ? ? ? ? 79s? ? ? ? 79s
#查看?pod?狀態(tài)
kubectl get pods

kubectl logs my-busybox-job-9lzkc
Welcome xuexi
Next to Meet you
#動態(tài)查看?pod?狀態(tài)
kubectl get pods -w

kubectl logs my-busybox-job-xmlcb
Welcome xuexi
Next to Meet you
#資源清單文件詳細解讀
apiVersion: batch/v1?
kind: Job
metadata:
name: my-busybox-job spec:
ttlSecondsAfterFinished: 20
completions: 6 ? ? # Job 成功完成?Pod?的總數(shù)
parallelism: 3 ? ? ? ?#并行執(zhí)行的?pod?數(shù)量是?3?次?
backoffLimit: 6
template: spec:
restartPolicy: Never ? ? #. 重啟策略默認
pod的重啟策略restartpolicy:pod在遇到故障之后重啟的動作有:
1.always:當(dāng)容器退出時,總是重啟容器,默認策略
2.onfailure:當(dāng)容器異常退出(退出狀態(tài)碼非0)時,重啟容器
3.nerver:當(dāng)容器退出時,從不重啟容器
使用CronJob創(chuàng)建周期性的定時任務(wù)
cat cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
? name: hello
spec:
? schedule: "*/1 * * * *"
? jobTemplate:
? ? spec:
? ? ? template:
? ? ? ? spec:
? ? ? ? ? containers:
? ? ? ? ? - name: hello
? ? ? ? ? ? image: busybox
? ? ? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? ? ? command:
? ? ? ? ? ? - /bin/sh
? ? ? ? ? ? - -c
? ? ? ? ? ? - data; echo Hello from the Kubernetes cluster
? ? ? ? ? restartPolicy: OnFailure
更新
kubectl apply -f cronjob.yaml
kubectl get cronjob
NAME? ? SCHEDULE? ? ? SUSPEND? ACTIVE? LAST SCHEDULE? AGE
hello? */1 * * * *? False? ? 0? ? ? ? <none>? ? ? ? ? 39s
#從命令的結(jié)果可以看出,CronJob?還沒有調(diào)度或運行任何?Job。觀察大概一分鐘,等待?CronJob?創(chuàng)建:
kubectl get jobs --watch
NAME? ? ? ? ? ? ? COMPLETIONS? DURATION? AGE
hello-1621232340? 1/1? ? ? ? ? 1s? ? ? ? 62s
hello-1621232400? 1/1? ? ? ? ? 2s? ? ? ? 2s
my-busybox-job? ? 6/6? ? ? ? ? 2m5s? ? ? 20m
#現(xiàn)在可以看到由?hello?這個?cronjob?調(diào)度的一個正在運行的?job。
kubectl get cronjob
NAME? ? SCHEDULE? ? ? SUSPEND? ACTIVE? LAST SCHEDULE? AGE
hello? */1 * * * *? False? ? 0? ? ? ? 62s? ? ? ? ? ? 3m41s
#可以看到?hello?這個?CronJob?成功地在?LAST SCHEDULE?中指定的時間點調(diào)度了一個作 業(yè)。當(dāng)前有?0?個活動作業(yè),這意味著該作業(yè)已經(jīng)完成或失敗。
kubectl get pods | grep hello
hello-1621232400-qm5w6? ? ? 0/1? ? Completed? 0? ? ? ? ? 2m24s
hello-1621232460-dm56x? ? ? 0/1? ? Completed? 0? ? ? ? ? 83s
hello-1621232520-6rfxb? ? ? 0/1? ? Completed? 0? ? ? ? ? 23s
kubectl logs hello-1621232640-z4vw5
Mon May 17 06:24:09 UTC 2021
Hello from the Kubernetes cluster