O Escape implantará apenas a série de clusters - Istio implementa o caso bookinfo de gerenciamento de tráfego de microsserviço

Índice

1. Exemplo de introdução

1. Crie uma instância de bookinfo:

2. Estrutura da instância 

3. Acesso

2. aquisição de tráfego de microsserviço istio

1. Página do produto de acesso ao gateway de entrada

2. Roteamento de peso

3. Roteamento do caminho de acesso

4. Reescrita de caminho

5. Prioridade de correspondência

6. Estratégia de encaminhamento de DestinationRule

7. Configure a política de roteamento de acordo com o cabeçalho

8. Espelhamento de tráfego

9. Fusível

10. Injeção de falha e mecanismo de tempo limite

2. Código de estado

11. Exibição dos indicadores de monitoramento do Prometheus

         1. Instale os componentes integrados

2. Acesso à interface visual


1. Exemplo de introdução

1. Crie uma instância de bookinfo:

$ kubectl create namespace bookinfo 
$ kubectl -n bookinfo create -f samples/bookinfo/platform/kube/bookinfo.yaml 
$ kubectl -n bookinfo get po 
NOME READY STATUS RESTARTS AGE 
details-v1-5974b67c8-wclnd 1/1 Running 0 34s 
productpage -v1-64794f5db4-jsdbg 1/1 Em execução 0 33s 
avaliações-v1-c6cdf8d98-jrfrn 1/1 Em execução 0 33s 
avaliações-v1-7f6558b974-kq6kj 1/1 Em execução 0 33s 
avaliações-v2-6cb6ccd848-qdg2k 1/1 Em execução 0 34s 
comentários-v3-cc56b578-kppcx 1/1 Em execução 0 34s

2. Estrutura da instância 

O aplicativo consiste em quatro microsserviços separados. Este aplicativo imita uma categoria em uma livraria online, exibindo informações sobre um livro. A página mostrará uma descrição de um livro, detalhes do livro (ISBN, contagem de páginas, etc.) e alguns comentários sobre o livro.

O aplicativo Bookinfo é dividido em quatro microsserviços separados:

  • productpage.Este microsserviço irá chamar detailse reviewsdois microsserviços para gerar páginas.

  • details.Este microsserviço contém informações do livro.

  • reviews. Este microsserviço contém resenhas relacionadas a livros. Ele também chama ratingsmicrosserviços.

  • ratings. Este microsserviço contém informações de classificação que consistem em resenhas de livros.

reviewsExistem 3 versões de microsserviços:

  • A versão v1 não chama ratingso serviço.

  • A versão v2 chama ratingso serviço e exibe informações de classificação com ícones de 1 a 5 estrelas pretas.

  • A versão v3 chama ratingso serviço e exibe informações de classificação com 1 a 5 ícones de estrela vermelha

O Bookinfo é um aplicativo heterogêneo e vários microsserviços são escritos em diferentes linguagens. Esses serviços não dependem do Istio, mas constituem um exemplo representativo de service mesh: consiste em vários serviços, vários idiomas e reviewsserviços com várias versões.

3. Acesso

Use o ingresso para acessar o serviço productpage:

ingress-productpage.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: productpage
  namespace: bookinfo
spec:
  rules:
  - host: productpage.bookinfo.com
    http:
      paths:
      - backend:
          serviceName: productpage
          servicePort: 9080
        path: /
status:
  loadBalancer: {}

2. aquisição de tráfego de microsserviço istio

1. Página do produto de acesso ao gateway de entrada

Como obter um controle de tráfego mais refinado?

Injetar contêiner sidecar

Como injetar contêiner sidecar

usaristioctl kube-inject

$ kubectl -n bookinfo apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)

Rotule o espaço de nomes

# Rotule o namespace para que os serviços implantados neste namespace sejam injetados automaticamente no contêiner sidecar 
$ kubectl label namespace dafault istio-injection=enabled

Injetar informações do livro

$ kubectl -n bookinfo apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)

