2016-05-04 7 views
2

私はfabric8を使用してKubernetesの上にクラスタ管理レイヤーを開発しています。 &サービスなどをインスタント化したときに、「公式」APIがエラーの通知を取得することが混乱しています。.jsonまたは.yaml仕様からリソースをインスタンス化するときに、Kubernetesがエラーの通知を受け取る最善の方法?

「ポッドデプロイメントコード」のセクションでは、ポッド用の機能を削除しました。 すべてが正しく行われると、コードは正常です。 は、方法deployPodWithWatchで見ることができるように、「時計」を設定することに依存しています。私は与えられたeventReceivedコールバック で行うすべてのイベントを印刷することですが、私たちの実際のコードは次のような通知をばらばらにします:

got action: 
    MODIFIED/
     Pod(apiVersion=v1, kind=Pod, metadata=...etc etc 
     status=PodStatus(
      conditions=[ 

とポッドの「状態」要素を選ぶと、私たちはPodConditionを取得するとき(status = True、type = Ready)、がポッドが正常に展開されたことを認識しています。

ハッピーパスの場合、これは素晴らしいです。実際には、変数 k8sUrlがサイトの適切なURLに設定されたコードを実行することができます。k8s インストールにはサイト固有の認証が必要ないため、コードを提供していないことを願っています。

ただし、変数imageNameを「nginBoo」に変更したとします。あなたがコードを実行した後に、名前空間「ジャンク」、 にごkubernetesコンテキストを設定し、

describe pod podboy 

を行うあなたが最後との2件のステータスメッセージが表示されますので、その名前のパブリックドッカ 画像は、ありません理由/メッセージの次の値

Reason  message 
failedSync Error syncing pod, skipping... 
failed  Failed to pull image "nginBoo": API error (500): 
      Error parsing reference: "nginBoo" 
      is not a valid repository/tag 

これらのタイプのエラーをキャッチするようにウォッチコールバックを実装したいと考えています。私は文字列「APIエラー」含まれているが、これはと思われる理由コードを見ることができると仮定し

state=ContainerState(running=null, terminated=null, 
     waiting=ContainerStateWaiting(
      reason=API error (500): 
       Error parsing reference: 
        "nginBoo" is not a valid repository/tag 

:しかし、私は見 唯一のものは、ポッドは、このようなフィールドを有することを特徴とする請求「MODIFIED」イベントです は、実装に依存するハックとなることが多いです。すべてのケースを網羅していない可能性があります。 は今後のバージョンで変更される可能性があります。 エラーがあるかどうかを調べるにはもう少し公式な方法が必要ですが、私の検索は乾燥してしまっています。だから私は謙虚に あなたのk8sエキスパートからガイダンスをリクエストしてください。ありがとう!

ポッドの展開コードは

import com.fasterxml.jackson.databind.ObjectMapper 
import scala.collection.JavaConverters._ 
import com.ning.http.client.ws.WebSocket 
import com.typesafe.scalalogging.StrictLogging 
import io.fabric8.kubernetes.api.model.{DoneableNamespace, Namespace, Pod, ReplicationController} 
import io.fabric8.kubernetes.client.DefaultKubernetesClient.ConfigBuilder 
import io.fabric8.kubernetes.client.Watcher.Action 
import io.fabric8.kubernetes.client.dsl.Resource 
import io.fabric8.kubernetes.client.{DefaultKubernetesClient, Watcher} 

object ErrorTest extends App with StrictLogging { 
    // corresponds to --insecure-skip-tls-verify=true, according to io.fabric8.kubernetes.api.model.Cluster 
    val trustCerts = true 
    val k8sUrl = "http://localhost:8080" 
    val namespaceName = "junk" // replace this with name of a namespace that you know exists 
    val imageName: String = "nginx" 

    def go(): Unit = { 
    val kube = getConnection 
    dumpNamespaces(kube) 
    deployPodWithWatch(kube, getPod(image = imageName)) 
    } 

    def deployPodWithWatch(kube: DefaultKubernetesClient, pod: Pod): Unit = { 
    kube.pods().inNamespace(namespaceName).create(pod) /* create the pod ! */ 
    val podWatchWebSocket: WebSocket =    /* create watch on the pod */ 
     kube.pods().inNamespace(namespaceName).withName(pod.getMetadata.getName).watch(getPodWatch) 
    } 

    def getPod(image: String): Pod = { 
    val jsonTemplate = 
     """ 
    |{ 
    | "kind": "Pod", 
    | "apiVersion": "v1", 
    | "metadata": { 
    | "name": "podboy", 
    | "labels": { 
    |  "app": "nginx" 
    | } 
    | }, 
    | "spec": { 
    | "containers": [ 
    |  { 
    |  "name": "podboy", 
    |  "image": "<image>", 
    |  "ports": [ 
    |  { 
    |   "containerPort": 80, 
    |   "protocol": "TCP" 
    |  } 
    |  ] 
    |  } 
    | ] 
    | } 
    |} 
     """. 
    stripMargin 
    val replacement: String = "image\": \"" + image 
    val json = jsonTemplate.replaceAll("image\": \"<image>", replacement) 
    System.out.println("json:" + json); 
    new ObjectMapper().readValue(json, classOf[Pod]) 
    } 

    def dumpNamespaces(kube: DefaultKubernetesClient): Unit = { 
    val namespaceNames = kube.namespaces().list().getItems.asScala.map { 
     (ns: Namespace) => { 
    ns.getMetadata.getName 
     } 
    } 
    System.out.println("namespaces are:" + namespaceNames); 
    } 

    def getConnection = { 
    val configBuilder = new ConfigBuilder() 
    val config = 
     configBuilder. 
    trustCerts(trustCerts). 
    masterUrl(k8sUrl). 
    build() 
    new DefaultKubernetesClient(config) 
    } 

    def getPodWatch: Watcher[Pod] = { 
    new Watcher[Pod]() { 
     def eventReceived(action: Action, watchedPod: Pod) { 
     System.out.println("got action: " + action + "/" + watchedPod) 
     } 
    } 
    } 

    go() 
} 

答えて

0

私はあなたが、イベントを見ていくつかのガイダンスのためthis topicを見るためにお勧めしたいです。一般に、各オブジェクトは、あなたが見ることができ、そのようなエラーを通知されるイベントを生成する必要があります。

+0

はい。それは理にかなっている。同僚@仕事は同じことを示唆した。ありがとう! –

関連する問題