日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob

發布時間:2024/3/7 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、資源元信息

Kubernetes的資源對象組成:主要包括了Spec、Status兩部分。其中Spec部分用來描述期望的狀態,Status部分用來描述觀測到的狀態

Kubernetes的元數據部分。該部分主要包括了用來識別資源的標簽:Label;用來描述資源的注解:Annotation;用來描述多個資源之間相互關系的OwnerReference

1)、Label

Label是Kubernetes系統中的一個重要概念。它的作用就是在資源上添加標識,用來對它們進行區分和選擇

Label的特點:

  • 一個Label會以key/value鍵值對的形式附加到各種對象上,如Node、Pod、Service等等
  • 一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象上去
  • Label通常在資源對象定義時確定,當然也可以在對象創建后動態添加或者刪除

可以通過Label實現資源的多維度分組,以便靈活、方便地進行資源分配、調度、配置、部署等管理工作

一些常用的Label示例如下:

  • 版本標簽:“version”:“release”,“version”:“stable”
  • 環境標簽:“environment”:“dev”,“environment”:“test”,“environment”:“pro”
  • 架構標簽:“tier”:“frontend”,“tier”:“backend”

標簽定義完畢之后,還要考慮到標簽的選擇,這就要使用到Label Selector,即:

  • Label用于給某個資源對象定義標識

  • Label Selector用于查詢和篩選擁有某些標簽的資源對象

當前有兩種Label Selector:

  • 基于等式的Label Selector

    name = slave:選擇所有包含Label中key="name"且value="slave"的對象

    env != production:選擇所有包括Label中的key="env"且value不等于"production"的對象

  • 基于集合的Label Selector

    name in (master, slave):選擇所有包含Label中的key="name"且value="master"或"slave"的對象

    name not in (frontend):選擇所有包含Label中的key="name"且value不等于"frontend"的對象

標簽的選擇條件可以使用多個,此時將多個Label Selector進行組合,使用逗號","進行分隔即可。例如:

name = slave, env != production

name not in (frontend), env != production

1)命令方式

創建pod-label.yaml文件,內容如下:

apiVersion: v1 kind: Pod metadata:name: pod-labelnamespace: dev spec:containers:- image: nginx:1.17.1name: podports:- name: nginx-portcontainerPort: 80protocol: TCP # 創建Pod [root@k8s-master ~]# kubectl create -f pod-label.yaml pod/pod-label created# 為pod資源打標簽 [root@k8s-master ~]# kubectl label pod pod-label version=1.0 -n dev pod/pod-label labeled [root@k8s-master ~]# kubectl get pod pod-label -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-label 1/1 Running 0 78s version=1.0# 為pod資源更新標簽 [root@k8s-master ~]# kubectl label pod pod-label version=2.0 -n dev --overwrite pod/pod-label labeled [root@k8s-master ~]# kubectl get pod pod-label -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-label 1/1 Running 0 2m4s version=2.0# 篩選標簽 [root@k8s-master ~]# kubectl get pod -n dev -l version=2.0 --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-label 1/1 Running 0 2m46s version=2.0# 刪除標簽 [root@k8s-master ~]# kubectl label pod pod-label version- -n dev pod/pod-label labeled [root@k8s-master ~]# kubectl get pod pod-label -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-label 1/1 Running 0 3m29s <none>

2)配置方式

修改pod-label.yaml文件,修改后內容如下:

apiVersion: v1 kind: Pod metadata:name: pod-labelnamespace: devlabels:version: "3.0" env: "test" spec:containers:- image: nginx:1.17.1name: podports:- name: nginx-portcontainerPort: 80protocol: TCP # 更新Pod [root@k8s-master ~]# kubectl apply -f pod-label.yaml pod/pod-label configured[root@k8s-master ~]# kubectl get pod pod-label -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-label 1/1 Running 0 5m17s env=test,version=3.0

2)、Annotation

Annotations一般是系統或者工具用來存儲資源的非標示性信息,可以用來擴展資源的spec/status的描述

3)、Ownereference

Ownereference一般就是指集合類的資源,比如說Pod集合,就有replicaset、statefulset

集合類資源的控制器會創建對應的歸屬資源。比如:replicaset控制器在操作中會創建Pod,被創建Pod的Ownereference就指向了創建Pod的replicaset,Ownereference使得用戶可以方便地查找一個創建資源的對象,另外,還可以用來實現級聯刪除的效果

2、Pod控制器介紹

Pod是Kubernetes的最小管理單元,在Kubernetes中,按照Pod的創建方式可以將其分為兩類:

  • 自主式Pod:Kubernetes直接創建出來的Pod,這種Pod刪除后就沒有了,也不會重建
  • 控制器創建的Pod:Kubernetes通過控制器創建的Pod,這種Pod刪除了之后還會自動重建

什么是Pod控制器

Pod控制器是管理Pod的中間層,使用Pod控制器之后,只需要告訴Pod控制器,想要多少個什么樣的Pod就可以了,它會創建出滿足條件的Pod并確保每一個Pod資源處于用戶期望的目標狀態。如果Pod資源在運行中出現故障,它會基于指定策略重新編排Pod

在Kubernetes中,有很多類型的Pod控制器,每種都有自己的適合的場景,常見的有下面這些:

  • ReplicationController:比較原始的Pod控制器,已經被廢棄,由ReplicaSet替代
  • ReplicaSet:保證副本數量一直維持在期望值,并支持Pod數量擴縮容,鏡像版本升級
  • Deployment:通過控制ReplicaSet來控制Pod,并支持滾動升級、回退版本
  • DaemonSet:在集群中的指定Node上運行且僅運行一個副本,一般用于守護進程類的任務
  • Job:它創建出來的Pod只要完成任務就立即退出,不需要重啟或重建,用于執行一次性任務
  • CronJob:它創建的Pod負責周期性任務控制,不需要持續后臺運行
  • StatefulSet:管理有狀態應用

3、ReplicaSet(RS)

1)、ReplicaSet定義

ReplicaSet的主要作用是保證一定數量的Pod正常運行,它會持續監聽這些Pod的運行狀態,一旦Pod發生故障,就會重啟或重建。同時它還支持對pod數量的擴縮容和鏡像版本的升降級

ReplicaSet的資源清單文件:

apiVersion: apps/v1 # 版本號 kind: ReplicaSet # 類型 metadata: # 元數據name: # rs名稱 namespace: # 所屬命名空間 labels: # 標簽controller: rs spec: # 詳情描述replicas: 3 # 副本數量selector: # 選擇器,通過它指定該控制器管理哪些podmatchLabels: # Labels匹配規則app: nginx-podmatchExpressions: # Expressions匹配規則- {key: app, operator: In, values: [nginx-pod]}template: # 模板,當副本數量不足時,會根據下面的模板創建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80

在這里面,需要新了解的配置項就是spec下面幾個選項:

  • replicas:指定副本數量,其實就是當前RS創建出來的Pod的數量,默認為1

  • selector:選擇器,它的作用是建立Pod控制器和Pod之間的關聯關系,采用的Label Selector機制,在Pod模板上定義Label,在控制器上定義選擇器,就可以表明當前控制器能管理哪些Pod了

  • template:模板,就是當前控制器創建Pod所使用的模板,就是Pod的定義

2)、創建ReplicaSet

創建pc-replicaset.yaml文件,內容如下:

apiVersion: apps/v1 kind: ReplicaSet metadata:name: pc-replicasetnamespace: dev spec:replicas: 3selector: matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1 # 創建rs [root@k8s-master ~]# kubectl create -f pc-replicaset.yaml replicaset.apps/pc-replicaset created# 查看rs # DESIRED:期望副本數量 # CURRENT:當前副本數量 # READY:已經準備好提供服務的副本數量 [root@k8s-master ~]# kubectl get rs pc-replicaset -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR pc-replicaset 3 3 3 25s nginx nginx:1.17.1 app=nginx-pod# 查看當前控制器創建出來的pod # 這里發現控制器創建出來的pod的名稱是在控制器名稱后面拼接了-xxxxx隨機碼 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-replicaset-8hjrb 1/1 Running 0 58s pc-replicaset-jx8zb 1/1 Running 0 58s pc-replicaset-r56fn 1/1 Running 0 58s

3)、擴縮容

# 編輯rs的副本數量,修改spec:replicas: 6即可 [root@k8s-master ~]# kubectl edit rs pc-replicaset -n dev replicaset.apps/pc-replicaset edited# 查看pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-replicaset-2tnmm 1/1 Running 0 12s pc-replicaset-8hjrb 1/1 Running 0 6m4s pc-replicaset-jx8zb 1/1 Running 0 6m4s pc-replicaset-lqv6z 1/1 Running 0 12s pc-replicaset-q8p5w 1/1 Running 0 12s pc-replicaset-r56fn 1/1 Running 0 6m4s# 使用scale命令實現擴縮容,后面--replicas=n直接指定目標數量即可 [root@k8s-master ~]# kubectl scale rs pc-replicaset --replicas=2 -n dev replicaset.apps/pc-replicaset scaled# 命令運行完畢,立即查看,發現已經有4個開始準備退出了 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-replicaset-2tnmm 0/1 Terminating 0 76s pc-replicaset-8hjrb 0/1 Terminating 0 7m8s pc-replicaset-jx8zb 0/1 Terminating 0 7m8s pc-replicaset-lqv6z 0/1 Terminating 0 76s pc-replicaset-q8p5w 1/1 Running 0 76s pc-replicaset-r56fn 1/1 Running 0 7m8s# 稍等片刻,就只剩下2個了 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-replicaset-q8p5w 1/1 Running 0 101s pc-replicaset-r56fn 1/1 Running 0 7m33s

4)、鏡像更新

# 編輯rs的容器鏡像 - image: nginx:1.17.2 [root@k8s-master ~]# kubectl edit rs pc-replicaset -n dev replicaset.apps/pc-replicaset edited# 再次查看,發現鏡像版本已經變更了 [root@k8s-master ~]# kubectl get rs -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR pc-replicaset 2 2 2 36m nginx nginx:1.17.2 app=nginx-pod# kubectl set image rs rs名稱 容器=鏡像版本 -n namespace [root@k8s-master ~]# kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev replicaset.apps/pc-replicaset image updated# 再次查看,發現鏡像版本已經變更了 [root@k8s-master ~]# kubectl get rs -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR pc-replicaset 2 2 2 37m nginx nginx:1.17.1 app=nginx-pod

