亚马逊AWS官方博客

OpenSource | 使用 Kubeless 在 AWS 上的 Kubernetes 集群中运行 FaaS

借助无服务器计算技术,无需预置、扩展或管理任何服务器即可构建和运行应用程序和服务。FaaS(函数即服务)是一种运行时服务,它通过在需要时启动代码位(函数)实现无服务器计算,让开发人员无需管理基础设施,并让开发人员可以简单地编写业务逻辑代码。随着 Kubernetes 的兴起,多个开放源 FaaS 平台也应运而生。此博文分为两部分,将介绍一个此种 FaaS、Kubeless 以及如何在 AWS 上的 Kubeless 集群上安装和运行它。- Arun


Kubeless 是一种开放源函数即服务 (FaaS) 解决方案,建立在 Kubernetes 的基础上。受 AWS Lambda 的启发,Kubeless 旨在通过将基于函数的包装纳入容器,让 Kubernetes 用户也享受到函数编程的优点。Kubeless 的技术优势在于它使用了自定义资源定义 API 对象,是对 Kubernetes 的一种扩展。Kubeless 使用 k8s 基本对象来构建类似于 Lambda 的系统,它允许开发人员将小的代码单位作为函数部署,不用关心底层基础设施。当您使用 Kubernetes 时,使用 Kubeless 部署小的代码单位就好比创建 Kubernetes 资源一样简单。除可以使用 Kubeless 来部署 HTTP Webhook 外,您还可以部署可通过云中发生的事件触发的函数,例如有文件正在加载到存储桶、数据流等等。由于 Kubeless 建立在上游 Kubernetes 的基础上,它可以在 Amazon EKS 中部署,并且所部署的任何函数也可以基于多种 AWS 源进行触发。在此博文中,我们将介绍如何在使用 kops 在 AWS 上创建的 Kubernetes 集群中使用 Kubeless,以及如何部署小型函数。在下一篇博文中,我们将介绍如何根据发布到 Kinesis 流的事件触发 Kubeless 函数。

使用 kops 在 AWS 上创建集群

kops 是一种可用于创建 Kubernetes 集群的预置工具,它拥有非常先进的 AWS 支持功能。详情请参阅文档。此处我们仅演示主要步骤,因此请自行熟悉完整的演示,特别是您第一次使用 kops 时。(更多信息请参阅使用 Kops 管理 AWS 上的 Kubernetes 集群。)获取 pre-reqs 并设置环境,创建一个拥有必要角色的 kops IAM 用户,然后创建用于存储集群配置的 S3 存储桶,设置两个环境变量,确保您了解您将使用的区域,如下所示:

aws s3api create-bucket --bucket kops-Kubeless --region us-east-1

export NAME=Kubeless.k8s.local

export KOPS_STATE_STORE=s3://kops-Kubeless

aws ec2 describe-availability-zones --region eu-west-1

这时您已准备就绪,可以创建集群:

kops create cluster --zones eu-west-1a ${NAME}

kops update cluster Kubeless.k8s.local --yes

完成所有操作后务必删除它:

kops delete cluster --name ${NAME} --yes

安装 Helm 以部署 Ingress 控制器

使用 Ingress 控制器可让我们将函数暴露到公共互联网上。从 GitHub 发布页面取得 Helm 客户端,然后创建一个具有恰当 RBAC 权限的服务账户。

kubectl create serviceaccount --namespace kube-system tiller

kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

helm init --service-account tiller --upgrade

使用负载均衡器服务部署 nginx Ingress 控制器

helm install --name nginx-ingress stable/nginx-ingress --set rbac.create=true

Ingress 控制器开始运行后,您可以获取使用的公有 DNS 主机名:

kubectl get svc nginx-ingress-nginx-ingress-controller -o json | jq -r .status.loadBalancer.ingress[0].hostname

部署 Kubeless

为了在集群上部署 Kubeless,您需要创建一个专用的命名空间,然后将几个清单发布到 Kubernetes API 服务器。这些清单将会创建一个自定义资源定义,用来声明新的函数对象类型,并将启动 Kubeless 控制器。以下两个命令行将演示如何创建命名空间以及如何启动最新版本的 Kubeless:

kubectl create ns kubeless

kubectl create -f https://github.com/Kubeless/Kubeless/releases/download/v1.0.0-alpha.2/Kubeless-v1.0.0-alpha.2.yaml

最后,如要从命令行使用 Kubeless,您需要安装 CLI。您可以从 Github 发布页面获取它,OSX 用户也可直接从 brew 获取。

$ brew install kubeless

部署函数

让我们在 Python 创建一个简单的 echo 函数:

cat << EOF >> echo.py

def handler(event, context):

print(event['data'])

return event['data']

EOF

部署函数:

kubeless function deploy foo --runtime python3.6 --from-file echo.py --handler echo.handler

函数将会很快准备就绪,对应的 Pod 也将运行(请注意您可以配置 AutoScaling 以确保您的函数根据请求或负载进行扩展)。

$ kubeless function ls

NAME    NAMESPACE    HANDLER        RUNTIME      DEPENDENCIES    STATUS

foo     default      echo.handler    python3.6                   1/1 READY

$ kubectl get pods|grep foo

foo-697454fcd4-n7g5g     1/1 Running 0      1m

创建指向函数的路由。请注意函数将会公开暴露(可以添加 TLS 和身份验证,但不会在此处解释,请参阅完整的文档)。

kubeless trigger http create foo --function-name foo --gateway nginx

函数正常运行后,您可以使用 Ingress 对象中定义的 Host 标头和 Ingress 控制器的公有终端节点调用它。

$ export FOO_HOST=$(kubectl get ingress foo -o json |jq -r .spec.rules[0].host)

$ export FOO_INGRESS=$(kubectl get svc nginx-ingress-nginx-ingress-controller -o json | jq -r .status.loadBalancer.ingress[0].hostname)

$ curl -d '{"kubeless": "on AWS"}' -H "Host: ${FOO_HOST}" -H "Content-Type:application/json" ${FOO_INGRESS}

{"kubeless": "on AWS"}

小结

恭喜!如果您已经到达这一步,您已经在 AWS 上的 Kubernetes 集群中运行 Kubeless。在下一篇博文中,我们将介绍真正令人激动的部分:如何根据云事件触发Sebastien Goasguen函数,重点为 AWS Kinesis。Sebastien Goasguen 是一位拥有二十年经验的资深开放源专家。他是 Apache 软件基金会的会员,在转战容器领域前已经在 Apache CloudStack 项目上工作多年。他是 Kubernetes 创业公司 Skippbox 的创始人,该公司后来被 Bitnami 收购。他是 Kubeless 的缔造者,目前担任该公司技术总监和产品经理。作为一名活跃的博主,他非常热爱分享新的前沿技术。Sebastien 是《O’Reilly Docker Cookbook》的作者和《Kubernetes Cookbook》的联合作者。本博文中的内容和观点均源自第三方作者,AWS 对本博文中的内容或准确性不承担任何责任。