top of page
Foto do escritorRafael Natali

Problema de conectividade do Kubernetes Pod com Istio ativado

Um Pod do K8s pode retornar um erro ao tentar acessar a rede antes que o sidecar do Istio esteja em execução.

Muitas aplicações executam comandos ou verificações durante a inicialização, que requerem conectividade de rede. Isso pode fazer com que os contêineres de aplicação fiquem pendurados ou reiniciem se o sidecar contêiner do istio-proxy não estiver pronto.

Este artigo demonstra como usar a anotação holdApplicationUntilProxyStarts do Istio para evitar problemas de conectividade de rede.


Ambiente de Teste


O ambiente de teste foi configurado com as seguintes tecnologias:

  • macOS Monterey versão 12.3.1 Apple M1 Pro

  • minikube v1.26.0

  • K8s v1.22.7

  • Istio v1.13.3

Consulte a documentação oficial sobre como instalar o Istio


Antes de começar

1. Inicie o minikube com a versão específica do K8s:

minikube start — kubernetes-version=v1.22.7

2. Implante a aplicação de exemplo httpbin:

  • Certifique-se de que o diretório atual seja o diretório do Istio.

  • Implante a aplicação httpbin.

kubectl apply -f samples/httpbin/httpbin.yaml

3. Revise o status da aplicaçāo httpbin:


$ kubectl get services httpbin 
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
httpbin   ClusterIP   10.105.138.79   <none>        8000/TCP   32d

$ kubectl get pods httpbin-74fb669cc6-4qs24                                                                                    
NAME                       READY   STATUS    RESTARTS         AGE
httpbin-74fb669cc6-4qs24   2/2     Running   0                32d


 

Cenário 1 — Pod com erro


Agora que o Istio e o httpbin estão implantados e funcionando, podemos implantar nosso Pod pod-test-connectivity. Este é o arquivo yaml do Pod:

apiVersion: v1
kind: Pod
metadata:
  name: "pod-test-connectivity"
spec:
  containers:
  - name: wget
    image: busybox
    command: ['wget']
    args: [ '-qO-', 'httpbin:8000']
restartPolicy: Never

Este Pod executará um comando wget para fazer uma requisiçāo (GET) ao aplicativo httpbin.

Crie o Pod:

$ kubectl apply -f pod-connectivity.yaml                      
pod/pod-test-connectivity created

Verifique o status do Pod:

$ kubectl get pods pod-test-connectivity                  
NAME                    READY   STATUS   RESTARTS   AGE
pod-test-connectivity   1/2     Error    0          25s

O Pod está com status Error. Ao analisar os logs, podemos ver:

$ kubectl logs pod-test-connectivity    
wget: can't connect to remote host (10.105.138.79): Connection refused

Delete o Pod:

$ kubectl delete -f pod-connectivity.yaml                      
pod/pod-test-connectivity deleted

 

Cenário 2 — Pod funcionando corretamente


Desta vez, vamos adicionar a annotation holdApplicationUntilProxyStarts ao Pod:

apiVersion: v1
kind: Pod
metadata:
  name: "pod-test-connectivity"
  annotations:
    proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
spec:
  containers:
  - name: curl
    image: curlimages/curl
    command: ["/bin/sh"]
    args:
    - "-c"
    - |
    curl httpbin:8000
    curl -s -X POST 127.0.0.1:15000/quitquitquit #to exit the istio-proxy sidecar
restartPolicy: Never

Crie o Pod:

$ kubectl apply -f pod-connectivity.yaml                      
pod/pod-test-connectivity created

Verifique o status do Pod:

$ kubectl get pods pod-test-connectivity
NAME                    READY   STATUS      RESTARTS   AGE
pod-test-connectivity   0/2     Completed   0          7s

Agora o Pod executou o curl sem nenhum problema. Olhe os logs para confirmar:

$ kubectl logs pod-test-connectivity

...
<div class="wrapper">
        <section class="block col-12 block-desktop col-12-desktop">
            <div>
            
 <h2>Other Utilities</h2>
 
 <ul>
                    <li>
                        <a href="/forms/post">HTML form</a> that posts to /post /forms/post</li>
                </ul>
                
<br />
                <br />
            </div>
        </section>
    </div>
</div>
</body>
</html>OK                                      

Usando a anotação holdApplicationUntilProxyStarts, o Pod é impedido de executar quaisquer comandos antes que o contêiner istio-proxy esteja em execução. Portanto, quando o Pod executa o comando curl, ele já possui conectividade de rede.


Referência





0 visualização0 comentário

댓글


bottom of page