1- import { makeInformer , ADD , DELETE , UPDATE , KubernetesObject } from '@kubernetes/client-node' ;
1+ import { makeInformer , ADD , DELETE , ERROR , UPDATE , KubernetesObject } from '@kubernetes/client-node' ;
22import { logger } from '../../../common/logger' ;
33import { WorkloadKind } from '../../types' ;
44import { podWatchHandler , podDeletedHandler } from './pod' ;
@@ -12,6 +12,7 @@ import { statefulSetWatchHandler } from './stateful-set';
1212import { k8sApi , kubeConfig } from '../../cluster' ;
1313import * as kubernetesApiWrappers from '../../kuberenetes-api-wrappers' ;
1414import { IWorkloadWatchMetadata , FALSY_WORKLOAD_NAME_MARKER } from './types' ;
15+ import { ECONNRESET_ERROR_CODE } from '../types' ;
1516
1617/**
1718 * This map is used in combination with the kubernetes-client Informer API
@@ -109,6 +110,20 @@ export function setupInformer(namespace: string, workloadKind: WorkloadKind) {
109110
110111 const informer = makeInformer < KubernetesObject > ( kubeConfig , namespacedEndpoint , loggedListMethod ) ;
111112
113+ informer . on ( ERROR , ( err ) => {
114+ // Types from client library insists that callback is of type KubernetesObject
115+ if ( ( err as any ) . code === ECONNRESET_ERROR_CODE ) {
116+ logger . debug ( `informer ${ ECONNRESET_ERROR_CODE } occurred, restarting informer` ) ;
117+
118+ // Restart informer after 1sec
119+ setTimeout ( ( ) => {
120+ informer . start ( ) ;
121+ } , 1000 ) ;
122+ } else {
123+ logger . error ( { err } , 'unexpected informer error event occurred' ) ;
124+ }
125+ } ) ;
126+
112127 for ( const informerVerb of Object . keys ( workloadMetadata . handlers ) ) {
113128 informer . on ( informerVerb , async ( watchedWorkload ) => {
114129 try {
0 commit comments