腾讯云云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码, 是实时文件处理和数据处理等场景下理想的计算平台。 您只需使用 SCF 平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。
但是,在我们使用过程中,会经常出现各种疑问,比如经常遇到用户说为什么云函数没有执行到,为什么超时,支持多少并发,等等一系列的问题。那么深入理解serverless原理对我们理解并解决这类问题就显得非常重要了。腾讯SCF不开源,我们也不好分析,但是serverless平台大多依赖k8s和docker容器,实现原理也大同小异,那么我们就以serverless开源框架Fission为例,深入看看无服务函数的运行原理。
下面简单介绍下Fission,这是一个依赖于k8s和docker的高性能生产级的无服务函数运行框架。使用go语言编写,并支持运行多种语言,包括NodeJS, Python, Ruby, Go, PHP, Bash以及任何Linux可执行程序。
为了理解无服务函数,那么下面开始我们将借助Fission,自建一个serverless平台,搭建源码调试环境,看看无服务函数运行原理。
本次环境搭建基于 MAC OS 上操作:
本次环境会使用Minikube搭建单实例的k8s,docker和go的安装较为简单这里不再介绍
避免之前有残留安装的版本,先清理一遍
$ minikube stop
$ minikube delete
$ sudo rm -f /usr/local/bin/minikube
然后下载并安装
$ curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v0.28.2/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
$ git clone https://github.com/kubernetes/kubernetes.git
$ cd kubernetes
$ make
$ sudo cp _output/bin/kubectl /usr/local/bin/
$ sudo chmod +x /usr/local/bin/kubectl
依赖环境工具安装好之后,就可以开始k8s环境搭建了,该版本的Minikube默认安装的k8s集群版本为v1.10.0,也可以指定版本,指定资源,指定虚拟机类型。
# 设置 docker 加速镜像
$ minikube start --registry-mirror=https://registry.docker-cn.com
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.minikube start --registry-mirror=https://registry.docker-cn.com
There is a newer version of minikube available (v1.14.2). Download it here:
https://github.com/kubernetes/minikube/releases/tag/v1.14.2
To disable this notification, run the following:
minikube config set WantUpdateNotification false
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
# 检查状态
$ minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
# 查看pod
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-minikube 1/1 Running 0 42s
kube-system kube-addon-manager-minikube 1/1 Running 2 4d
kube-system kube-apiserver-minikube 1/1 Running 0 42s
kube-system kube-controller-manager-minikube 1/1 Running 0 42s
kube-system kube-dns-86f4d74b45-ccl6q 3/3 Running 3 4d
kube-system kube-proxy-jl58n 1/1 Running 0 21s
kube-system kube-scheduler-minikube 1/1 Running 1 4d
kube-system kubernetes-dashboard-5498ccf677-tjsn4 0/1 CrashLoopBackOff 2 4d
kube-system storage-provisioner 0/1 CrashLoopBackOff 2 4d
kube-system tiller-deploy-664858687b-xmwbq 1/1 Running 2 4d
# kubernetes dashboard打开
$ minikube dashboard
至此依赖环境搭建完毕,接下来搭建Fission调试环境。
# 下载源码
$ git clone https://github.com/fission/fission.git $GOPATH/src/github.com/fission/fission
$ cd $GOPATH/src/github.com/fission/fission
#下载依赖包
$ go mod vendor
# 检测文件是否正确
$ ./hack/verify-gofmt.sh
$ ./hack/verify-govet.sh
导入IDE:
Fission项目的代码结构很简洁,先简单介绍下项目目录:
* cmd目录是所有运行时组件的入口:
Component | Runtime Component | Used in |
---|---|---|
fetcher | Docker Image | Environments |
fission-bundle | Docker Image | Binary for all components |
fission-cli | CLI Binary | CLI by user |
preupgradechecks | Docker Image | Pre-install upgrade |
* pkg目录是所有核心组件逻辑代码所在:
.
├── pkg
│ ├── apis
│ ├── builder
│ ├── buildermgr
│ ├── cache
│ ├── canaryconfigmgr
│ ├── controller
│ ├── crd
│ ├── error
│ ├── executor
│ ├── fetcher
│ ├── fission-cli
│ ├── generator
│ ├── info
│ ├── kubewatcher
│ ├── logger
│ ├── mqtrigger
│ ├── plugin
│ ├── publisher
│ ├── router
│ ├── storagesvc
│ ├── throttler
│ ├── timer
│ └── uti
* Charts目录看起来是个图标组件,这个我们先不管。
* Environments目录云函数运行时环境
进入Fission-cli,打开main.go准备执行程序,配置程序命令,然后点击运行,即可调试创建云函数命令:
调试云函数修改为:
即可调试云函数运行。
至此,整个serverless环境搭建完毕,可以始阅读并调试代码。Fission的具体用法可以参考这里:https://docs.fission.io/docs/usage
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。