Как я могу удалить все модули определенных развертываний определенных пространств имен? - PullRequest
2 голосов
/ 24 сентября 2019

Я ищу способ удалить все модули определенных развертываний определенных пространств имен.Другими словами, учитывая:

x - список пространств имен
y - список развертываний

for i in x:
  for j in y:
    delete all pods of deployment j in namespace i

Я был бы рад, если бы кто-то знал, как это сделатьэто в командах bash.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 24 сентября 2019

Я верю, что что-то подобное сделает это:

#!/bin/bash

NAMESPACES=( n1 n2 n3 )
DEPLOYMENTS=( dep1 dep2 dep3 )

for i in "${NAMESPACES[@]}"
do
  for x in "${DEPLOYMENTS[@]}"
  do
     # Get the pods in the deployment
     PODS=$(kubectl -n $i get pods --no-headers | awk '{print $1}' | grep $x | tr '\n' ' ')
     kubectl -n $i delete pods $PODS
  done
done
1 голос
/ 25 сентября 2019

Вы пояснили в комментариях, что ваш вариант использования предназначен для Pods получения новых данных из ConfigMaps.Для этого вам не нужно напрямую удалять какие-либо модули.

Если ваш Pods получает данные от ConfigMaps через подключенный том, и вы не используете функцию subPath, тогда *Изменения 1008 * получаются автоматически, и вам не нужно ничего делать с вашими Deployments или Pods (возможно, вам придется подождать минуту или около того, чтобы изменения распространялись).Конечно, чтобы это работало, ваше приложение в вашем Pod должно отслеживать изменения в смонтированных файлах и включать их при появлении изменений.

Если, с другой стороны, ваши Pods извлекаютсязначения через, скажем, переменные окружения, тогда вам просто нужно перезапустить вашу Deployments, для которой есть более удобная команда kubectl, чем удаление, на самом деле вам вообще не нужно обходиться напрямую с Pods,Используйте kubectl rollout restart:

namespaces="ns1 ns2"
deployments="dep1 dep2"

for ns in ${namespaces}; do
  for dep in ${deployments}; do
    kubectl rollout restart deployment/"${dep}" --namespace="${ns}"
  done
done
1 голос
/ 25 сентября 2019

Если вам нужно «однострочное» решение, вы можете использовать расширение скобок bash вместе с метками и селекторами Kubernetes * :

eval 'kubectl delete pods --namespace='{n1,n2,n3}' --selector='{app=foo1,app=foo2,svc=svc1,svc=svc2}';'

Другой способ записать это:

eval 'kubectl delete pods -n '{n1,n2,n3}' -l '{"'app in (foo1,foo2)'","'svc in (svc1,svc2)'"}';'
1 голос
/ 24 сентября 2019

Как правило, вы делаете это с помощью селекторов меток.В метаданные шаблона вы должны поместить что-то вроде labels: {app: foo}, а затем kubectl delete pod --all-namespaces -l app=foo.

0 голосов
/ 24 сентября 2019

Для этого вы можете использовать xargs .

Например,

echo -n=namespace1 -n=namespace2 -n=namespace3 | xargs -n1 -t kubectl delete deployments dep1 dep2 dep3 

эквивалентно

kubectl delete deployments dep1 dep2 dep3 -n=namespace1 
kubectl delete deployments dep1 dep2 dep3 -n=namespace2
kubectl delete deployments dep1 dep2 dep3 -n=namespace3

Если ваша цельчтобы удалить модули, вы можете использовать

echo -n=namespace1 -n=namespace2 -n=namespace3 | xargs -n1 -t kubectl apply deployments -f dep1.yml -f dep2.yml -f dep3.yml

Это работает, потому что развертывания автоматически удаляют старые модули для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...