私は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()
}
はい。それは理にかなっている。同僚@仕事は同じことを示唆した。ありがとう! –