Fabric8 手表 API 中的 Action ADD 是什么意思?我最初的理解是添加一个资源,但是我测试了一下,触发了一堆ADD Actions。
问问题
286 次
1 回答
2
是的,Fabric8 Kubernetes ClientWatchEvent
基本上映射到 Kubernetes pkg/watch/json
。所以EventType
它基本上是一个String
由 Kubernetes API 服务器作为响应发送的值,您需要处理您需要对事件类型执行的操作。它可以有以下值:ADDED
, DELETED
, MODIFIED
, BOOKMARK
, ERROR
. 当您在没有任何resourceVersion
参数的情况下启动手表时,它只会从资源版本设置为0
. 它从头开始监视,您会看到ADD
针对集群中已经存在的资源触发的操作。我认为您在使用时一定已经看到了这种行为kubectl
:
~/go/src/github.com/fabric8io/kubernetes-client/kubernetes-model/kubernetes-model-core : $ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
<These are pre existing resources listed since start of watch>
nginx-deployment-54f57cf6bf-4swvr 1/1 Running 1 < 2d5h
nginx-deployment-54f57cf6bf-4swvr-clonem6sg6 1/1 Running 1 2d5h
testpod 1/1 Running 1 2d5h
testpod-cloneb5fkz 1/1 Running 1 2d5h
<You should be able to see events after you do some changes>
testpod 1/1 Running 1 2d5h
如果您继续创建更多资源,您应该能够看到更多ADDED
操作被触发。在修改时,您也应该看到MODIFIED
事件。这些由 Kubernetes APIServer 发送,Fabric8 Kubernetes Client 只是将它们反序列化为 Java 对象。
因此,在观看时,我建议您根据您在eventReceived()
通话中的情况处理所有情况,如下所示:
// Latch for Watch termination
final CountDownLatch isWatchClosed = new CountDownLatch(1);
try (KubernetesClient client = new DefaultKubernetesClient()) {
client.pods().inNamespace(namespace).watch(new Watcher<Pod>() {
@Override
public void eventReceived(Action action, Pod pod) {
logger.log(Level.INFO, action.name() + " " + pod.getMetadata().getName());
switch (action.name()) {
case "ADDED":
logger.log(Level.INFO, pod.getMetadata().getName() + "got added");
break;
case "DELETED":
logger.log(Level.INFO, pod.getMetadata().getName() + "got deleted");
break;
case "MODIFIED":
logger.log(Level.INFO, pod.getMetadata().getName() + "got modified");
break;
default:
logger.log(Level.SEVERE, "Unrecognized event: " + action.name());
}
}
@Override
public void onClose(KubernetesClientException e) {
logger.log(Level.INFO, "Closed");
isWatchClosed.countDown();
}
});
// Wait till watch gets closed
isWatchClosed.await();
} catch (InterruptedException interruptedException) {
logger.log(Level.INFO, "Thread Interrupted!");
Thread.currentThread().interrupt();
}
我希望这能清除您对 Fabric8 的 WatchEvent 类型的理解。
于 2020-05-19T17:28:54.547 回答