Deployment
回顾什么是RS#
在 Kubernetes 中,RS 是 ReplicaSet 的缩写,它是一种 API 对象,用于确保指定数量的 Pod 副本始终运行并处于可用状态。ReplicaSet 负责维护 Pod 副本的稳定运行,如果由于某些原因(如节点故障或 Pod 崩溃)导致 Pod 副本数量减少,ReplicaSet 将替换这些 Pod 以维持期望的副本数量。
ReplicaSet 通常与 Deployment 一起使用,Deployment 控制器使用 ReplicaSet 来管理 Pod 副本的声明周期。Deployment 负责声明 Pod 模板的期望状态,而 ReplicaSet 负责实现这个状态。
ReplicaSet 的主要特点包括:
- 副本数量保证:确保指定数量的 Pod 副本始终运行。
- 选择器(Selector):ReplicaSet 使用选择器来识别和管理它应该管理的 Pod。选择器是一个标签查询,用于匹配 Pod 的标签。
- 更新和替换:当 Pod 模板发生变化时,ReplicaSet 可以替换旧的 Pod 副本,以确保所有 Pod 都符合新的模板。
ReplicaSet 与 Deployment 的关系可以这样理解:Deployment 定义了应用程序的期望状态,而 ReplicaSet 确保这个状态得以实现。当 Deployment 需要更新时,它会创建一个新的 ReplicaSet 并逐步替换旧的 ReplicaSet 中的 Pod。这样,Deployment 可以实现零停机更新和回滚。
回顾什么是Deployment
#
在Kubernetes中,Deployment(部署)是一种高级API对象,用于声明式地管理无状态应用的生命周期,包括应用的声明、更新和扩展。Deployment控制器负责Pod的声明周期,确保在任何给定时间,都运行着指定数量的Pod副本。
以下是Deployment的一些关键特性:
- 声明式更新:Deployment允许你定义应用的期望状态,Kubernetes会自动将当前状态更改为期望状态。
- 自我修复:如果Pod由于节点故障或其他原因失败,Deployment会自动替换失败的Pod。
- 水平扩展:Deployment支持使用
kubectl scale
命令或在Deployment定义中指定副本数来扩展Pod的数量。- 滚动更新:Deployment支持滚动更新,这意味着你可以逐步推出更新,一次更新一个或多个Pod,直到所有Pod都更新到新版本。
- 回滚:如果新版本的应用出现问题,Deployment允许你回滚到以前的版本。
- 暂停和恢复:你可以暂停Deployment的更新,进行调试或其他操作,然后在准备好后恢复更新。
- 最小可用性:在更新过程中,Deployment可以配置为保持一定数量的Pod始终可用,以确保服务的连续性。
- 进度和状态:Deployment对象提供进度和状态信息,以便你可以了解Deployment的状态和任何相关问题。
这是GPT的生成-__-
简单来说Deployment
就是控制器,用来管理Pod
,同时在原生的pod
基础上添加了很多强大的功能
因此我们只是单独创建一个Pod
的时候,只是一个pod
,她没有扩容缩容,暂停恢复等强大的功能,一点都不行,我们就需要用Deployment
来创建管理pod
什么是Label
和Selector
#
在使用Deployment
之前我们需要明白什么是Label`和`Selector
label
是标签,Selector
是选择器
选择器可以选择某些标签进行某些操作,比如说就像Mysql中的where name = 1 and id != 2
,标签中的值是可以随意设置的,只要能够被选择器筛选就可以
label 可以写在metadata中,也可以写在 spec中
1 | metadata: |
如果要临时创建label
#
1 | kubectl label po <资源名称> labelName=labelValue |
如果要修改label
#
1 | kubectl label po <资源名称> app=hello22 --overwrite |
如果要查看label
#
1 | kubectl get po --show-labels |
例如:
1 | kubectl get po --show-labels |
以上的方式不适用于Deployment
,适合原生Pod
加上选择器#
1 | kubectl get po -l app=v1 # -l 相当于加上标签匹配 |
Deployment
操作#
创建
最简单的创建
1
2
3
4
5
6
7
8
9
10
11
12
13sudo kubectl create deploy nginx-deploy --image=nginx:1.7.9
hhhyc@hhhyc:~/deployments$ sudo kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 0/1 1 0 113s
hhhyc@hhhyc:~/deployments$ sudo kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-deploy-68c658776b 1 1 0 7m45s
hhhyc@hhhyc:~/deployments$ sudo kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-68c658776b-qq6hl 0/1 CrashLoopBackOff 5 (34s ago) 3m46s可以看到
nginx-deploy-68c658776b-qq6hl
这个名字的嵌套关系可以看出
Deploymenet
-RS
-Pod
的顶级嵌套关系,由此可以作为其唯一标识
查看
Deploy
的配置信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39hhhyc@hhhyc:~/deployments$ sudo kubectl get deploy nginx-deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
.......
kubectl describe deploy nginx-deploy
Name: nginx-deploy
Namespace: default
CreationTimestamp: Tue, 09 Jul 2024 14:51:45 +0800
Labels: app=nginx-deploy
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx-deploy
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx-deploy
Containers:
nginx:
Image: nginx:1.7.9
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-68c658776b (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 45m deployment-controller Scaled up replica set nginx-deploy-68c658776b to 1
# 这个event就表示这几次的更新回滚的事件记录修改配置
首先通过刚才的查看原先配置信息获取配置,复制并粘贴到新的
yaml
文件中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2024-07-09T06:51:45Z"
generation: 1
labels:
app: nginx-deploy
name: nginx-deploy
namespace: default
resourceVersion: "21427"
uid: f9b46890-3e5d-4964-961c-5f11fcf5ed86
# ....
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
# 粘贴到 status 前即可然后删除一些不需要的数据,比如说时间,版本,uid等数据.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29apiVersion: apps/v1 #deploy api版本
kind: Deployment # 资源类型
metadata: # 元信息
labels:
app: nginx-deploy
name: nginx-deploy
namespace: default
spec: # 期望状态
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10 # 经过滚动更新后的历史版本数
selector: # 选择器,匹配标签相对的RS--也是一个选择器
matchLabels:
app: nginx-deploy
strategy: # 更新策略
rollingUpdate: # 采用滚动更新
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template: #描述我们的pod如何创建
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: nginx
terminationGracePeriodSeconds: 30最后输入命令实现更新
1
kubectl apply -f nginx-deploy.yaml
也可以这样:
这样可以直接修改
deploy.yaml
中的内容,不过需要打开这个文件1
kubectl edit deploy nginx-deploy
也可以这样:
1
bectl set image deployment/nginx-deploy nginx=nginx:1.7.9
Deployment
功能调整#
滚动更新
只要修改了
deployment
配置文件中的template
中的属性后,才会触发更新操作扩容缩容
只要修改
template
中的raplica
中的数据继续ing(不方便)直接用下面的命令(方便)
1
2kubectl scale --replicas=9 deploy nginx-deploy
# 但是这个操作RS并不会扩容,而是Pod会扩容版本回滚
1
kubectl roolout status deployments nginx-deploy
- 查看之前的版本历史
1
kubectl rollout history deployment/<deployment-name>
暂停与恢复
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx