海南海口網(wǎng)站開(kāi)發(fā)公司怎么進(jìn)行網(wǎng)站推廣
pod控制器發(fā)的概念:
工作負(fù)載,workload用于管理pod的中間層,確保pod資源符合預(yù)期的狀態(tài)。
預(yù)期狀態(tài):
1、副本數(shù)
2、容器重啟策略
3、鏡像拉取策略
pod出故障的出去等等
pod控制器的類型:
1、replicaset:指定pod副本的數(shù)量
三個(gè)組件:
1、pod的副本
2、標(biāo)簽選擇器,判斷哪個(gè)pod歸自己管理
3、擴(kuò)縮容
2、Deployment控制器,他是掛載在replicaset之上。管理無(wú)狀態(tài)應(yīng)用。目前最好的控制器,支持滾動(dòng)更新和回滾。提供聲明式配置。
3、statefulSet:控制器的一種,管理有狀態(tài)的應(yīng)用,也可以設(shè)置副本數(shù),可以擴(kuò)縮容。pod的序號(hào)是固定的。重啟之后,pod的名稱也不會(huì)發(fā)生變化。有狀態(tài)。
4、DaemonSet:可以在所有節(jié)點(diǎn)部署一個(gè)pod,他沒(méi)有副本數(shù)??梢韵拗撇渴鸬墓?jié)點(diǎn)。也是無(wú)狀態(tài)的應(yīng)用。服務(wù)必須是一個(gè)守護(hù)進(jìn)程。ingress logstashflannel
5、job:工作pod控制器,執(zhí)行完成即可退出,不要重啟,不需要重建
6、cronjob:周期性的定時(shí)任務(wù)控制器,不需要再后臺(tái)持續(xù)運(yùn)行。
pod和控制器的關(guān)系:
1、controllers:管理控制器。
pod通過(guò)label-----------》selector進(jìn)行關(guān)聯(lián)。
1、Deployment控制器
strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25%
這是Deployment的默認(rèn)更新策略
rollingUpdate:滾動(dòng)更新
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx
spec:replicas: 1selector:matchLabels:app: nginx1strategy:type: Recreate
#每次有更新,都會(huì)把舊的pod全部停止,然后再啟動(dòng)新的實(shí)例。服務(wù)可能會(huì)短暫的終端。無(wú)特殊需要可不加template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx
maxSurge: 25%:升級(jí)過(guò)程中,新啟動(dòng)的pod數(shù)量不能超過(guò)期望pod數(shù)的25%
maxUnavailable: 25%:在升級(jí)過(guò)程中,新的pod啟動(dòng)好之后,銷毀的舊的pod數(shù)量不能超過(guò)期望pod的25%。
2、statefulSet 有狀態(tài)應(yīng)用
無(wú)狀態(tài)應(yīng)用,pod名稱是無(wú)序的,任務(wù)所有pod的都是一體的。共享存儲(chǔ) NFS,所有deployment下的pod共享一個(gè)存儲(chǔ)。
statefulSet:有狀態(tài)的應(yīng)用。pod名稱是有序的,所有pod都是獨(dú)立的。存儲(chǔ)卷也是獨(dú)立的
順序:0-n,delete刪除也不會(huì)改變pod的序號(hào),擴(kuò)縮容也是有序的。
apiVersion: v1
kind: Service
metadata:name: nginx-weblabels:app: nginx2
spec:ports:- port: 80targetPort: 80clusterIP: ""selector:app: nginx2
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: weblabels:app: nginx2
spec:replicas: 2selector:matchLabels:app: nginx2serviceName: "nginx-web"template:metadata:labels:app: nginx2spec:containers:- name: nginximage: nginx:1.22volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: htmlspec:accessModes: ["ReadWriteMany"]storageClassName: "nfs-client-storageclass"resources:requests:storage: 2Gi
headless service:無(wú)頭服務(wù),沒(méi)有clusterIP,必須要有動(dòng)態(tài)的pvc。
k8s集群當(dāng)中一種特殊的服務(wù)類型。不分配ClusterIP給Service,不會(huì)負(fù)載均衡到后端的pod。
dns來(lái)提供服務(wù)的發(fā)現(xiàn)和訪問(wèn)。
由于ClusterIP的是空,k8s集群會(huì)給每個(gè)headless service中的pod創(chuàng)建一個(gè)dns記錄。
格式:pod-name.headless-service-name.namespace.svc.cluster.local.
web-0 nginx-web defaults 本地地址(pod的IP當(dāng)中)
通過(guò)Dns直接解析訪問(wèn)pod的IP地址
類似于在集群中給pod做了一個(gè)映射
為什么要用headless????
有序。獨(dú)立個(gè)體。
deployment的pod是沒(méi)有名稱的,隨機(jī)字符串,無(wú)序。他需要一個(gè)集中的clusterip來(lái)集中統(tǒng)一為pod提供網(wǎng)絡(luò)
statefulset是有序的,pod的名稱是固定的。重建之后pod的標(biāo)識(shí)符也不變。pod的名稱是唯一的標(biāo)識(shí)符。
系統(tǒng)直接通過(guò)pod名稱解析ip地址。IP地址會(huì)不會(huì)變???
答案:ip地址會(huì)變,類似于訪問(wèn)www.baidu.com 但訪問(wèn)的IP不是同一個(gè)。
為什么要有動(dòng)態(tài)的pv???
只要是有狀態(tài)的副本集群都會(huì)涉及持久化存儲(chǔ),每個(gè)pod是獨(dú)立個(gè)體,每個(gè)pod都有自己專用的存儲(chǔ)點(diǎn)。
statefulset在定義的時(shí)候就規(guī)定了每個(gè)pod是不能同一個(gè)存儲(chǔ)卷。
不是固定節(jié)點(diǎn)的應(yīng)用,不是固定節(jié)點(diǎn)的ip應(yīng)用
更新發(fā)布比較頻繁,名稱不變。
支持自動(dòng)伸縮,節(jié)點(diǎn)的資源不夠,可以自動(dòng)擴(kuò)縮容。
3、daemonSet
daemonSet:確保每個(gè)節(jié)點(diǎn)上都運(yùn)行一個(gè)副本,當(dāng)有node加入集群,也會(huì)為他新增一個(gè)pod
當(dāng)node節(jié)點(diǎn)從集群當(dāng)中移除時(shí),pod也會(huì)被回收。
daemonSet不需要指定調(diào)度策略,默認(rèn)會(huì)在每個(gè)節(jié)點(diǎn)創(chuàng)建一個(gè)pod。除非污點(diǎn)
我們也可以通過(guò)指定的方式,只把deamonset部害在指定的節(jié)點(diǎn)。沒(méi)有副本數(shù)選擇,不需要設(shè)置
控制器類型的資源創(chuàng)建方式: 基于控制器創(chuàng)建的pod,delete只是相當(dāng)于重啟,要徹底刪除pod,必須刪除控制器。
千萬(wàn)不要delete
部署在所有節(jié)點(diǎn)
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx-deamonlabels:app: nginx1
#提高代碼可讀性,別人讀
spec:selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx
#不定義副本數(shù),DaemonSet在每一個(gè)node上部署一個(gè)。
指定節(jié)點(diǎn)部署
此處定義了node02節(jié)點(diǎn)標(biāo)簽 ingress=true
?
apiVersion: apps/v1
kind: DaemonSet
metadata:name: nginx2-deamonlabels:app: nginx2
#提高代碼可讀性,別人讀
spec:selector:matchLabels:app: nginx2template:metadata:labels:app: nginx2spec:containers:- image: nginx:1.22name: nginx2nodeSelector:ingress: "true"
#不定義副本數(shù),DaemonSet在指定node上部署一個(gè)。
#除非污點(diǎn),不部署
4、job
job:job分為兩類:job普通任務(wù) 和 cronjob定時(shí)任務(wù)
job:執(zhí)行只需要一次性的任務(wù)。
腳本需要執(zhí)行,數(shù)據(jù)庫(kù)遷移,視頻解碼等等業(yè)務(wù)。
對(duì)于k8s系統(tǒng)來(lái)說(shuō),既然定義了是job,你只需要執(zhí)行一次,或者指定次數(shù)即可,不能一種允許。
第一個(gè):必須指定容器的重啟策略,onfailure never
第二個(gè):執(zhí)行失敗的次數(shù)也是收限制的,,默認(rèn)是6次
第三個(gè):跟新yaml文件,先刪除任務(wù),再更新。不能動(dòng)態(tài)更新。
坑:容器化部署過(guò)數(shù)據(jù)庫(kù)沒(méi)有??
可以,數(shù)據(jù)庫(kù)是核心資產(chǎn),不會(huì)容器化部署。你們公司是容器化部署嗎?
前端你們會(huì)容器化部署嗎??
nginx可以容器化部署。
apiVersion: batch/v1
kind: Job
metadata:name: centos-job
spec:template:spec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","test -e /etc/passwd1"]restartPolicy: NeverbackoffLimit: 4
#允許任務(wù)失敗的次數(shù),4次后,restartPolicy的策略,來(lái)進(jìn)行容器的重啟或者不重啟。
5、cronjob
周期性任務(wù),定期執(zhí)行,和linux的crontab的語(yǔ)法一模一樣
分時(shí)日月周? ?* * * * *?
應(yīng)用場(chǎng)景:定時(shí)備份 通知作用 定時(shí)檢測(cè)(結(jié)合探針一起做)
定時(shí)任務(wù)yaml文件
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: centos-cronjob
spec:schedule: "*/1 * * * *"concurrencyPolicy: Allow
#如果執(zhí)行失敗的任務(wù)的保留的個(gè)數(shù) 默認(rèn)是1個(gè)startingDeadlineSeconds: 15
#pod啟動(dòng)之后必須在一定的時(shí)間內(nèi)開(kāi)始執(zhí)行,如果超過(guò)15秒沒(méi)有運(yùn)行,任務(wù)將不會(huì)運(yùn)行,任務(wù)也會(huì)標(biāo)記失敗successfulJobsHistoryLimit: 3
#保留成功的任務(wù)數(shù),默認(rèn)值就是3jobTemplate:spec:template:spec:containers:- image: centos:7name: centoscommand: ["/bin/bash","-c","date; echo lyw"]restartPolicy: Never
總結(jié):
五個(gè)都是控制器創(chuàng)建的pod,都是依賴控制器
deployment:無(wú)狀態(tài)應(yīng)用,最好用的,也是用的最多的
statefulSet:有狀態(tài)應(yīng)用,有序的,獨(dú)立的pod
daemonSet:無(wú)狀態(tài)應(yīng)用,不能定義副本數(shù)。每個(gè)節(jié)點(diǎn)都運(yùn)行一個(gè)pod,可以指定節(jié)點(diǎn)
job:執(zhí)行一次性的任t務(wù),必須有重啟策略,是默認(rèn)失敗次數(shù)6次,只有失敗次數(shù)達(dá)到,重啟會(huì)生效
cronjob: 定時(shí)任務(wù)。通知,備份或者探測(cè) cronjob定期檢測(cè)nginx的80端口是 tcptocker */1 * * * *