一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機(jī)|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識(shí)|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - 服務(wù)器知識(shí) - K8S中五種控制器的介紹以及使用

K8S中五種控制器的介紹以及使用

2022-01-23 23:33早川語 服務(wù)器知識(shí)

這篇文章主要給大家介紹了關(guān)于K8S中五種控制器及使用的相關(guān)資料,控制器 又稱之為工作負(fù)載,本文通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

 

k8s的控制器類型

Kubernetes中內(nèi)建了很多controller(控制器),這些相當(dāng)于一個(gè)狀態(tài)機(jī),用來控制Pod的具體狀態(tài)和行為

Deployment:適合無狀態(tài)的服務(wù)部署

StatefullSet:適合有狀態(tài)的服務(wù)部署

DaemonSet:一次部署,所有的node節(jié)點(diǎn)都會(huì)部署,例如一些典型的應(yīng)用場景:

運(yùn)行集群存儲(chǔ) daemon,例如在每個(gè)Node上運(yùn)行 glusterd、ceph

在每個(gè)Node上運(yùn)行日志收集 daemon,例如 fluentd、 logstash

在每個(gè)Node上運(yùn)行監(jiān)控 daemon,例如 Prometheus Node Exporter

Job:一次性的執(zhí)行任務(wù)

Cronjob:周期性的執(zhí)行任務(wù)

總體來說,K8S有五種控制器,分別對(duì)應(yīng)處理無狀態(tài)應(yīng)用、有狀態(tài)應(yīng)用、守護(hù)型應(yīng)用和批處理應(yīng)用

 

pod與控制器之間的關(guān)系

controllers:在集群上管理和運(yùn)行容器的對(duì)象通過label-selector相關(guān)聯(lián)

Pod通過控制器實(shí)現(xiàn)應(yīng)用的運(yùn)維,如伸縮,升級(jí)等

K8S中五種控制器的介紹以及使用

 

Deployment(無狀態(tài)化應(yīng)用)

應(yīng)用場景:web服務(wù)

Deployment中文意思為部署、調(diào)度,通過Deployment我們能操作RS(ReplicaSet),你可以簡單的理解為它是一種通過yml文件的聲明,在Deployment 文件里可以定義Pod數(shù)量、更新方式、使用的鏡像,資源限制等。無狀態(tài)應(yīng)用都用Deployment來創(chuàng)建

通過Deployment對(duì)象,你可以輕松的做到以下事情:

  • 創(chuàng)建ReplicaSet和Pod
  • 滾動(dòng)升級(jí)(不停止舊服務(wù)的狀態(tài)下升級(jí))和回滾應(yīng)用(將應(yīng)用回滾到之前的版本)
  • 平滑地?cái)U(kuò)容和縮容
  • 暫停和繼續(xù)Deployment
Deployment創(chuàng)建
[root@master shuai]# vim nginx-delpoy.yaml

apiVersion: apps/v1
kind: Deployment   "定義是Deployment"
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  "副本數(shù)量為3"
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80


"創(chuàng)建資源"
[root@master shuai]# kubectl apply -f nginx-delpoy.yaml 
deployment.apps/nginx-deployment created

//Replicaset 是控制版本,副本數(shù),回滾就是通過此來實(shí)現(xiàn)
"//查看所有資源"
[root@master shuai]# kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-d55b94fd-cndf2   1/1     Running   0          3m31s
pod/nginx-deployment-d55b94fd-ghlwk   1/1     Running   0          3m31s
pod/nginx-deployment-d55b94fd-tm4sw   1/1     Running   0          3m31s
pod/pod-example                       1/1     Running   0          10h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   3d6h

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3         3         3            3           3m31s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-d55b94fd   3         3         3       3m31s

