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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4月前
|
Kubernetes 监控 Cloud Native
eBPF技术大揭秘:一张全景图彻底改变Kubernetes问题排查,助你成为云原生时代的超级英雄!
【8月更文挑战第8天】在云原生时代,Kubernetes作为容器编排的标准,其问题排查变得日益复杂。eBPF技术无需改动内核即可编写高效、安全的内核程序,实现系统细粒度观测与控制。近期发布的基于eBPF的Kubernetes问题排查全景图,展示了如何利用eBPF监控资源使用、网络性能及调度策略等,例如通过eBPF程序监控CPU使用率。此全景图有助于快速定位如高CPU使用率等问题所在Pod,进而优化配置或调整调度。
123 8
|
4月前
|
运维 Kubernetes Cloud Native
OpenKruise:云原生应用自动化的超级引擎,让Kubernetes焕发超能力!
【8月更文挑战第8天】在现代云计算中,云原生应用借助Kubernetes实现了标准化部署。OpenKruise作为扩展工具库,增强了Kubernetes的功能,提供自动化管理复杂应用的能力。通过兼容的控制器、CRDs及Operator模式,OpenKruise简化了应用操作。用户可通过Helm安装,并利用如CloneSet等功能高效复制与管理Pods,从而专注于业务开发而非运维细节,提升云原生应用的灵活性与效率。
110 6
|
7月前
|
运维 Kubernetes 网络协议
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
68 0
|
运维 Kubernetes Cloud Native
SREWorks云原生数智运维工程实践-Kubernetes资源编排之二:Helm篇(下)
SREWorks云原生数智运维工程实践-Kubernetes资源编排之二:Helm篇
122 1
|
自然语言处理 运维 监控
《云原生架构容器&微服务优秀案例集》——01 互联网——站酷 基于 ASM 解决多语言技术栈下服务管理难题,实现运维提效
《云原生架构容器&微服务优秀案例集》——01 互联网——站酷 基于 ASM 解决多语言技术栈下服务管理难题,实现运维提效
247 0
|
运维 Kubernetes Cloud Native
|
存储 运维 Kubernetes
|
存储 运维 Kubernetes