0

Fabric8 手表 API 中的 Action ADD 是什么意思?我最初的理解是添加一个资源,但是我测试了一下,触发了一堆ADD Actions。

4

1 回答 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 回答