微服務和容器化帶來了將應用程序分解成可重複使用的小型單元的訴求,這些單元一般做爲單獨的進程運行,或者在單獨的容器運行。 Kubernetes的Pod模型容許用戶建立一個部署單元,該單元能夠打包多個容器做爲應用程序的單個實例。docker
Knative 用戶當前一樣存在將多個容器部署到一個Pod中對訴求。支持多個容器的能力將有利於把更普遍的工做負載部署到Knative Serving模型中。所以 Knative 從 0.16.0 版本開始提供多個容器的能力。api
單容器介紹網絡
Knative 0.16.0以前的版本,僅支持設置一個業務容器,也就是在Knative Service中只能設置一個容器。在服務建立的過程當中,會默認在POD中加上一個 QUEUE 容器,該容器主要用戶接管入口流量,用於基於流量的KPA指標收集。典型的一個Knative Service 以下:app
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示意圖以下:curl
若是咱們想要加上一個自定義的SideCar容器(通常用於網絡互通,文件下載拷貝等輔助功能),是沒有辦法去支持的,也就限制了實際的使用場景。ide
多容器介紹微服務
Knative 從 0.16.0 版本開始也支持了多容器(沒什麼好說的,k8s pod自然的特性必需要支持)阿里雲
那麼如何使用多容器呢?很簡單,其實就是在containers屬性中配置多個便可,示例以下:url
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
開啓多容器特性spa
$ kubectl -n knative-serving get configmap config-features -oyaml ...... multi-container: "enabled" ......
前提條件
建立服務
接下來咱們建立多容器的一個服務,該服務包括兩個容器:
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 中使用多個容器。
本文爲阿里雲原創內容,未經容許不得轉載。