03 | 业务永不宕机,K8s如何实现自动扩容和自愈?
传统的扩容和自愈
- 深入了解
- 翻译
- 解释
- 总结
Kubernetes(K8s)作为一种容器编排系统,通过自动扩容和自愈机制,解决了传统VM架构在扩容和自愈方面存在的缺陷。K8s的负载均衡器能够感知业务健康情况,确保请求转发至健康的节点,提升了业务的稳定性和可靠性。文章详细介绍了K8s的自愈功能,包括自动重启服务、自动转移故障等,以及通过创建Deployment、Service和Ingress来实现K8s自愈实验。通过实验,展示了K8s感知业务故障、故障转移、重启和负载均衡的自动化过程。这些功能使得K8s成为一种强大的容器编排系统,为业务的稳定性和可靠性提供了有力支持。 K8s的自动扩容功能依赖于Metric Server提供的监控指标,通过安装、配置和监控,可以实现根据CPU使用率自动扩容的策略。文章通过实际操作演示了自动扩容的过程,展示了K8s对业务压力的感知和自动横向扩容的能力。总结中还提到了K8s的最小调度单位Pod以及创建Deployment工作负载的方式,以及对Manifest的编写方法。最后,留下了思考题,引发读者对自愈和扩容方案的思考和讨论。 总的来说,本文通过实际操作和技术概念的介绍,生动展示了K8s的自愈和自动扩容功能,为读者提供了深入了解和思考的机会。
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
全部留言(19)
- 最新
- 精选
- ghostwritten1. 安装 podman、kubectl、kind 2. 创建 kind :kind create cluster --config config.yaml 3. 创建 deployment:kubectl create deployment hello-world-flask --image=lyzhang1999/hello-world-flask:latest --replicas=2 4. 生成 yaml文件:kubectl create deployment hello-world-flask --image lyzhang1999/hello-world-flask:latest --replicas=2 --dry-run=client -o yaml 5. 创建 service:kubectl create service clusterip hello-world-flask --tcp=5000:5000 6. 创建 ingress:kubectl create ingress hello-world-flask --rule="/=hello-world-flask:5000" 7. 创建 ingress-nginx:kubectl create -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/ingress-nginx/ingress-nginx.yaml 8. 访问测试:while true; do sleep 1; curl http://127.0.0.1; echo -e '\n'$(date);done 9. 模拟宕机:kubectl exec -it hello-world-flask-56fbff68c8-2xz7w -- bash -c "killall python3" 10. 创建 metric server:kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/metrics/metrics.yaml 11. 等待deployment创建成功:kubectl wait deployment -n kube-system metrics-server --for condition=Available=True --timeout=90s 12. 创建自动扩容策略: kubectl autoscale deployment hello-world-flask --cpu-percent=50 --min=2 --max=10 13. deployment 设置资源配额:kubectl patch deployment hello-world-flask --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/resources", "value": {"requests": {"memory": "100Mi", "cpu": "100m"}}}]' 14. 查看最新创建的pod:kubectl get pod --field-selector=status.phase==Running 15. 创建并发请求:kubectl exec -it hello-world-flask-64dd645c57-4clbp -- ab -c 50 -n 10000 http://127.0.0.1:5000/ 16. 查看 pod 数量:k get pods -w
作者回复: 非常棒的命令备忘录!
2022-12-22归属地:广东210 - ghostwritten实现 K8s autoscalers 自动扩容 三类组件: Horizontal Pod Autoscaler (HPA):根据 CPU 利用率增加或减少复制控制器、部署、副本集或有状态集中的 pod 数量——缩放是水平的; Cluster Autoscaler: 根据 pod 的资源请求自动添加或删除集群中的节点; Vertical Pod Autoscaler (VPA):它增加和减少容器 CPU 和内存资源配置,以使集群资源分配与实际使用情况保持一致。
作者回复: 是的,最经常使用的是 HPA。 CA 目前主流的云厂商都支持,包括国内三大云厂商。 VPA 的特性对生产帮助很大,不过目前还没有 GA,可以进一步留意。
2022-12-22归属地:广东7 - Promise我们公司之前使用pm2开进行服务自愈,手动扩缩容。后面搭建了k8s环境使用k8s开进行服务的部署和上线很方便。但是k8s这个东西要学的是在太多了。。。。
作者回复: 是的,K8s 的内容深不见底,学习一两项技术是远远不够的。这也是这门课程开课的初衷。
2022-12-14归属地:广东4 - Michael这个svc默认的转发策略是什么?轮询嘛?我验证不是轮询的 [root@iZwz90sfnybprmnd5ojhr9Z data]# while true; do sleep 1; curl http://127.0.0.1; echo -e '\n'$(date);done Hello, my first docker images! hello-world-flask-c68dc87d7-tfvcs Tue Dec 13 12:58:02 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-kbv4j Tue Dec 13 12:58:03 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-tfvcs Tue Dec 13 12:58:04 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-tfvcs Tue Dec 13 12:58:05 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-kbv4j Tue Dec 13 12:58:06 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-kbv4j Tue Dec 13 12:58:07 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-tfvcs Tue Dec 13 12:58:08 CST 2022 Hello, my first docker images! hello-world-flask-c68dc87d7-kbv4j Tue Dec 13 12:58:09 CST 2022
作者回复: 取决于 K8s 集群的 kube-proxy 的实现方式,Iptables 默认是随机,IPVS 模式默认是加权轮训的算法。
2022-12-13归属地:广东32 - Geek_df0d4d请教一下,hpa的默认缩容策略是什么?--cpu-percent=50,当 CPU 超过 50% 时将进行自动扩容,那是否降到50以下就缩容?是单个pod降到50以下缩容,还是deploy整体降到50?
作者回复: Pod 的平均资源利用率
2023-04-08归属地:上海1 - Y前面都成功了。自动扩容没有实验成功。
作者回复: 检查一下 Metric-Server 是否启动成功,需要它提供 CPU 和内存指标。
2022-12-15归属地:广东31 - 亮老师,你好,如果我使用minikube部署的集群,操作上会有什么区别?貌似无法访问80端口
作者回复: 用 minikube addons enable ingress 命令来添加 ingress,然后可以使用 minikube tunnel 来暴露服务。
2023-06-23归属地:浙江 - KevinWindows10+Docker Desktop+Kubectl+Kind环境下“为部署的 hello-world-flask Deployment 设置资源配额”的命令不正确,经验证,正确的命令如下: kubectl patch deployment hello-world-flask --type=json -p="[{'op': 'add', 'path': '/spec/template/spec/containers/0/resources', 'value': {'requests': {'memory': '100Mi', 'cpu': '100m'}}}]"
作者回复: 👍🏻感谢分享和指正
2023-05-10归属地:四川 - 小马🐎啥时候监听了80端口了 我请教下
作者回复: 在第二小节创建 KIND 集群的时候指定了 PortMapping,暴露了80端口: kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings: - containerPort: 80 hostPort: 80 protocol: TCP - containerPort: 443 hostPort: 443 protocol: TCP
2023-03-22归属地:上海 - 养养怎么判断pod故障的?文章中没看到设置的地方,是通过对应pod的端口吗?
作者回复: 使用 K8s 探针,在 12 讲中有详细介绍。
2023-03-14归属地:广东