3

bash スクリプトでは、通常、「kubectl wait」を使用して、特定のポッド リソースの準備が整うまでブロックします。たとえば、次のようなものです。

kubectl wait --for=condition=Ready --timeout=2m -n mynamespace pod -l myselector

多くの場合、待機する必要があるポッドの正確な名前がわからないため、これはうまく機能します。「kubectl wait」を使用すると、セレクターに基づいてポッドを見つけて、準備が整うまでブロックできます。

次に、golang コードで同様のことを行う必要があります。client-goライブラリを使用して特定のポッドを名前で認証および「取得」する例を見てきました。しかし、この例を私のニーズに最適に適応させる方法についていくつか質問があります...

  1. ポッドを「Get()」できる正確な/完全な名前がわからないため、セレクターを使用してポッドを見つけることができるため、「kubectl wait」が最適です。セレクターを使用して必要なポッドを見つけられるようにするには、代わりに client-go ライブラリを使用して Get() の代わりに CoreV1().Pods().List() 呼び出しを行う必要があると思いますか?

  2. また、ポッドはすぐには存在しない可能性があり、「kubectl wait」が処理する 1 分ほど後にのみ作成される可能性があります。コードでは、ポッドが存在するまでループ/スリープして List() を実行し続ける必要がありますか?

  3. #2と同様の質問... List()がポッド名を返したら、そのポッドが「準備完了」状態になるのをgolangで「待機」する最良の方法は何ですか?回避できる場合は、スリープで醜いポーリングを実行したくありません...だから、golang の「待機」パッケージなどを使用するより良いオプションはありますか? おすすめは何ですか?

4

1 に答える 1

4

それを正確に行うのはどうkubectlですか?基本的に、List(...)を使用してフィールドセレクターに基づいてリストし、次にWatch(...)

スニペット:

...
        // List with a name field selector to get the current resourceVersion to watch from (not the object's resourceVersion)
        gottenObjList, err := o.DynamicClient.Resource(info.Mapping.Resource).Namespace(info.Namespace).List(context.TODO(), metav1.ListOptions{FieldSelector: nameSelector})
        if apierrors.IsNotFound(err) {
            return info.Object, true, nil
        }
        if err != nil {
            // TODO this could do something slightly fancier if we wish
            return info.Object, false, err
        }
        if len(gottenObjList.Items) != 1 {
            return info.Object, true, nil
        }
        gottenObj := &gottenObjList.Items[0]
        resourceLocation := ResourceLocation{
            GroupResource: info.Mapping.Resource.GroupResource(),
            Namespace:     gottenObj.GetNamespace(),
            Name:          gottenObj.GetName(),
        }
        if uid, ok := o.UIDMap[resourceLocation]; ok {
            if gottenObj.GetUID() != uid {
                return gottenObj, true, nil
            }
        }

        watchOptions := metav1.ListOptions{}
        watchOptions.FieldSelector = nameSelector
        watchOptions.ResourceVersion = gottenObjList.GetResourceVersion()
        objWatch, err := o.DynamicClient.Resource(info.Mapping.Resource).Namespace(info.Namespace).Watch(context.TODO(), watchOptions)
        if err != nil {
            return gottenObj, false, err
        }
...

✌️

于 2020-08-17T03:33:23.960 に答える