roteamento de tráfego

Realize a distribuição proporcional do tráfego que não pode ser resolvido pelo ingresso

página do produto de acesso ao gateway de entrada

productpage-gateway.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: productpage-gateway
  namespace: bookinfo
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - productpage.bookinfo.com
productpage-virtualservice.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gateway-front-tomcat
  namespace: bookinfo
spec:
  gateways:
  - productpage-gateway
  hosts:
  - productpage.bookinfo.com
  http:
  - route:
    - destination:
        host: productpage
        port:
          number: 9080

Configure o nginx e acesse-o usando a porta 80 do nome de domínio.

upstream bookinfo-productpage {
  server 192.168.0.121:32437;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  productpage.bookinfo.com;
​
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_pass http://bookinfo-productpage;
    }
}



$ nginx -s reload

Neste momento, a resolução de nome de domínio nginx da configuração de hosts locais win pode ser acessada normalmente, indicando que o tráfego entrou com sucesso na grade de serviço

2. Roteamento de peso

Requisito 1: Só quero visitarreviews-v3,所有流量都调度到v3也就是红心上面。其他不调度

# 设置一条路由规则,要求访问reviews服务的流量全部转到v3的后端
$ cat virtual-service-reviews-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  namespace: bookinfo
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v3
# 定义流量访问的目的地,v1对应review服务里面label为version=v1的pod
$ cat destination-rule-reviews.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
  namespace: bookinfo
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
[root@k8s-master bookinfo]# kubectl get po -n bookinfo  --show-labels | grep  review
reviews-v1-d49966d6b-vn5tx        2/2     Running   2          15h   app=reviews,istio.io/rev=,pod-template-hash=d49966d6b,security.istio.io/tlsMode=istio,version=v1
reviews-v2-644f5c9ddb-pjmnh       2/2     Running   2          15h   app=reviews,istio.io/rev=,pod-template-hash=644f5c9ddb,security.istio.io/tlsMode=istio,version=v2
reviews-v3-d56b49bc8-brp5k        2/2     Running   2          15h   app=reviews,istio.io/rev=,pod-template-hash=d56b49bc8,security.istio.io/tlsMode=istio,version=v3
$ kubectl apply -f virtual-service-reviews-v3.yaml 
​#
Visite a página do produto para teste. Neste momento, descobriu-se que a página foi interrompida na versão v3 e não mudará, e os requisitos foram atendidos.

Requisito 2: Realizar a seguinte distribuição de tráfego:

90% -> reivews-v1 
10% -> reviews-v2 
0% -> reviews-v3
# 同样的方式,刚才已经定义过v1、v2、v3的去向了,现在只需要增加v1和v2路由规则即可
$ cat virtual-service-reviews-90-10.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  namespace: bookinfo
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10

$ kubectl apply -f virtual-service-reviews-90-10.yaml

此时,再次访问,v3就不会出现了

3. Roteamento do caminho de acesso

Requisitos: Significa acessar diferentes páginas de acordo com diferentes caminhos

O efeito é o seguinte: 

# Defina para permitir que o tráfego externo entre na grade, edite diretamente o gateway existente
 - hosts:
    - productpage.bookinfo.com
    - bookinfo.com

# Adicione configuração de roteamento, acesse o nome de domínio de bookinfo.com através do gateway productpage-gateway, corresponda às seguintes regras e alcance apenas o nível de descoberta de serviço neste momento, se precisar configurar estratégias de alocação de roteamento para serviços específicos, você precisa para adicionar um subconjunto. 

$ kubectl -n bookinfo edit gw productpage-gateway
​
$ cat bookinfo-routing-with-uri-path.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
  namespace: bookinfo
spec:
  gateways:
  - productpage-gateway
  hosts:
    - bookinfo.com
  http:
  - name: productpage-route
    match:
    - uri:
        prefix: /productpage
    route:
    - destination:
        host: productpage
  - name: reviews-route
    match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
  - name: ratings-route
    match:
    - uri:
        prefix: /ratings
    route:
    - destination:
        host: ratings