查看控制器信息
kubectl deit deployment/nginx-deployment
.....省略信息.....
strategy:
    rollingUpdate:         "版本更新為滾動(dòng)更新機(jī)制"
      maxSurge: 25%        "最大更新副本數(shù)是25%,最多擴(kuò)容125%" "為了保持副本數(shù)量,增加的百分比同時(shí)要銷毀多少"
      maxUnavailable: 25%  "最大刪除副本是25%,最多縮容到75%"
    type: RollingUpdate
...省略信息....


"執(zhí)行kubectl describe deploy nginx-deployment 也可以查看"

....省略信息....
RollingUpdateStrategy:  25% max unavailable, 25% max surge

查看歷史版本

[root@master shuai]# kubectl rollout history deploy/nginx-deployment
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>   "//這邊只有一個(gè),證明還沒有滾動(dòng)更新"

 

狀態(tài)與無狀態(tài)化對(duì)特點(diǎn)

無狀態(tài)服務(wù)的特點(diǎn):

1)deployment 認(rèn)為所有的pod都是一樣的

2)不用考慮順序的要求

3)不用考慮在哪個(gè)node節(jié)點(diǎn)上運(yùn)行

4)可以隨意擴(kuò)容和縮容

有狀態(tài)服務(wù)的特點(diǎn):

1)實(shí)例之間有差別,每個(gè)實(shí)例都有自己的獨(dú)特性,元數(shù)據(jù)不同,例如etcd,zookeeper

2)實(shí)例之間不對(duì)等的關(guān)系,以及依靠外部存儲(chǔ)的應(yīng)用。

 

Deployment的更新

如果想要讓 nginx pod 使用 nginx:1.9.1 的鏡像來代替原來的 nginx的鏡像,運(yùn)行以下命令
[root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated

或者我們可以使用 edit 命令來編輯 Deployment,將image從nginx改寫成 nginx:1.9.1
kubectl edit deployment/nginx-deployment

查看更新進(jìn)度
[root@master ~]# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out

Deployment更新時(shí)會(huì)創(chuàng)建一個(gè)新的ReplicaSet,然后將新的ReplicaSet中的Pod慢慢擴(kuò)容到指定的副本數(shù),將舊的ReplicaSet慢慢縮容到0。因此,更新時(shí)總能夠確保舊的服務(wù)不會(huì)停止,這就是滾動(dòng)更新。

 

Deployment的回滾

當(dāng)我們像上文一樣更新了Deployment之后,我們發(fā)現(xiàn)nginx:1.9.1的鏡像不是很穩(wěn)定,因此想要修改回nginx:1.7.9的版本,此時(shí)我們不需要手動(dòng)更改Deployment文件,而是利用Deployment的回滾功能。

使用rollout history命令查看Deployment的版本(revision):

[root@master ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         kubectl create --filename=deploy.yml --record=true
2         kubectl create --filename=deploy.yml --record=true

因?yàn)槲覀儎?chuàng)建 Deployment 的時(shí)候使用了 —recored 參數(shù)可以記錄命令,我們可以很方便的查看每次 revison 的變化。

查看單個(gè) revision 的詳細(xì)信息:

[root@master ~]# kubectl rollout history deployment/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=658d7f4b4b
  Annotations:  kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
  Containers:
   nginx:
    Image:      nginx:1.9.1
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

可以使用rollout undo命令回滾到前一個(gè)revision
[root@master ~]# kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back

[root@master ~]# kubectl describe deployment/nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 3
                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
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
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>

也可以使用–to-revision參數(shù)指定某個(gè)歷史版本:

[root@master ~]#  kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back

[root@master ~]# kubectl describe deployment/nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 4
                        kubernetes.io/change-cause: kubectl create --filename=deploy.yml --record=true
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 4 total | 3 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.9.1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>

你可以通過設(shè)置 .spec.revisonHistoryLimit 項(xiàng)來指定 deployment 最多保留多少 revison 歷史記錄。默認(rèn)的會(huì)保留所有的 revision;如果將該項(xiàng)設(shè)置為 0,Deployment 就不允許回退了。

