Introdução ao suporte para vários contêineres Knative

Introdução: microsserviços e conteinerização trazem a necessidade de decompor aplicativos em pequenas unidades reutilizáveis, que geralmente são executadas como processos separados ou em contêineres separados. O modelo Pod do Kubernetes permite que os usuários criem uma unidade de implantação que pode empacotar vários contêineres como uma única instância de um aplicativo. Os usuários do Knative atualmente também têm demandas para implantar vários contêineres em um pod. A capacidade de suportar vários contêineres facilitará a implantação de uma gama mais ampla de cargas de trabalho no modelo Knative Serving. Portanto, o Knative oferece vários recursos de contêiner a partir da versão 0.16.0.

Orientar

Os microsserviços e a conteinerização trouxeram demandas para decompor aplicativos em pequenas unidades reutilizáveis, que geralmente são executadas como processos separados ou em contêineres separados. O modelo Pod do Kubernetes permite que os usuários criem uma unidade de implantação que pode empacotar vários contêineres como uma única instância de um aplicativo.

Os usuários do Knative atualmente também têm demandas para implantar vários contêineres em um pod. A capacidade de suportar vários contêineres facilitará a implantação de uma gama mais ampla de cargas de trabalho no modelo Knative Serving. Portanto, o Knative oferece vários recursos de contêiner a partir da versão 0.16.0.

Suporte a vários contêineres

Introdução de recipiente único

As versões anteriores ao Knative 0.16.0 suportam apenas a configuração de um contêiner de negócios, ou seja, apenas um contêiner pode ser configurado no Knative Service. No processo de criação do serviço, um contêiner QUEUE será adicionado ao POD por padrão.O usuário principal desse contêiner assume o tráfego de entrada e é usado para coleta de indicadores KPA com base no tráfego. Um serviço típico da Knative é o seguinte:

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"

O diagrama esquemático do POD em operação após a criação é o seguinte:

 

Se quisermos adicionar um contêiner SideCar personalizado (normalmente usado para interoperabilidade de rede, download e cópia de arquivos e outras funções auxiliares), não há como suportá-lo, o que limita os cenários reais de uso.

Introdução de multi-contêineres

O Knative também oferece suporte a vários contêineres desde a versão 0.16.0 (nada a dizer, os recursos naturais do pod k8s devem ser compatíveis)

 

Então, como usar vários contêineres? É muito simples. Na verdade, você pode configurar vários no atributo containers. O exemplo é o seguinte:

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

Ative o recurso de vários contêineres

  • Alibaba Cloud Knative v0.18.3 foi habilitado por padrão.
  • Community Knative 0.16.0 não é habilitado por padrão. A partir de 0.17.0, ele é habilitado por padrão. Execute as seguintes operações para verificar se ele está habilitado:
 $ kubectl -n knative-serving get configmap config-features -oyaml
 ......
 multi-container: "enabled"
 ......

Prática de múltiplos contêineres

Pré-requisitos

 

Criar serviço

Em seguida, criamos um serviço de vários contêineres, que inclui dois contêineres:

  • servindo recipiente 容器
  • sidecarcontainer 容器

O servircontainer chama sidecarcontainer, o código de amostra é o seguinte:

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))
}

O contêiner sidecarcontainer é usado para imprimir a informação "Yay !! multi-contêiner funciona", o código de amostra é o seguinte:

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))
}

Nós criamos um serviço 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

Execute o comando de implantação:

kubectl apply -f multi-container.yaml

Verifique as informações do pod e encontre três contêineres (contêiner de fila, contêiner de contêiner de serviço, contêiner de contêiner lateral):

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

Serviço de acesso:

richard@B-N3TEMD6P-1650 multi-container % curl -H "host: multi-container.default.example.com" http://182.92.208.172
Yay!! multi-container works

Podemos ver que o acesso a vários contêineres entrou em vigor.

Acho que você gosta

Origin blog.csdn.net/weixin_43970890/article/details/115012202
Recomendado
Clasificación