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.