2016-02-04 11 views
9

特定のコマンドをポッドやサービスとして起動したり停止したりするのに興味があります。これらのコマンドはオプションではないので、ymlファイルのライフサイクルフックを使用することはできません。 watch APIを使ってこれらのコマンドを実行するwatcherポッドの実行を検討しました。しかし、私たちは、同じイベントを繰り返し何度も送信し続けることがないように、ウォッチAPIを使用する方法を理解することはできません。接続が開かれてから新しいイベントのみを送信するようにwatch APIに指示する方法はありますか?ステートフルなウォッチAPIが不合理であると予想される場合は、タイムスタンプまたは単調に増加するIDを渡して、既に見られたイベントを回避することは可能でしょうか?Kubernetes apiを使ったポッドイベントの表示

基本的には、apiと通信するデーモンプロセスを使ってポッドを実行しています。私たちはストリームとしてイベントを見つけることができます。しかし、ポッドが作成または削除されたときにいくつかのタスクを実行することに興味があります。

答えて

4

私は答えを見つけました。他の誰かが見ている場合。

リソースを見て、pkg/controller/frameworkpackage

でカスタムタスクとイベントを処理するためのより良いシステムが、私はそれがでクラスタあなたが行うことがある場合には

1. initiate a framework.NewInFormer 
2. Run the controller 
3. the NewInFormer loads with your custom event handlers that will call when the events occured. 
+0

こんにちは@sadlil、 私は同じ問題を抱えています。解決法の詳細については、 – Ayoub

+0

@AyoubOulaika checkout this [this](https://github.com/kubernetes/contrib/blob/master/service-loadbalancer /service_loadbalancer.go#L567) – sadlil

3

kube repoのclientを使用することをおすすめします。 lifecycle hooksがあなたのユースケースでは機能しないのはなぜですか?

+0

私はKUBEからクライアントのレポを使用しています。これは私が期待どおりに動作していません。 – sadlil

1

、このようなステップを見つけありそれgolangでこのよう:

package main 

import (
    "fmt" 
    "time" 

    "k8s.io/client-go/kubernetes" 
    "k8s.io/client-go/pkg/api/v1" 
    "k8s.io/client-go/tools/cache" 
    "k8s.io/client-go/pkg/fields" 
    "k8s.io/client-go/rest" 
) 

func main() { 
    config, err := rest.InClusterConfig() 
    if err != nil { 
     panic(err.Error()) 
    } 

    clientset, err := kubernetes.NewForConfig(config) 
    if err != nil { 
     panic(err.Error()) 
    } 

    watchlist := cache.NewListWatchFromClient(clientset.Core().RESTClient(), "pods", v1.NamespaceDefault, 
     fields.Everything()) 
    _, controller := cache.NewInformer(
     watchlist, 
     &v1.Pod{}, 
     time.Second * 0, 
     cache.ResourceEventHandlerFuncs{ 
      AddFunc: func(obj interface{}) { 
       fmt.Printf("add: %s \n", obj) 
      }, 
      DeleteFunc: func(obj interface{}) { 
       fmt.Printf("delete: %s \n", obj) 
      }, 
      UpdateFunc:func(oldObj, newObj interface{}) { 
       fmt.Printf("old: %s, new: %s \n", oldObj, newObj) 
      }, 
     }, 
    ) 
    stop := make(chan struct{}) 
    go controller.Run(stop) 
} 
+2

特定のラベルセットに一致するものだけを見ることはできますか? – pldimitrov

0

あなたはライフサイクルフックコマンドはオプションではありませんと言うが、彼らは確かにオプションです。ここから

Hook handler implementations 
Containers can access a hook by implementing and registering a handler for that hook. There are two types of hook handlers that can be implemented for Containers: 
Exec - Executes a specific command, such as pre-stop.sh, inside the cgroups and namespaces of the Container. Resources consumed by the command are counted against the Container. 
HTTP - Executes an HTTP request against a specific endpoint on the Container. 

https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

0

実行KUBEプロキシが認証なしで時計を持つすべてのイベント

kubectl proxy 

一覧をカールを使用します。

curl -s 127.0.0.1:8001/api/v1/watch/events 

イベントを見て、ポッド開始のためJQでそれをフィルタリングして停止するカールを実行します。

curl -s 127.0.0.1:8001/api/v1/watch/events | jq --raw-output \ 'if .object.reason == "Started" then . elif .object.reason == "Killing" then . else empty end | [.object.firstTimestamp, .object.reason, .object.metadata.namespace, .object.metadata.name] | @csv' 

More details

関連する問題