在阿里云上试用 Knative
在今年的Google Cloud Next大会上,Google发布了Knative, 这是由Google、Pivotal、Redhat和IBM等云厂商共同推出的Serverless开源工具组件,它与Istio,Kubernetes一起,形成了开源Serverless服务的三驾马车。
本文来自阿里巴巴中间件事业部美国团队高级技术专家 Andy在 Knative的实践,Andy长期关注Service Mesh技术领域,在Cloud Foundry,Kubernetes,Envoy上等有着丰富的实践和开发经验。加入Service Mesh开发者群,微信添加“zjjxg2018”,并备注公司-城市信息。
有意思的是:上述几家公司是相互竞争的,但却能把各自擅长的技术贡献给同一个开源项目。另一个有意思的地方是对Serverless定义的转变。以前说到Serverless,大家就等同于FaaS,就感觉只要把function代码提交,然后定义event trigger就好了。现在Knative把Serverless这个概念转变成了免运维:用户还是要有server的,只是运维上比管理一个Kubernetes cluster更省心,而且不用的时候并不需要为server资源支付费用。除此之外,FaaS的应用场景很小,只有很小很快的函数才能比较容易部署。Knative以自助的方式实现部署,应用场景更广,且一般的应用都可以部署成Serverless。
根据Knative提供的文档介绍,一个完整的Serverless分为__Build__,__Serve__和__Eventing__三个部分。在本文中,我们将在阿里云上按照Knative github的安装指南,逐步操作,以实现一个Knative应用。
准备
创建 Kubernetes cluster
在阿里云上创建一个Kubernetes cluster,用系统默认的设置就行,但要保证你有Admin权限。如果你用已有的 cluster,请确认Kubernetes的版本是1.10以上。
安装 Knative
这个过程分为两步:
- 安装Istio:
Knative的Istio有一些自己定义的资源,所以不要用Istio网站的缺省安装。但是Knative现有指南未更新,还是0.8,有些旧。我所用的是1.0:
`curl https://raw.githubusercontent.com/knative/serving/master/third_party/istio-1.0.0/istio.yaml`
这个安装需要一点时间,但是是必须的。因为Knative依赖Istio来联接Serverless,而不是直接通过Kubernetes。等到所有的安装完成后,我们要开启Istio 自动injection:
kubectl label namespace default istio-injection=enabled
安装 Knative组件:
执行下面的命令:
kubectl apply -f https://github.com/knative/serving/releases/download/v0.1.1/release.yaml
安装后等待一会并确认:
kubectl get pods -n knative-serving -w
kubectl get pods -n knative-build -w
细心的同学会发现这里只安装了两部分:Build 和 Serving,那么Eventing呢?是需要单独安装的。
kubectl apply -f https://storage.googleapis.com/knative-releases/eventing/latest/release.yaml
同样的,运行这个命令来确认:
kubectl get pods -n knative-eventing -w
Build
Build是目前Knative项目中内容最丰富的部分。因为Pivotal拿出了压箱宝build packs加入Knative。而Google之前多年做app engine,也在这方面累计了很多经验。
在实现上,Build是一个Kubernetes Custom Resource Definition (CRD)。如同其它的Kubernetes CRD,定义的方式是通过YAML,调用的方式是API。用户可以选择不同的build template,比如Google的kaniko,Pivotal的build pack等。在本文中,我们选择kaniko build。
先安装Kaniko Build Template:
kubectl apply -f https://raw.githubusercontent.com/knative/build-templates/master/kaniko/kaniko.yaml
Kaniko build template和Docker build template最大的不同在于用户不需要本地安装Docker engine, Kaniko把代码搬到云上生成Image。源代码可以在远程的服务器上,还要指定相应的Dockerfile。
但是,这样做有个问题:Kaniko怎么访问用户的docker account呢?因此,我们需要创建一个secret,把用户的docker username和password存在里面。然后,还需要一个service account来绑定这个secret。
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:name: docker-user-passannotations:build.knative.dev/docker-0: https://index.docker.io/v1/
type: kubernetes.io/basic-auth
stringData: username: <docker username in plain text>password: <docker password in plain text>
把这里的username和password换成你自己的帐号信息,然后保存。
kubectl apply -f secret.yaml
vim service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: build-bot
secrets:- name: docker-user-pass
保存后执行:
kubectl apply -f service-account.yaml
然后我们创建Kubernetes manifest vim build.yaml
:
apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:name: docker-build
spec:serviceAccountName: build-bot #service account created abovesource:git:revision: masterurl: "https://github.com/szihai/hello-go.git"steps:-args:- "--dockerfile=/workspace/Dockerfile"- "--destination=docker.io/xxx/helloworld-go"image: "gcr.io/kaniko-project/executor:v0.1.0"name: build-and-push
本文所用的sample app是从Knative repo 上fork的。(例子)
在这里,我们指定了template用Kaniko。然后可以看到我们引用了前面的ServiceAccount 来访问secret。用这个之前把里面的destination
换成你自己的docker id,保存后用kubectl apply -f build.yaml
来执行。
那么,如何知道远程的Kaniko到底做好了没有呢?Kubernetes 会为kind: Build
创建一个job。用kubectl get pods
找到一个 docker-build-xxxx
的pod。然后运行:kubectl -n default logs docker-build-xxxx -c build-step-build-and-push
来观察build的情况。
我们也可以直接查看Kubetnetes build objects: kubectl describe builds
。要找的信息是:
当然,最直接的方法是去自己的Docker hub上找到这个Image。
Serving
这个部分与普通的Kubetnetes服务发布差别不大。先定义一个服务:vim service.yaml
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:name: helloworld-gonamespace: default
spec:runLatest:configuration:revisionTemplate:spec:container:image: docker.io/{username}/helloworld-goenv:- name: TARGETvalue: "Go Sample v1"
运行kubectl apply -f service.yaml
。需要注意的是这里我们用了serving.knative.dev 的API。所以与其它部署有所不同:不需要deployment.yaml。这可理解为deployment被knative给包办了。如果运行kubectl get deployments
,就可以看到helloworld-go-xxxx-deployment
。
下一个问题就是,如何访问这个服务呢?这时候,Istio就出场了。平时我们要自己创建Ingress 或LB,现在knative通过 Istio帮我们做了。首先我们得到Ingress Gateway的IP地址:
kubectl get svc knative-ingressgateway -n istio-system
这里找到EXTERNAL-IP
。然后我们找到Domain name:
kubectl get service.serving.knative.dev helloworld-go -o=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
接着运行:
curl -H "Host: {DOMAIN}" http://{EXTERNAL-IP}
结果应该是:Hello World: Go Sample v1!
如果有一段时间没访问该服务,就会发现运行kubectl get pods
的时候,这几个helloworld-go pod不见了。那是knative把replica数降为0。
Eventing
对于FaaS的来说,Eventing就是触发这个function的机制。上面我们用curl
去访问服务,其实是为了测试而已。在真实的部署过程中,这个function应该是有事件触发的。
Eventing是传统的FaaS的主要功能,也是除源代码外唯一与开发者真正相关的部分。正因为如此,其它FaaS,如Lambda, Openshift等,都可以通过这一层与Knative接口。
Knative设计的Eventing包括3个主要的概念:
- Source: 就是事件发生的起源,可以理解为与其它系统的接口,目前支持的包括K8sevents,GitHub和GCP PubSub 。
- Buses: 事件传输的途径,目前支持的有Stub,Kafka和GCP PubSub。
- Flows: 定义对事件的反应。这可以是连锁的反应而不是单一的。
所以,我们要做的事就是,选一个Source,选一个Bus, 然后定义一个Flow,就可以啦。
本文中,我们选用K8events和Stub ClusterBus。先把它们装上:
kubectl apply -f https://storage.googleapis.com/knative-releases/eventing/latest/release-clusterbus-stub.yaml
kubectl apply -f https://storage.googleapis.com/knative-releases/eventing/latest/release-source-k8sevents.yaml
在生成flow之前,有一个小问题:K8 event是Kubernetes内部产生的,要接收的话,必须要通过一个Service Account 来授权。这是Kubernetes的要求,不是本文重点,如前面一样,保存后执行:
apiVersion: v1
kind: ServiceAccount
metadata:name: feed-sanamespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: create-deploymentnamespace: default
rules:
- apiGroups: ["apps"]resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]
---
# This enables the feed-sa to deploy the receive adapter.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: feed-sa-deploynamespace: default
subjects:- kind: ServiceAccountname: feed-sanamespace: default
roleRef:kind: Rolename: create-deploymentapiGroup: rbac.authorization.k8s.io
---
# This enables reading k8s events from all namespaces.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: feed-admin
subjects:- kind: ServiceAccountname: feed-sanamespace: default
roleRef:kind: ClusterRolename: viewapiGroup: rbac.authorization.k8s.io
接下来是主要的一步,创建flow:vim flow.yaml
:
apiVersion: flows.knative.dev/v1alpha1
kind: Flow
metadata:name: k8s-event-flownamespace: default
spec:serviceAccountName: feed-satrigger:eventType: dev.knative.k8s.eventresource: k8sevents/dev.knative.k8s.eventservice: k8seventsparameters:namespace: defaultaction:target:kind: RouteapiVersion: serving.knative.dev/v1alpha1name: helloworld-go
接着运行kubectl apply -f flow.yaml
就可以了。
我们来看一下是不是真的运行了呢?过一会儿运行:
kubectl get pods
会看到k8s-event-flow-xxx的job运行完了。然后helloworld-go的pod都启动了。我们看一下日志: kubectl logs helloworld-go-xxxxx user-container
,就会看到如下的结果:
Hello world received a request.
Hello world received a request.
Hello world received a request.
Hello world received a request.
...
这说明这条链路是起作用的。那么,这个flow的定义说了什么呢?首先是用了刚刚定义的service account。然后在trigger
中定义什么样的event可以符合条件,这里我们说所有在 default namespace 的k8events 都符合。在action中我们定义有什么样的处理方式,本例中就直接调用了helloworld-go service。
结论
Knative是今年最新的云计算演进方向之一。阿里云支持Kubernetes,可以成功运行Knative和Istio等应用,大家也可以到阿里云上自己体验一番!
当然,作为一个新的备受瞩目的项目,Knative也会经历其成长的烦恼。我们会持续跟进,并提供和Knative相关、但不限于实践的分享,敬请期待。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
在阿里云上试用 Knative相关推荐
- 阿里云服务器试用一哈
阿里云服务器试用一哈 1.阿里云官网购买服务器 (我暂时领的免费用的7天,试用一哈 作用) <1>购买了阿里云服务器后,你能得到一个实例名称,公网IP,系统用户名及密码 解释一下:公网IP ...
- 阿里云上自建k8s挂载ali nas
阿里云上自建k8s挂载ali nas@TOC k8s nas ali 基础环境: 阿里云上两台ecs搭建k8s平台,版本信息: k8s: 1.23.5 docker: 20.10.7 ubuntu: ...
- 【SVN】在阿里云上创建svn服务器
1.创建用户及相关设置 阿里云搭建ubuntu18.04工作台,默认只有root超级用户.为了安全起见,我们使用普通用户来创建svn: useradd hello // 创建用户hello mkdir ...
- 如何在阿里云上安全的存放您的配置 - 续
在<如何在阿里云上安全的存放您的配置>一文中,我们介绍了如何通过ACM存放您的敏感配置,并进行加密.这样做的目的有两个: 在应用程序或对应生产环境容器或系统中,无需持久化任何敏感数据信息( ...
- PyTorch 1.3发布:能在移动端部署,支持Colab云TPU,阿里云上也能用
本文经AI新媒体量子位(公众号ID:qbitai)授权转载,转载请联系出处. 本文约2700字,建议阅读7分钟. 本文向你介绍 PyTorch1.3 的新特性. "我要转PyTorch!&q ...
- 在阿里云上部署生产级别Kubernetes集群
阿里云是国内非常受欢迎的基础云平台,随着Kubernetes的普及,越来越多的企业开始筹划在阿里云上部署自己的Kubernetes集群. 本文将结合实战中总结的经验,分析和归纳一套在阿里云上部署生产级 ...
- 云计算之路-阿里云上-幸福总是很突然:“黑色1秒”问题解决啦
云计算之路-阿里云上-幸福总是很突然:"黑色1秒"问题解决啦 参考文章: (1)云计算之路-阿里云上-幸福总是很突然:"黑色1秒"问题解决啦 (2)https: ...
- Oracle APEX 系列文章2:在阿里云上打造属于你自己的APEX完整开发环境 (准备工作)...
本文是钢哥的Oracle APEX系列文章中的第二篇,完整 Oracle APEX 系列文章如下: Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技 Oracle ...
- 阿里云上创建个人网站
1.注册域名 a)打开阿里云网站首页 https://www.aliyun.com/ b)打开产品页面下的域名注册页面 c)查询自己喜欢的域名(未被注册的,且价格低廉的,尽量选择.com的域名,方便别 ...
最新文章
- sql server 2014预览版发布
- 汇编语言随笔(14)-直接定址表、检测点16和实验16
- sublime 3114注册码
- 科技业务同比增长超20%,中国平安“金融+科技”成了吗?
- 如何使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM 上创建开发基础结构
- 百度机器翻译已经进化到什么程度?
- java中日期加减计算(转)
- 面试官系统精讲Java源码及大厂真题 - 10 Map源码会问哪些面试题
- 九度OJ 1048:判断三角形类型
- 通过url访问静态资源
- 用SppdProjectHelper进行CAD图纸编号
- 分布式,嵌入式,集群三种操作系统
- 深度学习Hello World --- 手写体识别 实战
- 模板template基础学习
- Altium Designer -- 精心总结
- flappy brid
- Kafka集群搭建过程(kafka2.5+eagle)
- 门控时钟、使能时钟的实现
- 俞敏洪:100个句子记完的7000单词(1)
- 老司机 iOS 周报 #65 | 2019-04-29
热门文章
- python异常值删除_python数据清洗中,是如何识别和处理异常值的?
- tp5 php跨域,TP5.1解决跨域
- logminer java_使用OracleLogminer同步Demo1Demo介绍-博客园.PDF
- 空调调节 java_空调调节方式
- 华农软件工程实验报告_华南农业大学的软件工程怎么样?
- leetcode 111 --- 二叉树最小深度
- python 控件id_查看控件id的工具
- python中的seed_Python seed() 函数 - Python 教程 - 自强学堂
- 为什么博导都希望,自己的博士生毕业也去高校当老师?
- 35岁北大博士拟升市长