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
Comments