-
在kubernetes中,按照Pod的创建方式可以将其分为两类:
-
- 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
-
- 控制器创建Pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。
-
在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
-
- ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
-
- ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
-
- Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
-
- Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
-
- DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
-
- Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
-
- CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
-
- StatefulSet:管理有状态的应用。
Deployment 并不管理Pod 而是通过管理Replicaset来间接管理Pod
-
Deployment的主要功能如下:
-
- 支持ReplicaSet的所有功能。
-
- 支持发布的停止、继续。
-
- 支持版本滚动更新和版本回退。
模板:
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: deploy
spec: # 详情描述
replicas: 3 # 副本数量
revisionHistoryLimit: 3 # 保留历史版本,默认为10
paused: false # 暂停部署,默认是false
progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
strategy: # 策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchexpressions: # expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
查看Deployment
kubectl get deploy deploymentname -n dev
查看Replicaset
kubectl get rs -n dev
扩缩容:
kubectl scale deploy deploymentname --replicas=5 -n dev
当然你也可以直接修改你创建的yanl文件
kubectl edit deployment deploymentname -n dev
更新–>重建更新和滚动更新
strategy: 指定新的Pod替代旧的Pod的策略,支持两个属性
type: 指定策略类型,支持两种策略
Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
rollingUpdate:当type为RollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:
maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。
maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。
修改镜像
kubectl set image deployment deploymentname nginx=nginx:1.17.3 -n dev
镜像更新中rs的变化:
# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3 # 其实这就是deployment能够进行版本回退的奥妙所在 kubectl get rs -n dev
版本回退
1.查看历史版本
kubectl rollout history deployment deploymentname -n dev
回退
# 可以使用-to-revision=1回退到1版本,如果省略这个选项,就是回退到上个版本,即2版本 kubectl rollout undo deployment deploymentname --to-revision=1 -n dev
金丝雀发布
kubectl set image deployment deploymentname nginx=nginx:1.17.4 -n dev && kubectl rollout pause deployment deploymentname -n dev
观察更新状态
kubectl rollout status deployment deploymentname -n dev
确保无误
kubectl rollout resume deployment deploymentname -n dev自动化扩缩容HPA
kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。
提前准备
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: nginx # deployment的名称
namespace: dev # 命名类型
spec: # 详细描述
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.1 # 容器需要的镜像地址
ports:
- containerPort: 80 # 容器所监听的端口
resources: # 资源限制
requests:
cpu: "100m" # 100m表示100millicpu,即0.1个CPU
kubectl expose deployment nginx --name=nginx --type=NodePort --port=80 --target-port=80 -n dev
apiVersion: autoscaling/v1 # 版本号
kind: HorizontalPodAutoscaler # 类型
metadata: # 元数据
name: pc-hpa # deployment的名称
namespace: dev # 命名类型
spec:
minReplicas: 1 # 最小Pod数量
maxReplicas: 10 # 最大Pod数量
targetCPUUtilizationPercentage: 3 # CPU使用率指标
scaleTargetRef: # 指定要控制的Nginx的信息
apiVersion: apps/v1
kind: Deployment
name: nginx
DaemonSet
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。使用 DaemonSet 的一些典型用法:
-
运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。
-
在每个 Node 上运行日志收集 daemon,例如fluentd、logstash。
-
在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter。
模板
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: #标签
controller: daemonset
spec: # 详情描述
revisionHistoryLimit: 3 # 保留历史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxUnavailable: 1 # 最大不可用状态的Pod的最大值,可用为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchexpressions: # expressions匹配规则
- key: app
operator: In
values:
- nginx-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
Job
Job也是一种很常用的控制器,在执行自动化脚本的时候就可以使用,比如使用ansible脚本job创建一个新的k8s集群,使用job创建MySQL账号密码,使用job去执行helm脚本等等。
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: # 标签
controller: job
spec: # 详情描述
completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: counter-pod
matchexpressions: # expressions匹配规则
- key: app
operator: In
values:
- counter-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或onFailure
containers:
- name: counter
image: busybox:1.30
command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done"]
定时任务CronJob
cronJob 是类似于Linux中的计划任务,用于执行周期性任务,如数据备份、周期性采集相关信息并发送邮件等。
apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels:
controller: cronjob
spec: # 详情描述
schedule: # cron格式的作业调度运行时间点,用于控制任务任务时间执行
concurrencyPolicy: # 并发执行策略
failedJobsHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
successfulJobsHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义
metadata: {}
spec:
completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
spec:
restartPolicy: Never # 重启策略只能设置为Never或onFailure
containers:
- name: counter
image: busybox:1.30
command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done" ]
有状态服务StatefulSet
-
无状态应用:
-
- 认为Pod都是一样的。
- 没有顺序要求。
-
- 不用考虑在哪个Node节点上运行。
- 随意进行伸缩和扩展。
-
有状态应用:
-
- 有顺序的要求。
- 认为每个Pod都是不一样的。
-
- 需要考虑在哪个Node节点上运行。
- 需要按照顺序进行伸缩和扩展。
-
- 让每个Pod都是独立的,保持Pod启动顺序和唯一性。
-
StatefulSet常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等。一般用来部署组件
-
Deployment 通常用来部署我们的服务
Deployment和StatefulSet的区别:
-
Deployment没有唯一标识而StatefulSet有唯一标识。
-
StatefulSet的唯一标识是根据主机名+一定规则生成的。
-
StatefulSet的唯一标识是主机名.无头Service名称.命名空间.svc.cluster.local
apiVersion: v1
kind: Service
metadata:
name: service-headliness
namespace: dev
spec:
selector:
app: nginx-pod
clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
type: ClusterIP
ports:
- port: 80 # Service的端口
targetPort: 80 # Pod的端口
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: pc-statefulset
namespace: dev
spec:
replicas: 3
serviceName: service-headliness
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
- StatefulSet支持两种更新策略:OnDelete和RollingUpdate(默认),其中OnDelete表示删除之后才更新,RollingUpdate表示滚动更新。



