Knative 多容器支持介绍
導讀
微服務和容器化帶來了將應用程序分解成可重復使用的小型單元的訴求,這些單元通常作為單獨的進程運行,或者在單獨的容器運行。 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 開始默認開啟,執行下面操作可查看是否開啟:
多容器實踐
前提條件
- 創建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 多容器支持介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云原生数据湖分析DLA 2020年年度总
- 下一篇: 基于WASM的无侵入式全链路A/B Te