Nova configuração do bookinfo.com no nginx:

upstream bookinfo {
  server 192.168.0.121:32437;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  bookinfo.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_pass http://bookinfo;
    }
}

Adicionar resolução de nome de domínio bookinfo.com aos hosts locais 

acesso:

http://bookinfo.com/productpage

http://bookinfo.com/ratings/1

http://bookinfo.com/reviews/1

O acesso real corresponde a:

bookinfo.com/productpage -> productpage:8090/productpage 
bookinfo.com/ratings -> avaliações:9080/avaliações 
bookinfo.com/reviews -> reviews:9080/reviews

Para realmente acessar a página productpage, já que recursos estáticos como css e js precisam ser referenciados, é necessário complementar /statico encaminhamento do caminho:

... 
  http: 
  - nome: productpage-route 
    match: 
    - uri: 
        prefixo: /productpage 
    - uri: prefixo: / 
    rota 
        estática : 
    - destino: 
        host: productpage 
...

virtualserviceA porta do serviço não está especificada na configuração, e o encaminhamento também pode ser efetivado?

Observe que, se houver apenas uma porta no serviço, ela será encaminhada automaticamente para esta porta sem especificar o número da porta explicitamente

4. Reescrita de caminho

Se você deseja realizar a função de reescrita e ocultar o nome real do caminho do URL, é muito simples:

bookinfo.com/rate -> avaliações:8090/avaliações
... 
  - nome: 
    correspondência de rota de avaliações: 
    - uri: 
        prefixo: /haha 
    reescrever: 
      uri: "/avaliações" 
    rota: 
    - destino: 
        host: avaliações 
...

5. Prioridade de correspondência

Requisito: Podemos acessar back-ends diferentes de acordo com o URL, mas não podemos levar em consideração todos os sufixos de URL. No momento, /logina correspondência encontrada ao clicar em login não é adicionada e pode haver outras coisas no futuro, portanto podemos adicionar uma regra no final da lista de regras, como a regra de encaminhamento padrão.

$ kubectl -n bookinfo edit vs bookinfo 
... 
  - name: default-route 
    route: 
    - destination: 
        host: productpage

6. Estratégia de encaminhamento de DestinationRule

A estratégia round robin é usada por padrão e os seguintes modelos de balanceamento de carga também são suportados, que podem ser DestinationRuleusados ​​para distribuir solicitações para serviços específicos ou subconjuntos de serviços.

  • Aleatório: encaminha a solicitação para uma instância aleatória

  • Ponderada: encaminha a solicitação para a instância de acordo com a porcentagem especificada

  • Menos solicitações: encaminha a solicitação para a instância com o menor número de solicitações

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-destination-rule
spec:
  host: my-svc
  trafficPolicy:     #默认的负载均衡策略模型为随机
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1  #subset1,将流量转发到具有标签 version:v1 的 deployment 对应的服务上
    labels:
      version: v1
  - name: v2  #subset2,将流量转发到具有标签 version:v2 的 deployment 对应的服务上,指定负载均衡为轮询
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
  - name: v3   #subset3,将流量转发到具有标签 version:v3 的 deployment 对应的服务上
    labels:
      version: v3

7. Configure a política de roteamento de acordo com o cabeçalho

        Por padrão, o projeto escreverá o nome do usuário no cabeçalho da solicitação do cabeçalho ao fazer login. Isso geralmente é implementado no código. Podemos usar istop para obter as informações do cabeçalho da solicitação de acordo com esse recurso.

        Requisitos: v2 é a versão oficial e v3 é a versão de teste. O usuário de teste interno testuser pode acessar a interface v3 ao fazer login e outros usuários podem acessar a interface v2 se não estiverem logados.

$ cat virtual-service-reviews-header.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  namespace: bookinfo
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: testuser
    route:
    - destination:
        host: reviews
        subset: v3
  - route:
    - destination:
        host: reviews
        subset: v2
