RC和RS是部署Pod的两种方式,但是在生产环境中主要使用Deployment等方式进行Pod的管理和部署,这里只做了解
RC 复制控制器【Replication Controller】
可以确保Pod副本数达到期望值,可确保一个Pod或一组同类Pod总是可用
RS 复制集【Replica Set】
是支持基于集合的标签选择器的下一代RC,它主要用作Deployment协调创建、删除和更新Pod,它和RC的唯一区别是 RS支持标签选择器
实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等
-
StatefulSet 是一个有状态的应用部署【类似Redis、Rabbitmq】
-
DaemonSet 会在每个符合标签的节点上都会启一个容器,类似Calico,日志收集等【不支持scale扩容,每个主机一个】
-
Deployment 用于部署无状态的服务,最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如:configserver,zuul,springboot;它可以管理多个副本的Pod,实现无缝迁移、自动扩容缩容,自动灾难恢复,一键回滚等功能。
Deployment
命令创建:
kubectl create deployment nginx --image=nginx:1.15.2
yaml文件创建:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2020-09-19T02:41:11Z"
generation: 1
labels:
app: nginx
name: nginx
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 2 #副本数
revisionHistoryLimit: 10 # 历史记录保留的个数
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
需要注意⚠️:
selector和metadata中的labels必须要配置成一样的,并且创建之后不可以修改
selector:
matchLabels:
app: nginx
.......
metadata:
creationTimestamp: null
labels:
app: nginx
更新Deployment
命令
修改nginx deployment中 pod名为nginx的镜像版本为nginx:1.15.3,并且record记录下,后续可以查看详细的修改记录
kubectl set image deploy nginx nginx=nginx:1.15.3 --record
命令查看滚动更新的过程状态
kubectl rollout status deploy nginx
回滚Deployment
1、直接回滚到上一个版本
查看历史版本
kubectl rollout history deploy nginx
开始回滚
kubectl rollout undo deploy nginx
⚠️可以看到镜像版本已经由nginx:bbbbajzjahq1adaqxxxxxagdfqqaaaa 回滚到了nginx:1adaqxxxxxagdfqqaaaa,向上回滚了1个版本
2、回滚到指定版本
查看指定版本的详细信息
kubectl rollout history deploy nginx --revision=3
回滚到指定的版本
kubectl rollout undo deploy nginx --to-revision=3
Deployment扩容
命令扩容/缩容
#扩容nginx这个deployment,增加为4个副本
kubectl scale --replicas=4 deploy nginx
修改yaml文件扩容/缩容
kubectl edit deploy nginx
Deployment更新暂停和恢复
每执行一个set命令,就会触发一次更新
#deployment暂停功能
kubectl rollout pause deployment nginx #暂停
#进行第一次更新
kubectl set image deploy nginx=nginx:1.15.3 --record
#进行第二次更新,添加CPU内存配置
kubectl set resources deploy nginx -c nginx --limits=cpu=100m,memory=64Mi --requests=cpu=20m,memory=16Mi --record
#deployment恢复,开始执行上面的修改操作
kubectl rollout resume deploy nginx
Deployment更新注意事项
清理策略:
在默认情况下,revision保留10个旧的ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit设置保留ReplicaSet的个数。当设置为0时,不保留历史记录
spec:
progressDeadlineSeconds: 600
replicas: 2 #副本数
revisionHistoryLimit: 10 # 历史记录保留的个数
.spec.minReadySeconds:可选参数,指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数,默认为0,即一旦被创建就视为可用。
滚动更新的策略
.spec.strategy.type:更新deployment的方式,默认是RollingUpdate
- RollingUpdate:滚动更新,可以指定maxSurge和maxUnavailable
- maxUnavailable:指定在回滚或更新时最大不可用的Pod的数量,可选字段,默认25%,可以设置成数字或百分比,如果该值为0,那么maxSurge就不能0
- maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果该值为0,那么maxUnavailable不能为0
- Recreate:重建,先删除旧的Pod,在创建新的Pod