Serverless 入门课
蒲松洋(秦粤)
前百度国际化前端组组长
16754 人已学习
新⼈⾸单¥29
Serverless 入门课
15
15
1.0x
00:00/00:00
登录|注册

08 | 搭建私有Serverless(一):K8s和云原生CNCF

你好,我是秦粤。上节课我们只是用 Docker 部署了 index.js,如果我们将所有拆解出来的微服务都用 Docker 独立部署,我们就要同时管理多个 Docker 容器,也就是 Docker 集群。如果是更复杂一些的业务,可能需要同时管理几十甚至上百个微服务,显然我们手动维护 Docker 集群的效率就太低了。而容器即服务 CaaS,恰好也需要集群的管理工具。我们也知道 FaaS 的底层就是 CaaS,那 CaaS 又是如何管理这么多函数实例的呢?怎么做才能提升效率?
我想你应该听过 Kubernetes,它也叫 K8s(后面统一简称 K8s),用于自动部署、扩展和管理容器化应用程序的开源系统,是 Docker 集群的管理工具。为了解决上述问题,其实我们就可以考虑使用它。K8s 的好处就在于,它具备跨环境统一部署的能力。
这节课,我们就试着在本地环境中搭建 K8s 来管理我们的 Docker 集群。但正常情况下,这个场景需要几台机器才能完成,而通过 Docker,我们还是可以用一台机器就可以在本地搭建一个低配版的 K8s。
下节课,我们还会在今天内容的基础上,用 K8s 的 CaaS 方式实现一套 Serverless 环境。通过这两节课的内容,你就可以完整地搭建出属于自己的 Serverless 了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何搭建私有Serverless环境的第一步:Kubernetes(K8s)和云原生CNCF。作者首先介绍了K8s的重要性和优势,以及在本地环境中搭建K8s的步骤。通过详细的操作指南,读者可以了解如何在个人电脑上安装和启动K8s,并查看其运行状况。接着,文章简要介绍了K8s的原理和架构,包括Master节点和Worker节点的作用,以及K8s集群的私有网络构建和服务暴露。最后,作者提到下一节课将基于K8s的CaaS方式实现一套Serverless环境,为读者展示如何完整搭建自己的Serverless系统。整体而言,本文为读者提供了一份清晰的K8s入门指南,让他们能够快速了解K8s的重要性和基本操作,为进一步学习和应用K8s打下基础。文章还介绍了K8s如何实现扩缩容,以及如何利用metrics组件进行实时监控,为读者提供了实用的技术知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Serverless 入门课》
新⼈⾸单¥29
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Demon.Lee
    请教老师一个部署的问题:与后端代码交互,前端代码在k8s体系下怎么部署才是最佳实践。 参考官网上的例子(https://kubernetes.io/zh/docs/tasks/access-application-cluster/connecting-frontend-backend/),我理解是将前端代码放在nginx里面,同时在nginx.conf中配置后台api的反向代理(我的理解是解决跨域问题),然后将其部署为一个pod,并暴露出该前端工程的service ip 和 nodePort。 1)如果这里不直接暴露前端服务ip和nodePort,而走ingress,是否有必要,个人觉得没必要,因为多绕了一层。 2)nginx.conf中给后台服务配置的反向代理,是配置后台应用程序对应 service 的 ingress 地址,还是直接配置后台应用程序对应 service 的内部 ip 和端口 (或直接就是 service name) 。 2.1)如果配置的是对应 service 的 ingress 地址,那又多绕了一层。但又想到两个点,一是前端代码如果某一天单独拎出去部署,而不是在k8s中,不受影响(可能是伪需求);二是通过nginx-ingress-controller,Prometheus可以拿到相关api调用的监控指标(请求延迟,请求量等,但也只能获得 ingress 中对应配置的 path 数据,https://github.com/kubernetes/ingress-nginx/pull/2701)。 2.2)如果配置的是对应service 内部 ip 和端口,提高了速度,但为了获取监控指标,也要部署一套 nginx exporter。 我们的部署方案是否欠妥(前端代码这么部署是最佳实践吗?nginx 反向代理配置呢?获取服务请求相关监控指标的方式是正确的吗?)想听听老师的想法,您所在的团队是如何做的,谢谢。(如果不是好问题,还请老师见谅,我对部署这一块做的不多,不是很熟悉。)

    作者回复: 我最后的课后习题讲解有关于部署的内容。现在云服务通常会提供负载均衡服务,给你一个高负载的IP。 域名解析配置这个IP就可以了。负载均衡服务,可以将你的容器IP挂载上。 如果你自己搭建的k8s集群,也不建议直接暴露到外网环境,因为面对ddos攻击,流量攻击时比较难解。最好是隐藏在云服务商的接入服务之后。

    2021-08-03
  • pop
    老师我在阿里云上的centos7机器上实践,很多镜像拉取不下来。例如myapp.yaml里面的registry.cn-shanghai.aliyuncs.com/jike-serverless/todolist:latest是找不到的;我配置了阿里云的镜像加速,但是还是会去dockerhub中去搜索镜像。请教如何正确的拉取镜像,包括下一章的istio也是同样的问题。

    作者回复: 这个镜像是需要自己构建的,私有镜像中有很多信息不可以被别人获取。例如ak/sk。 这个todolist是私有镜像,你自己构建好,修改成自己的镜像仓库才行。

    2020-12-07
    2
  • 神仙朱
    文中疑问:又因为 kubectl 是通过加密通信的,所以我们可以在一台电脑上同时控制多个 K8s 集群 这两者为什么是因果关系没太懂,不是加密通信就不能控制多个集群吗,反正都是指定上下文

    作者回复: 这里加密通信指的TLS,加密管道。上下文建立在加密管道之上。 我们可以通过切换上下文来操作不同的K8s集群,而Kubectl控制又建立在加密管道之上,比较安全。

    2020-07-08
  • 托尼斯威特
    docker桌面版在preference中enable Kubernetes会自动下载repos. docker-k8s-prefetch.sh是用来提前从阿里云的repo下载这些repo,再改名到google的repo的名字. 但是我发现, 我启动docker带的Kubernetes时, 还是会下载一套新版的repos.

    作者回复: 是的,脚本是预拉取镜像的。这个脚本可能有些旧了,可以查看一下docker里面的K8s版本号,修改脚本里面的对应版本号。

    2020-07-06
  • 小谢同学
    云厂商serverless的最小管理调度粒度是不是就等于k8s的pod?

    作者回复: 最小颗粒度是pod里面的容器,一个pod可以部署多个容器。当然,云厂商除了K8s,还有其他VM和sandbox方案。

    2020-06-30
  • Larry
    一个函数实例对应一个CaaS,还是多个函数实例对应一个CaaS?

    作者回复: 这个跟FaaS的用法是一样的,都可以的。 具体看资源的复用与隔离,用微服务拆分的角度思考一下。

    2020-05-13
  • miser
    好奇怪 为什么 deployment.apps/myapp READY 是0/1 NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/load-generator 1/1 1 1 12h deployment.apps/myapp 0/1 1 0 2m59s

    作者回复: 这个要通过查看日志去看看卡在哪里了。 kubectl logs deployment.apps/myapp 如果调试这些问题,你最好在课程首页申请加微信群,这样我好帮你看看怎么解决问题。

    2020-05-06
  • 春暖花开
    有个问题没有明白:我们在serverless平台下写的函数是怎么被调用的, 通常java的springboot或者spingcloud应用,会以jar 的方式启动后,监听端口,http请求数据最终会发送到监听端口, 然后一些列的解析处理,通过controller层最终到我们的业务逻辑。 但是serverless是个怎么处理方式,数据是怎么就到我们的处理函数呢? 是serverless平台怎么包装这个函数?这个一直没有明白。

    作者回复: 你不明白的应该是如何从0启动吧? 可能你看完Knative的activator介绍会容易理解一些。 activator就像一个代理。用户的http请求访问时,如果没有函数实例,activator会先接收请求,并启动函数实例(从0启动)。函数实例启动完成后,再将请求转接过去。 我用Node.js举例,函数实例启动后,会注册上游的端口号(例如3001)。上游Nginx,当HTTP请求时,会将HTTP request封装成对象,传递给上游的3001端口应用去处理。 我们之所以要在FaaS函数里面指定入口handler,就是做这个处理的。

    2020-05-06
  • 在 K8s 中 容器不是部署在 Node 节点上吗? 怎么文中部署在了Master 节点了? Master 节点也可以充当 Node节点吗?

    作者回复: master节点通常不推荐部署,不过例子中本地的minikube或者Docker Desktop为了节省本地资源,只有一个master节点。所以会部署在master节点。

    2020-05-04
    3
  • 我来也
    由于我有现成的k8s环境,所以就不用重新搭建,可以直接使用了. 最近两天在折腾阿里云的弹性容器实例(ECI). 想不到这东西还能使用抢占式实例(Spot)的模式,2CPU-2G的实例,不到0.05元每小时的价格. 跑一些临时的任务还是很好的. 就是这里的还不太完善,不像竞价实例那样,有具体的规格和历史的参考价格. 另外Kubernetes还可以与ECI对接,不管是阿里云的k8s集群,还是Serverless Kubernetes,还是自建的k8s集群, 都可以使用Virtual Kubelet来创建虚拟k8s工作节点,加入到k8s集群中. 虚拟节点本身不要钱,只是调度到上面的pod需要申请ECI实例,才需要按秒付费. 我只是在阿里云的k8s上尝试了一下,想折腾的小伙伴可以用它来扩展本地机器上创建的k8s集群. 相比自建的k8s工作节点,ECI实例就不太灵活. 一个ECI实例好像对应一个pod,ECI实例的最小规格是0.25CPU和512MB内存. 对小应用来说,还是蛮浪费的. 在我们的开发环境中,一个4CPU8G的工作节点,都是跑60+个pod的. 之前发现在ECI上拉镜像超级超级慢. 今天又尝试了下ECI的镜像缓存功能. 这个功能估计目前还不完善,反正我是遇到了缓存的镜像未生效的问题,已提交工单咨询了. 话说这个功能有点费钱. 1.制作镜像缓存需要用到ECI. 2.保存镜像需要用到云盘快照. 3.使用镜像还会自动创建一个云盘,额外挂载到ECI上.(与ECI同生命周期) 用的磁盘还都是较好的ESSD,还都是20GB起步,单个镜像缓存最多支持包含20个镜像. 还不如把镜像同步到阿里云的镜像仓库中,再走私网拉取镜像.

    作者回复: 你可以用ACK,将ECS资源节点化,变成K8s worker节点。这样比较稳定。 ECI有缓存加速,通常需要你给自己的应用构建一个基础镜像,例如所有的应用都是基于CentOS,在CentOS上加上一些常用的二进制包或者库函数。构建自己的基础镜像。 这样可以加速。

    2020-05-04
    6
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部