低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

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

2019 年 10 月 21 日

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 存储桶,设置两个环境变量,确保您了解您将使用的区域,如下所示:


Bash


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
复制代码


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


Bash


kops create cluster --zones eu-west-1a ${NAME}
kops update cluster Kubeless.k8s.local --yes
复制代码


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


Bash


kops delete cluster --name ${NAME} --yes
复制代码


安装 Helm 以部署 Ingress 控制器

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


Bash


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 控制器


Bash


helm install --name nginx-ingress stable/nginx-ingress --set rbac.create=true
复制代码


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


Bash


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


部署 Kubeless

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


Bash


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 获取。


Bash


$ brew install kubeless
复制代码


部署函数

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


Bash


cat << EOF >> echo.py
def handler(event, context):
print(event['data'])
return event['data']
EOF
复制代码


部署函数:


Bash


kubeless function deploy foo --runtime python3.6 --from-file echo.py --handler echo.handler
复制代码


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


Bash


$ 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 和身份验证,但不会在此处解释,请参阅完整的文档)。


Bash


kubeless trigger http create foo --function-name foo --gateway nginx
复制代码


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


Bash


$ 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。在下一篇博文中,我们将介绍真正令人激动的部分:如何根据云事件触发**



**函数,重点为 AWS Kinesis。Sebastien Goasguen 是一位拥有二十年经验的资深开放源专家。他是 Apache 软件基金会的会员,在转战容器领域前已经在 Apache CloudStack 项目上工作多年。他是 Kubernetes 创业公司 Skippbox 的创始人,该公司后来被 Bitnami 收购。他是 Kubeless 的缔造者,目前担任该公司技术总监和产品经理。作为一名活跃的博主,他非常热爱分享新的前沿技术。Sebastien 是《O’Reilly Docker Cookbook》的作者和《Kubernetes Cookbook》的联合作者。本博文中的内容和观点均源自第三方作者,AWS 对本博文中的内容或准确性不承担任何责任。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/running-faas-on-kubernetes-cluster-on-aws-using-kubeless/


2019 年 10 月 21 日 08:00170

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

北京区块链规划重点发展海淀朝阳通州等区,加大对代币监管力度

CECBC区块链专委会

北京行动计划 四个高地 需求导向 为政务服务

Vagrant 快速入门

FeiLong

vagrant

3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案

Throwable

Java 监控 Grafana Prometheus springboot

如何搭建Hive 环境

Rayjun

大数据 hive

关于架构的几件小事:架构概述(1)

北风

架构 架构设计 架构师 架构设计原则

阿里花500万年薪招天才黑客?官方回应:这种人得交给警察

程序员生活志

黑客 阿里

了不起的 Webpack Scope Hoisting 学习指南

pingan8787

Java 前端 webpack

SpringBoot 入门:02 - 实现 MVC

封不羁

Java spring springboot

SpringBoot2.x入门:应用打包与启动

Throwable

springboot

修炼我们的智慧之眼

J.Smile

认知提升

ARST Week7

时之虫

ARTS 打卡计划

如何使用预测性指标衡量敏捷转型的成功?

Atlassian

敏捷开发 开发工具 Atlassian Jira

十个提高产品经理工作效率的必备工具,果断收藏

马踏飞机747

大数据 设计 产品经理

架构师训练营第六周作业

Melo

iOS - CollectionViewCell对应不同flow layout的实例

teoking

ios

玛雅密码社区不忘初心 共筑未来通证新经济

Geek_116789

大话设计模式 | 4. 装饰模式

Puran

C# 设计模式

架构师训练营第六周学习总结

张明森

架构师训练营第六周作业

hiqian

list vs tupple

Leetao

Python 数据结构 Python基础知识

工程规约 - maven统一管理

Man

maven DevOps 工程规约

“新基建”来了!云南三年投资3776亿!

CECBC区块链专委会

并行流ParallelStream中隐藏的陷阱

Throwable

Java

看动画学算法之:排序-冒泡排序

程序那些事

算法 动画 排序算法 轻松学

如何不写一行代码就做出一款游戏来

Lawliet

Vue 游戏开发 游戏制作 游戏开源 前端进阶训练营

谈谈对分布式事务的一点理解和解决方案

Throwable

分布式 分布式事务 架构设计

如何编写可怕的 Java 代码?

武培轩

Java 编程 程序员 后端

U盘+grub2安装centos8实战

昌安古城

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

newbe36524

Docker .net core netcore ASP.NET Core

百万级别数据Excel导出优化

Throwable

架构设计 springboot

AOP有几种实现方式?

八苦-瞿昙

技术 随笔杂谈 aop 代理 框架

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

OpenSource,使用 Kubeless 在 AWS 上的 Kubernetes 集群中运行 FaaS-InfoQ