Knative 多容器支持介绍

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 微服务和容器化带来了将应用程序分解成可重复使用的小型单元的诉求,这些单元通常作为单独的进程运行,或者在单独的容器运行。 Kubernetes的Pod模型允许用户创建一个部署单元,该单元可以打包多个容器作为应用程序的单个实例。Knative 用户当前同样存在将多个容器部署到一个Pod中对诉求。支持多个容器的能力将有利于把更广泛的工作负载部署到Knative Serving模型中。因此 Knative 从 0.16.0 版本开始提供多个容器的能力。

导读

微服务和容器化带来了将应用程序分解成可重复使用的小型单元的诉求,这些单元通常作为单独的进程运行,或者在单独的容器运行。 Kubernetes的Pod模型允许用户创建一个部署单元,该单元可以打包多个容器作为应用程序的单个实例。

Knative 用户当前同样存在将多个容器部署到一个Pod中对诉求。支持多个容器的能力将有利于把更广泛的工作负载部署到Knative Serving模型中。因此 Knative 从 0.16.0 版本开始提供多个容器的能力。

多容器支持

单容器介绍

Knative 0.16.0之前的版本,仅支持设置一个业务容器,也就是在Knative Service中只能设置一个容器。在服务创建的过程中,会默认在POD中加上一个 QUEUE 容器,该容器主要用户接管入口流量,用于基于流量的KPA指标收集。典型的一个Knative Service 如下:

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

创建完成运行中POD示意图如下:

image.png

如果我们想要加上一个自定义的SideCar容器(一般用于网络互通,文件下载拷贝等辅助功能),是没有办法去支持的,也就限制了实际的使用场景。

多容器介绍

Knative 从 0.16.0 版本开始也支持了多容器(没什么好说的,k8s pod天然的特性必须要支持)

image.png

Queue

Queue

User

User

那么如何使用多容器呢?很简单,其实就是在containers属性中配置多个即可,示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: multi-container
  namespace: default
spec:
  template:
    spec:
      containers:
      - image: docker.io/savita3020/servingcontainer
        ports:
          - containerPort: 8881
      - image: docker.io/savita3020/sidecarcontainer

开启多容器特性

  • 阿里云 Knative v0.18.3 已经默认开启。
  • 社区 Knative 0.16.0 默认未开启, 从0.17.0 开始默认开启,执行下面操作可查看是否开启:
 $ kubectl -n knative-serving get configmap config-features -oyaml
 ......
 multi-container: "enabled"
 ......

多容器实践

前提条件


创建服务

接下来我们创建多容器的一个服务,该服务包括两个容器:

  • servingcontainer 容器
  • sidecarcontainer 容器

servingcontainer调用sidecarcontainer, 示例代码如下:

package main   
import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
  log.Println("serving container received a request.")
  res, err := http.Get("http://127.0.0.1:8882")
  if err != nil {
    log.Fatal(err)
  }
  resp, err := ioutil.ReadAll(res.Body)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Fprintln(w, string(resp))
}
func main() {
  log.Print("serving container started...")
  http.HandleFunc("/", handler)
  log.Fatal(http.ListenAndServe(":8881", nil))
}

sidecarcontainer 容器用于打印信息“Yay!! multi-container works”,示例代码如下:

package main
import (
  "fmt"
  "log"
  "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
  log.Println("sidecar container received a request.")
  fmt.Fprintln(w, "Yay!! multi-container works")
}
func main() {
  log.Print("sidecar container started...")
  http.HandleFunc("/", handler)
  log.Fatal(http.ListenAndServe(":8882", nil))
}

我们创建multi-container的服务

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: multi-container
  namespace: default
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/servingcontainer:v1
        ports:
          - containerPort: 8881
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/sidecarcontainer:v1

执行部署命令:

kubectl apply -f multi-container.yaml

查看pod信息,发现一个 3 个容器(queue容器、servingcontainer 容器、sidecarcontainer 容器):

richard@B-N3TEMD6P-1650 multi-container % kubectl get po
NAME                                                READY   STATUS    RESTARTS   AGE
multi-container-dfqtv-deployment-799c4f694c-bkc8t   3/3     Running   0          9s

访问服务:

richard@B-N3TEMD6P-1650 multi-container % curl -H "host: multi-container.default.example.com" http://182.92.208.172
Yay!! multi-container works

我们可以看到多容器访问已经生效。

总结

本文介绍了从 Knative  0.16.0 版本支持的多容器特性,以及如何在Knative Service 中使用多个容器,有兴趣的同学可以体验一下,也欢迎加入 Knative 交流群一起交流:

image.png

目录
相关文章
|
1月前
|
Kubernetes Java Linux
容器服务ACK常见问题之在knative中自定义域名失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
消息中间件 监控 Cloud Native
容器弹性—使用 Knative on ACK 实现基于请求的自动弹性|学习笔记
快速学习容器弹性—使用 Knative on ACK 实现基于请求的自动弹性
99 0
容器弹性—使用 Knative on ACK 实现基于请求的自动弹性|学习笔记
|
存储 Kubernetes Cloud Native
直播预告 | 容器服务 Knative 网关增强:支持 ALB
Knative 是基于 Kubernetes 之上提供的一款开源 Serverless 应用框架,能够帮助您部署和管理现代化的 Serverless 工作负载,打造企业级 Serverless 平台。ALB 面向应用层负载场景,具备自动弹性及大规模应用层流量处理能力。当前容器服务 Knative 提供 ALB 网关能力,充分发挥了流量、资源按需使用的 Serverless 能力。
直播预告 | 容器服务 Knative 网关增强:支持 ALB
|
运维 Kubernetes Cloud Native
开箱即用,Knative 给您极致的容器 Serverless 体验
CNCF 发布的年度调查报告显示 2019 年 Serverless 技术进一步获得了更大的认可。其中 41% 的受访者表示已经在使用 Serverless,另外 20% 的受访者表示计划在未来 12-18 个月内会采用 Serverless 技术。
|
运维 Kubernetes Cloud Native
开箱即用,Knative 给您极致的容器 Serverless 体验
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 导读:托管 Knative 开箱即用,您不需要为这些常驻实例付出任何成本。结合 SLB 云产品提供 Gateway 的能力以及基于突发性能型实例的保留规格功能,极大的节省您的 IaaS 开支,您支付的每一分钱都没有浪费。
开箱即用,Knative 给您极致的容器 Serverless 体验
|
弹性计算 运维 Kubernetes
开箱即用,Knative 给您极致的容器 Serverless 体验
托管 Knative 开箱即用,您不需要为这些常驻实例付出任何成本。结合 SLB 云产品提供 Gateway 的能力以及基于突发性能型实例的保留规格功能,极大的节省您的 IaaS 开支,您支付的每一分钱都没有浪费。
开箱即用,Knative 给您极致的容器 Serverless 体验
|
监控 网络协议 容器
Knative 应用在阿里云容器服务上的最佳实践
作者|元毅 阿里云智能事业群高级开发工程师 相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应用在阿里云容器服务上的最佳实践。
|
Kubernetes Shell 容器
阿里云Kubernetes容器服务上体验Knative
Knative Serving是一种可缩放至零、请求驱动的计算运行环境,构建在 Kubernetes 和 Istio 之上,支持为 serverless 应用、函数提供部署与服务。Knative Serving的目标是为Kubernetes提供扩展功能,用于部署和运行无服务器工作负载。
5476 0
|
2天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)