$ kubectl apply -f virtual-service-reviews-header.yaml 
​#
Atualizar observações http://bookinfo.com/productpage

Mais tipos de correspondência compatíveis podem ser encontrados aqui.

https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest

8. Espelhamento de tráfego

fundo:

Em muitos casos, quando refatoramos o serviço ou fizemos grandes otimizações no projeto, como podemos garantir que o serviço seja robusto? Nos serviços tradicionais, podemos apenas simular a resposta dos serviços em várias circunstâncias por meio de um grande número de testes. Embora haja uma série de métodos, como teste manual, teste automatizado e teste de estresse para detectá-lo, o teste em si é um comportamento de amostra. Mesmo que o testador melhore sua amostra de teste, ele não pode mostrar totalmente um fluxo real de serviços online. forma.

O design do espelhamento de tráfego resolve esses problemas ao máximo. O foco do espelhamento de tráfego não é mais usar um pequeno número de amostras para avaliar a robustez de um serviço, mas espelhar continuamente o tráfego online para nosso ambiente de pré-lançamento sem afetar o ambiente online, para que a reconstrução O serviço final seja submetido ao impacto e teste de uma onda de tráfego real antes de entrar online, para que todos os riscos sejam expostos na véspera de entrar online. Através da exposição contínua e resolução de problemas, o serviço será o mesmo que o atendimento online na véspera de ficar online. robustez. Como o ambiente de teste usa tráfego real, ele será capaz de mostrar a diversidade, autenticidade e complexidade do tráfego. Ao mesmo tempo, o serviço de pré-lançamento também mostrará seus recursos de processamento e tratamento de exceções mais realistas.

prática

# 准备httpbin v1
$ cat httpbin-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin-v1
  namespace: bookinfo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:80", "httpbin:app"]
        
# 准备httpbin v2
$ cat httpbin-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin-v2
  namespace: bookinfo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v2
  template:
    metadata:
      labels:
        app: httpbin
        version: v2
    spec:
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:80", "httpbin:app"]
        
$ istioctl kube-inject -f httpbin-v2.yaml | kubectl create -f -     
$ istioctl kube-inject -f httpbin-v1.yaml | kubectl create -f -

# 测试访问是否正常
$ curl $(kubectl -n bookinfo get po  -l version=v1,app=httpbin -ojsonpath='{.items[0].status.podIP}')/headers
{
  "headers": {
    "Accept": "*/*",
    "Content-Length": "0",
    "Host": "10.244.0.88",
    "User-Agent": "curl/7.29.0",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "777c7af4458c5b81",
    "X-B3-Traceid": "6b98ea81618deb4f777c7af4458c5b81"
  }
}

# Service文件
$ cat httpbin-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  namespace: bookinfo
  labels:
    app: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin

$ kubectl apply -f httpbin-svc.yaml


# 创建gateway和virtualservice,由于都是使用http请求,因此,直接
# 使用bookinfo.com/httpbin访问,因此直接修改bookinfo这个virtualservice即可
$ kubectl -n bookinfo get vs
NAME                   GATEWAYS                HOSTS               
bookinfo               [bookinfo-gateway]      [bookinfo.com]       
gateway-front-tomcat   [productpage-gateway]   [productpage.bookinfo.com]
reviews                                        [reviews]     
$ kubectl -n bookinfo edit vs bookinfo
#添加httpbin的规则
...
  - match:
    - uri:
        prefix: /httpbin
    name: httpbin-route
    rewrite:
      uri: /
    route:
    - destination:
        host: httpbin
        subset: v1
...

$ cat httpbin-destinationRule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  namespace: bookinfo
spec:
  host: httpbin
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
$ kubectl apply -f httpbin-destinationRule.yaml