5)、刪除ReplicaSet

# 使用kubectl delete命令會刪除此rs以及它管理的pod # 在Kubernetes刪除rs前,會將rs的replicas調整為0,等待所有的pod被刪除后,在執行rs對象的刪除 [root@k8s-master ~]# kubectl delete rs pc-replicaset -n dev replicaset.apps "pc-replicaset" deleted[root@k8s-master ~]# kubectl get pod -n dev No resources found in dev namespace. # 如果希望僅僅刪除RS對象(保留Pod),可以使用kubectl delete命令時添加--cascade=false選項(不推薦) [root@k8s-master ~]# kubectl delete rs pc-replicaset -n dev --cascade=false replicaset.apps "pc-replicaset" deleted [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-replicaset-dmhbh 1/1 Running 0 2m35s pc-replicaset-mr9l8 1/1 Running 0 2m35s pc-replicaset-pj6mp 1/1 Running 0 2m35s # 也可以使用yaml直接刪除(推薦) [root@k8s-master ~]# kubectl delete -f pc-replicaset.yaml replicaset.apps "pc-replicaset" deleted

4、Deployment(Deploy)

1)、Deployment定義

為了更好的解決服務編排的問題,Kubernetes在V1.2版本開始,引入了Deployment控制器。Deployment控制器并不直接管理Pod,而是通過管理ReplicaSet來簡介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加強大

Deployment主要功能有下面幾個:

  • 支持ReplicaSet的所有功能
  • 支持發布的停止、繼續
  • 支持滾動升級和回滾版本

Deployment的資源清單文件:

apiVersion: apps/v1 # 版本號 kind: Deployment # 類型 metadata: # 元數據name: # rs名稱 namespace: # 所屬命名空間 labels: # 標簽controller: deploy spec: # 詳情描述replicas: 3 # 副本數量revisionHistoryLimit: 3 # 保留歷史版本paused: false # 暫停部署,默認是falseprogressDeadlineSeconds: 600 # 部署超時時間(s),默認是600strategy: # 策略type: RollingUpdate # 滾動更新策略rollingUpdate: # 滾動更新maxSurge: 30% # 最大額外可以存在的副本數,可以為百分比,也可以為整數maxUnavailable: 30% # 最大不可用狀態的Pod的最大值,可以為百分比,也可以為整數selector: # 選擇器,通過它指定該控制器管理哪些podmatchLabels: # Labels匹配規則app: nginx-podmatchExpressions: # Expressions匹配規則- {key: app, operator: In, values: [nginx-pod]}template: # 模板,當副本數量不足時,會根據下面的模板創建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80

2)、控制器模型

Kubernetes所有的控制器都遵循一個通用編排模式,即:控制循環(control loop),這里有一段Go語言風格的偽代碼,描述這個控制循環:

for {實際狀態 := 獲取集群中對象X的實際狀態(Actual State)期望狀態 := 獲取集群中對象X的期望狀態(Desired State)if 實際狀態 == 期望狀態{什么都不做} else {執行編排動作,將實際狀態調整為期望狀態} }

在具體實現中,實際狀態往往來自于Kubernetes集群本身。比如,kubectl通過心跳匯報的容器狀態和節點狀態,或者監控系統中保存的應用監控數據,或者控制器主動收集的它自己感興趣的信息,這些都是常見實際狀態的來源

期望狀態一般來自于用戶提交的YAML文件。比如,Deployment對象中Replicas字段的值,這些信息往往都保存在Etcd中

