深入serverless原理(1)自建serverless平台,搭建源码调试环境

2020-11-13 23:29:04 浏览数 (1)

背景

腾讯云云函数(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 上操作:

  • Docker: v19.03.13
  • Minikube: v0.28.2
  • Kubernetes: v1.10.0
  • Fission: 1.11.2
  • Kubectl: 客户端v1.18.8,服务端v1.10.0
  • go 1.12.17

本次环境会使用Minikube搭建单实例的k8s,docker和go的安装较为简单这里不再介绍

Minikube安装

避免之前有残留安装的版本,先清理一遍

代码语言:javascript复制
$ minikube stop
$ minikube delete
$ sudo rm -f /usr/local/bin/minikube

然后下载并安装

代码语言:javascript复制
$ 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/

kubectl安装

代码语言:javascript复制
$ 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集群搭建

依赖环境工具安装好之后,就可以开始k8s环境搭建了,该版本的Minikube默认安装的k8s集群版本为v1.10.0,也可以指定版本,指定资源,指定虚拟机类型。

代码语言:javascript复制
# 设置 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
代码语言:javascript复制
# kubernetes dashboard打开
$ minikube dashboard

Fission调试环境搭建

至此依赖环境搭建完毕,接下来搭建Fission调试环境。

代码语言:javascript复制
# 下载源码
$ 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目录是所有核心组件逻辑代码所在:

代码语言:javascript复制
.
├── 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

0 人点赞