# 访问http://bookinfo.com/httpbin/headers,查看日志
# 此时发起请求,查看httpbin-v1的日志有刷,v2没反应,因为上面vs规则只匹配了v1,现在我们希望在访问v1的同时,流量也转发v2一份
[root@k8s-master bookinfo]# kubectl -n bookinfo logs -f httpbin-v1-66c7d456fb-hhqjv -c httpbin
[2022-01-17 09:04:00 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2022-01-17 09:04:00 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)
[2022-01-17 09:04:00 +0000] [1] [INFO] Using worker: sync
[2022-01-17 09:04:00 +0000] [9] [INFO] Booting worker with pid: 9
127.0.0.6 - - [17/Jan/2022:09:05:48 +0000] "GET /headers HTTP/1.1" 200 257 "-" "curl/7.29.0"
127.0.0.1 - - [17/Jan/2022:09:11:57 +0000] "GET //headers HTTP/1.1" 200 1133 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
127.0.0.1 - - [17/Jan/2022:09:13:07 +0000] "GET //headers HTTP/1.1" 200 1168 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"


[root@k8s-master ~]# k logs -f httpbin-v2-69b898fddc-zv2vj -c httpbin
kubectl -n bookinfo logs -f httpbin-v2-69b898fddc-zv2vj -c httpbin
[2022-01-17 09:04:15 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2022-01-17 09:04:15 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)
[2022-01-17 09:04:15 +0000] [1] [INFO] Using worker: sync
[2022-01-17 09:04:15 +0000] [9] [INFO] Booting worker with pid: 9

# 为httpbin-v1添加mirror设置,mirror点为httpbin-v2,mirror_percent表示转发100%的流量
$ kubectl -n bookinfo edit vs bookinfo
...
  - match:
    - uri:
        prefix: /httpbin
    name: httpbin-route
    rewrite:
      uri: /
    route:
    - destination:
        host: httpbin
        subset: v1
    mirror:
      host: httpbin
      subset: v2
    mirror_percent: 100
...

Neste momento, a página de acesso é o serviço v1, e a data de fundo v2 é atualizada de forma síncrona, indicando que a imagem de tráfego foi recebida. 

9. Fusível

introduzir

Disjuntor originalmente se refere ao mecanismo de desconexão do circuito quando a corrente excede o valor especificado e proteção contra curto-circuito ou proteção contra sobrecarga severa. Para sistemas de microsserviços, a fusão é particularmente importante. Quando o sistema encontra certas falhas de módulo, ele pode melhorar a disponibilidade das principais funções do sistema por meio da degradação do serviço e outros métodos, e pode lidar com falhas, picos potenciais ou outros fatores de rede desconhecidos.

preparar o ambiente

O Istio implementa o mecanismo de interrupção de circuito por meio do Envoy Proxy. O Envoy impõe a configuração da política de interrupção de circuito no nível da rede, para que não haja necessidade de configurar ou reprogramar cada aplicativo individualmente. Veja a seguir um exemplo para demonstrar como configurar o número de conexões interrompidas, número de solicitações e detecção de anomalias para serviços na grade do Istio. A essência da fusão do istio é uma limitação de corrente

  • Criar serviço httpbin

  • Criar um cliente de teste

    Definimos httpbinuma política de disjuntor para o serviço e, em seguida, criamos um cliente Java para enviar uma solicitação ao serviço de back-end para verificar se a política de disjuntor é acionada. Este cliente pode controlar o número de conexões, o número de simultaneidade e a fila de solicitações pendentes. O uso desse cliente pode acionar efetivamente a política de fusível definida na regra de destino. os clientes

    deployment yaml 内容如下:
    
    # httpbin-client-deploy.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin-client-v1
      namespace: bookinfo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin-client-v1
          version: v1
      template:
        metadata:
          labels:
            app: httpbin-client-v1
            version: v1
        spec:
          containers:
          - image: ceposta/http-envoy-client-standalone:latest
            imagePullPolicy: IfNotPresent
            name: httpbin-client
            command: ["/bin/sleep","infinity"]

    Aqui também injetaremos o Sidecar no cliente para garantir o controle do Istio sobre a interação da rede:

    $ kubectl apply -f <(istioctl kube-inject -f httpbin-client-deploy.yaml)