以Deployment為例,描述下它對控制器模型的實現:

  • Deployment控制器從Etcd中獲取到所有攜帶了app: nginx標簽的Pod,然后統計它們的數量,這就是實際狀態
  • Deployment對象的Replicas字段的值就是期望狀態
  • Deployment控制器將兩個狀態做比較,然后根據比較結果,確定是創建Pod,還是刪除已有Pod(實際是通過ReplicaSet實現對Pod的操作,后面會講到)
  • 類似Deployment這樣的一個控制器,實際上都是由上半部分的控制器定義(包括期望狀態),加上下半部分的被控制對象的模板組成的

    控制器對象本身,負責定義被管理對象的期望狀態。比如,Deployment里的replicas=2這個字段

    而被控制對象的定義,則來自于一個模板。比如,Deployment里的template字段。可以看到,Deployment這個template字段里的內容,跟一個標準的Pod對象的API定義絲毫不差。而所有被這個Deployment管理的Pod實例,其實都是根據這個template字段的內容創建出來的

    3)、創建Deployment

    創建pc-deployment.yaml,內容如下:

    apiVersion: apps/v1 kind: Deployment metadata:name: pc-deploymentnamespace: dev spec: replicas: 3selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1

    上面pc-deployment定義的Pod副本個數是3(spec.replicas=3)。在具體的實現上,這個Deployment與ReplicaSet以及Pod的關系如下圖:

    Deployment控制器實際操縱的是ReplicaSet對象,而不是Pod對象。對于一個Deployment所管理的Pod,它的ownerReference是ReplicaSet

    一個定義了replicas=3的Deployment,與它的ReplicaSet以及Pod的關系,實際上是一種層層控制的關系

    其中,ReplicaSet負責通過控制器模式保證系統中Pod的個數永遠等于指定的個數(比如3個)。這也正是Deployment只允許容器的restartPolicy=Always的主要原因:只有在容器能保證自己始終是Running狀態的前提下,ReplicaSet調整Pod的個數才有意義

    而在此基礎上,Deployment同樣通過控制器模式,來操作ReplicaSet的個數和屬性,進而實現水平擴展/收縮和滾動更新這兩個編排動作

    # 創建deployment [root@k8s-master ~]# kubectl create -f pc-deployment.yaml --record deployment.apps/pc-deployment created

    --record參數的作用是記錄下你每次操作所執行的命令,以方便后面查看

    # 查看deployment # READY 已經準備好提供服務的副本數量 # UP-TO-DATE 最新版本的pod的數量 # AVAILABLE 當前可用的pod的數量 [root@k8s-master ~]# kubectl get deploy pc-deployment -n dev NAME READY UP-TO-DATE AVAILABLE AGE pc-deployment 3/3 3 3 25s

    在返回結果中,我們可以看到四個狀態字段,它們的含義如下:

    • DESIRED:用戶期望的Pod副本個數(spec.replicas的值)
    • CURRENT:當前處于Running狀態的Pod的個數
    • UP-TO-DATE:當前處于最新版本的Pod的個數,所謂最新版本指的是Pod的Spec部分與Deployment里Pod模板里定義的完全一致
    • AVAILABLE:當前已經可用的Pod的個數,即:既是Running狀態,又是最新版本,并且已經處于Ready(健康檢查正確)狀態的Pod的個數

    只有這個AVAILABLE字段,描述的才是用戶所期望的最終狀態

    # 查看rs # 發現rs的名稱是在原來deployment的名字后面添加了一個10位數的隨機串 [root@k8s-master ~]# kubectl get rs -n dev NAME DESIRED CURRENT READY AGE pc-deployment-858db84f89 3 3 3 42s

    在用戶提交了一個Deployment對象后,Deployment Controller就會立即創建一個Pod副本個數為3的ReplicaSet。這個ReplicaSet的名字,則是由Deployment的名字和一個隨機字符串共同組成

    這個隨機字符串叫作pod-template-hash,ReplicaSet會把這個隨機字符串加在它所控制的所有Pod的標簽里,從而保證這些Pod不會與集群里的其他Pod混淆

    而ReplicaSet的DESIRED、CURRENT和READY字段的含義,和Deployment中是一致的。所以,相比之下,Deployment只是在ReplicaSet的基礎上,添加了UP-TO-DATE這個跟版本有關的狀態字段

    # 查看pod [root@k8s-master ~]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pc-deployment-858db84f89-74rr9 1/1 Running 0 68s app=nginx-pod,pod-template-hash=858db84f89 pc-deployment-858db84f89-bzsmh 1/1 Running 0 68s app=nginx-pod,pod-template-hash=858db84f89 pc-deployment-858db84f89-jgxw4 1/1 Running 0 68s app=nginx-pod,pod-template-hash=858db84f89

    4)、擴縮容

    # 變更副本數量為5個 [root@k8s-master ~]# kubectl scale deploy pc-deployment --replicas=5 -n dev deployment.apps/pc-deployment scaled# 查看deployment [root@k8s-master ~]# kubectl get deploy pc-deployment -n dev NAME READY UP-TO-DATE AVAILABLE AGE pc-deployment 5/5 5 5 142m# 查看pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-deployment-858db84f89-74rr9 1/1 Running 0 143m pc-deployment-858db84f89-bns84 1/1 Running 0 108s pc-deployment-858db84f89-bzsmh 1/1 Running 0 143m pc-deployment-858db84f89-cx6dk 1/1 Running 0 108s pc-deployment-858db84f89-jgxw4 1/1 Running 0 143m# 編輯deployment的副本數量,修改spec:replicas: 4即可 [root@k8s-master ~]# kubectl edit deploy pc-deployment -n dev deployment.apps/pc-deployment edited# 查看pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-deployment-858db84f89-74rr9 1/1 Running 0 144m pc-deployment-858db84f89-bzsmh 1/1 Running 0 144m pc-deployment-858db84f89-cx6dk 1/1 Running 0 3m3s pc-deployment-858db84f89-jgxw4 1/1 Running 0 144m

    5)、鏡像更新

    Deployment支持兩種更新策略:重建更新滾動更新,可以通過strategy指定策略類型

    strategy:type: # 指定策略類型,支持兩種策略Recreate: # 重建更新,在創建出新的Pod之前會先殺掉所有已存在的PodRollingUpdate: # 滾動更新,就是殺死一部分,就啟動一部分,在更新過程中,存在兩個版本PodrollingUpdate: # 當type為RollingUpdate時生效,用于為RollingUpdate設置參數,支持兩個屬性maxUnavailable: # 用來指定在升級過程中不可用Pod的最大數量,默認為25%maxSurge: # 用來指定在升級過程中可以超過期望的Pod的最大數量,默認為25%

    1)重建更新

    編輯pc-deployment.yaml,在spec節點下添加更新策略,修改后內容如下:

    apiVersion: apps/v1 kind: Deployment metadata:name: pc-deploymentnamespace: dev spec: replicas: 3strategy: # 策略type: Recreate # 重建更新 selector:matchLabels:app: nginx-pod template:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1 # 更新deployment [root@k8s-master ~]# kubectl apply -f pc-deployment.yaml deployment.apps/pc-deployment configured# 更新鏡像 [root@k8s-master ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev deployment.apps/pc-deployment image updated# 觀察升級過程 [root@k8s-master ~]# kubectl get pod -n dev -w NAME READY STATUS RESTARTS AGE pc-deployment-858db84f89-8sdvp 1/1 Running 0 22s pc-deployment-858db84f89-d7cr8 1/1 Running 0 22s pc-deployment-858db84f89-jhlf7 1/1 Running 0 22spc-deployment-858db84f89-jhlf7 1/1 Terminating 0 57s pc-deployment-858db84f89-d7cr8 1/1 Terminating 0 57s pc-deployment-858db84f89-8sdvp 1/1 Terminating 0 57spc-deployment-6c78d7875b-wphf8 0/1 Pending 0 0s pc-deployment-6c78d7875b-jthvj 0/1 Pending 0 0s pc-deployment-6c78d7875b-dtgz5 0/1 Pending 0 0spc-deployment-6c78d7875b-wphf8 0/1 ContainerCreating 0 0s pc-deployment-6c78d7875b-jthvj 0/1 ContainerCreating 0 1s pc-deployment-6c78d7875b-dtgz5 0/1 ContainerCreating 0 1spc-deployment-6c78d7875b-dtgz5 1/1 Running 0 3s pc-deployment-6c78d7875b-wphf8 1/1 Running 0 3s pc-deployment-6c78d7875b-jthvj 1/1 Running 0 3s# 在創建出新的Pod之前會先殺掉所有已存在的Pod

    2)滾動更新

    編輯pc-deployment.yaml,在spec節點下修改更新策略,修改后內容如下:

    apiVersion: apps/v1 kind: Deployment metadata:name: pc-deploymentnamespace: dev spec: replicas: 3strategy: # 策略type: RollingUpdate # 滾動更新策略rollingUpdate:maxSurge: 25% maxUnavailable: 25% selector:matchLabels:app: nginx-pod template:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1 # 更新deployment [root@k8s-master ~]# kubectl apply -f pc-deployment.yaml deployment.apps/pc-deployment configured# 更新鏡像 [root@k8s-master ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n dev deployment.apps/pc-deployment image updated# 觀察升級過程 [root@k8s-master ~]# kubectl get pod -n dev -w NAME READY STATUS RESTARTS AGE pc-deployment-858db84f89-cg7bn 1/1 Running 0 24s pc-deployment-858db84f89-n6pqb 1/1 Running 0 20s pc-deployment-858db84f89-x7jks 1/1 Running 0 22spc-deployment-57df6f8b8c-jsr9z 0/1 Pending 0 0s pc-deployment-57df6f8b8c-jsr9z 0/1 ContainerCreating 0 0s pc-deployment-57df6f8b8c-jsr9z 1/1 Running 0 51s pc-deployment-858db84f89-x7jks 0/1 Terminating 0 83spc-deployment-57df6f8b8c-jkphn 0/1 Pending 0 0s pc-deployment-57df6f8b8c-jkphn 0/1 ContainerCreating 0 0s pc-deployment-57df6f8b8c-jkphn 1/1 Running 0 2s pc-deployment-858db84f89-n6pqb 0/1 Terminating 0 83spc-deployment-57df6f8b8c-xfr9f 0/1 Pending 0 0s pc-deployment-57df6f8b8c-xfr9f 0/1 ContainerCreating 0 1s pc-deployment-57df6f8b8c-xfr9f 1/1 Running 0 1s pc-deployment-858db84f89-cg7bn 0/1 Terminating 0 89s# 至此,新版本的Pod創建完畢,舊版本的Pod銷毀完畢 # 中間過程是滾動進行的,也就是邊銷毀邊創建# 查看rs,發現原來的rs的依舊存在,只是pod數量變為了0,而后又新產生了一個rs,pod數量為3 # 其實這就是deployment能夠進行版本回退的奧妙所在,后面會詳細解釋 [root@k8s-master ~]# kubectl get rs -n dev NAME DESIRED CURRENT READY AGE pc-deployment-57df6f8b8c 3 3 3 8m15s pc-deployment-6c78d7875b 0 0 0 16m pc-deployment-858db84f89 0 0 0 171m

    滾動更新過程如下圖:

    在上面這個Deployment的例子中,它有3個Pod副本,那么控制器在滾動更新的過程中永遠都會確保至少有2個Pod處于可用狀態,至多只有4個Pod同時存在于集群中

    如上所示,Deployment的控制器實際上控制的是ReplicaSet的數目,以及每個ReplicaSet的屬性

    而一個應用的版本對應的正是一個ReplicaSet;這個版本應用的Pod數量,則由ReplicaSet通過它自己的控制器(ReplicaSet Controller)來保證。通過這樣的多個ReplicaSet對象,Kubernetes項目就實現了對多個應用版本的描述

    6)、版本回退

    Deployment支持版本升級過程中的暫停、繼續功能以及版本回退等諸多功能,下面具體來看

    kubectl rollout:版本升級相關功能,支持下面的選項:

    • status:顯示當前升級狀態
    • history:顯示升級歷史記錄
    • pause:暫停版本升級過程
    • resume:繼續已經暫停的版本升級過程
    • restart:重啟版本升級過程
    • undo:回滾到上一級版本(可以使用--to-revision回滾到指定版本)

    重新創建Deployment,并進行兩次鏡像升級:

    # 重新創建deployment [root@k8s-master ~]# kubectl delete -f pc-deployment.yaml deployment.apps "pc-deployment" deleted[root@k8s-master ~]# kubectl create -f pc-deployment.yaml --record deployment.apps/pc-deployment created[root@k8s-master ~]# kubectl get deploy,rs,pod -n dev NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/pc-deployment 3/3 3 3 12sNAME DESIRED CURRENT READY AGE replicaset.apps/pc-deployment-858db84f89 3 3 3 12sNAME READY STATUS RESTARTS AGE pod/pc-deployment-858db84f89-4kj4h 1/1 Running 0 12s pod/pc-deployment-858db84f89-glvff 1/1 Running 0 12s pod/pc-deployment-858db84f89-mw297 1/1 Running 0 12s[root@k8s-master ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR pc-deployment 3/3 3 3 15s nginx nginx:1.17.1 app=nginx-pod# 進行鏡像升級 [root@k8s-master ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev deployment.apps/pc-deployment image updated[root@k8s-master ~]# kubectl get deploy,rs,pod -n dev NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/pc-deployment 3/3 3 3 54sNAME DESIRED CURRENT READY AGE replicaset.apps/pc-deployment-6c78d7875b 3 3 3 27s replicaset.apps/pc-deployment-858db84f89 0 0 0 54sNAME READY STATUS RESTARTS AGE pod/pc-deployment-6c78d7875b-dqts7 1/1 Running 0 25s pod/pc-deployment-6c78d7875b-s64ld 1/1 Running 0 23s pod/pc-deployment-6c78d7875b-xffh2 1/1 Running 0 27s[root@k8s-master ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR pc-deployment 3/3 3 3 110s nginx nginx:1.17.2 app=nginx-pod# 再進行鏡像升級 [root@k8s-master ~]# kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n dev deployment.apps/pc-deployment image updated[root@k8s-master ~]# kubectl get deploy,rs,pod -n dev NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/pc-deployment 3/3 3 3 4m59sNAME DESIRED CURRENT READY AGE replicaset.apps/pc-deployment-57df6f8b8c 3 3 3 38s replicaset.apps/pc-deployment-6c78d7875b 0 0 0 4m32s replicaset.apps/pc-deployment-858db84f89 0 0 0 4m59sNAME READY STATUS RESTARTS AGE pod/pc-deployment-57df6f8b8c-7vmpg 1/1 Running 0 34s pod/pc-deployment-57df6f8b8c-mqlwx 1/1 Running 0 36s pod/pc-deployment-57df6f8b8c-qrs7w 1/1 Running 0 38s[root@k8s-master ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR pc-deployment 3/3 3 3 5m10s nginx nginx:1.17.3 app=nginx-pod # 查看當前升級版本的狀態 [root@k8s-master ~]# kubectl rollout status deploy pc-deployment -n dev deployment "pc-deployment" successfully rolled out# 查看升級歷史記錄 [root@k8s-master ~]# kubectl rollout history deploy pc-deployment -n dev deployment.apps/pc-deployment REVISION CHANGE-CAUSE 1 kubectl create --filename=pc-deployment.yaml --record=true 2 kubectl create --filename=pc-deployment.yaml --record=true 3 kubectl create --filename=pc-deployment.yaml --record=true# 版本回滾 # 這里直接使用--to-revision=1回滾到了1版本(nginx:1.17.1),如果省略這個選項,就是回退到上個版本,就是2版本(nginx:1.17.2) [root@k8s-master ~]# kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev deployment.apps/pc-deployment rolled back# 查看發現,通過nginx鏡像版本可以發現到了1版本 [root@k8s-master ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR pc-deployment 3/3 3 3 9m6s nginx nginx:1.17.1 app=nginx-pod# 查看rs,發現第一個rs中有3個pod運行,后面兩個版本的rs中pod為0 # 其實deployment之所以可是實現版本的回滾,就是通過記錄下歷史rs來實現的 # 一旦想回滾到哪個版本,只需要將當前版本pod數量降為0,然后將回滾版本的pod提升為目標數量就可以了 [root@k8s-master ~]# kubectl get rs -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES pc-deployment-57df6f8b8c 0 0 0 5m13s nginx nginx:1.17.3 pc-deployment-6c78d7875b 0 0 0 9m7s nginx nginx:1.17.2 pc-deployment-858db84f89 3 3 3 9m34s nginx nginx:1.17.1

    7)、金絲雀發布

    Deployment控制器支持控制更新過程中的控制,如暫停(pause)或繼續(resume)更新操作

    比如有一批新的Pod資源創建完成后立即暫停更新過程,此時,僅存在一部分新版本的應用,主體部分還是舊的版本。然后,再篩選一小部分的用戶請求路由到新版本的Pod應用,繼續觀察能否穩定地按期望的方式運行。確定沒問題之后再繼續完成余下的Pod資源滾動更新,否則立即回滾更新操作。這就是所謂的金絲雀發布

    # 更新deployment的版本,并配置暫停deployment [root@k8s-master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.4 -n dev && kubectl rollout pause deployment pc-deployment -n dev deployment.apps/pc-deployment image updated deployment.apps/pc-deployment paused# 觀察更新狀態 [root@k8s-master ~]# kubectl rollout status deploy pc-deployment -n dev Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...[root@k8s-master ~]# kubectl get rs -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES pc-deployment-57df6f8b8c 0 0 0 15m nginx nginx:1.17.3 pc-deployment-6c78d7875b 0 0 0 19m nginx nginx:1.17.2 pc-deployment-849d4778f4 1 1 0 14s nginx nginx:1.17.4 pc-deployment-858db84f89 3 3 3 20m nginx nginx:1.17.1# 監控更新的過程,可以看到已經新增了一個資源,但是并未按照預期的狀態去刪除一個舊的資源,就是因為使用了pause暫停命令# 繼續更新 [root@k8s-master ~]# kubectl rollout resume deploy pc-deployment -n dev deployment.apps/pc-deployment resumed[root@k8s-master ~]# kubectl get rs -n dev -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES pc-deployment-57df6f8b8c 0 0 0 20m nginx nginx:1.17.3 pc-deployment-6c78d7875b 0 0 0 24m nginx nginx:1.17.2 pc-deployment-849d4778f4 3 3 3 5m16s nginx nginx:1.17.4 pc-deployment-858db84f89 0 0 0 25m nginx nginx:1.17.1

    5、DaemonSet(DS)

    1)、DaemonSet定義

    DaemonSet類型的控制器可以保證在集群中的每一臺(或指定)節點上都運行一個副本。一般適用于日志收集、節點監控等場景。也就是說,如果一個Pod提供的功能是節點級別的(每個節點都需要且只需要一個),那么這類Pod就適合使用DaemonSet類型的控制器創建

    DaemonSet創建的Pod有如下三個特征:

    • 這個Pod運行在Kubernetes集群里的每一個節點(Node)上
    • 每個節點上只有一個這樣的Pod實例
    • 當有新的節點加入Kubernetes集群后,該Pod會自動地在新節點上被創建出來;而當舊節點被刪除后,它上面的Pod也相應地會被回收掉

    DaemonSet的資源清單文件:

    apiVersion: apps/v1 # 版本號 kind: DaemonSet # 類型 metadata: # 元數據name: # rs名稱 namespace: # 所屬命名空間 labels: # 標簽controller: daemonset spec: # 詳情描述revisionHistoryLimit: 3 # 保留歷史版本updateStrategy: # 更新策略type: RollingUpdate # 滾動更新策略rollingUpdate: # 滾動更新maxUnavailable: 1 # 最大不可用狀態的Pod的最大值,可以為百分比,也可以為整數selector: # 選擇器,通過它指定該控制器管理哪些podmatchLabels: # Labels匹配規則app: nginx-podmatchExpressions: # Expressions匹配規則- {key: app, operator: In, values: [nginx-pod]}template: # 模板,當副本數量不足時,會根據下面的模板創建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80

    2)、創建DaemonSet

    創建pc-daemonset.yaml,內容如下:

    apiVersion: apps/v1 kind: DaemonSet metadata:name: pc-daemonsetnamespace: dev spec: selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1 # 創建daemonset [root@k8s-master ~]# kubectl create -f pc-daemonset.yaml --record daemonset.apps/pc-daemonset created# 查看daemonset [root@k8s-master ~]# kubectl get ds -n dev -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR pc-daemonset 2 2 2 2 2 <none> 15s nginx nginx:1.17.1 app=nginx-pod# 查看pod,發現在每個Node上都運行一個pod [root@k8s-master ~]# kubectl get pod -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pc-daemonset-gbzw8 1/1 Running 0 23s 10.244.1.35 k8s-node2 <none> <none> pc-daemonset-h6zfz 1/1 Running 0 23s 10.244.2.74 k8s-node1 <none> <none>

    3)、DaemonSet實現原理

    DaemonSet如何保證每個Node上有且只有一個被管理的Pod呢

    DaemonSet Controller首先從Etcd里獲取所有的Node列表,然后遍歷所有的Nod,然后去檢查,當前這個Node上是不是有一個攜帶了app: nginx-pod標簽的Pod在運行

    檢查結果可能有這么三種情況:

    • 沒有這種Pod,那么就意味著要在這個Node上創建這樣一個Pod
    • 有這種Pod,但是數量大于1,那就說明要把多余的Pod從這個Node上刪除掉
    • 正好只有一個這種Pod,那說明這個節點是正常的

    DaemonSet是如何在指定的Node上創建新Pod呢

    通過kubectl edit來看下DaemonSet創建Pod的詳細信息:

    [root@k8s-master ~]# kubectl edit pod pc-daemonset-pq6n7 -n dev spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution: # Node節點必須滿足指定的所有規則才可以,相當于硬限制nodeSelectorTerms:- matchFields:- key: metadata.nameoperator: Invalues:- k8s-node1

    上面定義的nodeAffinity的含義是:這里Pod只允許運行在metadata.name是k8s-node1的節點上

    DaemonSet Controller會在創建Pod的時候,自動在這個Pod的API對象里,加上這樣一個nodeAffinity定義。其中,需要綁定的節點名字,正是當前正在遍歷的這個Node

    此外,DaemonSet還會給這個Pod自動加上另外一個與調度相關的字段,叫作tolerations。這個字段意味著這個Pod,會容忍(Toleration)某些Node的污點(Taint)

    spec: tolerations:- effect: NoSchedulekey: node.kubernetes.io/unschedulableoperator: Exists

    上面定義的tolerations的含義是:容忍所有被標記為unschedulable污點的Node;容忍的效果是允許調度

    而在正常情況下,被標記了unschedulable污點的Node,是不會有任何Pod被調度上去的(effect: NoSchedule)。可是,DaemonSet自動地給被管理的Pod加上了這個特殊的tolerations,就使得這些Pod可以忽略這個限制,繼而保證每個節點上都會被調度一個Pod。當然,如果這個節點有故障的話,這個Pod可能會啟動失敗,而DaemonSet則會始終嘗試下去,直到Pod啟動成功

    DaemonSet創建的Pod自動添加的tolerations配置如下:

    spec: tolerations:- effect: NoExecutekey: node.kubernetes.io/not-readyoperator: Exists- effect: NoExecutekey: node.kubernetes.io/unreachableoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/disk-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/memory-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/pid-pressureoperator: Exists- effect: NoSchedulekey: node.kubernetes.io/unschedulableoperator: Exists

    如果這個DaemonSet是一個網絡插件的Agent組件,這個時候整個Kubernetes集群里還沒有可用的容器網絡,所有Worker節點的狀態都是NotReady(NetworkReady=false)。但因為DaemonSet創建的Pod會容忍所有被標記為not-ready污點的Node,所以即使在所有Worker節點的狀態都是NotReady時,DaemonSet創建的Pod依然能被調度

    4)、鏡像更新與版本回退

    # 鏡像更新 [root@k8s-master ~]# kubectl set image daemonset pc-daemonset nginx=nginx:1.17.2 -n dev daemonset.apps/pc-daemonset image updated[root@k8s-master ~]# kubectl get ds -n dev -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR pc-daemonset 2 2 2 2 2 <none> 2m8s nginx nginx:1.17.2 app=nginx-pod# 查看升級歷史記錄 [root@k8s-master ~]# kubectl rollout history ds pc-daemonset -n dev daemonset.apps/pc-daemonset REVISION CHANGE-CAUSE 1 kubectl create --filename=pc-daemonset.yaml --record=true 2 kubectl create --filename=pc-daemonset.yaml --record=true

    Deployment管理這些版本,靠的是一個版本對應一個ReplicaSet對象。可是,DaemonSet控制器操作的直接就是Pod,不可能有ReplicaSet這樣的對象參與其中。那么,它的這些版本又是如何維護的呢?

    Kubernetes v1.7之后添加了一個API對象,名叫ControllerRevision,專門用來記錄某種Controller對象的版本。比如,可以通過如下命令查看pc-daemonset對應的ControllerRevision:

    [root@k8s-master ~]# kubectl get controllerrevision -n dev NAME CONTROLLER REVISION AGE pc-daemonset-6c78d7875b daemonset.apps/pc-daemonset 2 107s pc-daemonset-858db84f89 daemonset.apps/pc-daemonset 1 2m30s

    使用kubectl describe查看這個ControllerRevision對象:

    [root@k8s-master ~]# kubectl describe controllerrevision pc-daemonset-6c78d7875b -n dev Name: pc-daemonset-6c78d7875b Namespace: dev Labels: app=nginx-podcontroller-revision-hash=6c78d7875b Annotations: deprecated.daemonset.template.generation: 2kubernetes.io/change-cause: kubectl create --filename=pc-daemonset.yaml --record=true API Version: apps/v1 Data:Spec:Template:$patch: replaceMetadata:Creation Timestamp: <nil>Labels:App: nginx-podSpec:Containers:Image: nginx:1.17.2Image Pull Policy: IfNotPresentName: nginxResources:Termination Message Path: /dev/termination-logTermination Message Policy: FileDns Policy: ClusterFirstRestart Policy: AlwaysScheduler Name: default-schedulerSecurity Context:Termination Grace Period Seconds: 30 ...... Revision: 2 Events: <none>

    這個ControllerRevision對象實際上是在Data字段保存了該版本對應的完整的DaemonSet的API對象。并且,在Annotation字段保存了創建這個對象所使用的kubectl命令

    # 版本回滾 [root@k8s-master ~]# kubectl rollout undo ds pc-daemonset --to-revision=1 -n dev daemonset.apps/pc-daemonset rolled back# 查看發現,通過nginx鏡像版本可以發現到了1版本 [root@k8s-master ~]# kubectl get ds -n dev -o wide NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR pc-daemonset 2 2 1 1 1 <none> 6m11s nginx nginx:1.17.1 app=nginx-pod# 查看升級歷史記錄 [root@k8s-master ~]# kubectl rollout history ds pc-daemonset -n dev daemonset.apps/pc-daemonset REVISION CHANGE-CAUSE 2 kubectl create --filename=pc-daemonset.yaml --record=true 3 kubectl create --filename=pc-daemonset.yaml --record=true

    這個kubectl rollout undo操作,實際上相當于讀取到了Revision=1的ControllerRevision對象保存的Data字段。而這個Data字段里保存的信息,就是Revision=1時這個DaemonSet的完整API對象

    所以,現在DaemonSet Controller就可以使用這個歷史API對象,對現有的DaemonSet做一次PATCH操作(等價于執行一次kubectl apply -f “舊的DaemonSet對象”),從而把這個DaemonSet更新到一個舊版本

    所以,在執行完這次回滾完成后,DaemonSet的Revision并不會從Revision=2退回到1,而是會增加成Revision=3。這是因為,一個新的 ControllerRevision被創建了出來

    6、Job

    1)、Job定義

    Job主要用于負責**批量處理(一次要處理指定數量任務)短暫的一次性(每個任務僅運行一次就結束)**任務。Job特點如下:

    • 當Job創建的pod執行成功結束時,Job將記錄成功結束的pod數量
    • 當成功結束的pod達到指定的數量時,Job將完成執行

    Job的資源清單文件:

    apiVersion: batch/v1 # 版本號 kind: Job # 類型 metadata: # 元數據name: # rs名稱 namespace: # 所屬命名空間 labels: # 標簽controller: job spec: # 詳情描述completions: 1 # 指定job需要成功運行Pods的次數。默認值:1parallelism: 1 # 指定job在任一時刻應該并發運行Pods的數量。默認值:1activeDeadlineSeconds: 30 # 指定job可運行的時間期限,超過時間還未結束,系統將會嘗試進行終止backoffLimit: 6 # 指定job失敗后進行重試的次數。默認是6manualSelector: true # 是否可以使用selector選擇器選擇pod,默認是falseselector: # 選擇器,通過它指定該控制器管理哪些podmatchLabels: # Labels匹配規則app: counter-podmatchExpressions: # Expressions匹配規則- {key: app, operator: In, values: [counter-pod]}template: # 模板,當副本數量不足時,會根據下面的模板創建pod副本metadata:labels:app: counter-podspec:restartPolicy: Never # 重啟策略只能設置為Never或者OnFailurecontainers:- name: counterimage: busybox:1.30command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]

    關于重啟策略設置的說明:

    • 如果指定為OnFailure,則job會在pod出現故障時重啟容器,而不是創建pod,failed次數不變
    • 如果指定為Never,則job會在pod出現故障時創建新的pod,并且故障pod不會消失,也不會重啟,failed次數加1
    • 如果指定為Always的話,就意味著一直重啟,意味著job任務會重復去執行了,當然不對,所以不能設置為Always

    2)、創建Job

    創建pc-job.yaml,內容如下:

    apiVersion: batch/v1 kind: Job metadata:name: pc-jobnamespace: dev spec:template:spec:containers:- name: piimage: resouer/ubuntu-bc command: ["sh", "-c", "echo 'scale=10000; 4*a(1)' | bc -l "]restartPolicy: NeverbackoffLimit: 4

    上面定義了計算π值的Pod,輸出到小數點后10000位

    跟其他控制器不同的是,Job控制器并不要求定義一個spec.selector來描述要控制哪些Pod

    # 創建job [root@k8s-master ~]# kubectl create -f pc-job.yaml job.batch/pc-job created# 查看job詳情 [root@k8s-master ~]# kubectl describe job pc-job -n dev Name: pc-job Namespace: dev Selector: controller-uid=85b24167-0e3f-465d-bc8d-ac10aa5df734 Labels: controller-uid=85b24167-0e3f-465d-bc8d-ac10aa5df734job-name=pc-job Annotations: <none> Parallelism: 1 Completions: 1 Start Time: Wed, 09 Feb 2022 22:32:11 +0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template:Labels: controller-uid=85b24167-0e3f-465d-bc8d-ac10aa5df734job-name=pc-jobContainers:pi:Image: resouer/ubuntu-bcPort: <none>Host Port: <none>Command:sh-cecho 'scale=10000; 4*a(1)' | bc -l Environment: <none>Mounts: <none>Volumes: <none> ......

    這個Job對象在創建后,它的Pod模板,被自動加上了一個controller-uid=< 一個隨機字符串 >這樣的Label。而這個Job對象本身,則被自動加上了這個Label對應的Selector,從而保證了Job與它所管理的Pod之間的匹配關系。而Job Controller之所以要使用這種攜帶了UID的Label,就是為了避免不同Job對象所管理的Pod發生重合

    # pod進入Running狀態,意味著它正在計算π的值 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-job-vc25v 1/1 Running 0 19s# 幾分鐘后計算結束,這個pod就會進入Completed狀態 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-job-vc25v 0/1 Completed 0 2m13s

    這也是需要在Pod模板中定義restartPolicy=Never的原因:離線計算的Pod永遠都不應該被重啟,否則它們會再重新計算一遍

    事實上,restartPolicy在Job對象里只允許被設置為Never和OnFailure;而在Deployment對象里,restartPolicy則只允許被設置為Always

    3)、Job并行控制

    在Job對象中,負責并行控制的參數有兩個:

    • spec.parallelism:它定義的是一個Job在任意時間最多可以啟動多少個Pod同時運行
    • spec.completions:它定義的是Job至少要完成的Pod數目,即Job的最小完成數

    修改pc-job.yaml,修改后內容如下:

    apiVersion: batch/v1 kind: Job metadata:name: pc-jobnamespace: dev spec:parallelism: 2completions: 4template:spec:containers:- name: piimage: resouer/ubuntu-bccommand: ["sh", "-c", "echo 'scale=10000; 4*a(1)' | bc -l "]restartPolicy: NeverbackoffLimit: 4

    指定了這個Job最大的并行數是2,而最小的完成數是4

    # 重新創建job [root@k8s-master ~]# kubectl delete job pc-job -n dev job.batch "pc-job" deleted [root@k8s-master ~]# kubectl create -f pc-job.yaml job.batch/pc-job created[root@k8s-master ~]# kubectl get job -n dev NAME COMPLETIONS DURATION AGE pc-job 0/4 23s 23s# job首先創建了兩個并行運行的pod來計算π [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-job-cjlvf 1/1 Running 0 38s pc-job-jkf2r 1/1 Running 0 38s# 前兩個pod完成計算后,進入Completed狀態 # job第二次創建出來的兩個并行的pod進入了Running狀態 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-job-brd6n 1/1 Running 0 26s pc-job-cjlvf 0/1 Completed 0 2m34s pc-job-czbp8 1/1 Running 0 10s pc-job-jkf2r 0/1 Completed 0 2m34s[root@k8s-master ~]# kubectl get job -n dev NAME COMPLETIONS DURATION AGE pc-job 2/4 2m52s 2m52s# 所有的pod均已經成功退出 [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-job-brd6n 0/1 Completed 0 5m53s pc-job-cjlvf 0/1 Completed 0 8m1s pc-job-czbp8 0/1 Completed 0 5m37s pc-job-jkf2r 0/1 Completed 0 8m1s# job執行完成 [root@k8s-master ~]# kubectl get job -n dev NAME COMPLETIONS DURATION AGE pc-job 4/4 4m18s 8m5s

    7、CronJob(CJ)

    1)、CronJob定義

    CronJob控制器以Job控制器資源為其管控對象,并借助它管理Pod資源對象,Job控制器定義的作業任務在其控制器資源創建之后便會立即執行,但CronJob可以以類似于Linux操作系統的周期性任務作業計劃的方式控制其運行時間點重復運行的方式。也就是說,CronJob可以在特定的時間點(反復的)去運行Job任務

    CronJob的資源清單文件:

    apiVersion: batch/v1beta1 # 版本號 kind: CronJob # 類型 metadata: # 元數據name: # rs名稱 namespace: # 所屬命名空間 labels: # 標簽controller: cronjob spec: # 詳情描述schedule: # cron格式的作業調度運行時間點,用于控制任務在什么時間執行concurrencyPolicy: # 并發執行策略,用于定義前一次作業運行尚未完成時是否以及如何運行后一次的作業failedJobHistoryLimit: # 為失敗的任務執行保留的歷史記錄數,默認為1successfulJobHistoryLimit: # 為成功的任務執行保留的歷史記錄數,默認為3startingDeadlineSeconds: # 啟動作業錯誤的超時時長jobTemplate: # job控制器模板,用于為cronjob控制器生成job對象;下面其實就是job的定義metadata:spec:completions: 1parallelism: 1activeDeadlineSeconds: 30backoffLimit: 6manualSelector: trueselector:matchLabels:app: counter-podmatchExpressions: 規則- {key: app, operator: In, values: [counter-pod]}template:metadata:labels:app: counter-podspec:restartPolicy: Never containers:- name: counterimage: busybox:1.30command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]

    需要重點解釋的幾個選項:

    schedule: cron表達式,用于指定任務的執行時間

    */1 * * * *<分鐘> <小時> <日> <月份> <星期>分鐘值從0到59小時值從0到23日值從1到31月值從1到12星期值從0到6,0代表星期日多個時間可以用逗號隔開,范圍可以用連字符給出,*可以作為通配符,/表示每...

    concurrencyPolicy:

    • Allow:允許Jobs并發運行(默認)
    • Forbid:禁止并發運行,如果上一次運行尚未完成,則跳過下一次運行
    • Replace:替換,取消當前正在運行的作業并用新作業替換它

    2)、創建CronJob

    創建pc-cronjob.yaml,內容如下:

    apiVersion: batch/v1beta1 kind: CronJob metadata:name: pc-cronjobnamespace: devlabels:controller: cronjob spec:schedule: "*/1 * * * *"jobTemplate:metadata:spec:template:spec:restartPolicy: Nevercontainers:- name: counterimage: busybox:1.30command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

    每分鐘執行一次

    # 創建cronjob [root@k8s-master ~]# kubectl create -f pc-cronjob.yaml cronjob.batch/pc-cronjob created# 查看cronjob [root@k8s-master ~]# kubectl get cj -n dev NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE pc-cronjob */1 * * * * False 0 <none> 17s[root@k8s-master ~]# kubectl get job -n dev NAME COMPLETIONS DURATION AGE pc-cronjob-1644420420 1/1 29s 2m8s pc-cronjob-1644420480 1/1 29s 68s pc-cronjob-1644420540 0/1 8s 8s# 查看pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pc-cronjob-1644420420-jv2v6 0/1 Completed 0 2m12s pc-cronjob-1644420480-s7chz 0/1 Completed 0 72s pc-cronjob-1644420540-mwk76 1/1 Running 0 12s# 刪除cronjob [root@k8s-master ~]# kubectl delete cj pc-cronjob -n dev cronjob.batch "pc-cronjob" deleted

    參考

    Kubernetes(K8S) 入門進階實戰完整教程,黑馬程序員K8S全套教程(基礎+高級)

    極客時間 《深入剖析Kubernetes》

    云原生技術公開課

    總結

    以上是生活随笔為你收集整理的Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    91av电影在线 | 欧美一区二区三区免费看 | 99精品欧美一区二区三区黑人哦 | 亚洲精品国产麻豆 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 综合网婷婷 | 日韩精品在线播放 | 99色在线播放 | 五月婷婷激情综合 | 天堂素人在线 | 九色porny真实丨国产18 | 亚洲精品综合在线 | 手机av在线网站 | 天天草视频| 国产视频亚洲视频 | 黄色大片网 | 日韩一区二区三免费高清在线观看 | 国产剧情av在线播放 | 免费色黄| 国产精品国产三级国产 | 国产精品不卡一区 | 国产成人av | 91在线播放综合 | 中文日韩在线 | 日韩极品视频在线观看 | 中文字幕在线中文 | 久久国产视频网站 | 国产精品久久久久一区二区 | 国产a级免费 | 99精品国自产在线 | 九九久久久久久久久激情 | 91av视频在线观看 | 黄色一级网 | 国产亚洲成人网 | 麻豆视传媒官网免费观看 | 成人午夜剧场在线观看 | 在线观看视频国产一区 | 日日操网 | 99在线播放 | 亚洲精品av在线 | www.xxxx变态.com| 欧美日韩一区二区三区视频 | 国产精品女人久久久 | 婷婷色婷婷| 日韩视频一区二区三区在线播放免费观看 | 在线看一区二区 | 国产欧美综合在线观看 | 99re6热在线精品视频 | av在线a| 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产免费人成xvideos视频 | 91成人看片 | 超碰在线最新 | 超碰国产在线 | 国产高清视频免费观看 | 中文字幕在线免费观看 | www.伊人色.com | 欧美激情视频一区二区三区免费 | 在线播放 日韩专区 | 黄色毛片一级片 | 一区二区三区视频在线 | 国产精品igao视频网网址 | 久久久久国| 日本最新一区二区三区 | www狠狠| 久久精品国产亚洲精品 | 国产精品你懂的在线观看 | 超碰97国产精品人人cao | 国产1区2区 | 亚洲高清国产视频 | 色网站视频 | 欧美精品v国产精品 | 午夜精品久久久久久久99婷婷 | 国产手机在线精品 | 国产精品久久久久影视 | 人人爱爱| 成人在线观看资源 | 9i看片成人免费看片 | 日日夜夜91| 91夜夜夜| 国产涩涩在线观看 | 波多野结衣久久资源 | 一本一本久久a久久精品综合妖精 | 综合久久五月天 | 国产亚洲视频在线观看 | 91在线入口 | 人人干网 | 丁香久久 | 中文字幕丝袜美腿 | 一二三区av | 免费黄色在线 | 午夜精品久久久久久久99热影院 | 精品久久综合 | 嫩小bbbb摸bbb摸bbb | 六月色 | 9999在线观看 | 国产成人777777 | 国产91aaa | 免费视频黄 | 成人免费视频播放 | 精品中文字幕在线 | 国产视频精品久久 | 久久久久久不卡 | 丁香五婷| 99精品欧美一区二区三区黑人哦 | 成人免费观看在线视频 | 最新婷婷色 | 日韩a在线观看 | 一级黄色片在线免费观看 | 色搞搞| 狠狠干狠狠艹 | 五月天综合激情 | 亚洲天堂在线观看完整版 | 少妇自拍av| 懂色av懂色av粉嫩av分享吧 | 久久99亚洲精品久久 | 久久久久久久久网站 | 超碰在线观看97 | 日本精品视频在线观看 | av日韩在线网站 | 91在线国内视频 | 国产日韩视频在线观看 | 99综合电影在线视频 | 最新免费中文字幕 | 久久国产精品久久久 | 国产69熟 | 天天射天天 | 人人超在线公开视频 | 日韩精品视频在线观看免费 | 久久草在线免费 | 亚洲精品无 | 久久久国产精品久久久 | 欧美精品v国产精品v日韩精品 | 亚洲成a人片在线www | 免费成人在线观看视频 | 国产91对白在线播 | 综合色在线 | 黄色小说网站在线 | 香蕉视频在线视频 | 成人av电影免费观看 | 亚洲精品啊啊啊 | 青青射| 久久综合久久综合这里只有精品 | 国产精品麻豆一区二区三区 | 久久久999免费视频 日韩网站在线 | 国产xxxx| 久香蕉 | 97视频在线观看免费 | 97成人精品| 亚洲国产剧情av | 美女国产 | 一级理论片在线观看 | 99精品一级欧美片免费播放 | 99re视频在线观看 | av网站免费线看精品 | 97超碰中文| 久久精品99国产精品亚洲最刺激 | 中文字幕在线观看资源 | 婷婷中文字幕在线观看 | 天天操比 | 欧美日韩免费观看一区二区三区 | 亚洲精品午夜久久久久久久久久久 | 亚洲精品视频在线观看网站 | 狠狠色噜噜狠狠狠狠 | 日本久久久久久科技有限公司 | 超碰在线观看99 | 欧美日韩在线精品 | 欧美激情视频一区二区三区免费 | 91av片| 国产成人精品av在线观 | 久久精品99视频 | 亚洲三级在线免费观看 | 久久夜色网| 精品国产乱码一区二 | 欧美性生活免费 | 亚洲在线国产 | 久久深夜 | 91香蕉久久 | 91九色在线视频观看 | 狠狠色丁香婷婷综合 | 国内精品小视频 | 在线 国产 亚洲 欧美 | 天天综合天天做天天综合 | 欧美日本在线观看视频 | 精品免费国产一区二区三区四区 | 日本高清xxxx | 亚洲精品中文在线 | 韩国av三级 | 国产香蕉97碰碰碰视频在线观看 | 国产人成看黄久久久久久久久 | 久久免费视频播放 | 中文字幕黄色 | 精品天堂av | 国产精品观看在线亚洲人成网 | 中文字幕在线看人 | 成人午夜精品福利免费 | 色综合在| 久久久久久久久久久成人 | 亚洲一区二区三区精品在线观看 | 深夜国产福利 | 国产精品热| 成人av高清 | 美女视频黄在线 | 日本中文字幕视频 | 久草视频播放 | 国产精品久久三 | 99精品视频在线观看视频 | 亚洲视频999| 97视频在线播放 | 99精品成人 | 六月丁香婷婷网 | 国产精品久久久亚洲 | 国模视频一区二区 | 黄色软件网站在线观看 | 黄在线 | 黄色成人在线 | 在线成人免费电影 | 精品国产伦一区二区三区观看方式 | 波多野结衣日韩 | 99精品欧美一区二区三区黑人哦 | 二区中文字幕 | av片无限看 | 国产精品一区二区三区视频免费 | 国产1区在线观看 | 国产精品美女久久久久久2018 | 日韩大片在线 | 五月天婷婷狠狠 | 亚洲激情小视频 | 欧美久久影院 | 精品国产91亚洲一区二区三区www | 久久精品国产99 | 一区二区伦理 | 在线播放日韩av | 国产精品日韩在线 | 日韩欧美视频免费观看 | 九九久久久久99精品 | 狠狠躁夜夜躁人人爽视频 | 亚洲黄色小说网址 | 久久99爱视频 | 四川bbb搡bbb爽爽视频 | 成人在线视频一区 | 国产精品人成电影在线观看 | 黄色一级大片在线免费看国产一 | 国产91综合一区在线观看 | 色永久免费视频 | 免费日韩电影 | 亚洲国产日韩精品 | 国产免费叼嘿网站免费 | 国产视频日韩视频欧美视频 | 亚洲成人中文在线 | 日本成人中文字幕在线观看 | 日韩av成人在线 | 免费在线观看黄色网 | 国产精品久久久久高潮 | 91黄色免费网站 | 91激情| 久久精品老司机 | 日本久久免费视频 | 成人av网站在线观看 | 国产不卡在线 | 在线免费观看黄网站 | 四虎视频| 日韩99热 | 国产色在线 | 九色精品在线 | 在线播放国产精品 | 少妇精品久久久一区二区免费 | 五月天婷婷在线视频 | 亚洲精品午夜久久久 | 久久免费视频观看 | 成年人在线观看免费视频 | 超碰97人| av中文国产| 在线国产小视频 | 91精品国产91久久久久久三级 | 99九九99九九九视频精品 | 一级黄色在线免费观看 | 日日夜夜天天久久 | 国产一二区在线观看 | 日韩欧美高清一区二区三区 | 午夜精品一区二区三区可下载 | 日韩精品在线视频免费观看 | 欧美色888| 久久久免费观看完整版 | 久久精品波多野结衣 | 久久只有精品 | 欧美激情视频一区二区三区 | 久草com| 91探花在线视频 | 午夜视频在线观看一区二区三区 | 亚洲人av免费网站 | 天天操天天弄 | 国产精品9999 | 久久一区二区免费视频 | 青青河边草观看完整版高清 | 91香蕉视频黄 | 午夜精品久久一牛影视 | 欧美电影黄色 | 久久国产一区二区三区 | 一级免费黄色 | 中文字幕中文字幕中文字幕 | 色多多在线观看 | japanesefreesex中国少妇 | 久久亚洲福利 | 在线观看深夜视频 | 久99久精品视频免费观看 | 婷婷亚洲激情 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 丁香视频五月 | 亚洲成人精品 | 久久免费电影 | 久久久91精品国产一区二区精品 | 久久99久国产精品黄毛片入口 | 国产成人av网址 | www91在线 | 免费看黄在线观看 | 国产一区二三区好的 | 久久免费激情视频 | 国产一区免费在线 | 日产av在线播放 | 日韩精品一区二区三区中文字幕 | 日韩欧美在线播放 | 精品视频久久 | 激情综合电影网 | 亚洲精品美女久久久久网站 | 天天插伊人| a亚洲视频 | 亚洲综合激情小说 | 麻花天美星空视频 | 正在播放日韩 | 欧美另类交人妖 | 成人午夜电影在线播放 | 欧美日韩不卡一区 | 亚洲91精品在线观看 | av在线超碰| 久久精品亚洲综合专区 | 亚洲九九爱 | 激情五月亚洲 | av免费网站在线观看 | 麻豆免费视频网站 | 五月开心婷婷 | 四虎欧美| 青青网视频| 色综合久久88色综合天天人守婷 | 国产小视频你懂的 | 激情av在线播放 | 欧美日韩国产精品一区 | 永久免费毛片 | 五月婷婷狠狠 | 日日摸日日添夜夜爽97 | 伊人久久影视 | 久久一级片 | 蜜臀av一区二区 | 亚洲 av网站 | 五月婷婷在线视频观看 | 在线免费av播放 | 国产一二三在线视频 | 久草在线视频首页 | 91观看视频| 欧美大片第1页 | 欧美在一区 | 国产成人精品久久亚洲高清不卡 | 97精品一区二区三区 | 免费观看日韩 | 麻豆精品传媒视频 | 日日夜夜av | 91爱爱电影 | 国产精品久久久久久久av电影 | 中文字幕一区av | 久久综合九色综合久99 | 久久久久久国产精品 | 婷婷精品国产欧美精品亚洲人人爽 | 美国三级黄色大片 | 日本精品视频在线观看 | 国产精品亚洲片夜色在线 | 在线视频免费观看 | 久久国产一区二区三区 | 在线观看欧美成人 | 国产精品久久99综合免费观看尤物 | 日韩精品一区二区三区三炮视频 | 韩国av一区二区三区 | 日韩精品一区二区三区三炮视频 | 亚洲成人免费在线 | 久久午夜国产精品 | 人人爽人人乐 | 亚洲.www| 国产精品一区二区av | 精品一区二区三区四区在线 | 亚洲成人av片 | av免费网| 中文字幕在线观看亚洲 | 国产精品国产三级国产不产一地 | 日日干天天射 | 毛片久久久 | 少妇高潮流白浆在线观看 | 天天拍天天爽 | 欧美日韩免费一区二区 | 欧美一二三四在线 | 国产伦理剧 | 日日夜夜精品免费视频 | 国产69精品久久久久99 | 亚洲欧美精品一区 | 中文字幕久久精品一区 | 黄色aa久久 | 97电院网手机版 | 天天草天天操 | 国产在线视频一区二区三区 | 国产一区二区成人 | 国产精品大全 | 国产自产在线视频 | 中文字幕在线免费97 | 天天干天天操天天爱 | 国产一级大片免费看 | 亚洲成av人影片在线观看 | 久久精品网站视频 | www.com黄色 | 国产精品麻豆视频 | 精品久久久久久亚洲 | 免费一级片观看 | 成人黄大片 | 日本中文字幕网 | 黄网站色成年免费观看 | 国产色婷婷在线 | 欧美日韩国产在线一区 | 国产理论在线 | 色婷婷狠狠 | 欧美成人黄 | 亚洲男模gay裸体gay | 999成人精品 | 国产精品一区二区免费 | 日韩69av | 久久无码av一区二区三区电影网 | 青青五月天 | 中文字幕av网站 | 天天爽天天碰狠狠添 | 久久久久久久久久久高潮一区二区 | 中文字幕国产一区 | 99热这里只有精品8 久久综合毛片 | 亚洲理论电影网 | 亚洲精品男女 | 久久综合狠狠综合久久综合88 | 黄色毛片电影 | 人成电影网 | 国产成人香蕉 | av高清网站在线观看 | 欧美夫妻性生活电影 | 欧美怡红院| 人人看人人爱 | 欧美日韩另类视频 | 在线观看视频黄色 | 黄色小说免费观看 | 久久久久北条麻妃免费看 | 99精品国产高清在线观看 | 91精品资源| 伊人超碰在线 | 干亚洲少妇 | 欧美日韩视频 | av在线影片 | 国产原创在线观看 | 国色综合 | 天天亚洲综合 | 久久久精品国产免费观看一区二区 | 91精品欧美一区二区三区 | 天天射天天操天天色 | 美女免费黄视频网站 | 国产成人久久 | 国产精品免费观看久久 | 日日干日日 | 在线不卡中文字幕播放 | 激情网婷婷 | 免费精品在线观看 | 国产破处在线播放 | 成人福利在线 | 欧美日韩一区二区视频在线观看 | 日韩欧美高清免费 | 精品久久久久久国产偷窥 | 97超碰免费在线观看 | 国产精品欧美久久 | 日本一区二区免费在线观看 | 久久久久国产精品午夜一区 | 综合黄色网 | 婷婷国产v亚洲v欧美久久 | 在线之家免费在线观看电影 | www国产亚洲 | 精品91在线 | 久久国内精品99久久6app | 一区二区三区在线观看免费 | 国产成人av网 | 丁香九月婷婷综合 | 日韩欧美在线不卡 | 人人视频网站 | 成人av电影免费 | 亚洲精品视频二区 | www五月天com| 成年人免费电影在线观看 | 日本女人在线观看 | 亚洲天天在线日亚洲洲精 | www.五月天婷婷 | 国产一线二线三线在线观看 | 亚洲精品国产综合99久久夜夜嗨 | 操操操av| 97福利在线 | 日本久久成人中文字幕电影 | www.久久久.cum | 日韩中文在线视频 | av千婊在线免费观看 | 亚洲国产精品99久久久久久久久 | 超碰在线99 | 午夜精品电影 | 天天草天天操 | 亚洲国产成人在线观看 | 欧美日韩性 | 天天综合网国产 | 91视频免费国产 | 在线视频 区| 色就是色综合 | 久久久久久久久免费 | 中文字幕亚洲综合久久五月天色无吗'' | 日本aaaa级毛片在线看 | 91av资源在线 | 特级西西www44高清大胆图片 | 国产999在线| 日韩在线一二三区 | 在线视频你懂 | 欧美日韩二区在线 | 国产三级精品三级在线观看 | 96av麻豆蜜桃一区二区 | 九九九毛片 | 天天操天天干天天操天天干 | 欧美午夜a | 日本中文字幕观看 | 国产特级毛片aaaaaaa高清 | www.xxxx欧美 | 天天射色综合 | 国产精品免费不卡 | 国产精品久久人 | 国产精品成人av久久 | 免费精品人在线二线三线 | 五月天综合网 | 人人射网站 | 在线91播放 | 欧美另类调教 | 久久伊人国产精品 | 成人app在线免费观看 | 夜夜躁日日躁狠狠久久88av | 国产在线999 | 欧美日韩国产亚洲乱码字幕 | 欧美久久久久久久久久久 | 色婷婷免费 | 狠狠操狠狠干天天操 | 色婷婷综合在线 | 中文字幕免费 | 六月激情网| 亚洲综合婷婷 | 成人天堂网 | 国产精品自产拍在线观看桃花 | 韩国在线一区二区 | 嫩小bbbb摸bbb摸bbb | 国产 日韩 欧美 中文 在线播放 | www久| a v在线视频| 亚洲美女在线一区 | 久艹视频在线观看 | 免费av 在线| 91九色精品 | 国产视频一区精品 | 久久tv视频 | 五月导航 | 97精品在线视频 | 久久精品首页 | 久久久久久看片 | 欧美日韩免费网站 | 97电影在线 | 亚洲 成人 欧美 | 又污又黄网站 | 91精品一区在线观看 | 免费观看成人网 | 欧美成人亚洲成人 | 国产xxxxx在线观看 | 亚洲一区二区三区四区精品 | 97超碰国产在线 | 成人一区二区在线 | 欧美日韩中文国产一区发布 | 黄免费在线观看 | 91麻豆精品国产91久久久无限制版 | 国产高清av在线播放 | 黄色一级免费网站 | 亚洲天天综合 | 亚洲精品456在线播放第一页 | 午夜免费久久看 | 久久精品成人欧美大片古装 | av青草 | 天天天在线综合网 | 人人揉人人揉人人揉人人揉97 | 久久久精品视频网站 | 久久久久亚洲天堂 | 欧美午夜寂寞影院 | 色 免费观看 | 在线免费观看国产精品 | 亚洲精品日韩av | 免费看毛片网站 | 欧美日韩69 | 在线综合 亚洲 欧美在线视频 | 91片黄在线观看动漫 | 天天操天天色综合 | 日韩免费视频线观看 | 黄污网站在线 | 日韩欧美精品在线 | 国产在线播放一区二区三区 | 成人av一区二区三区 | 天操夜夜操 | 欧美另类交在线观看 | 成人免费在线播放 | 激情丁香婷婷 | 久久久国产精品人人片99精片欧美一 | 亚洲精品综合久久 | 午夜精品久久久久久久99水蜜桃 | 精品少妇一区二区三区在线 | 国产亚洲成人网 | 精品日韩在线一区 | 亚洲欧美国内爽妇网 | 狠狠干天天 | 亚洲欧洲日韩在线观看 | 欧美国产精品久久久久久免费 | 久久九九精品久久 | 麻豆久久久久 | 黄色小说在线观看视频 | 国产成人av片 | 国产日韩高清在线 | 99精品成人 | 日日日操 | 久久成人人人人精品欧 | 婷婷丁香六月 | 成人av片免费观看app下载 | 成人福利在线 | 91视频3p| 日韩精品在线一区 | 五月婷婷综合在线视频 | 亚洲综合色站 | a天堂最新版中文在线地址 久久99久久精品国产 | a级免费观看 | 又粗又长又大又爽又黄少妇毛片 | 91福利小视频 | 国产高清在线免费视频 | 国产一区在线免费观看视频 | 麻豆成人精品 | 91免费在线视频 | 在线观看日本韩国电影 | 成人毛片在线观看 | 国产五月色婷婷六月丁香视频 | 涩涩资源网 | 亚洲国产成人久久综合 | 亚洲专区欧美 | 在线电影日韩 | 日韩久久精品一区二区三区 | av黄色在线 | 天天爱天天操 | 精品亚洲欧美一区 | 日本护士撒尿xxxx18 | 91精品视频免费 | 国产精品乱码久久 | 久久精品国产精品亚洲 | 欧美激情综合五月色丁香 | 看v片| 精品成人在线 | 丁香5月婷婷久久 | 五月激情久久久 | 欧美激情视频一二区 | 国产一级特黄毛片在线毛片 | 91丨九色丨国产女 | 精品国产一区二区三区久久久蜜月 | av在线短片 | 亚洲va欧美va人人爽春色影视 | 国产精品一区二区三区在线看 | 国产伦精品一区二区三区高清 | 国产免费av一区二区三区 | 久久精品成人热国产成 | 久久99久久99精品免视看婷婷 | 美女黄久久 | 成年人国产在线观看 | 国产乱对白刺激视频在线观看女王 | 中文字幕资源网 | 久久人91精品久久久久久不卡 | 97视频在线观看免费 | 麻豆传媒电影在线观看 | .精品久久久麻豆国产精品 亚洲va欧美 | 黄av在线| 国产人在线成免费视频 | 天天视频亚洲 | 国产精品一区电影 | 人人爽网站 | 九九久久精品视频 | 国产精品久久久久久久久久免费 | 欧美成人日韩 | 色噜噜日韩精品欧美一区二区 | 91在线公开视频 | 狠狠色丁香婷婷综合最新地址 | 日韩在线视频网 | 中文字幕专区高清在线观看 | 欧美激情视频一区二区三区 | 免费看毛片网站 | 三级在线国产 | 麻豆免费在线播放 | 在线观看免费高清视频大全追剧 | 久久精品国产亚洲精品 | 亚洲国产偷 | 高潮久久久久久 | 久久精品国产一区二区电影 | 91大神在线看 | 免费热情视频 | av888.com| 最近日本韩国中文字幕 | 久久久亚洲麻豆日韩精品一区三区 | 97在线视频免费观看 | 97在线视| 91麻豆看国产在线紧急地址 | 天天爽天天搞 | 波多野结衣亚洲一区二区 | 久久av中文字幕片 | 99国产精品久久久久老师 | 久草在线一免费新视频 | 日韩天堂网| 国产中文字幕视频在线 | 婷婷综合视频 | 日日射av | 精品久久久一区二区 | 亚洲理论电影 | 国产无遮挡又黄又爽在线观看 | 亚洲免费精品一区二区 | 精品国产123| 天天操天天舔天天爽 | 91香蕉国产| 在线免费高清视频 | 欧美激情综合五月色丁香 | 美女网站在线免费观看 | 亚洲精品18p| 成人网页在线免费观看 | 日本久久影视 | 国产精品手机在线 | 中文字幕日韩电影 | 精品国产精品一区二区夜夜嗨 | 欧美久久久影院 | 亚洲免费激情 | 日韩视频一 | 激情小说网站亚洲综合网 | 国产精品21区 | 国产精品av电影 | 天天操天天艹 | 久久免费视频在线观看6 | 国产精品美女免费看 | 亚洲国产精品成人va在线观看 | 少妇bbb搡bbbb搡bbbb′ | 日韩羞羞| 国产高清久久久久 | 欧美精品乱码久久久久久按摩 | 国产不卡一区二区视频 | 91亚洲在线| 欧美国产日韩中文 | 一级黄色av | 免费av 在线 | 欧美综合色在线图区 | 欧美日韩久 | 国产一区二区三区久久久 | 91污污视频在线观看 | 啪啪肉肉污av国网站 | 欧美在线日韩在线 | 99日精品| 婷婷在线视频观看 | 在线视频日韩精品 | 国产日韩欧美在线观看视频 | 婷婷亚洲五月 | 蜜臀91丨九色丨蝌蚪老版 | 91热视频 | 伊人色播 | 久久亚洲私人国产精品va | 狠狠干夜夜操天天爽 | 美女在线免费观看视频 | 亚洲国产精品日韩 | 久久久久欠精品国产毛片国产毛生 | 国产激情小视频在线观看 | 911久久香蕉国产线看观看 | 国产亚洲精品久久久久动 | 黄色com | 夜夜爽www | www.五月婷婷 | 韩国在线视频一区 | 国产剧情一区在线 | 97超视频免费观看 | 欧洲精品久久久久毛片完整版 | 欧美一区二区三区四区夜夜大片 | 免费网站在线观看人 | 日韩电影中文 | 日韩精品免费一区 | 国产在线999| 欧美a影视 | 激情综合网五月婷婷 | 久久久久成人精品亚洲国产 | 91麻豆精品国产91久久久无需广告 | 日韩在观看线 | 亚洲影院色 | 亚洲成人精品 | 香蕉看片 | 中文字幕在线一区观看 | 五月综合久久 | 日韩免费在线播放 | 开心激情五月婷婷 | 午夜精品一区二区三区在线播放 | 日韩在线视频观看免费 | 奇米影视8888在线观看大全免费 | 久久99久久99精品中文字幕 | 一区二区三区在线免费观看视频 | 亚洲男男gaygay无套同网址 | 久久综合一本 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 日韩av不卡在线播放 | 午夜精品久久久久久久久久久久 | av色综合| 国产精品久久99综合免费观看尤物 | 亚洲欧洲av | 在线影视 一区 二区 三区 | 国产成人亚洲在线观看 | 超碰伊人网 | 在线观看免费国产小视频 | 中文欧美字幕免费 | 日韩大片在线播放 | 91精品蜜桃 | 精品视频99| 久久99久久99精品免费看小说 | 日本精品在线看 | 国产精品热 | 91精品国产乱码 | 97国产大学生情侣白嫩酒店 | 日韩高清www | 免费在线一区二区 | 精品一区 在线 | www.亚洲精品在线 | 五月色丁香 | 狂野欧美激情性xxxx欧美 | 亚洲综合在线观看视频 | 日本老少交 | 精品国产一区二区三区噜噜噜 | av在线播放不卡 | 精品成人a区在线观看 | 色婷婷综合久色 | 少妇搡bbbb搡bbb搡忠贞 | 男女拍拍免费视频 | 国产一区在线免费观看 | 精品一二三区视频 | 99久久精品费精品 | www.看片网站 | 夜夜操天天摸 | 色综合久久综合中文综合网 | 欧美韩日精品 | 手机在线永久免费观看av片 | 99精品在线看 | 婷婷网站天天婷婷网站 | 福利一区在线视频 | 欧美日韩国产成人 | 国产尤物在线 | 国产成人亚洲精品自产在线 | 日韩在线一二三区 | www.狠狠干 | 91av中文 | 99riav1国产精品视频 | 九九免费在线观看视频 | 91一区二区三区久久久久国产乱 | 中文字幕 国产专区 | 久久综合狠狠综合久久狠狠色综合 | 黄色av免费 | 一区二区三区免费在线播放 | 欧美日韩在线视频一区 | 成人免费视频观看 | 在线看成人 | 欧美精品xx | 国产精品久久久久久久久搜平片 | 99视频在线 | 亚洲伊人色 | 亚洲做受高潮欧美裸体 | 色姑娘综合天天 | av黄色av| 国产黄a三级三级三级三级三级 | 探花视频在线观看 | 成人h动漫精品一区二 | 亚洲精品99久久久久久 | 日韩在线视频国产 | 国产在线探花 | 97超级碰碰碰碰久久久久 | 婷婷九月激情 | 亚洲人天堂 | 96视频免费在线观看 | 欧美亚洲一区二区在线 | 久久久久在线观看 | 日日操天天操狠狠操 | av蜜桃在线 | 日韩网站一区 | 精品久久久久国产免费第一页 | 精品国内 | 中文字幕在线观看完整版 | 午夜12点 | 中文字幕制服丝袜av久久 | 国产精品video爽爽爽爽 | 狠狠干狠狠久久 | 国产视频一区在线 | 91女子私密保健养生少妇 | 成人资源在线 | 欧美色888 | 午夜美女视频 | 成年人免费在线观看网站 | 四虎欧美 | 久久成人午夜视频 | 黄色91在线观看 | 欧美日韩国产一区二 | 久久在线 | 丁香六月婷婷开心 | 亚洲视频,欧洲视频 | 毛片3 | 国产精品区免费视频 | 在线视频观看亚洲 | 免费视频二区 | 免费91在线观看 | 久黄色 | 狠狠色丁香久久综合网 | 四虎www com| 在线日本看片免费人成视久网 | 亚洲国产精品va在线 | 国产欧美精品一区二区三区四区 | jizzjizzjizz亚洲 | 国产精品porn| 国产拍揄自揄精品视频麻豆 | 久久不卡日韩美女 | 国模一区二区三区四区 | 久久黄色片 | 日韩最新理论电影 | 日韩精品免费在线视频 | 天天射色综合 | 中文字幕在线观看播放 | 亚洲女在线 | 国内精品久久久久影院日本资源 | 久久99久久99免费视频 | 午夜久久成人 | 日韩精品第1页 | 久久午夜精品影院一区 | 久草在线综合 | 黄色片网站av | 国产99一区二区 | 久久久久国产成人精品亚洲午夜 | 日韩av午夜在线观看 | 精品国产免费一区二区三区五区 | 国产精品99久久久久久久久久久久 | 亚洲综合少妇 | 成人午夜片av在线看 | av中文字幕网址 | 99精品免费观看 | 人人揉人人揉人人揉人人揉97 | 五月婷婷狠狠 | 在线观看国产中文字幕 | 日韩一区二区三区在线看 | 国产精品久久三 | 一区二区精 | 在线观看国产 | 伊人伊成久久人综合网小说 | 怡红院av久久久久久久 | 欧美精品一区在线 | 麻豆视频免费在线观看 | 色网站国产精品 | 国产成人精品免高潮在线观看 | 久久综合九色欧美综合狠狠 | 91av超碰 | 午夜精品中文字幕 | 亚洲一区二区三区四区精品 | 福利av在线| 在线免费观看av网站 | 综合伊人av | 91精品国产高清自在线观看 | 有码中文字幕在线观看 | www.天天干| 国内精品免费久久影院 | 久久五月激情 | 日本黄色大片免费 | 国产又粗又猛又色又黄视频 | 久久影视精品 | 看全黄大色黄大片 | 五月激情电影 | 色搞搞 | 国产成人av网址 | 欧美日韩视频一区二区三区 | av无限看 | 国产精品激情偷乱一区二区∴ | 色九九视频 | 91av视频在线观看 | 激情网在线视频 | 日韩aⅴ视频 | 免费看的黄网站软件 | 久久久2o19精品 | 国产精品久久99综合免费观看尤物 | 天天操夜操视频 | 国产成人精品日本亚洲999 | 亚洲有 在线|