弹性伸缩的接口:
Deployment版本回滚接口:
下面是配置的过程:
# kubectl create deployment web --image=nginx:latest --replicas=2
# kubectl expose deployment/web --type=NodePort --port=1080 --target-port=80
deployment副本扩容和缩容
# kubectl scale deployment/test -n default --replicas=2 或者 kubectl patch -n default deployment/test -p '{"spec":{"replicas":2}}'
配置HPA自动扩缩容
1。修改每个 API Server 的 kube-apiserver.yaml 配置开启 Aggregator Routing
# vi /etc/kubernetes/manifests/kube-apiserver.yaml
- --enable-aggregator-routing=true # 添加本行
修改 manifests 配置后 API Server 会自动重启生效。
2.安装metrics-server-参见k8s部署dashboard
官网:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server
下载六个文件并创建
# mkdir metrics-server; cd metrics-server
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/auth-delegator.yaml
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/auth-reader.yaml
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/metrics-apiservice.yaml
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/metrics-server-deployment.yaml
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/metrics-server-service.yaml
#wget https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/metrics-server/resource-reader.yaml
国内image:
registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
registry.cn-hangzhou.aliyuncs.com/google_containers/addon-resizer:1.8.11
查看metrics-server服务状态:
[root@node2 ~]# kubectl get pod -n kube-system | grep metrics-server
metrics-server-69b85598c-zl2gb 1/1 Running 1 2m12s
验证metric功能:
[root@node2 metrics-server]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node2 1256m 31% 1537Mi 26%
node201 898m 22% 1263Mi 21%
2.创建deployment的时候需要指定pod的cpu和memory资源限制,否则没有限制,会使用节点整体的资源,测试不出效果。
[root@node201 ~]# kubectl api-versions | grep autoscal
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
注释: autoscaling/v1只支持基于CPU指标的缩放; autoscaling/v2beta1支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放; autoscaling/v2beta2支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放
Deployment的pod容器必须要配置资源的request,否则hpa会报错,官方都解决不了。看到github有bug没有解决,就是这个原因,bug场景的资源限制是0也就是没有限制。
# kubectl apply -f web-autoscale.yml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-autoscale name: web-autoscale spec: replicas: 1 selector: matchLabels: app: web-autoscale template: metadata: labels: app: web-autoscale spec: containers: - image: nginx imagePullPolicy: Always name: nginx resources: limits: cpu: 200m requests: cpu: 80m
[root@node201 ~]# kubectl autoscale deployment web-autoscale --min=1 --max=5 --cpu-percent=30
horizontalpodautoscaler.autoscaling/web-autoscale autoscaled
表示最小一个pods 最多5个pods cpu负载超过30%就触发扩容
故障处理: 没有安装metrics
[root@node201 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web-autoscale Deployment/web-autoscale <unknown>/30% 1 5 1 26s
# kubectl describe hpa/web-autoscale 可以看到报错信息
Warning FailedGetResourceMetric 2m19s (x119 over 32m) horizontal-pod-autoscaler failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)
ab压测一下
# kubectl expose deployment/web-autoscale --type=NodePort --port=1085 --target-port=80
# while true; do wget -q -O- http://192.168.56.201:32638/test/index.html; done
[root@node201 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web-autoscale Deployment/web-autoscale 180%/30% 1 5 4 22m
停掉wget:
deployment的版本回滚
改变images生成新的deployment的replicaset副本:
# kubectl set image deployment/web nginx=nginx:1.18.1 --record=true
# kubectl set image deployment/web nginx=nginx:1.19.1 --record=true
change-cause标签:
# kubectl patch deployment/web --patch '{"metadata": {"annotations": {"kubernetes.io/change-cause": "nginx:1.8.1"}}}'
# kubectl annotate deployment/web kubernetes.io/change-cause='nginx:1.8.1'
查看deployment所有的历史版本:
# kubectl rollout history deployment/web
查看某一版本的详细信息:
# kubectl rollout history deployment/web --revision=6
回滚到某一版本
# kubectl rollout undo deployment/web --to-revision=5