只有 Deployment 的 rollout 被觸發(fā)才會(huì)創(chuàng)建一個(gè) revision!注意!當(dāng)且僅當(dāng) Deployment 的 Pod template被更改,例如更新 template 中的 label 和容器鏡像時(shí),才會(huì)觸發(fā)一個(gè)rollout,從而為Deployment創(chuàng)建出一個(gè)新的 revision。

rollout命令的更多用法:

  • history(查看歷史版本)
  • pause(暫停Deployment)
  • resume(恢復(fù)暫停的Deployment)
  • status(查看資源狀態(tài))
  • undo(回滾版本)

Job Controller負(fù)責(zé)根據(jù)Job Spec創(chuàng)建Pod,并持續(xù)監(jiān)控Pod的狀態(tài),直至其成功結(jié)束。如果失敗,則根據(jù)restartPolicy(只支持OnFailure和Never,不支持Always)決定是否創(chuàng)建新的Pod再次重試任務(wù)。

K8S中五種控制器的介紹以及使用

Job負(fù)責(zé)批量處理短暫的一次性任務(wù) (short lived one-off tasks),即僅執(zhí)行一次的任務(wù),它保證批處理任務(wù)的一個(gè)或多個(gè)Pod成功結(jié)束。

Kubernetes支持以下幾種Job:

  • 非并行Job:通常創(chuàng)建一個(gè)Pod直至其成功結(jié)束
  • 固定結(jié)束次數(shù)的Job:設(shè)置.spec.completions,創(chuàng)建多個(gè)Pod,直到.spec.completions個(gè)Pod成功結(jié)束
  • 帶有工作隊(duì)列的并行Job:設(shè)置.spec.Parallelism但不設(shè)置.spec.completions,當(dāng)所有Pod結(jié)束并且至少一個(gè)成功時(shí),Job就認(rèn)為是成功
  • 根據(jù).spec.completions和.spec.Parallelism的設(shè)置,可以將Job劃分為以下幾種pattern
JOB類型 使用實(shí)例 行為 completions parallelism
一次性Job 數(shù)據(jù)庫遷移 創(chuàng)建一個(gè)Pod直至其成功結(jié)束 1 1
固定結(jié)束次數(shù)的Job 處理工作隊(duì)列的Pod 依次創(chuàng)建一個(gè)Pod運(yùn)行直至completions個(gè)成功結(jié)束 2+ 1
固定結(jié)束次數(shù)的并行Job 多個(gè)Pod同時(shí)處理工作隊(duì)列 依次創(chuàng)建多個(gè)Pod運(yùn)行直至completions個(gè)成功結(jié)束 2+ 2+
并行Job 多個(gè)Pod同時(shí)處理工作隊(duì)列 創(chuàng)建一個(gè)或多個(gè)Pod直至有一個(gè)成功結(jié)束 1 2+
.job的使用
[root@master ~]# vi job.yml 
---
apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: busybox
        command: ["echo",  "hello k8s job"]
      restartPolicy: Never


[root@master ~]# kubectl apply -f job.yml 
job.batch/myjob created
[root@master ~]# kubectl get pods
NAME          READY   STATUS      RESTARTS   AGE
myjob-gq27p   0/1     Completed   0          37s

#查看這個(gè) pod的任務(wù)
[root@master ~]# kubectl get job
NAME    COMPLETIONS   DURATION   AGE
myjob   1/1           19s        5m11s

#查看這個(gè) pod的日志
[root@master ~]# kubectl logs myjob-gq27p
hello k8s job

 

CronJob控制器

CronJob 可以用來執(zhí)行基于時(shí)間計(jì)劃的定時(shí)任務(wù),類似于Linux/Unix系統(tǒng)中的 crontable (opens new window)。

CronJob 執(zhí)行周期性的重復(fù)任務(wù)時(shí)非常有用,例如備份數(shù)據(jù)、發(fā)送郵件等。CronJob 也可以用來指定將來某個(gè)時(shí)間點(diǎn)執(zhí)行單個(gè)任務(wù),例如將某項(xiàng)任務(wù)定時(shí)到系統(tǒng)負(fù)載比較低的時(shí)候執(zhí)行。

