1. Deployment概述
Deployment
是 Kubernetes 中一种声明式控制器,用来管理和维护一组 Pod
副本。主要用于管理无状态应用的生命周期。通过声明 Deployment
,可以自动化地控制应用的副本数量、进行无停机更新、扩展、缩容等。
Deployment
主要作用如下:
(1)定义期望状态:指定希望部署的应用配置和数量。
(2)管理副本:确保应用副本数量与配置的期望值一致。
(3)无停机更新:支持滚动更新,逐步更新 Pod,更新过程中不会中断服务。
(4)版本回滚:可以回滚到之前的某个版本,以应对更新失败的情况。
(5)扩展性:支持自动扩容和缩容,通过 HPA 等资源进行弹性管理。
Pod,ReplicaSet和Deployment三者的关系
(1)Pod
: 是 Kubernetes 中最基本的部署单元,表示一个或多个容器的集合。Pod 共享存储、网络和上下文。
(2)ReplicaSet
: 确保指定数量的 Pod 实例在任何时候都在运行。它通过监控 Pod 的状态来管理 Pod 的创建和删除。如果某个 Pod 异常终止,ReplicaSet 会创建一个新的 Pod 来替代它。
(3)Deployment
: 是更高级别的抽象,管理 ReplicaSet 的创建和更新。Deployment 允许用户声明希望运行的应用状态,包括 Pod 的模板、副本数量和更新策略。通过 Deployment,用户可以轻松实现滚动更新和回滚。
整个管理流程如下:
Deployment 创建并管理 ReplicaSet。
ReplicaSet 负责确保运行指定数量的 Pod。
Pod 是实际承载应用的实例。
下图是三个资源对象的关系简单呈现。
2. Deployment管理
2.1 YAML 配置文件详解
Deployment YAML 文件结构如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment # 资源名称,根据实际填写
namespace: prod # 命名空间
labels:
app: my-app # 标签键值对
spec:
replicas: 3 # 副本数
selector: # 标签选择器
matchLabels:
app: my-app
template: # Pod模版
metadata:
labels: # 标签与matchLabels处要保持一致
app: my-app
spec:
containers: # 定义容器的信息
- name: my-container
image: nginx:1.25 # 定义镜像名称和版本
imagePullPolicy: Always
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "500m"
env:
- name: ENV_VAR
value: "production"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 3
字段解析
(1)基础字段
apiVersion
:指定 API 版本,Deployment 使用 apps/v1。
kind
:资源类型,这里为 Deployment。
(2)metadata字段:资源的元数据
name
:资源名称
namespace
: 命名空间,默认是default命名空间
labels
:标签,使用键值对表示
(3)spec 字段
replicas
:指定运行中的 Pod 副本数量。例如 replicas: 3 表示希望有3个 Pod 实例在运行。
selector
:选择器,用于识别哪些 Pod 属于该 Deployment。selector.matchLabels 和 template.metadata.labels 必须一致,这样 Deployment 才可以管理对应的 Pod。
template
:定义 Pod 模板,它描述了 Pod 的具体配置。Deployment 根据模板创建或更新 Pod。
(4)template.spec 字段
containers
:容器列表。
name
:容器名称。
image
:容器使用的镜像,**生产环境一般都指向镜像仓库。**ports
:定义容器暴露的端口(如 containerPort: 80 表示容器暴露80端口)。
resources
:资源限制,用于限制 Pod 的 CPU 和内存资源。
env
:环境变量配置,向容器传递环境变量。
imagePullPolicy
: 镜像拉取策略,有三种。
Always
:总是向镜像仓库拉取IfNotPresent
:如果本地没有镜像就向镜像仓库拉取Never
:不向镜像仓库拉取,只使用本地镜像
livenessProbe
:定义健康检查,用于监控 Pod 是否健康运行,还有redinessProbe和Startup等探针。
2.2 基础管理
(1)创建deployment
有两种方式,一种是命令行直接创建,一种是写一个yaml文件,通过apply命令进行创建
生产环境通常使用后者,因为可以定制化deployment
# 命令行创建deployment
kubectl create deployment <deployment-name> --image=<container-image>
kubectl create deploy mynginx --image=nginx:1.25
# 基于yaml方式创建
kubectl apply -f my-deployment.yaml
(2)查看deployment
# 查看deployment信息
kubectl get deploy -n <namespace>
kubectl get deploy nginx
# 查看某个deploy详细信息
kubectl get deploy nginx -o wide
kubectl describe deploy nignx
(3)删除deployment
# 命令行删除
kubectl delete deploy <deploy-name>
kubectl delete deploy mynginx
# 基于资源清单删除
kubectl delete -f my-deployment.yaml
2.3 更新策略详解
Kubernetes 提供了灵活的 Deployment 更新策略,方便实现无停机更新、蓝绿部署等应用更新需求。
(1)更新策略配置
strategy
字段定义了 Deployment 的更新策略。Kubernetes 支持RollingUpdate
和 Recreate
两种更新策略:
策略一:RollingUpdate(滚动更新):
RollingUpdate
是 Deployment 的默认更新策略。更新时会逐步创建新的 Pod 副本,替换旧的 Pod,确保应用保持在线状态。
更新策略是在spec字段下配置的,配置示例:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
参数详解:
maxUnavailable
:更新过程中允许的最大不可用 Pod 数量,支持绝对值或百分比(如 75%)。
maxSurge
:更新过程中允许的最大新建 Pod 数量,同样支持绝对值或百分比。
更新具体步骤:
创建新 Pod(以符合 maxSurge 配置的上限)。
新 Pod 变为 Ready 状态时,停止旧的 Pod。
不断重复以上步骤,直到所有旧的 Pod 替换为新 Pod。
策略二:Recreate(重建):
Recreate
策略会直接停止所有旧的 Pod 并创建新的 Pod,适合无状态服务或无需保证持续在线的应用。
配置示例:
strategy:
type: Recreate
生产环境一般是使用滚动更新方法。
(2)更新操作
方法一:通过 YAML 文件更新
编辑 YAML 文件并重新应用。
kubectl apply -f my-deployment.yaml
方法二:直接设置新镜像更新
kubectl set image deployment/my-deployment my-container=nginx:1.25
查看更新状态:
kubectl rollout status deployment my-deployment
在滚动更新中,您可以选择暂停更新,以便在每一步观察应用行为。
暂停更新:
kubectl rollout pause deployment my-deployment
恢复更新:
kubectl rollout resume deployment my-deployment
2.4 Deployment 回滚
如果更新发生错误或出现异常,可以将 Deployment 回滚到上一个稳定版本:
执行回滚:
kubectl rollout undo deployment my-deployment
查看历史记录:
kubectl rollout history deployment my-deployment
回滚到指定版本:如果有多个历史记录,可以通过 --to-revision
指定回滚的版本。
# 将版本回滚到第三个版本
kubectl rollout undo deployment my-deployment --to-revision=3
2.5 扩容和缩容详解
Deployment
支持动态扩容和缩容,通过更改 replicas
数量来控制 Pod 的副本数量。
(1)手动扩容或缩容:
kubectl scale deployment my-deployment --replicas=3
(2)自动扩容(HPA)
Kubernetes 支持基于 HorizontalPodAutoscaler(HPA)
进行自动扩容,根据负载动态调整 Pod 副本数量:
# CPU超过85%就进行扩容
kubectl autoscale deployment my-deployment --min=3 --max=5 --cpu-percent=85
3 其他常用功能
3.1 探针配置
探针(Probe)用于监测 Pod
是否健康,Kubernetes 提供了三种探针类型:
Liveness Probe
:检测Pod
是否正常工作。如果检测失败,会重启 Pod,如果在重启后 Liveness 探针仍然失败,Pod 将被标记为失败。。Readiness Probe
:检测Pod
是否准备好接收流量。如果检测失败,Pod 不会参与负载均衡,这确保了新版本的容器在完全准备好之前不会接收到流量,从而避免对应用的不良影响。。Startup Probe
:用于启动检测,尤其适合启动时间较长的应用。
如果对探针不是很熟悉,可以查看我之前是文章进行查看详细的介绍。
探针配置示例
containers:
- name: my-container
image: nginx:1.25
ports:
- containerPort: 80
livenessProbe: # 存活探针
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe: # 就绪探针
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
startupProbe: # 启动探针
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 10
探针参数:
initialDelaySeconds
:在容器启动后首次探测前的延迟时间。periodSeconds
:两次探测之间的时间间隔。failureThreshold
:如果探测失败超过该值,容器会被重启或标记为不可用。
3.2 与ConfigMap/Secret 的集成
Deployment 支持从 ConfigMap
和 Secret
中注入环境变量,使配置管理更方便灵活:
在spec.template.spec.containers
处设置
从 ConfigMap
加载环境变量:
envFrom:
- configMapRef:
name: my-config
从 Secret
加载环境变量:
envFrom:
- secretRef:
name: my-secret
3.3 资源限制
设置 CPU 和内存限制可以防止单个 Pod 占用过多资源:
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "250m"
limits
:资源上限,容器无法超出该值。
requests
:资源请求值,调度时优先分配该值的资源。
4 部署完整实例
下面是一个较为完整的 Deployment YAML 配置文件示例,包含了滚动更新、资源限制、环境变量、健康检查等配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
labels:
app: my-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: my-config
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "250m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 3
上面的实例如何要用到生产环境的话,一般还需要volume
和volumeMounts
的部分参数,将数据持久化存储到对应的存储设备上。这个存储卷将在后面文章详细讲解。
本次先分享到这里,后续将继续分享Service,K8S网络,存储卷PV/PVC和安全等相关重要知识,将跟已学的K8S基础知识点进行联动,更好得全面掌握K8S。
码字不易,戳下方名片,关注+星标
往期精彩文章