Deployment
因为RCRS无法支持动态更新
Deployment支持动态更新
无状态应用管理
Deployment控制器下面就是ReplicaSet
当我们创建Deployment的时候实际上会给我们创建一个同名的ReplicaSet控制器,这个RS上面是我们对应的pod节点
更新的时候,Deployment是支持自动更新的,RS也可以更新,就是把已经生成的节点一个一个删掉,他就会生成更新后的节点,这样也可算是更新
Deployment最主要的功能:
事件和状态查看 :
必要时可以查看Deployment对象更新进度和状态
版本记录:
自动更新就是因为做了版本记录,每次创建或更新都会给我们记录一个版本,这个版本默认情况最多可以记录十个,一个deployment可以记录10个版本,可以做更新和回滚!
回滚:
更新操作启动后的任一时刻(包括完成后)发现问题,都可以通过回滚机制将应用返回到前一个或由用户指定的历史记录中的版本。
暂停和启动∶
更新过程中能够随时暂停和继续完成后面的步骤。deployment能够自动更新的话,但是自动更新是默认开启的,可以让他暂停
多种更新方案:
其实就两种,一种叫Recreate,一次性的,叫重建更新机制,就比如我一次性运行三个pod,如果我是用Recreate方式的话,他是一次性把三个都停了然后给你创建新的
另外一种RollingUpdate滚动更新,分批次更新
写一个Deployment
最主要的字段spec
[root@k8s-master1 ~]# kubectl explain deployment.spec
KIND: Deployment
VERSION: apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
Specification of the desired behavior of the Deployment.
DeploymentSpec is the specification of the desired behavior of the
Deployment.
FIELDS:
minReadySeconds <integer>
#pod 正常情况是READY 1/1 或者2/2 到就绪以后多少秒内 内部运行的pod没有crashing(崩溃)或者宕机之类的动作,他就认为你的状态时就绪的 这个默认值时10秒 就是正常情况你的pod创建起来 十秒后没问题 就认为你没问题
Minimum number of seconds for which a newly created pod should be ready
without any of its container crashing, for it to be considered available.
Defaults to 0 (pod will be considered available as soon as it is ready)
paused <boolean>
#暂定挂起 上面说的暂停 默认是不挂起的 改为true 就挂起
Indicates that the deployment is paused.
progressDeadlineSeconds <integer>
#滚动更新超时时长 默认为600秒 10分钟
The maximum time in seconds for a deployment to make progress before it is
considered to be failed. The deployment controller will continue to process
failed deployments and a condition with a ProgressDeadlineExceeded reason
will be surfaced in the deployment status. Note that progress will not be
estimated during the time a deployment is paused. Defaults to 600s.
replicas <integer>
#和前面RS RC类似 pod副本数
Number of desired pods. This is a pointer to distinguish between explicit
zero and not specified. Defaults to 1.
revisionHistoryLimit <integer>
#定义的历史版本数量 默认值为10 不修改就是10
The number of old ReplicaSets to retain to allow rollback. This is a
pointer to distinguish between explicit zero and not specified. Defaults to
10.
selector <Object> -required-
#标签选择器
Label selector for pods. Existing ReplicaSets whose pods are selected by
this will be the ones affected by this deployment. It must match the pod
template's labels.
strategy <Object>
#定义的更新机制 详细看下 看下面
The deployment strategy to use to replace existing pods with new ones.
template <Object> -required-
#模板
Template describes the pods that will be created.
详细看下更新机制 strategy
[root@k8s-master1 rc]# kubectl explain deployment.spec.strategy
KIND: Deployment
VERSION: apps/v1
RESOURCE: strategy <Object>
DESCRIPTION:
The deployment strategy to use to replace existing pods with new ones.
DeploymentStrategy describes how to replace existing pods with new ones.
FIELDS:
rollingUpdate <Object>
#更新机制
Rolling update config params. Present only if DeploymentStrategyType =
RollingUpdate.
type <string>
#只有ytpe为Recreate 的时候上面那个值才有效 如果时RollingUpdate 上面那个值 就不需要了
Type of deployment. Can be "Recreate" or "RollingUpdate". Default is
RollingUpdate.
Possible enum values:
- `"Recreate"` Kill all existing pods before creating new ones.
- `"RollingUpdate"` Replace the old ReplicaSets by new one using rolling
update i.e gradually scale down the old ReplicaSets and scale up the new
one.
详细看下rollingUpdate
[root@k8s-master1 rc]# kubectl explain deployment.spec.strategy.rollingUpdate
KIND: Deployment
VERSION: apps/v1
RESOURCE: rollingUpdate <Object>
DESCRIPTION:
Rolling update config params. Present only if DeploymentStrategyType =
RollingUpdate.
Spec to control the desired behavior of rolling update.
FIELDS:
maxSurge <string>
#在更新期间最大允许超过期望值的个数,这个数可以是个数字也可以是个百分比 默认是25%
The maximum number of pods that can be scheduled above the desired number
of pods. Value can be an absolute number (ex: 5) or a percentage of desired
pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number
is calculated from percentage by rounding up. Defaults to 25%. Example:
when this is set to 30%, the new ReplicaSet can be scaled up immediately
when the rolling update starts, such that the total number of old and new
pods do not exceed 130% of desired pods. Once old pods have been killed,
new ReplicaSet can be scaled up further, ensuring that total number of pods
running at any time during the update is at most 130% of desired pods.
maxUnavailable <string>
#在更新过程种允许缺少期望pod个数 默认是25%
The maximum number of pods that can be unavailable during the update. Value
can be an absolute number (ex: 5) or a percentage of desired pods (ex:
10%). Absolute number is calculated from percentage by rounding down. This
can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set
to 30%, the old ReplicaSet can be scaled down to 70% of desired pods
immediately when the rolling update starts. Once new pods are ready, old
ReplicaSet can be scaled down further, followed by scaling up the new
ReplicaSet, ensuring that the total number of pods available at all times
during the update is at least 70% of desired pods.
写一个
[root@k8s-master1 rc]# vim deployment-v1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels: #deployment 本身定义的标签没有任何意义 他的标签后面标签选择器 还有容器标签 没有关系
app: nginx
env: dev
spec:
replicas: 10 #副本数
selector: #标签选择器 它支持RS的哪两种 但是没有必要写两种 写一种就可以
matchLabels:
app: nginx-1
template:
metadata:
labels:
app: nginx-1
spec:
containers:
- name: nginx
image: harbor.guoguo.com/apps/nginx:1.22.1
ports:
- containerPort: 80
[root@k8s-master1 rc]# kubectl apply -f deployment-v1.yml
deployment.apps/nginx-deployment created
[root@k8s-master1 rc]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 10/10 10 10 12s
[root@k8s-master1 rc]# kubectl get rs
NAME DESIRED CURRENT READY AGE
#我们创建一的deployment 他会给我们呢创建一个同名的RS
nginx-deployment-8f88cddbf 10 10 10 15s
我创建deployment我可以用这个
[root@k8s-master1 rc]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out
#显示deployment 已经success成功
[root@k8s-master1 rc]# kubectl get rs -l app=nginx-1
NAME DESIRED CURRENT READY AGE
nginx-deployment-8f88cddbf 10 10 10 3m52s
#查看标签为app=nginx-1的 再rs里面
[root@k8s-master1 rc]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-8f88cddbf-28b7h 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
#8f88cddbf 这个hash值是给rs准备的 28b7h也是随机生成的hash 他是rs名称生成的hash #这个是hash值 每个pod都加hash
nginx-deployment-8f88cddbf-7l2kh 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-92sqh 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-97kjl 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-c9xc8 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-dcs4g 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-hw66l 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-jdm9q 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-tsjcc 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
nginx-deployment-8f88cddbf-wnld4 1/1 Running 0 6m52s app=nginx-1,pod-template-hash=8f88cddbf
更新
基于Deployment里的template字段,如果这个字段有修改才意味着更新
更新很简单
第一种方式:直接修改yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
env: dev
spec:
replicas: 10
selector:
matchLabels:
app: nginx-1
template: #更新是基于templast字段更新
metadata:
labels:
app: nginx-1
spec:
containers:
- name: nginx
image: harbor.guoguo.com/apps/nginx:1.24.1 #修改为1.24.0
ports:
- containerPort: 80
[root@k8s-master1 rc]# kubectl apply -f deployment-v1.yml
deployment.apps/nginx-deployment configured
#configured表示有更改
[root@k8s-master1 rc]# kubectl apply -f deployment-v1.yml
deployment.apps/nginx-deployment unchanged
#unchanged表示没更改
如果我们对已经存在的Deploymeng更新他是一个一个更新
[root@k8s-master1 rc]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx-deployment-646c459d9b-6b4qd 1/1 Running 0 56s
nginx-deployment-646c459d9b-9gblq 1/1 Running 0 56s
nginx-deployment-646c459d9b-qfjtt 1/1 Running 0 56s
nginx-deployment-8f88cddbf-s8htc 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-s8htc 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-s8htc 0/1 ContainerCreating 0 0s
nginx-deployment-8f88cddbf-s8htc 0/1 ContainerCreating 0 0s
nginx-deployment-8f88cddbf-s8htc 1/1 Running 0 1s
nginx-deployment-646c459d9b-9gblq 1/1 Terminating 0 99s
nginx-deployment-8f88cddbf-s7fgv 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-s7fgv 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-s7fgv 0/1 ContainerCreating 0 0s
nginx-deployment-646c459d9b-9gblq 1/1 Terminating 0 99s
nginx-deployment-8f88cddbf-s7fgv 0/1 ContainerCreating 0 1s
nginx-deployment-646c459d9b-9gblq 0/1 Terminating 0 100s
nginx-deployment-646c459d9b-9gblq 0/1 Terminating 0 100s
nginx-deployment-646c459d9b-9gblq 0/1 Terminating 0 100s
nginx-deployment-8f88cddbf-s7fgv 1/1 Running 0 1s
nginx-deployment-646c459d9b-qfjtt 1/1 Terminating 0 100s
nginx-deployment-8f88cddbf-fkdhp 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-fkdhp 0/1 Pending 0 0s
nginx-deployment-8f88cddbf-fkdhp 0/1 ContainerCreating 0 0s
nginx-deployment-646c459d9b-qfjtt 1/1 Terminating 0 100s
nginx-deployment-8f88cddbf-fkdhp 0/1 ContainerCreating 0 1s
nginx-deployment-8f88cddbf-fkdhp 1/1 Running 0 1s
nginx-deployment-646c459d9b-6b4qd 1/1 Terminating 0 101s
nginx-deployment-646c459d9b-6b4qd 1/1 Terminating 0 101s
nginx-deployment-646c459d9b-qfjtt 0/1 Terminating 0 101s
nginx-deployment-646c459d9b-qfjtt 0/1 Terminating 0 101s
nginx-deployment-646c459d9b-qfjtt 0/1 Terminating 0 101s
nginx-deployment-646c459d9b-6b4qd 0/1 Terminating 0 102s
nginx-deployment-646c459d9b-6b4qd 0/1 Terminating 0 102s
nginx-deployment-646c459d9b-6b4qd 0/1 Terminating 0 102s
^C[root@k8s-master1 rc]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-8f88cddbf-fkdhp 1/1 Running 0 26s
nginx-deployment-8f88cddbf-s7fgv 1/1 Running 0 27s
nginx-deployment-8f88cddbf-s8htc 1/1 Running 0 28s
#我把pod数量削减为了三个 这样显示的短点
#他并不是一次都关闭 他首先会创建一个rs
[root@k8s-master1 rc]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-646c459d9b 0 0 0 9m16s
nginx-deployment-8f88cddbf 3 3 3 23m
#9br是更新前用rs然后又新创建了一个rs
#创建完rs他会再新的rs里面启动pod,这个过程是创建好一个pod,会把老的删除一个
#三个都创建完成了 旧的也都删完了
上面是通过修改配置清单的方式对deployment进行更新
第二种方式命令行(生产上多数临时发布系统的时候用命令行的方式进行修改)
[root@k8s-master1 rc]# kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.24.0 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx-deployment image updated
#命令解析:
# kubectl set image : kubectl 的子命令,用于更新资源的镜像。
# deployment nginx-deployment : 指定要更新的部署的名称。
# nginx=harbor.guoguo.com/apps/nginx:1.24.0 : 设置 nginx 容器的新镜像,使用私有仓库 harbor.guoguo.com 的镜像,标签为 1.24.0。
# --record : 将此更新操作记录到部署的 revision history 中,方便后续查看和回滚。
#更新 nginx-deployment 部署中 nginx 容器的镜像版本到 1.24.0
#镜像来自私有仓库 harbor.guoguo.com
#记录此更新操作到 revision history
#镜像更新后,会根据部署策略自动滚动升级。
#使用 kubectl set image 可以方便地更新部署的镜像版本,并记录下此次变更,是一个非常有用的 kubectl 操作。
#注意最后的nginx=仓库地址 这个nginx是yml文件里面定义的容器名字!
第三种方式edit
[root@k8s-master1 rc]# kubectl edit deployments.apps nginx-deployment
#直接用edit方式去修改
总结一下更新的三种方式:
第一种:修改配置文件 然后直接从新执行一遍
第二种:命令行更新 kubectl set
第三种:edit
回滚
[root@k8s-master1 rc]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 <none>
3 kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.22.1 --record=true
#有三个版本 只显示了两个 第二个版本没有写名字,如果我想回到第二个版本
[root@k8s-master1 rc]# kubectl rollout history deployment nginx-deployment --revision=2
#查看版本信息 查看的第二个版本
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx-1
pod-template-hash=646c459d9b
Containers:
nginx:
Image: harbor.guoguo.com/apps/nginx:1.24.0
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
回滚到上个版本
[root@k8s-master1 rc]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
#已经回滚
回滚到指定版本
[root@k8s-master1 rc]# kubectl rollout history deployment nginx-deployment
#查看历史版本信息
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
3 kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.22.1 --record=true
4 <none>
[root@k8s-master1 rc]# kubectl rollout history deployment nginx-deployment --revision=3
#查看第三个版本信息
deployment.apps/nginx-deployment with revision #3
Pod Template:
Labels: app=nginx-1
pod-template-hash=8f88cddbf
Annotations: kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.22.1 --record=true
Containers:
nginx:
Image: harbor.guoguo.com/apps/nginx:1.22.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
[root@k8s-master1 rc]# kubectl rollout undo deployment nginx-deployment --to-revision=3
#回滚到指定的3版本
deployment.apps/nginx-deployment rolled back
扩容与缩容(生产很少用)
第一种方式:直接去修改yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
env: dev
spec:
replicas: 100 #修改为期待的副本数
selector:
matchLabels:
app: nginx-1
template:
metadata:
labels:
app: nginx-1
spec:
containers:
- name: nginx
image: harbor.guoguo.com/apps/nginx:1.24.0
ports:
- containerPort: 80
第二种方法命令行
[root@k8s-master1 rc]# kubectl scale deployment nginx-deployment --replicas 3
#将nginx-deployment 副本数量设置为3
deployment.apps/nginx-deployment scaled
第三种edit也可以
[root@k8s-master1 rc]# kubectl edit deployments.apps nginx-deployment
暂停恢复更新
我们并没有加暂停更新的参数paused
但是我们可以通过命令行方式添加
[root@k8s-master1 rc]# kubectl rollout pause deployment nginx-deployment
#暂停
deployment.apps/nginx-deployment paused
如果这是和我执行更新的命令,他是不会生效的不会更新的
尝试一下
[root@k8s-master1 rc]# kubectl set image deployment nginx-deployment nginx=harobr.guoguo.com/apps/nginx:1.22.1
deployment.apps/nginx-deployment image updated
[root@k8s-master1 rc]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-646c459d9b-4tzlj 1/1 Running 0 22m
nginx-deployment-646c459d9b-kspkn 1/1 Running 0 22m
nginx-deployment-646c459d9b-vr8c5 1/1 Running 0 22m
[root@k8s-master1 rc]# kubectl exec -it nginx-deployment-646c459d9b-4tzlj /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-deployment-646c459d9b-4tzlj:/# nginx -v
nginx version: nginx/1.24.0
#并没有更新
[root@k8s-master1 rc]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
5 kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.22.1 --record=true
6 kubectl set image deployment nginx-deployment nginx=harbor.guoguo.com/apps/nginx:1.22.1 --record=true
[root@k8s-master1 rc]# kubectl rollout undo deployment nginx-deployment --to-revision=5
#回滚到5
error: you cannot rollback a paused deployment; resume it first with 'kubectl rollout resume' and try again
#错误:您无法回滚已暂停的部署; 首先使用“kubectl rolloutresume”恢复它,然后重试
取消挂起
[root@k8s-master1 rc]# kubectl rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed
这个生产上比较有用,未来做灰度发布的时候,比如我更新了一段的时候,暂停让他线上保持两个阶段
以上就是滚动更新与暂停恢复
更新Deployment注意事项
#历史版本清理策略:
在默认情况下, revision 保留 10 个旧的 ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit 设置保留 ReplicaSet 的个数。当设置为 0 时,不保留历史记录。
更新策略:
.spec.strategy.type==Recreate,表示重建,先删掉旧的Pod再创建新的Pod;
#Recreate一次性全部删除
.spec.strategy.type==RollingUpdate,表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程;
.spec.strategy.rollingUpdate.maxUnavailable,指定在回滚更新时最大不可用的Pod数量,可选字段, 默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能 为0;
.spec.strategy.rollingUpdate.maxSurge可以超过期望值的最大Pod数,可选字段,默认为5%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。
Ready 策略:
.spec.minReadySeconds 是可选参数, 指定新创建的 Pod 应该在没有任何容器崩溃的情况下 视为
Ready (就绪)状态的最小秒数, 默认为 0,即一旦被创建就视为可用,通常和容器探针连 用。
试下Recreate 重建 更新的时候一次性都删除 然后全部都创建 不适用滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
strategy: #更新策略
type: Recreate #重建
selector:
matchLabels:
app: nginx-1
template:
metadata:
labels:
app: nginx-1
spec:
containers:
- name: nginx
image: harbor.guoguo.com/apps/nginx:1.22.1 #修改为1.22.1
ports:
- containerPort: 80
[root@k8s-master1 rc]# kubectl apply -f deployment-v1.yml
deployment.apps/nginx-deployment configured
[root@k8s-master1 rc]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-646c459d9b-kd4sm 1/1 Running 0 17s
nginx-deployment-646c459d9b-m72hj 1/1 Running 0 17s
nginx-deployment-646c459d9b-x6zj4 1/1 Running 0 17s
#看他们的创建时间 就能看出来是一块创建的