Knative 化繁为简之道:应用部署与访问

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Knative 是一款基于 Kubernetes 之上的开源 Serverless 框架,其目标之一是降低用户服务部署及使用门槛。在此基础上提还供了其它丰富的功能,如自动扩缩容,路由流量,金丝雀发布以及事件驱动等。在本文中,我们首先 Kubernetes 上部署应用并进行服务访问,然后在 Knative 中部署同样的服务并访问,以此对比来看Knative如何降低了服务部署及访问的门槛。

导读

Knative 是一款基于 Kubernetes 之上的开源 Serverless 框架,其目标之一是降低用户服务部署及使用门槛。在此基础上提还供了其它丰富的功能,如自动扩缩容,路由流量,金丝雀发布以及事件驱动等。在本文中,我们首先 Kubernetes 上部署应用并进行服务访问,然后在 Knative 中部署同样的服务并访问,以此对比来看Knative如何降低了服务部署及访问的门槛。
我们清楚如果提供一个线上对外访问的服务,一般需要提供域名访问入口,另外服务发现/负载均衡以及工作负载也是必须的,那么要提供这些能力,我们先看一下在Kubernetes中应该怎么做。

在 Kubernetes 提供域名服务访问

image.png
在kubernetes中,我们提供对外访问的服务,需要创建如下3个资源:
• Ingress - 域名访问
• Service - 服务发现/负载均衡
• Deployment/Statefulset等 - 工作负载
以最简单的部署 hello-world 为例,首先我们创建工作负载 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
  labels:
    app: hello-world
spec:
  selector:
    matchLabels:
      app: hello-world
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        ports:
        - name: http
          containerPort: 8080
        env:
        - name: TARGET
          value: "Go Sample v1"

将上面的文本保存hello_deployment.yaml, 然后执行 kubectl apply :

$ kubectl apply -f hello_deployment.yaml

我们可以看到两个 POD 已经 running 状态:

$ kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
hello-world-deployment-86923fxfs-4wfw   1/1     Running   0          30s
hello-world-deployment-86923fxfs-xsr   1/1     Running   0          30s

接下来,我们创建服务访问 Service:

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  selector:
    app: hello-world
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    name: http

执行 kubectl 创建 service 如下:

$ kubectl apply -f hello_k8s_svc.yaml

最后我们将服务通过网关提供出来,那么需要Ingress, 通常的使用nginx ingress, 关于部署nginx ingress controller, 这里不进行详细说明,可以参考社区的部署方式即可: https://github.com/kubernetes/ingress-nginx.
部署完 nginx ingress controller 之后,我们创建ingress, 具体yaml内容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-world
spec:
  rules:
  - host: helloworld-go.knative.top
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-world
          servicePort: 80

执行kubectl之后,将helloworld-go.knative.top设置域名解析(nginx ingress controller slb)之后我们直接进行域名访问:

$ curl helloworld-go.knative.top
Hello Go Sample v1!

在 Knative 中提供域名服务访问

在 Knative 中提供域名访问你只需要创建 Knative Service 服务即可,最直接的理解就是:Knative Service = ingress + k8s service + deployment。此外Knative 提供了丰富的网关插件,如istio、kourier等。
image.png

一个简单的 Knative Service yaml:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
          env:
            - name: TARGET
              value: "Go Sample v1"

看起来是不是跟Deployment很像,其实这里面的spec,就是pod spec,对于直接对K8s工作负载比较熟悉的来说,使用Knative Service可以说是0门槛。
接下来通过执行 kubectl 创建该资源:

$ kubectl apply -f ksvc.yaml

我们可以看到Pod已经创建出来了:

$ kubectl get pods
NAME                                             READY   STATUS    RESTARTS   AGE
helloworld-go-cdqm7-deployment-75b4dc8c9-xxzcw   2/2     Running   0          11s

接下来我们如何进行域名服务访问呢?很简单,通过查看Knative Sevice即可:

$ kubectl get ksvc
NAME                       URL                                                                                                                                    LATESTCREATED                    LATESTREADY                      READY   REASON
helloworld-go              http://helloworld-go.default.knative.top                                                                                               helloworld-go-5c52g              helloworld-go-5c52g              True