verificar

Primeiro tente NUM_THREADS=1criar uma conexão com um único thread ( ) e faça 5 chamadas (padrão: NUM_CALLS_PER_CLIENT=5):

$ CLIENT_POD=$(kubectl get pod -n bookinfo | grep httpbin-client | awk '{ print $1 }') 
$ kubectl -n bookinfo exec -it $CLIENT_POD -c httpbin-client -- sh -c 'export URL_UNDER_TEST=http ://httpbin:8000/get export NUM_THREADS=1 && java -jar http-client.jar'

Vamos tentar aumentar o número de threads para 2:

$ kubectl -n bookinfo exec -it $CLIENT_POD -c httpbin-client -- sh -c 'export URL_UNDER_TEST=http://httpbin:8000/get export NUM_THREADS=2 && java -jar http-client.jar'

Crie uma DestinationRule e httpbindefina uma política de disjuntor para o serviço:

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  namespace: bookinfo
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
EOF
  • maxConnections : Limite o número de conexões iniciadas para o serviço de back-end HTTP/1.1. Se esse limite for excedido, o fusível será ativado.

  • maxPendingRequests : Limita o comprimento da lista de solicitações pendentes. Se esse limite for excedido, o disjuntor será acionado.

  • maxRequestsPerConnection : limita o número de solicitações feitas ao serviço de back-end a qualquer momento HTTP/2. Se esse limite for excedido, o disjuntor será ligado.

Você pode visualizar a política de disjuntores definida no fragmento de configuração do envoy:

$ istioctl pc cluster httpbin-client-v1-56b86fb85c-vg5pp.bookinfo --fqdn httpbin.bookinfo.svc.cluster.local -ojson 
... 
        "connectTimeout": "10s", 
        "maxRequestsPerConnection": 1, 
        "circuitBreakers": { 
            "thresholds": [ 
                { 
                    "maxConnections": 1, 
                    "maxPendingRequests": 1, 
                    "maxRequests": 4294967295, 
                    "maxRetries": 4294967295 
                } 
            ] 
        }, 
...

A estratégia de fusão do istio é essencialmente um remédio no nível do proxy e não invadirá a camada de código. Se você realmente deseja evitar exceções, a melhor maneira é implementar a repetição ou tratamento de exceção por meio do código, que é mais eficaz

10. Injeção de falha e mecanismo de tempo limite

        Em um sistema com arquitetura de microsserviços, para que o sistema atenda a requisitos de alta robustez, geralmente é necessário testar o sistema quanto a erros direcionais. Por exemplo, se o sistema de pedidos e o sistema de pagamento no comércio eletrônico falharem, será um acidente de produção muito sério. Portanto, é necessário considerar uma variedade de falhas anormais no estágio inicial do projeto do sistema e projetar uma estratégia de recuperação perfeita ou elegância para cada anormalidade.A estratégia de fallback, tentar o nosso melhor para evitar a ocorrência de acidentes semelhantes, para que quando o sistema falhar, ele ainda possa operar normalmente. Nesse processo, a simulação de falha de serviço sempre foi uma tarefa muito complicada.

        Por que há injeção de falhas? Para melhorar a compatibilidade do programa, teste se o sistema está funcionando normalmente quando há um grande número de 404 e 502. O sistema não pode desligar porque alguns pedidos falharam.

        O istio fornece um mecanismo de injeção de falhas não intrusivo, permitindo que desenvolvedores e testadores simulem exceções de serviço por meio da configuração sem ajustar o programa de serviço. Atualmente, existem duas categorias:

  • abort : item opcional, falha de interrupção, configura um objeto do tipo Abort. Usado para injetar falhas de classe de exceção de solicitação. Simplificando, é usado para simular se o serviço atual tem a capacidade de processamento quando o serviço upstream retorna um código de exceção especificado para a solicitação.

  • delay : Item opcional, falha de atraso, configura um objeto do tipo Delay. Usado para injetar faltas atrasadas. Em termos leigos, é simular artificialmente o tempo de resposta dos serviços upstream para testar se o serviço atual é capaz de tolerância a falhas e recuperação de desastres em condições de alta latência.

