云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
5442 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

03 | 业务永不宕机,K8s如何实现自动扩容和自愈?

你好,我是王炜。
上一节,我们介绍了 K8s Pod 以及如何通过 Pod 部署容器镜像,学习了 K8s 交互工具 Kubectl 的基本操作。
那么,K8s 到底有什么强大之处让大家趋之若鹜呢?它又能给我们的业务带来哪些新的变化?我认为,其中最重要也是最吸引人的就是它的自动扩容和自愈机制。
这节课,我会继续延展上节课的内容,从传统 VM 的扩容和自愈出发,分析这种架构的缺点。然后,我会以我们之前部署的 Pod 为例,带你一步步在 K8s 上配置扩容和自愈,让你直观地感受 K8s 的强大优势。
在开始今天的演练之前,你需要做好以下准备:
准备一台电脑(首选 Linux 或 macOS,Windows 也适用,注意操作差异);
按上一节课的内容在本地创建 Kind 集群。

传统的扩容和自愈

在 VM 时代,我们的业务以进程的方式运行在虚拟机上,并由虚拟机对外提供服务。随着业务规模的扩大,我们需要支撑更多的访问流量,这时业务扩容就成了首先要考虑的问题。
在公有云环境下,VM 架构最典型的一种扩容方式是弹性伸缩组。意思是通过对虚拟机内存、CPU 等监控指标配置伸缩阈值,实现动态地自动伸缩。此外,我们一般还会结合虚拟机镜像、负载均衡器等云产品一并使用,如下图所示。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • ghostwritten
    1. 安装 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

    作者回复: 非常棒的命令备忘录!

    归属地:广东
    2
    10
  • ghostwritten
    实现 K8s autoscalers 自动扩容 三类组件: Horizo​​ntal Pod Autoscaler (HPA):根据 CPU 利用率增加或减少复制控制器、部署、副本集或有状态集中的 pod 数量——缩放是水平的; Cluster Autoscaler: 根据 pod 的资源请求自动添加或删除集群中的节点; Vertical Pod Autoscaler (VPA):它增加和减少容器 CPU 和内存资源配置,以使集群资源分配与实际使用情况保持一致。

    作者回复: 是的,最经常使用的是 HPA。 CA 目前主流的云厂商都支持,包括国内三大云厂商。 VPA 的特性对生产帮助很大,不过目前还没有 GA,可以进一步留意。

    归属地:广东
    6
  • Promise
    我们公司之前使用pm2开进行服务自愈,手动扩缩容。后面搭建了k8s环境使用k8s开进行服务的部署和上线很方便。但是k8s这个东西要学的是在太多了。。。。

    作者回复: 是的,K8s 的内容深不见底,学习一两项技术是远远不够的。这也是这门课程开课的初衷。

    归属地:广东
    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 模式默认是加权轮训的算法。

    归属地:广东
    3
    2
  • Geek_df0d4d
    请教一下,hpa的默认缩容策略是什么?--cpu-percent=50,当 CPU 超过 50% 时将进行自动扩容,那是否降到50以下就缩容?是单个pod降到50以下缩容,还是deploy整体降到50?

    作者回复: Pod 的平均资源利用率

    归属地:上海
    1
  • Y
    前面都成功了。自动扩容没有实验成功。

    作者回复: 检查一下 Metric-Server 是否启动成功,需要它提供 CPU 和内存指标。

    归属地:广东
    3
    1
  • 老师,你好,如果我使用minikube部署的集群,操作上会有什么区别?貌似无法访问80端口

    作者回复: 用 minikube addons enable ingress 命令来添加 ingress,然后可以使用 minikube tunnel 来暴露服务。

    归属地:浙江
  • Kevin
    Windows10+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'}}}]"

    作者回复: 👍🏻感谢分享和指正

    归属地:四川
  • 小马🐎
    啥时候监听了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

    归属地:上海
  • 养养
    怎么判断pod故障的?文章中没看到设置的地方,是通过对应pod的端口吗?

    作者回复: 使用 K8s 探针,在 12 讲中有详细介绍。

    归属地:广东
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部