控制器
ReplicaSet、Deployment、StatefulSet 和 DaemonSet 都是 Kubernetes 中的控制器对象,用于管理 Pod 的创建、扩展、缩减和更新等操作。
一、Deployment
适用无状态服务应用部署;Deployment 是在 ReplicaSet 的基础上提供了更高级功能的控制器。它提供了滚动更新和回滚功能
1、配置文件
apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息
labels: # 标签
app: nginx-deploy # 具体的 key: value 配置形式
name: nginx-deploy # deployment 的名字
namespace: default # 所在的命名空间
spec:
replicas: 3 # 期望副本数,最终运行的副本数
revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
selector: # 选择器,用于找到匹配的 ReplicaSet(RS)
matchLabels: # 按照标签匹配
app: nginx-deploy # 匹配的标签key/value
strategy: # 更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 25% # 进行滚动更新时,允许超过期望副本数的额外副本个数或比例,
maxUnavailable: 25% # 进行滚动更新时,不可用的最大副本个数或比例
type: RollingUpdate # 更新类型,采用滚动更新
template: # pod 模板
metadata: # pod 的元信息
labels: # pod 的标签
app: nginx-deploy
spec: # pod 期望信息
containers: # pod 的容器
- image: nginx:1.7.9 # 镜像
imagePullPolicy: IfNotPresent # 拉取策略
name: nginx # 容器名称
restartPolicy: Always # 重启策略
terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间
关于期望副本数
replicas
、maxSurge和
maxUnavailable:
replicas
:期望副本数;maxSurge
:允许超过期望副本数的额外副本数,绝对数值或百分比。例如,如果maxSurge
设置为 1,那么在滚动更新期间,可以将副本数量增加到期望副本数加上1;maxUnavailable
:不可用的最大副本数。绝对数值或百分比。例如,如果maxUnavailable
设置为 1,那么在滚动更新期间,最多允许有一个副本不可用;举例:
spec: replicas: 3 # 期望副本数 ... strategy: rollingUpdate: maxSurge: 1 # 进行滚动更新时,允许超过期望副本数的额外副本个数或比例 maxUnavailable:1 # 进行滚动更新时,不可用的最大副本个数或比例 type: RollingUpdate # 更新类型,采用滚动更新
在此情况下,Kubernetes会根据
maxSurge
的值先增加1个额外的副本,使得总共有4个副本。然后再逐个替换旧的副本,直到所有旧副本被替换为止。这样可以保证在更新过程中至少有3个可用的副本。然而,由于Deployment的
replicas
值是3,Kubernetes会自动将副本数量调整回到3个。它会逐个替换旧的副本,直到满足replicas
定义的副本数为止。这样确保了最终运行的副本数与replicas
的值保持一致。
2、创建/查看
# 创建一个 deployment(nginx-deploy)
[root@k8s-master ~]# kubectl create deploy nginx-deploy --image=nginx:1.7.9
deployment.apps/nginx-deploy created
# 或执行 "kubectl create -f xxx.yaml --record"
# --record 会在 annotation 中记录当前命令创建或升级了资源,后续可以查看做过哪些变动操作
# 查看部署信息
[root@k8s-master ~]# kubectl get deployments --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 1/1 1 1 7h22m app=nginx-deploy
# 查看 rs
[root@k8s-master ~]# kubectl get rs --show-labels
NAME DESIRED CURRENT READY AGE LABELS
nginx-deploy-78d8bf4fd7 1 1 1 4h2m app