前言
在K8S中,我们可以根据访问量,以一种简单的形式动态扩展我们的应用,以及以一种零停机时间的形式滚动更新我们的 应用。
以下演示均以上篇文章的deployment文件为例。
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo-deployment
labels:
k8s-app: k8s-demo-web
spec:
replicas: 1
selector:
matchLabels:
k8s-app: k8s-demo-web
template:
metadata:
labels:
k8s-app: k8s-demo-web
spec:
containers:
- name: aspnetcore
image: easyboys/k8sdemo:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000 #此端口需要与dockerfile中指定暴露的端口一致,否则无法访问
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: k8s-demo-web
name: k8s-demo-service
spec:
type: NodePort
ports:
- port: 5000
targetPort: 5000
nodePort: 31000
selector:
k8s-app: k8s-demo-web
1、Scale
创建上面所示的Deployment,replicas为1:
kubectl apply -f demoDeployment-1.yaml
如下图所示,成功创建了一个服务副本:
执行以下命令扩容到4个:
kubectl scale deployment k8s-demo-deployment --replicas 4
如下图所示,成功创建了四个副本运行在两个节点下:
根据CPU状态自动扩容todo
2、Rolling Update
如我们需要更新镜像,并不会一次性全部更新,而是创建一个新的pod,暂停一个旧的pod,创建完成后删除旧的pod,确保每次只有一个pod不可用。
更新镜像:
kubectl set image deployment/k8s-demo-deployment aspnetcore=easyboys/k8sdemo:v2
如下图所示,三个pod为runing状态,只有一个pod处理更新状态。
验证更新是否成功:
版本为v2,更新成功
回滚更新:
回滚到上一次的更新状态
kubectl rollout undo deployment/k8s-demo-deployment
查看回滚状态:
kubectl rollout status deployment/k8s-demo-deployment
如下图,成功回滚到v1版本
回滚到指定版本:
如果要回滚到指定本版,那么每次发布的都有带上 --record参数
准备三个demoployment:
demoDeployment-1.yaml 对应image:easyboys/k8sdemo:v1
demoDeployment-2.yaml 对应image:easyboys/k8sdemo:v2
demoDeployment-3.yaml 对应image:easyboys/k8sdemo:v3
分别依次执行:
kubectl apply -f demoDeployment-1.yaml --record
kubectl apply -f demoDeployment-2.yaml --record
kubectl apply -f demoDeployment-3.yaml --record
查看Deployment升级的历史记录:
kubectl rollout history deployment/k8s-demo-deployment
查看单个revision的详细信息:
kubectl rollout history deployment/k8s-demo-deployment --revision=2
回退指定版本:
--to-revision 指定版本号
kubectl rollout undo deployment/k8s-demo-deployment --to-revision=1