简介: 微服务和容器化带来了将应用程序分解成可重复使用的小型单元的诉求,这些单元通常作为独自的过程运行,或者在独自的容器运行。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 交换群一起交换:
版权申明: 本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。