前文:
扩缩容
生产环境中,K8S的扩缩容用的是Horizontal Pod Autoscaler(以下简称HPA),Pod水平扩缩器。与“水平”对应的是“垂直”。
“水平”是指增加或减少Pod。
“垂直”是指增加或减少资源(CPU或内存等)给运行中的Pod。
其原理就是K8S监听Pod的资源利用指标,根据指定的指标&标准,自动进行扩缩容。
具体细节就不介绍了,毕竟本文也不是给专业的K8S运维人员看的,简单的算法就是:
期望副本数=ceil(当前副本数*(当前指标/期望指标))
例如,当前副本数=2,当前指标CPU利用率=100%,期望指标=50%,可得期望副本数=(2*(1/0.5))=4,进行自动扩容。
反之,当前副本数=4,当前指标CPU利用率=50%,期望指标=100%,可得期望副本数=(4*(0.5/1))=2,进行自动缩容。
与之配套的还有很多API、配置,本文就不讲这么复杂的了。在实际生产中,自动扩缩容应用起来还是很慎重的,毕竟指标这个东西,不可控的因素多,配置不好,动不动就扩缩容,反而会造成不稳定。
本文就讲一下怎么用上文的Deployment,手动扩缩容。
其实很简单,修改文件deployment.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 3
selector:
matchLabels:
project: k8sdemo
template:
metadata:
labels:
project: k8sdemo
spec:
containers:
- name: web-service
image: 用户名/k8sdemo:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
将spec.replicas由2改为3,重新执行就扩容了,同理,改为1,就缩容。
滚动更新
这个很实用,我还记得早年间没有K8S,甚至没有Jenkins、Sentinel、Nacos等这些CI/CD工具时,给多个副本升级是一件很手工的事情。先下线1个副本,升级,上线;再下线1个副本,升级,上线......
K8S就省事很多。
我们先把工程升级版本,按照前文的步骤推送镜像到Docker Hub。
修改deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 5
selector:
matchLabels:
project: k8sdemo
minReadySeconds: 20
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
project: k8sdemo
spec:
containers:
- name: web-service
image: 用户名/k8sdemo:1.1
imagePullPolicy: Always
ports:
- containerPort: 8080
说明:
滚动更新的目的是:将旧Pod删除至0,新Pod增加至期望副本数。
- 为了演示,事先将期望副本数扩容到了5个。
- 镜像版本改为1.1
- spec.minReadySeconds=20。代表更新一个副本后,强制等待20秒,再更新下一个。
- spec.strategy.type=RollingUpdate。强制要求用滚动更新的方式进行。
- spec.strategy.rollingUpdate.maxUnavailable=0。此次滚动更新过程中,不可用副本数的最大值(或最大比例),值越小,系统就越稳定,升级越平滑。本例设为0,代表滚动更新期间,不可以让副本数小于期望副本数。
- spec.strategy.rollingUpdate.maxSurge=1。此次滚动更新过程中,超过期望副本数的最大值(或最大比例),值越大,更新速度越快。本例设为1,代表滚动更新期间,副本数可以是5+1个。
- maxUnavailable=0,maxSurge=1,代表先增加1个新Pod,再删除1个旧Pod,直到新Pod5个增加完毕,旧Pod删除完毕。
执行命令后,可以通过监测命令看一下状态
kubectl rollout status deployment web-deploy
访问接口:
完结撒花