简介:微服务和容器化带来了将应用程序分解成可重复使用的小型单元的诉求,这些单元通常作为单独的进程运行,或者在单独的容器运行。 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示意图如下:

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

多容器介绍

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

那么如何使用多容器呢?很简单,其实就是在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"
 ......

多容器实践

前提条件

  • 创建Kubernetes托管版集群
  • 一键部署Knative

创建服务

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

  • 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 交流群一起交流:

原文链接:https://developer.aliyun.com/article/782390?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Knative 多容器支持介绍相关推荐

  1. Tomcat容器入门介绍

    Tomcat容器入门介绍 Tomcat环境配置 PS:JDK的安装这里就不讲了,找到安装包直接下一步下一步就行了. 1.配置JDK 在Windows10下,找到环境变量 在环境变量中添加JDK主目录 ...

  2. [C++ STL] 各容器简单介绍

    [C++ STL] 各容器简单介绍 目录 一.什么是STL? 二.容器(Containers) 2.1 vector 2.2 deque 2.3 list 2.4 set 2.5 map 2.6 容器 ...

  3. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  4. c++容器vector介绍

    vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分 ...

  5. 容器技术介绍之docker核心技术概述

    容器简单来说是一种沙盒技术,将应用"装"进沙盒中,像集装箱一样,把应用封装起来,使得应用之间不会相互干扰,而放进沙盒中的应用也方便"搬家".本文基于docker ...

  6. C++中常用的std标准容器(全部容器功能介绍)

    文章目录 C++中常用的std标准容器 顺序容器: 有序关联容器: 无序关联容器: 顺序容器 1. vector容器 a. vector的定义与初始化 b. vecotr常使用的操作 c. 小结: 2 ...

  7. 微软宣布提供Azure Cognitive Services容器支持

    微软宣布提供对Cognitive Services的容器支持,允许在任何地方使用机器学习功能,无论是在云端.边缘还是自有.借助Azure Cognitive Services,企业可以使用各种认知功能 ...

  8. SA387Gr22Cl2美标容器板介绍,SA387Gr22Cl2钢板规格8-90mm厚

    SA387Gr22Cl2美标容器板介绍,SA387Gr22Cl2钢板规格8-90mm厚 SA387Gr22Cl2美标容器板,执行标准asme标准 Gr22是级别(具体22指的是Cr2 .25, Mo1 ...

  9. Docker容器支持中文并添加中文字体

    Docker容器支持中文并添加中文字体 1.使用Maven打包Java应用,生成App.jar,上传到Linux服务器.Linux同级目录创建fonts文件夹,存放字体库以及字体 2.编写Docker ...

最新文章

  1. Spring事务管理 与 SpringAOP
  2. php integer
  3. redis缓存java对象_Redis缓存系统-Java-Jedis操作Redis,基本操作以及 实现对象保存...
  4. springboot七牛云---报{“error“:“download token auth failed“}错误
  5. 艾泰路由器设置虚拟服务器,艾泰路由器设置步骤
  6. saltstack常用模块
  7. cmake 在安装mysql_cmake安装mysql
  8. JDK 15 正式发布,划时代的 ZGC 同时宣布转正!
  9. C语言中控制printf的打印颜色实例及vt100的控制符文档-转
  10. Android中的WebView之loadDataWithBaseURL()与loadData()
  11. workbench求解闭合状态尼龙槽环
  12. MySQL基础_练习和一个经典面试题
  13. javascript获取网址参数
  14. matlab画矩阵中的两列,matlab 图例 两列
  15. web im环信陌生人聊天或客服聊天功能
  16. TEM波以及TEM TE TM模的区别
  17. 2022.11.22 英语背诵
  18. 利用python提取基因cDNA长度,exon数量,pep长度和PI
  19. 电压源电流源电路符号及2B法
  20. Testin云测试在智能测试领域的探索实践

热门文章

  1. Apache Flink 零基础入门(四)Flink开发批处理应用程序
  2. java高并发(十八)线程池
  3. 浙大提出会打德扑的「自我博弈」AI,还会玩射击游戏
  4. 地图容器自适应浏览器是什么意思_Web移动端实现自适应缩放界面的方法汇总
  5. python 设置x轴_python matplotlib坐标轴设置的方法
  6. 机器学习基础-主成分分析PCA-16
  7. python中计算排队等待时间_codewars(python)练习笔记十:计算超市排队时长
  8. SQL Server 查询数据库里所有表的行数
  9. 使用Logstash filter grok过滤日志文件
  10. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)