mirror of
https://github.com/k8snetworkplumbingwg/multus-cni.git
synced 2025-04-27 19:25:28 +00:00
Don't wait too long for an answer from API Server
If Multus plugin gets a DEL request, but the API Server is down (e.g. via 'crictl rmp'), the call takes so long, it actually never finishes. This prevents CRI-O from deleting the Pods.
This commit is contained in:
parent
4fc16b3bb8
commit
4ff141c18d
@ -82,6 +82,15 @@ func (c *ClientInfo) GetPod(namespace, name string) (*v1.Pod, error) {
|
||||
return c.Client.CoreV1().Pods(namespace).Get(context.TODO(), name, metav1.GetOptions{})
|
||||
}
|
||||
|
||||
// GetPodContext gets pod from kubernetes with context
|
||||
func (c *ClientInfo) GetPodContext(ctx context.Context, namespace, name string) (*v1.Pod, error) {
|
||||
if c.PodInformer != nil {
|
||||
logging.Debugf("GetPod for [%s/%s] will use informer cache", namespace, name)
|
||||
return listers.NewPodLister(c.PodInformer.GetIndexer()).Pods(namespace).Get(name)
|
||||
}
|
||||
return c.Client.CoreV1().Pods(namespace).Get(ctx, name, metav1.GetOptions{})
|
||||
}
|
||||
|
||||
// DeletePod deletes a pod from kubernetes
|
||||
func (c *ClientInfo) DeletePod(namespace, name string) error {
|
||||
return c.Client.CoreV1().Pods(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
|
||||
|
@ -542,7 +542,10 @@ func GetPod(kubeClient *k8s.ClientInfo, k8sArgs *types.K8sArgs, isDel bool) (*v1
|
||||
var pod *v1.Pod
|
||||
if err := wait.PollImmediate(pollDuration, shortPollTimeout, func() (bool, error) {
|
||||
var getErr error
|
||||
pod, getErr = kubeClient.GetPod(podNamespace, podName)
|
||||
// Use context with a short timeout so the call to API server doesn't take too long.
|
||||
ctx, cancel := context.WithTimeout(context.TODO(), pollDuration)
|
||||
defer cancel()
|
||||
pod, getErr = kubeClient.GetPodContext(ctx, podNamespace, podName)
|
||||
if isCriticalRequestRetriable(getErr) || retryOnNotFound(getErr) {
|
||||
return false, nil
|
||||
}
|
||||
@ -555,7 +558,9 @@ func GetPod(kubeClient *k8s.ClientInfo, k8sArgs *types.K8sArgs, isDel bool) (*v1
|
||||
// Try one more time to get the pod directly from the apiserver;
|
||||
// TODO: figure out why static pods don't show up via the informer
|
||||
// and always hit this case.
|
||||
pod, err = kubeClient.GetPod(podNamespace, podName)
|
||||
ctx, cancel := context.WithTimeout(context.TODO(), pollDuration)
|
||||
defer cancel()
|
||||
pod, err = kubeClient.GetPodContext(ctx, podNamespace, podName)
|
||||
if err != nil {
|
||||
return nil, cmdErr(k8sArgs, "error waiting for pod: %v", err)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user