Reduce ACI API calls (#282)
* Reduce ACI API calls Reduce reconcile calls and API calls in reconcile * Fix the pod status update issue * Revert a few unnecessary change
This commit is contained in:
@@ -251,15 +251,19 @@ func (s *Server) Run() error {
|
||||
}
|
||||
|
||||
log.Println("Pod watcher event is received:", ev.Type)
|
||||
reconcile := false
|
||||
switch ev.Type {
|
||||
case watch.Added:
|
||||
s.resourceManager.AddPod(ev.Object.(*corev1.Pod))
|
||||
reconcile = s.resourceManager.UpdatePod(ev.Object.(*corev1.Pod))
|
||||
case watch.Modified:
|
||||
s.resourceManager.UpdatePod(ev.Object.(*corev1.Pod))
|
||||
reconcile = s.resourceManager.UpdatePod(ev.Object.(*corev1.Pod))
|
||||
case watch.Deleted:
|
||||
s.resourceManager.DeletePod(ev.Object.(*corev1.Pod))
|
||||
reconcile = s.resourceManager.DeletePod(ev.Object.(*corev1.Pod))
|
||||
}
|
||||
|
||||
if reconcile {
|
||||
s.reconcile()
|
||||
}
|
||||
s.reconcile()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,6 +314,7 @@ func (s *Server) updateNode() {
|
||||
// reconcile is the main reconciliation loop that compares differences between Kubernetes and
|
||||
// the active provider and reconciles the differences.
|
||||
func (s *Server) reconcile() {
|
||||
log.Println("Start reconcile.")
|
||||
providerPods, err := s.provider.GetPods()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
@@ -318,7 +323,8 @@ func (s *Server) reconcile() {
|
||||
|
||||
for _, pod := range providerPods {
|
||||
// Delete pods that don't exist in Kubernetes
|
||||
if p := s.resourceManager.GetPod(pod.Namespace, pod.Name); p == nil {
|
||||
if p := s.resourceManager.GetPod(pod.Namespace, pod.Name); p == nil || p.DeletionTimestamp != nil {
|
||||
log.Printf("Deleting pod '%s'\n", pod.Name)
|
||||
if err := s.deletePod(pod); err != nil {
|
||||
log.Printf("Error deleting pod '%s': %s\n", pod.Name, err)
|
||||
continue
|
||||
@@ -329,21 +335,25 @@ func (s *Server) reconcile() {
|
||||
// Create any pods for k8s pods that don't exist in the provider
|
||||
pods := s.resourceManager.GetPods()
|
||||
for _, pod := range pods {
|
||||
p, err := s.provider.GetPod(pod.Namespace, pod.Name)
|
||||
if err != nil {
|
||||
log.Printf("Error retrieving pod '%s' from provider: %s\n", pod.Name, err)
|
||||
var providerPod *corev1.Pod
|
||||
for _, p := range providerPods {
|
||||
if p.Namespace == pod.Namespace && p.Name == pod.Name {
|
||||
providerPod = p
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if pod.DeletionTimestamp == nil && pod.Status.Phase != corev1.PodFailed && p == nil {
|
||||
if pod.DeletionTimestamp == nil && pod.Status.Phase != corev1.PodFailed && providerPod == nil {
|
||||
log.Printf("Creating pod '%s'\n", pod.Name)
|
||||
if err := s.createPod(pod); err != nil {
|
||||
log.Printf("Error creating pod '%s': %s\n", pod.Name, err)
|
||||
continue
|
||||
}
|
||||
log.Printf("Pod '%s' created.\n", pod.Name)
|
||||
}
|
||||
|
||||
// Delete pod if DeletionTimestamp set
|
||||
// Delete pod if DeletionTimestamp is set
|
||||
if pod.DeletionTimestamp != nil {
|
||||
log.Printf("Pod '%s' is pending deletion.\n", pod.Name)
|
||||
var err error
|
||||
if err = s.deletePod(pod); err != nil {
|
||||
log.Printf("Error deleting pod '%s': %s\n", pod.Name, err)
|
||||
@@ -373,25 +383,30 @@ func (s *Server) createPod(pod *corev1.Pod) error {
|
||||
return origErr
|
||||
}
|
||||
|
||||
log.Printf("Pod '%s' created.\n", pod.Name)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) deletePod(pod *corev1.Pod) error {
|
||||
var delErr error
|
||||
if delErr = s.provider.DeletePod(pod); delErr != nil && errors.IsNotFound(delErr) {
|
||||
return fmt.Errorf("Error deleting pod '%s': %s", pod.Name, delErr)
|
||||
return delErr
|
||||
}
|
||||
|
||||
if !errors.IsNotFound(delErr) {
|
||||
var grace int64
|
||||
if err := s.k8sClient.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{GracePeriodSeconds: &grace}); err != nil && errors.IsNotFound(err) {
|
||||
if errors.IsNotFound(err) {
|
||||
log.Printf("Pod '%s' doesn't exist.\n", pod.Name)
|
||||
return nil
|
||||
}
|
||||
|
||||
return fmt.Errorf("Failed to delete kubernetes pod: %s", err)
|
||||
}
|
||||
|
||||
s.resourceManager.DeletePod(pod)
|
||||
|
||||
log.Printf("Pod '%s' deleted.\n", pod.Name)
|
||||
}
|
||||
|
||||
@@ -403,17 +418,13 @@ func (s *Server) updatePodStatuses() {
|
||||
// Update all the pods with the provider status.
|
||||
pods := s.resourceManager.GetPods()
|
||||
for _, pod := range pods {
|
||||
if pod.DeletionTimestamp != nil && pod.Status.Phase == corev1.PodSucceeded {
|
||||
continue
|
||||
}
|
||||
|
||||
if pod.Status.Phase == corev1.PodFailed && pod.Status.Reason == PodStatusReason_ProviderFailed {
|
||||
if pod.Status.Phase == corev1.PodSucceeded || (pod.Status.Phase == corev1.PodFailed && pod.Status.Reason == PodStatusReason_ProviderFailed) {
|
||||
continue
|
||||
}
|
||||
|
||||
status, err := s.provider.GetPodStatus(pod.Namespace, pod.Name)
|
||||
if err != nil {
|
||||
log.Printf("Error retrieving pod '%s' status from provider: %s\n", pod.Name, err)
|
||||
log.Printf("Error retrieving pod '%s' in namespace '%s' status from provider: %s\n", pod.Name, pod.Namespace, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user