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 Linux API
[没接触过kubevirt?]15分钟快速入门kubevirt
什么是kubevirt? kubevirt是一个容器方式运行虚拟机的项目。`kubevirt`是附加`kubernetes`集群上的,它是通过 `CustomResourceDefinition(CRD)`部署到`Kubernetes API`变成资源对象。使用方式类似创建`deploy、pod`......这些资源清单。
5230 0
[没接触过kubevirt?]15分钟快速入门kubevirt
|
Kubernetes 搜索推荐 前端开发
containerd 镜像构建工具 -- nerdctl 和 buildkit
containerd 镜像构建工具 -- nerdctl 和 buildkit
7462 0
|
12月前
|
Kubernetes 安全 Serverless
基于Service Mesh管理Knative流量最佳实践
Istio扩展了Kubernetes,以建立可编程、应用程序感知的服务网格(Service Mesh)。Istio与Knative结合使用,可以为Serverless应用工作负载带来标准、通用的流量管理、可观测和安全性能力。
基于Service Mesh管理Knative流量最佳实践
|
Kubernetes 容器 Perl
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
15979 0
|
7月前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。
|
Kubernetes 应用服务中间件 nginx
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
50694 30
|
消息中间件 弹性计算 Kubernetes
Knative 架构解析
【2月更文挑战第29天】Knative作为构建无服务器产品的基础设施,建立在Kubernetes和Istio之上,提供从源代码到服务的编排、流量管理、自动扩缩容和事件绑定等功能,分为Build、Eventing和Serving三个模块,旨在确保编程模型的可移植性。
|
运维 数据安全/隐私保护 Docker
Docker自建仓库之Docker Registry部署实战
关于如何使用Docker Registry镜像搭建本地私有Docker仓库的实战教程,包括了下载镜像、创建授权目录和用户名密码、启动Registry容器、验证端口和容器、测试登录仓库、上传和下载镜像的详细步骤。
2915 5
|
机器学习/深度学习 存储 人工智能
摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台
本文将介绍和梳理我们对云原生 AI 这个新领域的思考和定位,介绍云原生 AI 套件产品的核心场景、架构和主要能力。
摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台
|
Kubernetes 网络协议 关系型数据库
基于operator sdk轻松编写一个k8s自定义资源管理应用
operator 是一种 kubernetes 的扩展形式,可以帮助用户以 Kubernetes 的声明式 API 风格自定义来管理应用及服务,operator已经成为分布式应用在k8s集群部署的事实标准了,在云原生时代系统想迁移到k8s集群上编写operator应用是必不可少的能力,这里介绍用 CoreOS 的 operator framework 工具如何快速构建一个 operator 应用。
7720 0