赠书 | 如何部署一个Knative Service

我们以一个go语言编写的程序代码为例,创建一个简单的Web服务,当该服务接收到HTTP GET请求时会根据环境变量TARGET传递的内容向response输出Hello $TATGET! 内容。

1. 创建一个文件名为helloworld.go的文件。程序源码如下:

package mainimport ("fmt""log""net/http""os")func handler(w http.ResponseWriter, r *http.Request) {  log.Print("helloworld: received a request")  target := os.Getenv("TARGET")if target == "" {    target = "World"  }  fmt.Fprintf(w, "Hello %s!\n", target)}func main() {  log.Print("helloworld: starting server...")http.HandleFunc("/", handler)port := os.Getenv("PORT")if port == "" {    port = "8080"  }log.Printf("helloworld: listening on port %s", port)  log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))}

使用下面内容的Dockerfile构建源码并生成容器:

# Use the official Golang image to create a build artifact.# This is based on Debian and sets the GOPATH to /go.# https://hub.docker.com/_/golangFROM golang:1.13 as builder# Create and change to the app directory.WORKDIR /app# Retrieve application dependencies using go modules.# Allows container builds to reuse downloaded dependencies.COPY go.* ./RUN go mod download# Copy local code to the container image.COPY . ./# Build the binary.# -mod=readonly ensures immutable go.mod and go.sum in container builds.RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o server# Use the official Alpine image for a lean production container.# https://hub.docker.com/_/alpine# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-buildsFROM alpine:3RUN apk add --no-cache ca-certificates# Copy the binary to the production image from the builder stage.COPY --from=builder /app/server /server# Run the web service on container startup.CMD ["/server"]
# 在本地主机构建容器。{username}替换为你自己在dockerhub的用户名。docker build -t {username}/helloworld-go .# 将容器Push到Docker容器镜像仓库。{username}替换为你自己在dockerhub的用户名。docker push {username}/helloworld-go

 部署Knative Service 

Knative Service和其他Kubernetes资源类似,可以通过一个YAML文件进行定义和部署。接下来我们使用上一步构建的容器来部署Knative Service服务。service.yaml配置文件如下:

apiVersion: serving.knative.dev/v1kind: Servicemetadata:name: helloworld-go  # Service名称namespace: defaultspec:template:metadata:name: helloworld-go-v1 # Knative Revision名称,如果未设置系统将会自动生成。spec:containers:- image: {username}/helloworld-goenv:- name: TARGETvalue: "Go Sample v1"livenessProbe:httpGet:path: /readinessProbe:httpGet:            path: /

运行下面的命令部署helloworld-go Knative Service:

# kubectl apply -f service.yaml

在这个YAML配置文件中,Knative Service的kind的值是Service,为了避免与Kubernetes内置的service混淆,apiVersion的值需要设置为serving.knative.dev/v1。

配置文件中的spec区块与Kubernetes PodSpec的定义几乎完全一样,只是删除了以下属性:

• InitContainers• RestartPolicy• TerminationGracePeriodSeconds• ActiveDeadlineSeconds• DNSPolicy• NodeSelector• AutomountServiceAccountToken• NodeName• HostNetwork• HostPID• HostIPC• ShareProcessNamespace• SecurityContext• Hostname• Subdomain• Affinity• SchedulerName• Tolerations• HostAliases• PriorityClassName• Priority• DNSConfig• ReadinessGates• RuntimeClassName

spec.template.metadata.name定义了Knative Revision的名称,这个名称是可选的,如果被省略,Revision的名称会自动生成。

Knative Service的liveness探针与标准Kubernetes探针有微小区别。Knative Service探针定义中没有port属性定义。Knative Serving控制器在service部署阶段能够自动确定port值。readiness探针也遵循同样的规则。

检查部署结果并验证服务:

# kubectl get ksvc helloworld-goNAME            URL                                                      LATESTCREATED      LATESTREADY           READY   REASONhelloworld-go   http://helloworld-go.default.example.com   helloworld-go-v1   helloworld-go-v1   True

通过curl命令访问helloworld-go服务:

##获取集群任一节点的IP地址和nodePort端口# IP_ADDRESS="$(kubectl get nodes -o 'jsonpath={.items[0].status.addresses[0].address}'):$(kubectl get svc istio-ingressgateway --namespace istio-system --output 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')"# curl -H "Host:helloworld-go.default.example.com" http://$IP_ADDRESSHello Go Sample v1!

