Deployment 簡述
Deployment
為 Pod
和 ReplicaSet
提供了一個聲明式定義 (declarative) 方法,用來替代以前的 ReplicationController
更方便的管理應用。
作為最常用的 Kubernetes 對象,Deployment
經常會用來創建 ReplicaSet
和 Pod
,我們往往不會直接在集群中使用 ReplicaSet
部署一個新的微服務,一方面是因為 ReplicaSet
的功能其實不夠強大,一些常見的更新、擴容和縮容運維操作都不支持,Deployment
的引入就是為了支持這些復雜的操作。
Deployment API 版本對照表
Kubernetes 版本 | Deployment 版本 |
---|---|
v1.5-v1.15 | extensions/v1beta1 |
v1.7-v1.15 | apps/v1beta1 |
v1.8-v1.15 | apps/v1beta2 |
v1.9+ | apps/v1 |
Deployment 一個典型的用例
一個典型的用例如下:
- 使用 Deployment 來創建 ReplicaSet。ReplicaSet 在后台創建 pod。檢查啟動狀態,看它是成功還是失敗。
- 然后,通過更新 Deployment 的 PodTemplateSpec 字段來聲明 Pod 的新狀態。這會創建一個新的 ReplicaSet,Deployment 會按照控制的速率將 pod 從舊的 ReplicaSet 移動到新的 ReplicaSet 中。
- 如果當前狀態不穩定,回滾到之前的 Deployment revision。每次回滾都會更新 Deployment 的 revision。
- 擴容 Deployment 以滿足更高的負載。
- 暫停 Deployment 來應用 PodTemplateSpec 的多個修復,然后恢復上線。
- 根據 Deployment 的狀態判斷上線是否 hang 住了。
- 清除舊的不必要的 ReplicaSet。
創建 Deployment
Deployment yaml
文件包含四個部分:
- apiVersion: 表示版本
- kind: 表示資源
- metadata: 表示元信息
- spec: 資源規范字段
Deployment yaml
名詞解釋:
apiVersion: apps/v1 # 指定api版本,此值必須在kubectl api-versions中 kind: Deployment # 指定創建資源的角色/類型 metadata: # 資源的元數據/屬性 name: demo # 資源的名字,在同一個namespace中必須唯一 namespace: default # 部署在哪個namespace中 labels: # 設定資源的標簽 app: demo version: stable spec: # 資源規范字段 replicas: 1 # 聲明副本數目 revisionHistoryLimit: 3 # 保留歷史版本 selector: # 選擇器 matchLabels: # 匹配標簽 app: demo version: stable strategy: # 策略 rollingUpdate: # 滾動更新 maxSurge: 30% # 最大額外可以存在的副本數,可以為百分比,也可以為整數 maxUnavailable: 30% # 示在更新過程中能夠進入不可用狀態的 Pod 的最大值,可以為百分比,也可以為整數 type: RollingUpdate # 滾動更新策略 template: # 模版 metadata: # 資源的元數據/屬性 annotations: # 自定義注解列表 sidecar.istio.io/inject: "false" # 自定義注解名字 labels: # 設定資源的標簽 app: demo version: stable spec: # 資源規范字段 containers: - name: demo # 容器的名字 image: demo:v1 # 容器使用的鏡像地址 imagePullPolicy: IfNotPresent # 每次Pod啟動拉取鏡像策略,三個選擇 Always、Never、IfNotPresent # Always,每次都檢查;Never,每次都不檢查(不管本地是否有);IfNotPresent,如果本地有就不檢查,如果沒有就拉取 resources: # 資源管理 limits: # 最大使用 cpu: 300m # CPU,1核心 = 1000m memory: 500Mi # 內存,1G = 1000Mi requests: # 容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行 cpu: 100m memory: 100Mi livenessProbe: # pod 內部健康檢查的設置 httpGet: # 通過httpget檢查健康,返回200-399之間,則認為容器正常 path: /healthCheck # URI地址 port: 8080 # 端口 scheme: HTTP # 協議 # host: 127.0.0.1 # 主機地址 initialDelaySeconds: 30 # 表明第一次檢測在容器啟動后多長時間后開始 timeoutSeconds: 5 # 檢測的超時時間 periodSeconds: 30 # 檢查間隔時間 successThreshold: 1 # 成功門檻 failureThreshold: 5 # 失敗門檻,連接失敗5次,pod殺掉,重啟一個新的pod readinessProbe: # Pod 准備服務健康檢查設置 httpGet: path: /healthCheck port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 periodSeconds: 10 successThreshold: 1 failureThreshold: 5 #也可以用這種方法 #exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常 # command: # - cat # - /tmp/health #也可以用這種方法 #tcpSocket: # 通過tcpSocket檢查健康 # port: number ports: - name: http # 名稱 containerPort: 8080 # 容器開發對外的端口 protocol: TCP # 協議 imagePullSecrets: # 鏡像倉庫拉取密鑰 - name: harbor-certification affinity: # 親和性調試 nodeAffinity: # 節點親和力 requiredDuringSchedulingIgnoredDuringExecution: # pod 必須部署到滿足條件的節點上 nodeSelectorTerms: # 節點滿足任何一個條件就可以 - matchExpressions: # 有多個選項,則只有同時滿足這些邏輯選項的節點才能運行 pod - key: beta.kubernetes.io/arch operator: In values: - amd64
Service yaml
名詞解釋:
apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中 kind: Service # 指定創建資源的角色/類型 metadata: # 資源的元數據/屬性 name: demo # 資源的名字,在同一個namespace中必須唯一 namespace: default # 部署在哪個namespace中 labels: # 設定資源的標簽 app: demo spec: # 資源規范字段 type: ClusterIP # ClusterIP 類型 ports: - port: 8080 # service 端口 targetPort: http # 容器暴露的端口 protocol: TCP # 協議 name: http # 端口名稱 selector: # 選擇器 app: demo
參考鏈接
作者:YP小站
鏈接:https://www.jianshu.com/p/99800eb305bf
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。