一個(gè) CronJob 對(duì)象就像 crontab (cron table) 文件中的一行。 它用Cron格式進(jìn)行編寫, 并周期性地在給定的調(diào)度時(shí)間執(zhí)行 Job。

注意:

  • 所有 CronJob 的 schedule: 時(shí)間都是基于kube-controller-manager. 的時(shí)區(qū)。
  • 如果你的控制平面在 Pod 或是裸容器中運(yùn)行了 kube-controller-manager, 那么為該容器所設(shè)置的時(shí)區(qū)將會(huì)決定 Cron Job 的控制器所使用的時(shí)區(qū)。
  • 為 CronJob 資源創(chuàng)建清單時(shí),請(qǐng)確保所提供的名稱是一個(gè)合法的DNS 子域名. 名稱不能超過 52 個(gè)字符。 這是因?yàn)?CronJob 控制器將自動(dòng)在提供的 Job 名稱后附加 11 個(gè)字符,并且存在一個(gè)限制, 即 Job 名稱的最大長度不能超過 63 個(gè)字符。
  • CronJob 用于執(zhí)行周期性的動(dòng)作,例如備份、報(bào)告生成等。 這些任務(wù)中的每一個(gè)都應(yīng)該配置為周期性重復(fù)的(例如:每天/每周/每月一次); 你可以定義任務(wù)開始執(zhí)行的時(shí)間間隔。

下面的 CronJob 示例清單會(huì)在每分鐘打印出當(dāng)前時(shí)間和問候消息:

[root@master kubenetres]# vi cronjob.yml
---
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
            - date; echo Hello nihao
          restartPolicy: OnFailure

創(chuàng)建pod查看
[root@master ~]# kubectl apply -f cronjob.yml 
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
cronjob.batch/hello created

#等一分鐘查看
[root@master ~]# kubectl get pods
NAME                   READY   STATUS      RESTARTS   AGE
hello-27339330-kkfxv   0/1     Completed   0          2s

#查看日志
[root@master ~]# kubectl logs hello-27339330-kkfxv
Fri Dec 24 15:30:00 UTC 2021
Hello nihao

 

總結(jié)

到此這篇關(guān)于K8S中五種控制器及使用的文章就介紹到這了,更多相關(guān)K8S控制器使用內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/qq_29188123/article/details/122162725

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: free白嫩性hd | 四虎comwww最新地址 | 香港三级血恋3 | 寡妇快点好大好爽视频 | 60岁了天天要小伙子 | 王淑兰李思雨李铁柱乡村小说免费 | 亚欧日韩 | yellow视频免费观看播放 | 小小水蜜桃视频高清在线观看免费 | 亚洲精品乱码蜜桃久久久 | 亚洲干综合 | 国产综合欧美日韩视频一区 | 99色亚洲| zoomkool最新版 | 日本xnxnxnxnxn护士 | 亚洲sss综合天堂久久久 | 色噜噜国产精品视频一区二区 | 5g影院天天爽爽 | 亚洲 制服 欧美 中文字幕 | 亚洲国产精品一在线观看 | 亚洲国产第一区二区香蕉日日 | 久久成人a毛片免费观看网站 | 国产农村一一级特黄毛片 | 色狠狠色狠狠综合天天 | 99在线精品免费视频九九视 | 久久亚洲免费视频 | 欧美性高清另类videosex死尸 | 国产综合欧美日韩视频一区 | 91果冻制片厂天美传媒 | 99av导航| 亚洲AV 日韩 国产 有码 | 久久久无码精品亚洲A片软件 | 久久热r在线视频精品 | 色男人网 | 2019午夜福合集高清完整版 | 精品成人网 | 日本韩国在线 | 国产一区二区免费在线 | 欧美一区二区福利视频 | 成人国产网站v片免费观看 成人国产精品视频 | 韩剧在线观看 |