目錄
一、Deployments - 控制器應(yīng)用
二、Deployment升級回滾和彈性收縮
2.1、創(chuàng)建一個(gè) 1.14 版本的 pod
2.2、應(yīng)用升級
2.3、查看升級狀態(tài)
2.4、查看歷史版本
2.5、應(yīng)用回滾
2.6、彈性伸縮?
三、StatefulSet - 有狀態(tài)應(yīng)用
四、DaemonSet - 守護(hù)進(jìn)程
五、Job - 單次任務(wù)
六、Cronjob - 定時(shí)任務(wù)
一、Deployments - 控制器應(yīng)用
Deployment 表示用戶對 K8S 集群的一次更新操作。Deployment 控制器可以部署無狀態(tài)應(yīng)用,管理 Pod 和 ReplicaSet、部署,滾動升級等功能。
下面是一個(gè) Deployment 示例。
其中創(chuàng)建了一個(gè) ReplicaSet,負(fù)責(zé)啟動三個(gè) nginx Pod:
vim simple-deployment.yam
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # 后續(xù)創(chuàng)建 ReplicaSet 和 Pod 的命名基礎(chǔ)
labels:
app: nginx
spec:
replicas: 3 # pod的副本數(shù)量
selector:
matchLabels:
app: nginx # 定義所創(chuàng)建的 ReplicaSet 如何查找要管理的 Pod
template:
metadata:
labels:
app: nginx # pod模板標(biāo)簽
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
創(chuàng)建Deployment:
$ kubectl create -f simple-deployment.yaml
deployment.apps/nginx-deployment created
# 查看deployment是否創(chuàng)建
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 13s
注意 Deployment 已創(chuàng)建全部三個(gè)副本,并且所有副本都是最新的(它們包含最新的 Pod 模板) 并且可用。字段說明:
- NAME 列出了名字空間中 Deployment 的名稱。
- READY 顯示應(yīng)用程序的可用的“副本”數(shù)。顯示的模式是“就緒個(gè)數(shù)/期望個(gè)數(shù)”。
- UP-TO-DATE 顯示為了達(dá)到期望狀態(tài)已經(jīng)更新的副本數(shù)。
- AVAILABLE 顯示應(yīng)用可供用戶使用的副本數(shù)。
- AGE 顯示應(yīng)用程序運(yùn)行的時(shí)間。
我們可以通過kubectl describe [deployment-name]查看deployment的相關(guān)事件:
$ kubectl describe deploy nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Mon, 06 Feb 2023 06:58:59 +0000
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-85996f8dbd (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 101s deployment-controller Scaled up replica set nginx-deployment-85996f8dbd to 3
我們看到,最下面的Scaled up replica set nginx-deployment-85996f8dbd to 3,其實(shí)就是運(yùn)行三個(gè)副本的Pod,在k8s中deployment是通過ReplicaSet(副本集)來實(shí)現(xiàn)的,當(dāng)我們創(chuàng)建一個(gè)deployment的時(shí)候,會自動創(chuàng)建一個(gè)ReplicaSet來管理pod的副本數(shù)量。
查看 Deployment 創(chuàng)建的 ReplicaSet(rs):
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-85996f8dbd 3 3 3 3m13s
ReplicaSet 輸出中包含以下字段:
- NAME 列出名字空間中 ReplicaSet 的名稱;
- DESIRED 顯示應(yīng)用的期望副本個(gè)數(shù),即在創(chuàng)建 Deployment 時(shí)所定義的值。 此為期望狀態(tài);
- CURRENT 顯示當(dāng)前運(yùn)行狀態(tài)中的副本個(gè)數(shù);
- READY 顯示應(yīng)用中有多少副本可以為用戶提供服務(wù);
- AGE 顯示應(yīng)用已經(jīng)運(yùn)行的時(shí)間長度。
注意 ReplicaSet 的名稱格式始終為 [Deployment 名稱]-[哈希]。 該名稱將成為所創(chuàng)建的 Pod 的命名基礎(chǔ)。 其中的哈希字符串與 ReplicaSet 上的 pod-template-hash 標(biāo)簽一致。
查看ReplicaSet相關(guān)事件:
$ kubectl describe rs nginx-deployment-85996f8dbd
Name: nginx-deployment-85996f8dbd
Namespace: default
Selector: app=nginx,pod-template-hash=85996f8dbd
Labels: app=nginx
pod-template-hash=85996f8dbd
Annotations: deployment.kubernetes.io/desired-replicas: 3
deployment.kubernetes.io/max-replicas: 4
deployment.kubernetes.io/revision: 1
Controlled By: Deployment/nginx-deployment
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
pod-template-hash=85996f8dbd
Containers:
nginx:
Image: nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m24s replicaset-controller Created pod: nginx-deployment-85996f8dbd-q9plt
Normal SuccessfulCreate 3m24s replicaset-controller Created pod: nginx-deployment-85996f8dbd-knwkv
Normal SuccessfulCreate 3m24s replicaset-controller Created pod: nginx-deployment-85996f8dbd-vcs8d
可以看到,replicaset-controller負(fù)責(zé)創(chuàng)建三個(gè)nginx的Pod。
二、Deployment升級回滾和彈性收縮?
- 升級: 假設(shè)從版本為 1.14 升級到 1.15 ,這就叫應(yīng)用的升級【升級可以保證服務(wù)不中斷】;
- 回滾:從版本 1.15 變成 1.14,這就叫應(yīng)用的回滾;
- 彈性伸縮:我們根據(jù)不同的業(yè)務(wù)場景,來改變 Pod 的數(shù)量對外提供服務(wù),這就是彈性伸縮;
2.1、創(chuàng)建一個(gè) 1.14 版本的 pod
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
# 修改 nginx 版本 1.14
- image: nginx:1.14
name: nginx
resources: {}
status: {}
創(chuàng)建pod:
$ kubectl apply -f nginx.yaml
?如上圖,可以看到, 當(dāng)前運(yùn)行的nginx容器的鏡像版本是1.14。
2.2、應(yīng)用升級
$ kubectl set image deployment web nginx=nginx:1.15
升級過程:
$ kubectl set image deployment web nginx=nginx:1.15
deployment.apps/web image updated
# 首先是開始的 nginx 1.14 版本的 Pod 在運(yùn)行,然后 1.15 版本的在創(chuàng)建
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-66bf4959f5-qhzsd 1/1 Running 0 52s
web-bbcf684cb-bbmqv 0/1 ContainerCreating 0 3s
# 然后在 1.15 版本創(chuàng)建完成后,就會暫停 1.14 版本
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-66bf4959f5-qhzsd 1/1 Terminating 0 67s
web-bbcf684cb-bbmqv 1/1 Running 0 18s
# 最后把 1.14 版本的 Pod 移除,完成我們的升級
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-bbcf684cb-bbmqv 1/1 Running 0 33s
我們在下載 1.15 版本,容器就處于 ContainerCreating 狀態(tài),然后下載完成后,就用 1.15 版本去替換 1.14 版本了,這么做的好處就是:升級可以保證服務(wù)不中斷。
2.3、查看升級狀態(tài)
$ kubectl rollout status deployment web
deployment "web" successfully rolled out
2.4、查看歷史版本
$ kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
2.5、應(yīng)用回滾
# 回滾到上一版本
$ kubectl rollout undo deployment web
# 回滾到指定版本
$ kubectl rollout undo deployment web --to-revision=2
如上圖,可以看到,通過kubectl rollout undo成功回滾到上一個(gè)版本,鏡像版本又變成1.14了。當(dāng)然還可以指定--to-revision回滾到指定的版本。
2.6、彈性伸縮?
# 創(chuàng)建5個(gè)pod副本
$ kubectl scale deployment web --replicas=5
deployment.apps/web scaled
# 輸出結(jié)果,等一會就會全部 Running
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-5b9d46fdff-2v2rt 1/1 Running 0 24s
web-5b9d46fdff-4lz7w 1/1 Running 0 24s
web-5b9d46fdff-7tq9x 1/1 Running 0 3m42s
web-5b9d46fdff-mfqhb 1/1 Running 0 24s
web-5b9d46fdff-sfx6q 1/1 Running 0 24s
三、StatefulSet - 有狀態(tài)應(yīng)用
Deployment控制器設(shè)計(jì)原則:管理的所有Pod一模一樣,提供同一個(gè)服務(wù),也不考慮在哪臺Node 運(yùn)行,可隨意擴(kuò)容和縮容。這種應(yīng)用稱為“無狀態(tài)”,例如Web服務(wù)。
在實(shí)際的場景中,并不能滿足所有應(yīng)用,尤其是分布式應(yīng)用,會部署多個(gè)實(shí)例,這些實(shí)例之間往往有依賴關(guān)系,例如主從關(guān)系、主備關(guān)系,這種應(yīng)用稱為“有狀態(tài)”,例如MySQL主從、Etcd集群。
這時(shí)候就需要有狀態(tài)部署了,有狀態(tài)部署有以下幾個(gè)特點(diǎn):
- 1、每個(gè)pod角色不同(不對等)
- 2、pod之間有連接關(guān)系
- 3、每個(gè)pod都有獨(dú)立的存儲
StatefulSet控制器用于部署有狀態(tài)應(yīng)用,滿足一些有狀態(tài)應(yīng)用的需求:
? Pod有序的部署、擴(kuò)容、刪除和停止;
? Pod分配一個(gè)穩(wěn)定的且唯一的網(wǎng)絡(luò)標(biāo)識;
? Pod分配一個(gè)獨(dú)享的存儲;
穩(wěn)定的Pod網(wǎng)絡(luò)標(biāo)識:使用Headless Service(相比普通Service只是將spec.clusterIP定義為None)。
維護(hù)Pod網(wǎng)絡(luò)身份,會為每個(gè)Pod分配一個(gè)數(shù)字編號并且按照編號順序部署。
穩(wěn)定主要體現(xiàn)在主機(jī)名和Pod A記錄:
? 主機(jī)名:<statefulset名稱>-<編號>
? Pod DNS A記錄:<statefulset名稱-編號>.<service-name> .<namespace>.svc.cluster.local
通過一個(gè)StatefulSet有狀態(tài)應(yīng)用的例子來說明:
準(zhǔn)備sta.yaml文件:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
clusterIP: None
ports:
- port: 80
name: nginx
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
創(chuàng)建并查看pod:
$ kubectl apply -f sta.yaml
service/nginx created
statefulset.apps/nginx-statefulset created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-statefulset-0 1/1 Running 0 62s
nginx-statefulset-1 1/1 Running 0 43s
nginx-statefulset-2 1/1 Running 0 39s
可以看到,每個(gè)pod都有一個(gè)唯一的名稱。
[root@localhost ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
nginx ClusterIP None <none> 80/TCP 110s
?可以看到,CULSTER-IP為None,說明這是一個(gè)Headless Service。
四、DaemonSet - 守護(hù)進(jìn)程
DaemonSet 確保全部節(jié)點(diǎn)上都運(yùn)行一個(gè) Pod 的副本。 當(dāng)有節(jié)點(diǎn)加入集群時(shí), 也會為他們新增一個(gè) Pod 。 當(dāng)有節(jié)點(diǎn)從集群移除時(shí),這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創(chuàng)建的所有 Pod。
DaemonSet 的一些典型用法:
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行集群守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行日志收集守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控守護(hù)進(jìn)程
一種簡單的用法是為每種類型的守護(hù)進(jìn)程在所有的節(jié)點(diǎn)上都啟動一個(gè) DaemonSet。 一個(gè)稍微復(fù)雜的用法是為同一種守護(hù)進(jìn)程部署多個(gè) DaemonSet;每個(gè)具有不同的標(biāo)志, 并且對不同硬件類型具有不同的內(nèi)存、CPU 要求。
DaemonSet示例:
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
創(chuàng)建并查看pod:?
# 當(dāng)前集群中存在兩個(gè)節(jié)點(diǎn)
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 2d17h v1.26.0
node01 Ready <none> 2d16h v1.26.0
$ kubectl apply -f daemonset.yaml
daemonset.apps/nginx created
# nginx pod在兩個(gè)節(jié)點(diǎn)都處于運(yùn)行狀態(tài)
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-frmjc 1/1 Running 0 6s 192.168.1.4 node01 <none> <none>
nginx-qdb7s 1/1 Running 0 6s 192.168.0.8 controlplane <none> <none>
五、Job - 單次任務(wù)
Job 會創(chuàng)建一個(gè)或者多個(gè) Pod,并將繼續(xù)重試 Pod 的執(zhí)行,直到指定數(shù)量的 Pod 成功終止。 隨著 Pod 成功結(jié)束,Job 跟蹤記錄成功完成的 Pod 個(gè)數(shù)。 當(dāng)數(shù)量達(dá)到指定的成功個(gè)數(shù)閾值時(shí),任務(wù)(即 Job)結(jié)束。 刪除 Job 的操作會清除所創(chuàng)建的全部 Pod。 掛起 Job 的操作會刪除 Job 的所有活躍 Pod,直到 Job 被再次恢復(fù)執(zhí)行。
示例 Job:下面是一個(gè) Job 配置示例。它負(fù)責(zé)計(jì)算 π 到小數(shù)點(diǎn)后 2000 位,并將結(jié)果打印出來。 此計(jì)算大約需要 10 秒鐘完成。
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi-job
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
創(chuàng)建并查看job:?
$ kubectl apply -f job.yaml
job.batch/pi-job created
$ kubectl get job
NAME COMPLETIONS DURATION AGE
pi-job 1/1 30s 82s
$ kubectl describe job pi-job
Name: pi-job
Namespace: default
Selector: controller-uid=63b08866-0f04-4326-98ac-08118ec419d7
Labels: controller-uid=63b08866-0f04-4326-98ac-08118ec419d7
job-name=pi-job
Annotations: batch.kubernetes.io/job-tracking:
Parallelism: 1
Completions: 1
Completion Mode: NonIndexed
Start Time: Sun, 29 Jan 2023 07:48:01 +0000
Completed At: Sun, 29 Jan 2023 07:48:31 +0000
Duration: 30s
Pods Statuses: 0 Active (0 Ready) / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=63b08866-0f04-4326-98ac-08118ec419d7
job-name=pi-job
Containers:
pi:
Image: perl:5.34.0
Port: <none>
Host Port: <none>
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 84s job-controller Created pod: pi-job-q7h7c
Normal Completed 54s job-controller Job completed
要查看 Job 對應(yīng)的已完成的 Pod,可以執(zhí)行 kubectl get pod:?
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-job-q7h7c 0/1 Completed 0 117s
# 查看Pod的標(biāo)準(zhǔn)輸出
$ kubectl logs pi-job-q7h7c
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
六、Cronjob - 定時(shí)任務(wù)
CronJob 創(chuàng)建基于時(shí)隔重復(fù)調(diào)度的 Job。
CronJob 用于執(zhí)行排期操作,例如備份、生成報(bào)告等。 一個(gè) CronJob 對象就像 Unix 系統(tǒng)上的 crontab(cron table)文件中的一行。 它用 Cron 格式進(jìn)行編寫, 并周期性地在給定的調(diào)度時(shí)間執(zhí)行 Job。
CronJob示例:下面的 CronJob 示例清單會在每分鐘打印出當(dāng)前時(shí)間和問候消息
vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: busybox
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
創(chuàng)建并查看cronjob:
$ kubectl create -f cronjob.yaml
cronjob.batch/hello-cronjob created
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello-cronjob * * * * * False 0 <none> 6s
$ kubectl describe cronjob hello-cronjob
Name: hello-cronjob
Namespace: default
Labels: <none>
Annotations: <none>
Schedule: * * * * *
Concurrency Policy: Allow
Suspend: False
Successful Job History Limit: 3
Failed Job History Limit: 1
Starting Deadline Seconds: <unset>
Selector: <unset>
Parallelism: <unset>
Completions: <unset>
Pod Template:
Labels: <none>
Containers:
busybox:
Image: busybox:1.28
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
date; echo Hello from the Kubernetes cluster
Environment: <none>
Mounts: <none>
Volumes: <none>
Last Schedule Time: Sun, 29 Jan 2023 07:57:00 +0000
Active Jobs: hello-cronjob-27916317
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 1s cronjob-controller Created job hello-cronjob-27916317
查看cronjob生成的pod:文章來源:http://www.zghlxwxcb.cn/news/detail-614148.html
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-cronjob-27916317-zdc9d 0/1 Completed 0 100s
hello-cronjob-27916318-nx65t 0/1 Completed 0 40s
$ kubectl logs hello-cronjob-27916317-zdc9d
Sun Jan 29 07:57:02 UTC 2023
Hello from the Kubernetes cluster
$ kubectl logs hello-cronjob-27916318-nx65t
Sun Jan 29 07:58:00 UTC 2023
Hello from the Kubernetes cluster
可以看到,cronjob每分鐘就會生成一個(gè)對應(yīng)的pod,然后日志輸出當(dāng)前時(shí)間和對應(yīng)的提示消息。文章來源地址http://www.zghlxwxcb.cn/news/detail-614148.html
到了這里,關(guān)于5、Kubernetes核心技術(shù) - Controller控制器工作負(fù)載的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!