1. Atraso e tempo limite

Atualmente, para os usuários que fazem login no luffy, as instruções para acessar os serviços são as seguintes:

página do produto --> avaliações v2 --> avaliações 
               \ 
                -> detalhes

ratingsUm atraso de 2 segundos pode ser injetado no serviço por :

# 请求ratings这个hosts时,注入2s的延迟
$ cat virtualservice-ratings-2s-delay.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
  namespace: bookinfo
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
$ kubectl apply -f virtualservice-ratings-2s-delay.yaml 
# Visite http://bookinfo.com/productpage novamente, você pode sentir claramente o atraso de 2s, a rede pode ver

Você pode visualizar a configuração do enviado correspondente:

$ istioctl pc r ratings-v1-556cfbd589-89ml4.bookinfo --name 9080 -ojson

A chamada neste momento é:

productpage --> reviews v2 - (atraso 2 segundos) -> avaliações 
               \ 
                -> detalhes

Neste ponto, adicione um tempo limite de solicitação para o serviço de revisões:

$ kubectl -n bookinfo edit vs reviews
...
  http:
  - match:
    - headers:
        end-user:
          exact: testuser
    route:
    - destination:
        host: reviews
        subset: v2
    timeout: 1s
  - route:
    - destination:
        host: reviews
        subset: v3
...
A relação de chamada desta função é:
productpage - (tempo limite de 0,5 seg) -> avaliações v2 - (atraso de 2 seg) -> avaliações 
               \ 
                -> detalhes

Neste ponto, equivale a injetar um atraso de 2s ao definir o serviço de classificação de solicitação de revisão e, em seguida, injetar um tempo limite de 1s para o usuário testuser. Se o usuário testuser for usado, um erro será relatado devido ao tempo limite. usuário não testador for usado, apenas um atraso ocorrerá e nenhuma falha ocorrerá.

Remover atraso:

$ kubectl -n bookinfo deletar vs avaliações

2. Código de estado

# 注入请求details服务时有50%返回500错误码的几率
$ cat virtualservice-details-aborted.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
  namespace: bookinfo
spec:
  hosts:
  - details
  http:
  - fault:
      abort:
        percentage:
          value: 50
        httpStatus: 500
    route:
    - destination:
        host: details
$ kubectl apply -f virtualservice-details-aborted.yaml
​
# 再次刷新查看details的状态,查看productpage的日志
$ kubectl -n bookinfo logs -f $(kubectl -n bookinfo get po -l app=productpage -ojsonpath='{.items[0].metadata.name}') -c istio-proxy
[2020-11-09T09:00:16.020Z] "GET /details/0 HTTP/1.1" 500 FI "-" "-" 0 18 0 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36" "f0387bb6-a445-922c-89ab-689dfbf548f8" "details:9080" "-" - - 10.111.67.169:9080 10.244.0.52:56552 - -

11. Exibição dos indicadores de monitoramento do Prometheus

1. Instale os componentes integrados

https://istio.io/latest/docs/ops/integrations

Grafana(图标展示)

$ kubectl apply -f samples/addons/grafana.yaml
Jaeger(分布式追踪)

$ kubectl apply -f samples/addons/jaeger.yaml
Kiali(针对istio可视化组件)

# 完善扩展组件地址:
grafana url: "http://grafana.istio.com"
tracing url: "http://jaeger.istio.com"
$ kubectl apply -f samples/addons/kiali.yaml
Prometheus(监控)

$ kubectl apply -f samples/addons/prometheus.yaml

创建kiali报错:
unable to recognize "samples/addons/kiali.yaml": no matches for kind "MonitoringDashboard" in version "monitoring.kiali.io/v1alpha1"

