Skip to content

Commit b0d58c7

Browse files
authored
[Feature] Add feature with random pod names (#809)
1 parent 7d02c5f commit b0d58c7

File tree

5 files changed

+66
-41
lines changed

5 files changed

+66
-41
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Fix PVC Resize for Single servers
88
- Add Topology support
99
- Add ARANGODB_ZONE env to Topology Managed pods
10+
- Add "Random pod names" feature
1011

1112
## [1.2.3](https://github.com/arangodb/kube-arangodb/tree/1.2.3) (2021-09-24)
1213
- Update UBI Image to 8.4

pkg/deployment/features/names.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,32 @@
1717
//
1818
// Copyright holder is ArangoDB GmbH, Cologne, Germany
1919
//
20-
// Author Adam Janikowski
2120
//
2221

2322
package features
2423

2524
func init() {
26-
registerFeature(podNames)
25+
registerFeature(shortPodNames)
26+
registerFeature(randomPodNames)
2727
}
2828

29-
var podNames = &feature{
29+
var shortPodNames = &feature{
3030
name: "short-pod-names",
3131
description: "Enable Short Pod Names",
3232
version: "3.5.0",
3333
enterpriseRequired: false,
3434
enabledByDefault: false,
3535
}
3636

37-
func PodNames() Feature {
38-
return podNames
37+
func ShortPodNames() Feature {
38+
return shortPodNames
39+
}
40+
41+
var randomPodNames = &feature{
42+
name: "random-pod-names",
43+
description: "Enables generating random pod names",
44+
}
45+
46+
func RandomPodNames() Feature {
47+
return randomPodNames
3948
}

pkg/deployment/images.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func (ib *imagesBuilder) fetchArangoDBImageIDAndVersion(ctx context.Context, cac
233233
}
234234

235235
err = k8sutil.RunWithTimeout(ctx, func(ctxChild context.Context) error {
236-
_, err := resources.CreateArangoPod(ctxChild, ib.KubeCli, ib.APIObject, ib.Spec, api.ServerGroupImageDiscovery, pod)
236+
_, _, err := resources.CreateArangoPod(ctxChild, ib.KubeCli, ib.APIObject, ib.Spec, api.ServerGroupImageDiscovery, pod)
237237
return err
238238
})
239239
if err != nil {

pkg/deployment/resources/pod_creator.go

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
//
1818
// Copyright holder is ArangoDB GmbH, Cologne, Germany
1919
//
20-
// Author Ewout Prangsma
21-
// Author Tomasz Mielech
2220
//
2321

2422
package resources
@@ -35,27 +33,22 @@ import (
3533
"sync"
3634
"time"
3735

38-
"github.com/arangodb/kube-arangodb/pkg/util"
39-
40-
"github.com/arangodb/kube-arangodb/pkg/util/errors"
41-
42-
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
43-
44-
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
45-
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces"
46-
36+
core "k8s.io/api/core/v1"
37+
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
4738
"k8s.io/apimachinery/pkg/types"
39+
"k8s.io/client-go/kubernetes"
4840

49-
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
41+
"github.com/arangodb/go-driver"
5042

51-
driver "github.com/arangodb/go-driver"
5243
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
44+
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
45+
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
46+
"github.com/arangodb/kube-arangodb/pkg/util"
5347
"github.com/arangodb/kube-arangodb/pkg/util/constants"
48+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
5449
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
55-
56-
core "k8s.io/api/core/v1"
57-
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
58-
"k8s.io/client-go/kubernetes"
50+
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
51+
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/interfaces"
5952
)
6053

6154
func versionHasAdvertisedEndpoint(v driver.Version) bool {
@@ -369,7 +362,8 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
369362

370363
newMember.PodName = k8sutil.CreatePodName(apiObject.GetName(), roleAbbr, newMember.ID, CreatePodSuffix(spec))
371364

372-
// Render pod
365+
var podCreator interfaces.PodCreator
366+
var args []string
373367
if group.IsArangod() {
374368
// Prepare arguments
375369
autoUpgrade := newMember.Conditions.IsTrue(api.ConditionTypeAutoUpgrade) || spec.Upgrade.Get().AutoUpgrade
@@ -390,16 +384,16 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
390384

391385
input := memberPod.AsInput()
392386

393-
args, err := createArangodArgs(cachedStatus, input)
387+
var err error
388+
args, err = createArangodArgs(cachedStatus, input)
394389
if err != nil {
395390
return nil, errors.WithStack(err)
396391
}
397392

398393
if err := memberPod.Validate(cachedStatus); err != nil {
399394
return nil, errors.WithStack(errors.Wrapf(err, "Validation of pods resources failed"))
400395
}
401-
402-
return RenderArangoPod(cachedStatus, apiObject, role, newMember.ID, newMember.PodName, args, &memberPod)
396+
podCreator = &memberPod
403397
} else if group.IsArangosync() {
404398
// Check image
405399
if !imageInfo.Enterprise {
@@ -455,7 +449,7 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
455449
}
456450

457451
// Prepare arguments
458-
args := createArangoSyncArgs(apiObject, spec, group, groupSpec, *newMember)
452+
args = createArangoSyncArgs(apiObject, spec, group, groupSpec, *newMember)
459453

460454
memberSyncPod := MemberSyncPod{
461455
tlsKeyfileSecretName: tlsKeyfileSecretName,
@@ -470,10 +464,23 @@ func (r *Resources) RenderPodForMember(ctx context.Context, cachedStatus inspect
470464
arangoMember: *member,
471465
}
472466

473-
return RenderArangoPod(cachedStatus, apiObject, role, newMember.ID, newMember.PodName, args, &memberSyncPod)
467+
podCreator = &memberSyncPod
474468
} else {
475469
return nil, errors.Newf("unable to render Pod")
476470
}
471+
472+
pod, err := RenderArangoPod(cachedStatus, apiObject, role, newMember.ID, newMember.PodName, args, podCreator)
473+
if err != nil {
474+
return nil, err
475+
}
476+
477+
if features.RandomPodNames().Enabled() {
478+
// The server will generate the name with some additional suffix after `-`.
479+
pod.GenerateName = pod.Name + "-"
480+
pod.Name = ""
481+
}
482+
483+
return pod, nil
477484
}
478485

479486
func (r *Resources) SelectImage(spec api.DeploymentSpec, status api.DeploymentStatus) (api.ImageInfo, bool) {
@@ -563,11 +570,12 @@ func (r *Resources) createPodForMember(ctx context.Context, spec api.DeploymentS
563570

564571
ctxChild, cancel := context.WithTimeout(ctx, k8sutil.GetRequestTimeout())
565572
defer cancel()
566-
uid, err := CreateArangoPod(ctxChild, kubecli, apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
573+
podName, uid, err := CreateArangoPod(ctxChild, kubecli, apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
567574
if err != nil {
568575
return errors.WithStack(err)
569576
}
570577

578+
m.PodName = podName
571579
m.PodUID = uid
572580
m.PodSpecVersion = template.PodSpecChecksum
573581
m.ArangoVersion = m.Image.ArangoDBVersion
@@ -610,12 +618,13 @@ func (r *Resources) createPodForMember(ctx context.Context, spec api.DeploymentS
610618

611619
ctxChild, cancel := context.WithTimeout(ctx, k8sutil.GetRequestTimeout())
612620
defer cancel()
613-
uid, err := CreateArangoPod(ctxChild, kubecli, apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
621+
podName, uid, err := CreateArangoPod(ctxChild, kubecli, apiObject, spec, group, CreatePodFromTemplate(template.PodSpec))
614622
if err != nil {
615623
return errors.WithStack(err)
616624
}
617625
log.Debug().Str("pod-name", m.PodName).Msg("Created pod")
618626

627+
m.PodName = podName
619628
m.PodUID = uid
620629
m.PodSpecVersion = template.PodSpecChecksum
621630
}
@@ -704,13 +713,14 @@ func RenderArangoPod(cachedStatus inspectorInterface.Inspector, deployment k8sut
704713
// CreateArangoPod creates a new Pod with container provided by parameter 'containerCreator'
705714
// If the pod already exists, nil is returned.
706715
// If another error occurs, that error is returned.
707-
func CreateArangoPod(ctx context.Context, kubecli kubernetes.Interface, deployment k8sutil.APIObject, deploymentSpec api.DeploymentSpec, group api.ServerGroup, pod *core.Pod) (types.UID, error) {
708-
uid, err := k8sutil.CreatePod(ctx, kubecli, pod, deployment.GetNamespace(), deployment.AsOwner())
716+
func CreateArangoPod(ctx context.Context, kubecli kubernetes.Interface, deployment k8sutil.APIObject,
717+
deploymentSpec api.DeploymentSpec, group api.ServerGroup, pod *core.Pod) (string, types.UID, error) {
718+
podName, uid, err := k8sutil.CreatePod(ctx, kubecli, pod, deployment.GetNamespace(), deployment.AsOwner())
709719
if err != nil {
710-
return "", errors.WithStack(err)
720+
return "", "", errors.WithStack(err)
711721
}
712722

713-
return uid, nil
723+
return podName, uid, nil
714724
}
715725

716726
func CreatePodFromTemplate(p *core.PodTemplateSpec) *core.Pod {
@@ -777,8 +787,11 @@ func (r *Resources) EnsurePods(ctx context.Context, cachedStatus inspectorInterf
777787
return nil
778788
}
779789

790+
// CreatePodSuffix creates additional string to glue it to the POD name.
791+
// The suffix is calculated according to the given spec, so it is easily to recognize by name if the pods have the same spec.
792+
// The additional `postSuffix` can be provided. It can be used to distinguish restarts of POD.
780793
func CreatePodSuffix(spec api.DeploymentSpec) string {
781-
if features.PodNames().Enabled() {
794+
if features.ShortPodNames().Enabled() || features.RandomPodNames().Enabled() {
782795
return ""
783796
}
784797

pkg/util/k8sutil/pods.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,16 +465,18 @@ func GetPodSpecChecksum(podSpec core.PodSpec) (string, error) {
465465
// CreatePod adds an owner to the given pod and calls the k8s api-server to created it.
466466
// If the pod already exists, nil is returned.
467467
// If another error occurs, that error is returned.
468-
func CreatePod(ctx context.Context, kubecli kubernetes.Interface, pod *core.Pod, ns string, owner metav1.OwnerReference) (types.UID, error) {
468+
func CreatePod(ctx context.Context, kubecli kubernetes.Interface, pod *core.Pod, ns string,
469+
owner metav1.OwnerReference) (string, types.UID, error) {
469470
AddOwnerRefToObject(pod.GetObjectMeta(), &owner)
470471

471-
if pod, err := kubecli.CoreV1().Pods(ns).Create(ctx, pod, metav1.CreateOptions{}); err != nil {
472+
if createdPod, err := kubecli.CoreV1().Pods(ns).Create(ctx, pod, metav1.CreateOptions{}); err != nil {
472473
if IsAlreadyExists(err) {
473-
return "", nil // If pod exists do not return any error but do not record UID (enforced rotation)
474+
return pod.GetName(), "", nil // If pod exists do not return any error but do not record UID (enforced rotation)
474475
}
475-
return "", errors.WithStack(err)
476+
477+
return "", "", errors.WithStack(err)
476478
} else {
477-
return pod.UID, nil
479+
return createdPod.GetName(), pod.UID, nil
478480
}
479481
}
480482

0 commit comments

Comments
 (0)