Поиск названия нового контейнера с куветтом

Я новичок в k8s, и здесь я столкнулся с небольшой проблемой.

Здесь контекст: мне нужно вызвать kubectl delete [podname] через crontask один раз в день и дождаться, пока k8s не воссоздает модуль, а затем войдите в контейнер в этом контейнере и запустите команду оболочки.

Поэтому я запрашиваю развертывание и получаю что-то вроде этого:

[email protected]:~$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
firstpod-123456789-something           1/1       Running   570        2d
secondpod-http-backend-something       1/1       Running   597        2d

то я написал сценарий bash, который удалял бы стручки в течение 5 минут. Это легкая часть.

Предположим, что я kubectl delete firstpod-123456789-something и жду, чтобы k8s воссоздали новый модуль. Этот новый блок будет иметь новое имя, например firstpod-[some random hash here]-something

Проблема в том, что мне нужно записать имя этого модуля в моем сценарии bash, чтобы затем я мог выполнить команду в этом uname -a например uname -a или что-то еще, чтобы проверить, что новый модуль работает и работает нормально.

Я просмотрел его и прочитал документы kubectl, но я не думаю, что есть простой способ сделать это через скрипт bash? Я предполагаю, что единственный способ получить название pod здесь будет через API k8s?

Я счастлив использовать любое решение на этом этапе. Интересно, есть ли способ переименовать новый модуль, когда k8s создаст новый? поэтому я мог бы grep для определенного ключевого слова?

Обратите внимание, что я не хочу egrep что-то вроде firstpod-[0-9]-something потому что это просто пример. У многих стручков много разных имен, это был всего лишь пример.

Спасибо!

Ответ 1

Вам нужно как-то пометить ваше deployment, например, мы установили app: myapp label app: myapp ниже:

apiVersion: extensions/v1beta1                                                                                                                                                                          
kind: Deployment                                                                                                                                                                                        
metadata:                                                                                                                                                                                               
  name: nginx                                                                                                                                                                                     
spec:                                                                                                                                                                                                   
  template:                                                                                                                                                                                             
    metadata:                                                                                                                                                                                           
      labels:                                                                                                                                                                                           
        app: my-app                                                                                                                                                                                
    spec:                                                                                                                                                                                               
      containers:                                                                                                                                                                                       
      - image: nginx                                                                                                                                                    
        name: nginx  

После этого вы можете получить имя модуля развертывания очень просто:

POD=$(kubectl get pod -l app=my-app -o jsonpath="{.items[0].metadata.name}")

и выполните там некоторую команду, например:

kubectl exec -ti $POD -- uname -a

Ответ 2

Как писал Николай, используйте ярлык, чтобы помочь в выборе. Тогда вы можете использовать

kubectl get pods -l app=my-app -o custom-columns=:metadata.name

Это дает вам имя модуля, который имеет метку "app = my-app"

Ответ 3

Я просто использую что-то вроде этого: kubectl exec -it -c container $(kubectl get po | grep -e '^deployment' | head -n 1 | awk '{print $1}') uname