在阿里云上试用 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

这个过程分为两步:

  1. 安装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
  1. 安装 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个主要的概念:

  1. Source: 就是事件发生的起源,可以理解为与其它系统的接口,目前支持的包括K8sevents,GitHub和GCP PubSub 。
  2. Buses: 事件传输的途径,目前支持的有Stub,Kafka和GCP PubSub。
  3. 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相关、但不限于实践的分享,敬请期待。

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡工具 haproxy剖析

haproxy 进阶 应用场景 只是作为负载均衡的工具&#xff0c;至于是什么应用集群都可以&#xff0c;例如&#xff1a;上面的RabbitMQ集群 下面那redis集群再给大家举个例子&#xff1a; 创建配置haproxy配置文件 #创建haproxy配置文件 touch /etc/haproxy/haproxy.cfg #Hapro…

阿里云参加ONS EU 2018,飞天洛神亮相网络顶会

9月25日&#xff0c;荷兰阿姆斯特丹&#xff0c;为期3天的网络科技界盛会Open Networking Summit拉开序幕。来自世界各地的网络技术领域专家齐聚一堂&#xff0c;参与并分享各自分支领域的经验和成果。阿里云在会上展示了虚拟网络系统飞天洛神&#xff0c;智能网络管理平台齐天…

linux中如何在文件中查找文件,linux下find(文件查找)命令的用法总结

每一种操作系统都有成千上万的文件组成&#xff0c;对于linux这样“一切皆文件”的操作系统来说更不例外&#xff0c;大家应该都能很轻松使用windows下的文件查找功能&#xff0c;但是对linux这一功能可能并不是很熟悉&#xff0c;其实想玩linux的你更要牢牢掌握这个命令&#…

主动安全,新华三融合生态之力!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 晶少责编 | 阿秃出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;“如今网络安全形势错综复杂&#xff0c;解决方案不可能由一家公司独当天下&#xff0c;面对这样的情况&#xff0c;我们就要选择自身擅长…

python数字字符串乘以2_Python基础(2)_数字和字符串类型

一、数据类型1、数字整型Python的整型相当于C中的long型,Python中的整数可以用十进制,八进制,十六进制表示。>>> 1010 --------->默认十进制>>> oct(10)012 --------->八进制表示整数时&#xff0c;数值前面要加上一个前缀“0”>>> hex(10)0x…

阿里敏捷实践| 4个迭代,从批量交付向持续交付转型

导语 忙不完的事情&#xff0c;解不完的bug&#xff0c;每次发版都得集体熬个大通宵。干得多&#xff0c;结果还不好。阿里内部某研发团队就正处在这样的漩涡之中。 在这样的背景下&#xff0c;阿里云效敏捷教练团队受邀&#xff0c;和该研发团队一起&#xff0c;通过4个迭代…

阿里云携手爱迪德,发布中国首个云端DRM解决方案

2018杭州云栖大会期间&#xff0c;阿里云携手技术生态合作伙伴-爱迪德&#xff0c;推出中国首个云端DRM解决方案。该方案受CHINA DRM LAB和好莱坞六大电影公司认可&#xff0c;可以有效加强平台方对高价值版权内容的保护&#xff0c;监测和防止视频内容的盗版。 爱迪德中国区销…

atomic在linux编译不通过,内存障碍和在linux上的atomic_t

最近我正在阅读一些Linux内核空间代码,我看到了这一点uint64_t used;uint64_t blocked;used atomic64_read(&g_variable->used); //#1barrier(); //#2blocked atomic64_read(&g_variable->blocked); //#3这段代码片段的语义是什么&#xff1f;确保#1在#3之前执…

pythonrgb高精度浮点运算类型_python实现RGB字符串,按24位对齐后输出对应Integer行数字...

题目来源&#xff1a;2021届字节跳动算法岗笔试题题目描述&#xff1a;实现一个RGB字符串(如&#xff1a;rgb(0, 50,255) )&#xff0c;按24位数字对齐后输出对应Integer型数字。R为高位&#xff0c;B为低位。例如&#xff1a;输入 rgb(0, 50,255) &#xff0c;输出13055输入描…

