ReplicaSet介绍
负责编排无状态应用的基础控制器是ReplicaSet,相应的资源类型通过三个关键组件 定义如何编排一个无状态应用
- replicas:期望运行的Pod副本数
- selector:标签选择器
- matchLabels 等值
- matchExpressions: 表达式
- template:Pod模板
ReplicaSet的问题
但是无法 无损更新, ReplicaSet的升级需要大量的手工操作 所以衍生出了Deployment 升级时 Deployment 会并存多个 ReplicaSet版本,
例如底层镜像更新了 需要手工删除pod 让ReplicaSet控制器 重新创建pod
ReplicaSet yaml示例
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-demo
spec:
minReadySeconds: 3
replicas: 2
selector:
matchLabels:
app: demoapp
release: stable
version: v1.0
template:
metadata:
labels:
app: demoapp
release: stable
version: v1.0
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
ports:
- name: http
containerPort: 80
注意: selector.matchLabels 必须是 template.metadata.labels的子集
获取ReplicaSet资源对象的状态
kubectl get rs
kubectl get replicaset
字段介绍
- DESIRED 期望的pod数
- CURRENT 当前的pod数
- READY 就绪的pod数
- AGE 当前资源创建后 生存的时长
Deployment控制器
Deployment介绍
- 是建立在 ReplicaSet控制器 上层的更高级的控制器
- 借助于 ReplicaSet 完成无状态应用的基本编排任务
- 它位于ReplicaSet更上面一层,基于ReplicaSet提供了滚动更新、回滚等更为强大的应用编排 功能
- 是ReplicaSet资源的编排工具
- Deployment编排ReplicaSet
- ReplicaSet编排Pod
- 但是,应该直接定义Deployment资源来编排Pod应用,ReplicaSet无须显式给出
Deployment资源示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
spec:
replicas: 4
selector:
matchLabels:
app: demoapp
release: stable
template:
metadata:
labels:
app: demoapp
release: stable
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:v1.0
ports:
- containerPort: 80
name: http
获取Deployment资源对象的状态
kubectl get deployment
更新策略 介绍
Deployment控制器支持两种更新策略
指纹的变更 作为变更的前提
滚动式更新(rolling updates)
- 指纹(Template的hash码变动后) 会维护replicaset老版本(rs01) 并且创建新版本(rs02)
- 终态是老版本(rs01)的pod为0、新版本(rs02)的pod是3
- 如果发现有问题 我们可以回归历史版本
- 更新历史数默认保存10个版本
pod数量的变化情况
| 老版本 | 新版本 |
|---|---|
| rs01 | rs02 |
| 3 | 0 |
| 2 | 1 |
| 1 | 2 |
| 0 | 3 |
-
逐批次更新Pod的方式,支持按百分比 或 具体的数量定义批次规模,默认策略
-
触发条件:Template的hash码变动
- 仅podTemplate的配置变动 会导致hash码改变
- replicas和selector的变更 不会导致podTemplate的hash变动
重建式更新(recreate)
- 在Pod资源被删除时,使用新的模板定义被足缺失的Pod数量,完成更新
- 触发条件:现有Pod被删除
命令示例
触发滚动更新
最为常见的更新需求是应用升级,即镜像文件更新,常用方法
kubectl apply
kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ...
kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE [options]
- 直接更新原配置文件,而后使用“kubectl apply”命令触发更新
- 上面第二和第三种方法可用于模板中任何必要配置的更新
查看更新状态:
## 语法
kubectl rollout status (TYPE NAME | TYPE/NAME) [flags] [options]
kubectl rollout status deployment deployment-demo
查看历史版本
## 语法
kubectl rollout history (TYPE NAME | TYPE/NAME) [flags] [options]
root@k8s-node01:~/learning-k8s/examples/deployments# kubectl rollout history deployment deployment-demo
deployment.apps/deployment-demo
REVISION CHANGE-CAUSE
1 <none>
回滚到前一版本
kubectl rollout undo (TYPE NAME | TYPE/NAME)
回滚到指定版本
kubectl rollout undo (TYPE NAME | TYPE/NAME) --to-revision=X
停止滚动更新
金丝雀场景 只更新1个新pod进去 老pod继续保留
kubectl rollout pause
如果灰度成功 可以kubectl rollout resume 继续更新
如果灰度失败 可以回滚
注意 生产环境必须配置livereadline探针 防止pod启动时立刻被service监听到 立马分配流量, pod中的应用可能还没有启动完毕 就接收到了流量
滚动更新策略 配置介绍
查看配置项
kubectl explain deploy.spec.strategy.rollingUpdate
pod数量和参数的关系
配置示例
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
maxSurge 参数
控制 当前最多可以存在的pod, 例如replicas=4 maxSurge=25% 那么最多可以存在5个
指定升级期间存在的总Pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是相对于期望值的一个百分比
maxUnavailable 参数
控制 可用的pod数量, 例如replicas=4 maxUnavailable=25% 那么最少可用的pod数量是3 也就是3、4、5都可以
升级期间正常可用的Pod副本数(包括新旧版本)最多不能低于期望值的个数,其值可以是0或正整数,也可以是相对于期望 值的一个百分比,默认值为1
存在的问题1:
必须以Pod为原子单位切割规模比例,且无法 精准控制流量路由的比例
无法精准控制 新 老pod接收的流量比例
service 是按照pod数量进行的切割
解决方案 七层负载均衡
存在的问题2
replicas=4 maxUnavailable=25% 更新过程中可能只存在3个pod可用 可能出现负载高的问题
解决方案 更新过程中 不允许减少pod maxSurge=1 maxUnavailable=0
扩容和缩容
容量管理类型
- 横向伸缩:增加或减少Pod数量
- 纵向(垂直)伸缩:调整Pod上的资源需求和资源限制
变动Deployment资源对象中的replicas字段的值即会触发应用规模的扩容或缩容
- 扩容和缩容是ReplicaSet的功能,具体操作由ReplicaSet完成
- 根据应用规模的需要进行手动配置
操作方法
- patch命令
- kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE] [options]
- 例如:kubectl patch deployment deploy-example -p '{"spec":{"replicas":3}}'
- 直接更新原配置文件,而后使用“kubectl apply”命令触发更新
扩展:自动扩容和缩容
- HPA(Horizontal Pod Autoscaler)控制器 水平扩容
- VPA(Vertical Pod Autoscaler)控制器 垂直扩容