上面的脚本中为了获取可以访问到helloworld-go服务的ip地址以端口号,我们选取了集群任一节点的ip地址,istio-ingressgateway服务的nodePort端口号。使用带有Service URL的主机名的头信息(例如Host:helloworld-go.default.example.com)即可访问helloworld-go服务了。

当curl访问到服务后,knative Serving自动创建了一个pod副本提供服务,当一段时间没有访问服务后,pod副本将会被销毁。我们可以通过watch kubectl get pods 来监控pod的生命周期。

本文摘编于机械工业出版社出版的图书《Knative实战:基于Kubernetes的无服务器架构实践》。

本书的读者对象:

  • 对Serverless技术感兴趣的读者。

  • 想要将Knative引入当前技术栈的架构师。

  • 想要采用Serverless技术的应用开发者。

  • 想要自己维护Knative Serverless平台的运维开发人员。

关于作者:

李志伟 某网云原生实验室负责人,容器云领域专家。在Kubernetes、Istio、Serverless、DevOps工具等领域有深入的研究和实践。热心于云原生技术的应用与推广,曾荣获“K8sMeetup中国社区”最受欢迎讲师奖项。

游杨  某网云原生实验室高级运维开发工程师。先后参与Kubernetes和Knative项目的落地与实施工作,拥有丰富的容器平台实践经验,聚焦于Kubernetes、Serverless、CI/CD技术领域。

对于Knative,你有哪些了解?

#欢迎来评论区讨论#

CSDN云计算 将选出三名优质留言

携手【机械工业出版社华章分社】送出

《Knative实战:基于Kubernetes的无服务器架构实践》一本

截至4月27日14:00点

60+专家,13个技术领域,CSDN 《IT 人才成长路线图》重磅来袭!

直接扫码或微信搜索「CSDN」公众号,后台回复关键词「路线图」,即可获取完整路线图!

更多精彩推荐
☞5G、射频、奥特曼,这仨有联系吗?☞再见 Nacos,我要玩 Service Mesh 了!☞用根因定位法,让运维效率再高一点!
点分享点收藏点点赞点在看

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

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

相关文章

一文读懂阿里云网络-SLB负载均衡新姿势

简介: 简介:负载均衡是洛神网络中最为关键的网元之一,其担负着网络流量分发的重任,有了它之后,用户在浏览应用的时候才能体会到“丝般顺滑”的感觉。欢迎免费体验SLB性能保障型负载均衡产品! 通过此文&…

聊聊缓存机制:双写兜兜转转,又回到了串行化

来源 | moon聊技术责编 | 寇雪芹头图 | 下载于ICphoto什么是双写?这个很好理解,双写就是说,一份数据在数据库存一份,在缓存中也存一份,给缓存一个过期时间,当读不到缓存时从数据库读出来然后写入缓存。为什…

如何基于大数据及AI平台实现业务系统实时化?

简介: 后疫情时代的新社会模式及经济形态必将催生出新的商业模式,在线业务及相关应用场景的流量呈现井喷式发展,常规的离线系统及离线机器学习平台已无法满足业务发展要求。 作者:高旸(吾与),阿…

基于 Flink 的典型 ETL 场景实现