idea升级2019.3后字体有的粗有的细

解决办法&#xff1a; 设置File–>Settings–>Editor–>Fallback font–>SimHei

飞天2.0 | 万物智能的基础服务

在2018杭州云栖大会的主论坛上&#xff0c;阿里云技术研发总经理蒋江伟发表了《飞天2.0&#xff0c;万物智能的基础服务》的主题演讲&#xff0c;从全连接、安全、简便、高速四个方面&#xff0c;阐述了飞天2.0网络的新特性。 蒋江伟表示&#xff0c;万物智能时代产生的海量数据…

黑科技揭秘:3分钟,轻松构建一张覆盖全球的企业专有网络

2018杭州云栖大会主论坛上&#xff0c;阿里巴巴研发技术总经理 蒋江伟在大会现场演示了分钟级构建企业专有网络的技术。 回顾一下当时的场景&#xff0c;一共有三步操作&#xff1a;上电&#xff0c; WAN口连接Internet&#xff0c;LAN口连接电脑&#xff0c;在工程师没有对设备…

恕我直言,有了这款 IDEA 插件,你可能只需要写 30% 的代码。。。

文章目录1. 安装(EasyCode)2. 建立数据库3. 在IDEA配置连接数据库4. 开始生成代码5. pom.xml6. Application.yml7. 启动项目8. 测试一下Easycode是idea的一个插件&#xff0c;可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码&#xff0c;简单而强大。…

linux硬盘为啥分区,Linux下为什么要进行磁盘的分区

一、先从整体上说说说分区的好处:1.数据安全:主要方面:只用一个分区&#xff0c;若遇到系统需要重装或者分区需要进行格式化等&#xff0c;原有的重要文件无法在本硬盘保留&#xff0c;而若提前进行了合理分区&#xff0c;则用户数据不会收到影响次要方面&#xff0c;我们知道&…

双十一提前预热,这款耳机直降80元!

还有不到10天时间就到双十一狂欢购物节了你们是不是已经把购物车加满了呢&#xff1f;反正的我已经加了好多了此时好想自己有个程序员男友帮我把购物车清空可惜了赶不上了之前推荐了一款兰士顿的T7R按键版蓝牙耳机大部分购买的用户给我的反馈说还不错哦但是也有一部分人问我有没…

python以写模式打开录入_Python的学习(六)—-文件和输入输出处理 | 学步园

Python中的文件和输入输出处理1. 文件对象的概念文件对象不仅可以用来访问普通的磁盘文件&#xff0c;还可以访问任何其他类型抽象层面上的文件。例如实时地“打开一个URL”来读取Web页面&#xff0c;在另一个独立的进程中执行一个命令进行通信&#xff0c;就好像是两个同时打开…

阿里云朱照远:视频云2.0,更大规模、更智能、更清晰

在2018杭州云栖大会19号下午的主论坛上&#xff0c;阿里云视频云总经理朱照远发表了《视频云2.0&#xff0c;智享未来视界》的主题演讲&#xff0c;从超大规模、智能化、实时连接、超高清8K这四个方面&#xff0c;阐述了视频云2.0的定义。 朱照远表示&#xff0c;在这个超大规模…

这次的新计算,很全能!

在2018杭州云栖大会上&#xff0c;阿里云技术研发总经理蒋江伟发表了《全能计算&#xff0c;灵活稳定》的主题演讲&#xff0c;从函数计算、弹性容器实例、高吞吐ESSD云盘、弹性裸金属服务器、SCC超级计算集群这五个方面&#xff0c;阐述了飞天2.0计算的新特性。 蒋江伟表示&am…

linux virtualhost不能正常运行,造成网站无法正常运行的4个原因!

原标题&#xff1a;造成网站无法正常运行的4个原因&#xff01;同虚拟主机产品对网站开发环境要求不同&#xff0c;如果两者不兼容&#xff0c;网站自然无法正常运行&#xff0c;这也是最常见的原因之一。因此&#xff0c;用户需设计好自己网站的开发环境&#xff0c;再去选择匹…