解决:
需要创建“CustomResourceDefinition”
cd istio-1.8.2/samples/addons/;vim kiali-crd.yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: monitoringdashboards.monitoring.kiali.io
spec:
  group: monitoring.kiali.io
  names:
    kind: MonitoringDashboard
    listKind: MonitoringDashboardList
    plural: monitoringdashboards
    singular: monitoringdashboard
  scope: Namespaced
  versions:
  - name: v1alpha1
    served: true
    storage: true

kubectl apply -f kiali-crd.yaml

参照:https://blog.csdn.net/qq_41674452/article/details/113345163

2. Acesso à interface visual

$ cat prometheus-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: prometheus
  namespace: istio-system
spec:
  rules:
  - host: prometheus.istio.com
    http:
      paths:
      - backend:
          serviceName: prometheus
          servicePort: 9090
        path: /
status:
  loadBalancer: {}
$ kubectl apply -f prometheus-ingress.yaml
[root@k8s-master warning]# kubectl get po -n istio-system -owide
NAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
grafana-75b5cddb4d-m6rph                1/1     Running   0          25m     10.244.1.216   k8s-node2   <none>           <none>
istio-egressgateway-66f8f6d69c-6mdkj    1/1     Running   3          46h     10.244.1.210   k8s-node2   <none>           <none>
istio-ingressgateway-758d8b79bd-xvxt8   1/1     Running   3          46h     10.244.1.212   k8s-node2   <none>           <none>
istiod-7556f7fddf-kjhpr                 1/1     Running   3          46h     10.244.1.209   k8s-node2   <none>           <none>
jaeger-5795c4cf99-w5lzg                 1/1     Running   0          25m     10.244.1.217   k8s-node2   <none>           <none>
kiali-6c49c7d566-n5hpr                  1/1     Running   0          8m44s   10.244.1.219   k8s-node2   <none>           <none>
prometheus-9d5676d95-67hvb              2/2     Running   0          25m     10.244.1.218   k8s-node2   <none>           <none>

Configure a resolução do nome de domínio dos hosts da máquina de serviço nginx; visualize a lista de destinos adicionados por padrão, que foram integrados por padrão:

O núcleo do qual é kubernetes-podso monitoramento. Cada serviço na grade de serviço é monitorado como um destino, e os indicadores de tráfego de serviço são fornecidos diretamente pelo contêiner sidecar.

$ kubectl -n bookinfo get po -owide 
$ curl 10.244.0.53:15020/stats/prometheus

Os dados coletados por esses indicadores de monitoramento podem ser visualizados no grafana.

$ cat grafana-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana
  namespace: istio-system
spec:
  rules:
  - host: grafana.istio.com
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: 3000
        path: /
status:
  loadBalancer: {}
​
​$
para i em $(seq 1 10000); do curl -s -o /dev/null "http://bookinfo.com/productpage"; feito

Após acessar a interface, é possível visualizar o Istio Mesh Dashboard e outros painéis relacionados, pois no arquivo de recursos do grafana, os arquivos de configuração JSON do painel de cada componente do Istio são montados na forma de ConfigMap:

$ kubectl -n istio-system get cm istio-services-grafana-dashboards 
NOME DADOS IDADE 
istio-services-grafana-dashboards 3 7d1h

jaeger

$ cat jaeger-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jaeger
  namespace: istio-system
spec:
  rules:
  - host: jaeger.istio.com
    http:
      paths:
      - backend:
          serviceName: tracing
          servicePort: 80
        path: /
status:
  loadBalancer: {}
  
$ kubectl apply -f jaeger-ingress.yaml

kiali

kiali é um serviço de análise de observabilidade

$ cat kiali-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kiali
  namespace: istio-system
spec:
  rules:
  - host: kiali.istio.com
    http:
      paths:
      - backend:
          serviceName: kiali
          servicePort: 20001
        path: /
status:
  loadBalancer: {}
$ kubectl apply -f kiali-ingress.yaml

Integra Prometheus, grafana, tracing, log,

Acho que você gosta

Origin blog.csdn.net/weixin_39855998/article/details/122530564
Recomendado
Clasificación