K8S Scale、Rolling Update、Cron Job
Scale
假设现在 apply 了一个 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 1
selector:
matchLabels:
app: web-server
component: web-server
template:
metadata:
labels:
app: web-server
component: web-server
spec:
containers:
- name: web-server
image: web-server:1.0
可以通过 scale 命令扩展成 3 个 Pod,K8S 会多启动两个 Pod,原来的 Pod 依然正常运行
kubectl scale --replicas=3 deployment web-server
也可以改变 yaml 文件
...
spec:
replicas: 3
...
然后 apply,K8S 会发现 deployment 已经部署,但新的 replicas 变成 3 了,所以会多启动两个 Pod
kubectl apply -f web-server.yml
replicas 的值也可以缩小,K8S 会自动停止多余的 Pod
Rolling Update
启动配置的时候记录版本的操作
kubectl apply -f web-server.yml --record=true
查看历史版本
kubectl rollout history deployment/web-server
可以看到
REVISION CHANGE-CAUSE
1 kubectl create --filename=web-server.yml --record=true
可以通过 set image 命令升级版本
kubectl set image deployment web-server web-server=web-server:2.0
再查看历史版本,可以看到
REVISION CHANGE-CAUSE
1 kubectl create --filename=web-server.yml --record=true
2 kubectl set image deployment web-server web-server=web-server:2.0
也可以在 web-server.yml 里面把 image 改了,然后重新 apply,也会触发 Rolling Update
kubectl apply -f web-server.yml
Rolling Update 会边启动新的 Pod 边停止旧的 Pod,比如 replicas 是 3,然后有一个 Service 连着这三个 Pod,那么在做 Rolling Update 的时候,会先启动一个新版本的 Pod,并且这个 Pod 也会连上 Service,然后停掉其中一个旧的 Pod,再启动新版本的 Pod,再停止旧的 Pod,如此循环,直到 3 个 Pod 都是新版的为止
Cron Job
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cron-job-test
namespace: default
spec:
concurrencyPolicy: Replace # 并发策略,如果时间到时,已经有一个 Pod 在运行,怎么处理
# Allow(默认):新的 Job 会和旧的 Job 一起运行
# Replace:停止旧的 Job,启动新的 Job
# JobForbid:如果有旧的 Job 在运行,那么不会创建新的 Job
failedJobsHistoryLimit: 10 # 保留多少个失败的任务,默认没限制
successfulJobsHistoryLimit: 10 # 保留多少个成功的任务,默认没限制
startingDeadlineSeconds: 15 # Pod 必须在 15 秒内开始执行,否则将不运行,且标记失败
terminationGracePeriodSeconds: 30 # Job 存活时间,默认为永久
schedule: '*/1 * * * *' # 每分钟执行一次
jobTemplate:
spec:
template:
metadata: {}
spec:
containers:
- name: cron-job-test
image: cron-job-test:1.0