Ah. O mais fácil é evitar a exclusão do serviço antes de cada implantação. Na minha experiência, os serviços tendem a ser muito duradouros; eles fornecem uma maneira boa e fixa de se referir a coisas sem ter que se preocupar com valores dinâmicos para portas, ips, dns, etc.
Na especificação de serviço Kibana, remova a entrada nodePort da configuração da porta, para que o serviço possa fazer sua própria coisa; uma coisa a menos para pensar. Não defina valores para loadBalancerIP ou externalIPs. As mesmas regras se aplicam aos outros serviços.
Para os arquivos de configuração da pilha ELK (não me lembro da aparência deles), consulte outros componentes pelos nomes de serviço: não é necessário usar IPs codificados ou algo do tipo. (Não faço ideia se você estava fazendo isso, mas apenas no caso.)
Permite que os serviços sejam criados; obtenha o IP externo do balanceador de carga e conecte-o à sua configuração de DNS.
Você pode continuar usando namespaces se preferir fazer as coisas, mas não excluir todo o namespace para limpar os componentes Deployments for ELK.
Divida sua especificação de pilha ELK em arquivos separados para Implantações e Serviços (tecnicamente, não tenho certeza se isso é necessário; talvez você consiga se safar), para poder usar:
kubectl delete -f logging-deployments.yaml
kubectl apply -f logging-deployments.yaml
ou um comando similar para atualizar as implantações sem incomodar os serviços.
Se você precisar (ou preferir) excluir a pilha ELK de outra maneira antes de criar uma nova, também poderá usar:
kubectl -n logging delete deployments --all
para excluir todas as implantações no namespace de registro. Para mim, essa opção parece um pouco mais perigosa do que precisa ser.
Uma segunda opção seria:
kubectl delete deployments kibana
kubectl delete deployments elasticsearch
kubectl delete deployments logstash
Se você não se importa com a digitação extra
Outra opção seria adicionar um novo marcador, algo como:
role: application
ou
stack: ELK
para cada uma das especificações de implantação. Do que você pode usar:
kubectl delete deployments -l stack=ELK
para limitar o escopo da exclusão ... mas, novamente, isso parece perigoso.
A minha preferência seria, a menos que houvesse alguma razão imperiosa para não dividir a configuração em arquivos > 2 e usar:
kubectl create -f svc-logging.yaml
kubectl create -f deploy-logging.yaml
kubectl delete -f deploy-logging.yaml
kubectl apply -f deploy-logging.yaml
...
etc
para ajudar a evitar quaisquer acidentes induzidos por erros tipográficos.
Eu desmembramento um pouco mais, com uma pasta separada para cada componente que contém uma implantação e um serviço, aninhados juntos como faz sentido (mais fácil de manter em um repositório, mais fácil se mais de uma pessoa precisar fazer alterações em componentes relacionados, mas separados), e geralmente com scripts bash create / destroy para fornecer algo como documentação ... mas você tem a idéia.
Configure desta forma, você deve ser capaz de atualizar qualquer um ou todos os componentes de implantação sem quebrar sua configuração de DNS / balanceamento de carga.
(Claro, isso tudo supõe que ter tudo em um arquivo não é um tipo de exigência difícil ... nesse caso, não tenho uma boa resposta para você do alto da minha cabeça. .)