Knative 多容器支持介紹

微服務和容器化帶來了將應用程序分解成可重複使用的小型單元的訴求,這些單元一般做爲單獨的進程運行,或者在單獨的容器運行。 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

  • 阿里雲 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 中使用多個容器。

原文連接

本文爲阿里雲原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索