web-dev-qa-db-ja.com

kubectlを使用して新しいポッドの名前を見つける

私はk8sが初めてで、ここで小さな問題に直面しています。

コンテキストは次のとおりです。1日に1回crontaskを介してkubectl delete [podname]を呼び出し、k8sがポッドを再作成するまで待機してから、そのポッドのコンテナーにログインし、シェルコマンドを実行する必要があります。

だから私は展開をクエリし、次のようなものを得ます:

user@Host:~$ 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

次に、5分間隔でポッドを削除するbashスクリプトを作成しました。それは簡単な部分です。

kubectl delete firstpod-123456789-somethingを呼び出し、k8sが新しいポッドを再作成するのを待つとします。その新しいポッドにはfirstpod-[some random hash here]-somethingのような新しい名前が付けられます

問題は、bashスクリプトでそのポッドの名前をキャプチャする必要があるため、そのポッドでuname -aなどのコマンドを実行し、新しいポッドが正常に動作していることを確認できるようにすることです。

グーグルでkubectlのドキュメントを読みましたが、bashスクリプト経由でこれを行う簡単な方法はないと思いますか?ここでポッド名を取得する唯一の方法はk8s APIを使用することだと思いますか?

この時点で任意のソリューションを使用できてうれしいです。 k8sが新しいポッドをスポーンするときに、新しいポッドの名前を変更する方法はあるのだろうか?特定のキーワードをgrepできますか?

firstpod-[0-9]-somethingのようなものをegrepしたくないことに注意してください。これは単なる例です。多くのポッドにはさまざまな名前がありますが、これはほんの一例です。

ありがとう!

19
Bluz

何らかの方法でdeploymentにラベルを付ける必要があります。たとえば、ラベル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
36
Nickolay

Nickolayが書いたように、選択に役立つラベルを使用してください。その後、使用することができます

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

これにより、ラベル「app = my-app」を持つポッドの名前が取得されます

5
P.Stromberg