Deployment 簡述
Deployment
為 Pod
和 ReplicaSet
提供了一個(gè)聲明式定義 (declarative) 方法深滚,用來替代以前的 ReplicationController
更方便的管理應(yīng)用。
作為最常用的 Kubernetes 對象伴榔,Deployment
經(jīng)常會(huì)用來創(chuàng)建 ReplicaSet
和 Pod
斯稳,我們往往不會(huì)直接在集群中使用 ReplicaSet
部署一個(gè)新的微服務(wù)海铆,一方面是因?yàn)?ReplicaSet
的功能其實(shí)不夠強(qiáng)大,一些常見的更新挣惰、擴(kuò)容和縮容運(yùn)維操作都不支持卧斟,Deployment
的引入就是為了支持這些復(fù)雜的操作殴边。
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 一個(gè)典型的用例
一個(gè)典型的用例如下:
- 使用 Deployment 來創(chuàng)建 ReplicaSet。ReplicaSet 在后臺(tái)創(chuàng)建 pod珍语。檢查啟動(dòng)狀態(tài)锤岸,看它是成功還是失敗。
- 然后板乙,通過更新 Deployment 的 PodTemplateSpec 字段來聲明 Pod 的新狀態(tài)是偷。這會(huì)創(chuàng)建一個(gè)新的 ReplicaSet,Deployment 會(huì)按照控制的速率將 pod 從舊的 ReplicaSet 移動(dòng)到新的 ReplicaSet 中募逞。
- 如果當(dāng)前狀態(tài)不穩(wěn)定蛋铆,回滾到之前的 Deployment revision。每次回滾都會(huì)更新 Deployment 的 revision放接。
- 擴(kuò)容 Deployment 以滿足更高的負(fù)載刺啦。
- 暫停 Deployment 來應(yīng)用 PodTemplateSpec 的多個(gè)修復(fù),然后恢復(fù)上線纠脾。
- 根據(jù) Deployment 的狀態(tài)判斷上線是否 hang 住了玛瘸。
- 清除舊的不必要的 ReplicaSet。
創(chuàng)建 Deployment
Deployment yaml
文件包含四個(gè)部分:
- apiVersion: 表示版本
- kind: 表示資源
- metadata: 表示元信息
- spec: 資源規(guī)范字段
Deployment yaml
名詞解釋:
apiVersion: apps/v1 # 指定api版本苟蹈,此值必須在kubectl api-versions中
kind: Deployment # 指定創(chuàng)建資源的角色/類型
metadata: # 資源的元數(shù)據(jù)/屬性
name: demo # 資源的名字糊渊,在同一個(gè)namespace中必須唯一
namespace: default # 部署在哪個(gè)namespace中
labels: # 設(shè)定資源的標(biāo)簽
app: demo
version: stable
spec: # 資源規(guī)范字段
replicas: 1 # 聲明副本數(shù)目
revisionHistoryLimit: 3 # 保留歷史版本
selector: # 選擇器
matchLabels: # 匹配標(biāo)簽
app: demo
version: stable
strategy: # 策略
rollingUpdate: # 滾動(dòng)更新
maxSurge: 30% # 最大額外可以存在的副本數(shù),可以為百分比再来,也可以為整數(shù)
maxUnavailable: 30% # 示在更新過程中能夠進(jìn)入不可用狀態(tài)的 Pod 的最大值磷瘤,可以為百分比,也可以為整數(shù)
type: RollingUpdate # 滾動(dòng)更新策略
template: # 模版
metadata: # 資源的元數(shù)據(jù)/屬性
annotations: # 自定義注解列表
sidecar.istio.io/inject: "false" # 自定義注解名字
labels: # 設(shè)定資源的標(biāo)簽
app: demo
version: stable
spec: # 資源規(guī)范字段
containers:
- name: demo # 容器的名字
image: demo:v1 # 容器使用的鏡像地址
imagePullPolicy: IfNotPresent # 每次Pod啟動(dòng)拉取鏡像策略针炉,三個(gè)選擇 Always扳抽、Never、IfNotPresent
# Always镰烧,每次都檢查楞陷;Never,每次都不檢查(不管本地是否有)结执;IfNotPresent,如果本地有就不檢查懂傀,如果沒有就拉取
resources: # 資源管理
limits: # 最大使用
cpu: 300m # CPU蜡感,1核心 = 1000m
memory: 500Mi # 內(nèi)存,1G = 1000Mi
requests: # 容器運(yùn)行時(shí)铸敏,最低資源需求,也就是說最少需要多少資源容器才能正常運(yùn)行
cpu: 100m
memory: 100Mi
livenessProbe: # pod 內(nèi)部健康檢查的設(shè)置
httpGet: # 通過httpget檢查健康,返回200-399之間蒙具,則認(rèn)為容器正常
path: /healthCheck # URI地址
port: 8080 # 端口
scheme: HTTP # 協(xié)議
# host: 127.0.0.1 # 主機(jī)地址
initialDelaySeconds: 30 # 表明第一次檢測在容器啟動(dòng)后多長時(shí)間后開始
timeoutSeconds: 5 # 檢測的超時(shí)時(shí)間
periodSeconds: 30 # 檢查間隔時(shí)間
successThreshold: 1 # 成功門檻
failureThreshold: 5 # 失敗門檻朽肥,連接失敗5次,pod殺掉篱昔,重啟一個(gè)新的pod
readinessProbe: # Pod 準(zhǔn)備服務(wù)健康檢查設(shè)置
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
#也可以用這種方法
#exec: 執(zhí)行命令的方法進(jìn)行監(jiān)測州刽,如果其退出碼不為0浪箭,則認(rèn)為容器正常
# command:
# - cat
# - /tmp/health
#也可以用這種方法
#tcpSocket: # 通過tcpSocket檢查健康
# port: number
ports:
- name: http # 名稱
containerPort: 8080 # 容器開發(fā)對外的端口
protocol: TCP # 協(xié)議
imagePullSecrets: # 鏡像倉庫拉取密鑰
- name: harbor-certification
affinity: # 親和性調(diào)試
nodeAffinity: # 節(jié)點(diǎn)親和力
requiredDuringSchedulingIgnoredDuringExecution: # pod 必須部署到滿足條件的節(jié)點(diǎn)上
nodeSelectorTerms: # 節(jié)點(diǎn)滿足任何一個(gè)條件就可以
- matchExpressions: # 有多個(gè)選項(xiàng),則只有同時(shí)滿足這些邏輯選項(xiàng)的節(jié)點(diǎn)才能運(yùn)行 pod
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
Service yaml
名詞解釋:
apiVersion: v1 # 指定api版本匹表,此值必須在kubectl api-versions中
kind: Service # 指定創(chuàng)建資源的角色/類型
metadata: # 資源的元數(shù)據(jù)/屬性
name: demo # 資源的名字宣鄙,在同一個(gè)namespace中必須唯一
namespace: default # 部署在哪個(gè)namespace中
labels: # 設(shè)定資源的標(biāo)簽
app: demo
spec: # 資源規(guī)范字段
type: ClusterIP # ClusterIP 類型
ports:
- port: 8080 # service 端口
targetPort: http # 容器暴露的端口
protocol: TCP # 協(xié)議
name: http # 端口名稱
selector: # 選擇器
app: demo
參考鏈接
- https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
- https://feisky.gitbooks.io/kubernetes/concepts/deployment.html
- https://draveness.me/kubernetes-deployment
本文由 YP小站 發(fā)布冻晤!