简介:微服务和容器化带来了将应用程序分解成可重复使用的小型单元的诉求,这些单元通常作为独自的过程运行,或者在独自的容器运行。 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/v1kind: Servicemetadata:  name: helloworld-gospec:  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/v1kind: Servicemetadata:  name: multi-container  namespace: defaultspec:  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 mainimport (    "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/v1kind: Servicemetadata:  name: multi-container  namespace: defaultspec:  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 poNAME                                                READY   STATUS    RESTARTS   AGEmulti-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.172Yay!! multi-container works

咱们能够看到多容器拜访曾经失效。

总结

本文介绍了从 Knative 0.16.0 版本反对的多容器个性,以及如何在Knative Service 中应用多个容器,有趣味的同学能够体验一下,也欢送退出 Knative 交换群一起交换:

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