设置域名解析到对应的网关slb(如果使用istio, 则直接获取istio-ingressgateway 对应的外网ip),通过 curl 直接访问域名:

$ curl helloworld-go.default.knative.top  
Hello Go Sample v1!

总结

通过上面的示例对比,我们很直接看到:通过 Knative 可以更简单的部署并提供服务。Knative 如何做到这一点呢?其实就是将K8s原有的资源进行了封装,并抽象出来了Knative Service这个应用模型,在满足功能的情况下,收敛了用户的资源操作界面,降低了服务部署与访问的门槛。此外通过这个模型,还提供了多版本管理以及基于流量的灰度发布能力,至于这些,我们会在后续的文章中介绍,欢迎大家持续关注。

欢迎加入 Knative 交流群

image.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 安全 Serverless
基于Service Mesh管理Knative流量最佳实践
Istio扩展了Kubernetes,以建立可编程、应用程序感知的服务网格(Service Mesh)。Istio与Knative结合使用,可以为Serverless应用工作负载带来标准、通用的流量管理、可观测和安全性能力。
基于Service Mesh管理Knative流量最佳实践
|
小程序 开发者
微信小程序报错[ app.json 文件内容错误] app.json: app.json 未找到,一招解决
微信小程序报错[ app.json 文件内容错误] app.json: app.json 未找到,一招解决
4924 0
微信小程序报错[ app.json 文件内容错误] app.json: app.json 未找到,一招解决
|
消息中间件 弹性计算 Kubernetes
Knative 架构解析
【2月更文挑战第29天】Knative作为构建无服务器产品的基础设施,建立在Kubernetes和Istio之上,提供从源代码到服务的编排、流量管理、自动扩缩容和事件绑定等功能,分为Build、Eventing和Serving三个模块,旨在确保编程模型的可移植性。
|
Kubernetes 应用服务中间件 nginx
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
52449 30
|
图形学 Android开发 开发者
U3D游戏开发实战:有效策略缩小包体大小,提升加载速度
【7月更文第12天】随着移动设备的普及,Unity 3D(简称U3D)作为一款强大的跨平台游戏开发引擎,成为了众多独立开发者和游戏工作室的首选。然而,面对日益增长的用户需求与有限的设备存储空间,如何在保证游戏质量的同时,有效缩减游戏包体大小,成为了开发者面临的一大挑战。本文将探讨一系列实用技巧和最佳实践,帮助你在U3D开发小游戏时显著减小包体尺寸,从而提升玩家的下载体验与启动速度。
498 12
|
存储 Kubernetes 安全
第四章 Helm仓库介绍配置国内仓库地址
第四章 Helm仓库介绍配置国内仓库地址
6385 2
|
存储 数据库 开发者
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
社区供稿 | XTuner发布LLaVA-Llama-3-8B,支持单卡推理,评测和微调
日前,XTuner 团队基于 meta 最新发布的 Llama-3-8B-Instruct 模型训练并发布了最新版多模态大模型 LLaVA-Llama-3-8B, 在多个评测数据集上取得显著提升。
|
存储 监控 Go
Golang框架实战-KisFlow流式计算框架(1)-概述
KisFlow是针对缺乏数仓平台但又有实时计算需求的企业的解决方案,它提供分布式批量消费、有状态流式计算、数据流监控和分布式任务调度等功能。通过KisFunction实现业务逻辑复用,减轻对业务数据库的压力。系统包括流式计算层和任务调度层,支持多种数据源和中间件集成。KisConfig用于配置管理,KisFunction是基本计算单元。设计目标是使业务工程师能轻松进行流式计算。项目源码可在GitHub查看:https://github.com/aceld/kis-flow。
466 0
Golang框架实战-KisFlow流式计算框架(1)-概述
|
Kubernetes 网络协议 关系型数据库
基于operator sdk轻松编写一个k8s自定义资源管理应用
operator 是一种 kubernetes 的扩展形式,可以帮助用户以 Kubernetes 的声明式 API 风格自定义来管理应用及服务,operator已经成为分布式应用在k8s集群部署的事实标准了,在云原生时代系统想迁移到k8s集群上编写operator应用是必不可少的能力,这里介绍用 CoreOS 的 operator framework 工具如何快速构建一个 operator 应用。
7893 0