简介: 本文将从数仓诞生的背景、数仓架构、离线与实时数仓的对比着手,综述数仓发展演进,然后分享基于 Flink 实现典型 ETL 场景的几个方案。 作者:买蓉 美团点评高级技术专家整理:赵阳(Flink 社区志愿者&…

商用密码技术与应用创新的方向是什么?安全牛发布《商密报告》全面揭晓

编辑 | 宋慧 出品 | CSDN云计算 头图 | 付费下载于东方IC 2021年4月22日,由安全牛举办的2021商用密码技术创新研讨会暨《2021商用密码创新应用指南》(以下简称《商密报告》)发布会在北京举行。 北京谷安天下科技有限公司副总裁贺晓辉在研讨…

Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

Flink 1.11 最重要的 Feature —— Hive Streaming 之前已经和大家分享过了,今天就和大家来聊一聊另一个特别重要的功能 —— CDC。 CDC概述 何为CDC?Change Data Capture,将数据库中的’增’、’改’、’删’操作记录下来。在很早之前是通…

阿里巴巴大数据实践:大数据建设方法论OneData

来源:数智化转型俱乐部 面对爆炸式增长的数据,如何建设高效的数据模型和体系,对这些数据进行有序和有结构地分类组织和存储,避免重复建设和数据不一致性,保证数据的规范性,一直是大数据系统建设不断追求的…

干货!一文搞懂无状态服务

来源 | 机智的程序员小熊责编 | 寇雪芹头图 | 下载于视觉中国事故的发生是量的积累的结果,任何事情都没有表面看起来那么简单,在软件运行的过程中,随着用户量的增加,不考虑高可用,迟早有一天会发生故障,不得…

后疫情时代,这家在线教育机构如何乘“云”而上

简介: 阿里云依托于云计算的基础设施特性,能够帮助教育机构避免业务侧重复投入、提高资源利用率、降低开发和运维成本,使洋葱学院激发出更大的活力,在后疫情时代得到更多用户的青睐 新冠疫情让现代人类和国际社会经历了大规模的隔…

2021全球权威AI性能竞赛MLPerf最新榜单: 浪潮获18项冠军几近半壁江山

4月22日,全球权威AI基准评测MLPerf公布2021年最新榜单,在全部有效41个项目中,浪潮获得18项性能第一,斩获几近半数冠军。 MLPerf™由图灵奖得主大卫•帕特森 (David Patterson)联合谷歌、斯坦福、哈佛大学…

NFS文件锁一致性设计原理解析

简介: 在存储系统中, NFS(Network File System,即网络文件系统)是一个重要的概念,已成为兼容POSIX语义的分布式文件系统的基础。它允许在多个主机之间共享公共文件系统,并提供数据共享的优势&am…

作为工程师,你真的了解无服务器?

译者 | 王欢来源 | 分布式实验室头图 | 下载于ICphoto最近,我在YouTube上看了一个非常出色的开发人员的视频。它的标题是“无服务器毫无意义”。虽然我非常喜欢该视频,但也不敢确定作者关于无服务器的观点是否完全正确,因此我想在本文中进行讨…

recaf反编译 java jar包

文章目录1. 获取方式2. 软件运行3. 导入jar4. 模式切换5. 字符串混淆解析1. 获取方式 添加QQ群获取197453088 2. 软件运行 java -jar recaf-2.21.13.jar3. 导入jar 4. 模式切换 5. 字符串混淆解析 如何解密Allatori 混淆的字符串 Java ALLATORIxDEMO

分布式锁在存储系统中的技术实践

简介: 阿里云存储提供了完整的分布式锁解决方案,经过了阿里云众多云产品宝贵的业务场景中长期锤炼,稳定高可靠,且提供了多种语言的SDK选择,甚至是RESTful集成方案。 1 背景 针对共享资源的互斥访问历来是很多业务系统…

Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)

简介: 从上篇开始,我们进入到了高可用的章节,上篇提到的熔断能力,是历年保障大促当天晚上整个系统不被洪峰流量打垮的法宝,本篇介绍的措施与熔断有不一样的地方? 前言 从上篇开始,我们进入到了…

闲鱼对Flutter-Native混合工程解耦的探索

简介: 分手快乐,祝你快乐~ 作者:祈晴 1. 闲鱼Flutter现状 闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在FlutterNative这种开发模式下,Nat…

学 Python 最大的 1 个误区,看看你中招了吗?

提起 Python,大家总觉得很简单。但是,能把 Python 用好的人,好像并没多少。随着 Python 火了之后,像“ 3 天带你学会 Python ”、“快速入门到全栈”这样的教程层出不穷。很多讲了一点基础语法后,还没讲 http 协议和异…

Unable to make public jdk.internal.loader.Resource jdk.internal.loader.URLClassPath.getResource(jav

文章目录1. 现象2. 异常截图2. 解决方案3. 执行命令4. 启动日志5. 浏览器效果图1. 现象 执行命令 xjar.exe java -jar unified-access-center-passwd.jar运行 sprinbgboot 打包的jar包报错 具体信息如下: C:\Users\gblfy\Desktop\xJarDir>xjar.exe java -jar…

win10安装go开发环境

文章目录1. 下载软件2. 安装3. 验证1. 下载软件 golang官网:https://golang.google.cn/dl/ 2. 安装 双击go1.19.1.windows-amd64.msi一路下一步 3. 验证 go version

3 张图带你走近蚂蚁mPaaS音视频通话组件

简介: 远程问诊、线上开户、车载语音通话……蚂蚁 mPaaS 正在“拥抱新技术,探索新未来”。 音视频技术的进步,让线上办公不再是一时权宜之计,也使得线上业务的“无接触”开展成为可能。近日,蚂蚁集团推出的移动开发平台…