Skip to content

Commit 450d61c

Browse files
authored
[Feature] Improve reconcilation time (#572)
1 parent 0cd5d30 commit 450d61c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1555
-648
lines changed

main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"strings"
3232
"time"
3333

34+
"github.com/rs/zerolog/log"
35+
3436
deploymentApi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
3537

3638
"github.com/arangodb/kube-arangodb/pkg/util"
@@ -146,6 +148,9 @@ func cmdUsage(cmd *cobra.Command, args []string) {
146148

147149
// Run the operator
148150
func cmdMainRun(cmd *cobra.Command, args []string) {
151+
// Set global logger
152+
log.Logger = logging.NewRootLogger()
153+
149154
// Get environment
150155
namespace := os.Getenv(constants.EnvOperatorPodNamespace)
151156
name := os.Getenv(constants.EnvOperatorPodName)

pkg/deployment/cleanup.go

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,54 @@
2323
package deployment
2424

2525
import (
26+
"github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector"
27+
"github.com/arangodb/kube-arangodb/pkg/util"
2628
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
29+
core "k8s.io/api/core/v1"
30+
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
2731
)
2832

2933
// removePodFinalizers removes all finalizers from all pods owned by us.
30-
func (d *Deployment) removePodFinalizers() error {
34+
func (d *Deployment) removePodFinalizers(cachedStatus inspector.Inspector) error {
3135
log := d.deps.Log
3236
kubecli := d.GetKubeCli()
33-
pods, err := d.GetOwnedPods()
34-
if err != nil {
35-
return maskAny(err)
36-
}
37-
for _, p := range pods {
38-
ignoreNotFound := true
39-
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
37+
38+
if err := cachedStatus.IteratePods(func(pod *core.Pod) error {
39+
if err := k8sutil.RemovePodFinalizers(log, kubecli, pod, pod.GetFinalizers(), true); err != nil {
4040
log.Warn().Err(err).Msg("Failed to remove pod finalizers")
41+
return err
42+
}
43+
44+
if err := kubecli.CoreV1().Pods(pod.GetNamespace()).Delete(pod.GetName(), &meta.DeleteOptions{
45+
GracePeriodSeconds: util.NewInt64(1),
46+
}); err != nil {
47+
if !k8sutil.IsNotFound(err) {
48+
log.Warn().Err(err).Msg("Failed to remove pod")
49+
return err
50+
}
4151
}
52+
return nil
53+
}, inspector.FilterPodsByLabels(k8sutil.LabelsForDeployment(d.GetName(), ""))); err != nil {
54+
return err
4255
}
56+
4357
return nil
4458
}
4559

4660
// removePVCFinalizers removes all finalizers from all PVCs owned by us.
47-
func (d *Deployment) removePVCFinalizers() error {
61+
func (d *Deployment) removePVCFinalizers(cachedStatus inspector.Inspector) error {
4862
log := d.deps.Log
4963
kubecli := d.GetKubeCli()
50-
pvcs, err := d.GetOwnedPVCs()
51-
if err != nil {
52-
return maskAny(err)
53-
}
54-
for _, p := range pvcs {
55-
ignoreNotFound := true
56-
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
64+
65+
if err := cachedStatus.IteratePersistentVolumeClaims(func(pvc *core.PersistentVolumeClaim) error {
66+
if err := k8sutil.RemovePVCFinalizers(log, kubecli, pvc, pvc.GetFinalizers(), true); err != nil {
5767
log.Warn().Err(err).Msg("Failed to remove PVC finalizers")
68+
return err
5869
}
70+
return nil
71+
}, inspector.FilterPersistentVolumeClaimsByLabels(k8sutil.LabelsForDeployment(d.GetName(), ""))); err != nil {
72+
return err
5973
}
74+
6075
return nil
6176
}

pkg/deployment/context_impl.go

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import (
2828
"net"
2929
"strconv"
3030

31+
"github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector"
32+
3133
"k8s.io/apimachinery/pkg/api/errors"
3234

3335
"github.com/arangodb/arangosync-client/client"
@@ -275,7 +277,7 @@ func (d *Deployment) DeletePod(podName string) error {
275277

276278
// CleanupPod deletes a given pod with force and explicit UID.
277279
// If the pod does not exist, the error is ignored.
278-
func (d *Deployment) CleanupPod(p v1.Pod) error {
280+
func (d *Deployment) CleanupPod(p *v1.Pod) error {
279281
log := d.deps.Log
280282
podName := p.GetName()
281283
ns := p.GetNamespace()
@@ -344,24 +346,6 @@ func (d *Deployment) GetPv(pvName string) (*v1.PersistentVolume, error) {
344346
return nil, maskAny(err)
345347
}
346348

347-
// GetOwnedPods returns a list of all pods owned by the deployment.
348-
func (d *Deployment) GetOwnedPods() ([]v1.Pod, error) {
349-
// Get all current pods
350-
log := d.deps.Log
351-
pods, err := d.deps.KubeCli.CoreV1().Pods(d.apiObject.GetNamespace()).List(k8sutil.DeploymentListOpt(d.apiObject.GetName()))
352-
if err != nil {
353-
log.Debug().Err(err).Msg("Failed to list pods")
354-
return nil, maskAny(err)
355-
}
356-
myPods := make([]v1.Pod, 0, len(pods.Items))
357-
for _, p := range pods.Items {
358-
if d.isOwnerOf(&p) {
359-
myPods = append(myPods, p)
360-
}
361-
}
362-
return myPods, nil
363-
}
364-
365349
// GetOwnedPVCs returns a list of all PVCs owned by the deployment.
366350
func (d *Deployment) GetOwnedPVCs() ([]v1.PersistentVolumeClaim, error) {
367351
// Get all current PVCs
@@ -414,20 +398,6 @@ func (d *Deployment) DeleteTLSKeyfile(group api.ServerGroup, member api.MemberSt
414398
return nil
415399
}
416400

417-
// GetTLSCA returns the TLS CA certificate in the secret with given name.
418-
// Returns: publicKey, privateKey, ownerByDeployment, error
419-
func (d *Deployment) GetTLSCA(secretName string) (string, string, bool, error) {
420-
ns := d.apiObject.GetNamespace()
421-
secrets := d.deps.KubeCli.CoreV1().Secrets(ns)
422-
owner := d.apiObject.AsOwner()
423-
cert, priv, isOwned, err := k8sutil.GetCASecret(secrets, secretName, &owner)
424-
if err != nil {
425-
return "", "", false, maskAny(err)
426-
}
427-
return cert, priv, isOwned, nil
428-
429-
}
430-
431401
// DeleteSecret removes the Secret with given name.
432402
// If the secret does not exist, the error is ignored.
433403
func (d *Deployment) DeleteSecret(secretName string) error {
@@ -470,8 +440,8 @@ func (d *Deployment) GetAgencyData(ctx context.Context, i interface{}, keyParts
470440
return err
471441
}
472442

473-
func (d *Deployment) RenderPodForMember(spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) {
474-
return d.resources.RenderPodForMember(spec, status, memberID, imageInfo)
443+
func (d *Deployment) RenderPodForMember(cachedStatus inspector.Inspector, spec api.DeploymentSpec, status api.DeploymentStatus, memberID string, imageInfo api.ImageInfo) (*v1.Pod, error) {
444+
return d.resources.RenderPodForMember(cachedStatus, spec, status, memberID, imageInfo)
475445
}
476446

477447
func (d *Deployment) SelectImage(spec api.DeploymentSpec, status api.DeploymentStatus) (api.ImageInfo, bool) {

pkg/deployment/deployment.go

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import (
2929
"sync/atomic"
3030
"time"
3131

32+
"github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector"
33+
3234
"github.com/arangodb/kube-arangodb/pkg/util/arangod"
3335

3436
"github.com/arangodb/arangosync-client/client"
@@ -84,7 +86,7 @@ type deploymentEvent struct {
8486
const (
8587
deploymentEventQueueSize = 256
8688
minInspectionInterval = 250 * util.Interval(time.Millisecond) // Ensure we inspect the generated resources no less than with this interval
87-
maxInspectionInterval = 30 * util.Interval(time.Second) // Ensure we inspect the generated resources no less than with this interval
89+
maxInspectionInterval = 10 * util.Interval(time.Second) // Ensure we inspect the generated resources no less than with this interval
8890
)
8991

9092
// Deployment is the in process state of an ArangoDeployment.
@@ -151,10 +153,10 @@ func New(config Config, deps Dependencies, apiObject *api.ArangoDeployment) (*De
151153
go d.resources.RunDeploymentHealthLoop(d.stopCh)
152154
go d.resources.RunDeploymentShardSyncLoop(d.stopCh)
153155
}
154-
if config.AllowChaos {
155-
d.chaosMonkey = chaos.NewMonkey(deps.Log, d)
156-
go d.chaosMonkey.Run(d.stopCh)
157-
}
156+
//if config.AllowChaos {
157+
// d.chaosMonkey = chaos.NewMonkey(deps.Log, d)
158+
// go d.chaosMonkey.Run(d.stopCh)
159+
//}
158160

159161
return d, nil
160162
}
@@ -199,16 +201,6 @@ func (d *Deployment) run() {
199201
log := d.deps.Log
200202

201203
if d.GetPhase() == api.DeploymentPhaseNone {
202-
// Create secrets
203-
if err := d.resources.EnsureSecrets(); err != nil {
204-
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create secrets", err, d.GetAPIObject()))
205-
}
206-
207-
// Create services
208-
if err := d.resources.EnsureServices(); err != nil {
209-
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create services", err, d.GetAPIObject()))
210-
}
211-
212204
// Create service monitor
213205
if d.haveServiceMonitorCRD {
214206
if err := d.resources.EnsureServiceMonitor(); err != nil {
@@ -221,16 +213,6 @@ func (d *Deployment) run() {
221213
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create initial members", err, d.GetAPIObject()))
222214
}
223215

224-
// Create PVCs
225-
if err := d.resources.EnsurePVCs(); err != nil {
226-
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create persistent volume claims", err, d.GetAPIObject()))
227-
}
228-
229-
// Create pods
230-
if err := d.resources.EnsurePods(); err != nil {
231-
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create pods", err, d.GetAPIObject()))
232-
}
233-
234216
// Create Pod Disruption Budgets
235217
if err := d.resources.EnsurePDBs(); err != nil {
236218
d.CreateEvent(k8sutil.NewErrorEvent("Failed to create pdbs", err, d.GetAPIObject()))
@@ -244,22 +226,22 @@ func (d *Deployment) run() {
244226
log.Info().Msg("start running...")
245227
}
246228

247-
if err := d.resources.EnsureAnnotations(); err != nil {
248-
log.Warn().Err(err).Msg("unable to update annotations")
249-
}
250-
251229
d.lookForServiceMonitorCRD()
252230

253231
inspectionInterval := maxInspectionInterval
254232
for {
255233
select {
256234
case <-d.stopCh:
235+
cachedStatus, err := inspector.NewInspector(d.GetKubeCli(), d.GetNamespace())
236+
if err != nil {
237+
log.Error().Err(err).Msg("Unable to get resources")
238+
}
257239
// Remove finalizers from created resources
258240
log.Info().Msg("Deployment removed, removing finalizers to prevent orphaned resources")
259-
if err := d.removePodFinalizers(); err != nil {
241+
if err := d.removePodFinalizers(cachedStatus); err != nil {
260242
log.Warn().Err(err).Msg("Failed to remove Pod finalizers")
261243
}
262-
if err := d.removePVCFinalizers(); err != nil {
244+
if err := d.removePVCFinalizers(cachedStatus); err != nil {
263245
log.Warn().Err(err).Msg("Failed to remove PVC finalizers")
264246
}
265247
// We're being stopped.

pkg/deployment/deployment_finalizers.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ package deployment
2525
import (
2626
"context"
2727

28+
"github.com/arangodb/kube-arangodb/pkg/deployment/resources/inspector"
29+
2830
"github.com/rs/zerolog"
2931
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3032

@@ -47,7 +49,7 @@ func ensureFinalizers(depl *api.ArangoDeployment) {
4749
}
4850

4951
// runDeploymentFinalizers goes through the list of ArangoDeployoment finalizers to see if they can be removed.
50-
func (d *Deployment) runDeploymentFinalizers(ctx context.Context) error {
52+
func (d *Deployment) runDeploymentFinalizers(ctx context.Context, cachedStatus inspector.Inspector) error {
5153
log := d.deps.Log
5254
var removalList []string
5355

@@ -60,7 +62,7 @@ func (d *Deployment) runDeploymentFinalizers(ctx context.Context) error {
6062
switch f {
6163
case constants.FinalizerDeplRemoveChildFinalizers:
6264
log.Debug().Msg("Inspecting 'remove child finalizers' finalizer")
63-
if err := d.inspectRemoveChildFinalizers(ctx, log, updated); err == nil {
65+
if err := d.inspectRemoveChildFinalizers(ctx, log, updated, cachedStatus); err == nil {
6466
removalList = append(removalList, f)
6567
} else {
6668
log.Debug().Err(err).Str("finalizer", f).Msg("Cannot remove finalizer yet")
@@ -79,11 +81,11 @@ func (d *Deployment) runDeploymentFinalizers(ctx context.Context) error {
7981

8082
// inspectRemoveChildFinalizers checks the finalizer condition for remove-child-finalizers.
8183
// It returns nil if the finalizer can be removed.
82-
func (d *Deployment) inspectRemoveChildFinalizers(ctx context.Context, log zerolog.Logger, depl *api.ArangoDeployment) error {
83-
if err := d.removePodFinalizers(); err != nil {
84+
func (d *Deployment) inspectRemoveChildFinalizers(ctx context.Context, log zerolog.Logger, depl *api.ArangoDeployment, cachedStatus inspector.Inspector) error {
85+
if err := d.removePodFinalizers(cachedStatus); err != nil {
8486
return maskAny(err)
8587
}
86-
if err := d.removePVCFinalizers(); err != nil {
88+
if err := d.removePVCFinalizers(cachedStatus); err != nil {
8789
return maskAny(err)
8890
}
8991

0 commit comments

Comments
 (0)