Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

statefulset: Use stateful sets for postgres deployments (PROJQUAY-6672) #980

Closed
wants to merge 13 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 1 addition & 8 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,5 @@ jobs:
uses: actions/checkout@v3
- name: OS Dependencies
run: apt-get update && apt-get install -y tar make gcc
- name: Install Kubebuilder
run: |
os=$(go env GOOS)
arch=$(go env GOARCH)
curl -L https://github.com/kubernetes-sigs/kubebuilder/releases/download/v2.3.1/kubebuilder_2.3.1_${os}_${arch}.tar.gz | tar -xz -C /tmp/
mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
- name: Tests
run: go test -v ./...
run: make test
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ all: manager

# Run tests
test: manifests generate fmt vet envtest ## Run tests.
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test ./... -coverprofile cover.out
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -v ./... -coverprofile cover.out

test-e2e:
mkdir -p ./bin
Expand Down Expand Up @@ -107,7 +107,7 @@ $(CONTROLLER_GEN): $(LOCALBIN)
.PHONY: envtest
envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
$(ENVTEST): $(LOCALBIN)
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@v0.0.0-20230216140739-c98506dc3b8e

# This target called from the prepare-release github action.
# CHANNEL - operator channel (eg. stable-3.6, candidate-3.9)
Expand Down
70 changes: 55 additions & 15 deletions controllers/quay/features.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,8 +410,8 @@ func (r *QuayRegistryReconciler) checkNeedsPostgresUpgradeForComponent(
ctx context.Context, qctx *quaycontext.QuayRegistryContext, quay *v1.QuayRegistry, component v1.ComponentKind,
) error {
componentInfo := map[v1.ComponentKind]struct {
deploymentSuffix string
upgradeField *bool
resourceSuffix string
upgradeField *bool
}{
v1.ComponentClairPostgres: {"clair-postgres", &qctx.NeedsClairPgUpgrade},
v1.ComponentPostgres: {"quay-database", &qctx.NeedsPgUpgrade},
Expand All @@ -422,23 +422,63 @@ func (r *QuayRegistryReconciler) checkNeedsPostgresUpgradeForComponent(
return fmt.Errorf("invalid component kind: %s", component)
}

deploymentName := fmt.Sprintf("%s-%s", quay.GetName(), info.deploymentSuffix)
resourceName := fmt.Sprintf("%s-%s", quay.GetName(), info.resourceSuffix)
r.Log.Info(fmt.Sprintf("getting %s version", component))

postgresDeployment := &appsv1.Deployment{}
if err := r.Client.Get(
ctx,
types.NamespacedName{
Name: deploymentName,
Namespace: quay.GetNamespace(),
},
postgresDeployment,
); err != nil {
r.Log.Info(fmt.Sprintf("%s deployment not found, skipping", component))
return nil
var deployedImageName string

if component == v1.ComponentClairPostgres {
statefulSet := &appsv1.StatefulSet{}
err := r.Client.Get(
ctx,
types.NamespacedName{
Name: resourceName,
Namespace: quay.GetNamespace(),
},
statefulSet,
)
if err != nil {
if !errors.IsNotFound(err) {
return err
}
// NOTE: Check for Deployment to support migration from Deployment to StatefulSet.
// This ensures compatibility with both old and new setups during the upgrade process.
deployment := &appsv1.Deployment{}
err = r.Client.Get(
ctx,
types.NamespacedName{
Name: resourceName,
Namespace: quay.GetNamespace(),
},
deployment,
)
if err != nil {
if errors.IsNotFound(err) {
r.Log.Info(fmt.Sprintf("%s statefulset and deployment not found, skipping", component))
return nil
}
return err
}
deployedImageName = deployment.Spec.Template.Spec.Containers[0].Image
} else {
deployedImageName = statefulSet.Spec.Template.Spec.Containers[0].Image
}
} else {
deployment := &appsv1.Deployment{}
if err := r.Client.Get(
ctx,
types.NamespacedName{
Name: resourceName,
Namespace: quay.GetNamespace(),
},
deployment,
); err != nil {
r.Log.Info(fmt.Sprintf("%s deployment not found, skipping", component))
return nil
}
deployedImageName = deployment.Spec.Template.Spec.Containers[0].Image
}

deployedImageName := postgresDeployment.Spec.Template.Spec.Containers[0].Image
r.Log.Info(fmt.Sprintf("%s deployment found", component), "image", deployedImageName)

expectedImage, err := kustomize.ComponentImageFor(component)
Expand Down
21 changes: 19 additions & 2 deletions controllers/quay/quayregistry_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,12 +246,16 @@ func (r *QuayRegistryReconciler) checkPostgresUpgradeStatus(
if job.Status.Succeeded == 1 {
log.Info(fmt.Sprintf("%s upgrade complete", jobName))
var oldPostgresDeploymentName string
var postgresDeploymentName string
if jobName == clairPostgresUpgradeJobName {
oldPostgresDeploymentName = fmt.Sprintf("%s-%s", quay.GetName(), "clair-postgres-old")
postgresDeploymentName = fmt.Sprintf("%s-%s", quay.GetName(), "clair-postgres")
} else {
oldPostgresDeploymentName = fmt.Sprintf("%s-%s", quay.GetName(), "quay-database-old")
postgresDeploymentName = fmt.Sprintf("%s-%s", quay.GetName(), "quay-database")
}
oldPostgresDeployment := &appsv1.Deployment{}
postgresDeployment := &appsv1.Deployment{}
if err := r.Client.Get(
ctx,
types.NamespacedName{
Expand All @@ -263,7 +267,20 @@ func (r *QuayRegistryReconciler) checkPostgresUpgradeStatus(
r.Log.Info(fmt.Sprintf("%s deployment not found, skipping", oldPostgresDeploymentName))
continue
}

if err := r.Client.Get(
ctx,
types.NamespacedName{
Name: postgresDeploymentName,
Namespace: quay.GetNamespace(),
},
postgresDeployment,
); err != nil {
r.Log.Info(fmt.Sprintf("%s deployment not found, skipping", postgresDeploymentName))
continue
}
if err := r.Client.Delete(ctx, postgresDeployment); err != nil {
r.Log.Error(err, fmt.Sprintf("%s deployment could not be deleted", postgresDeploymentName))
}
// Remove owner reference
obj, err := v1.RemoveOwnerReference(quay, oldPostgresDeployment)
if err != nil {
Expand Down Expand Up @@ -548,7 +565,7 @@ func (r *QuayRegistryReconciler) Reconcile(ctx context.Context, req ctrl.Request
v1.ConditionTypeRolloutBlocked,
metav1.ConditionTrue,
v1.ConditionReasonPostgresUpgradeFailed,
fmt.Sprintf("error checking for pg upgrade: %s", err),
fmt.Sprintf("error checking for clair pg upgrade: %s", err),
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
apiVersion: apps/v1
kind: Deployment
kind: StatefulSet
metadata:
name: clair-postgres
spec:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ resources:
- ./clair-pg-old.persistentvolumeclaim.yaml
- ./clair-pg-old.deployment.yaml
patchesStrategicMerge:
- ./clair-pg.deployment.patch.yaml
- ./clair-pg.statefulset.patch.yaml
4 changes: 2 additions & 2 deletions kustomize/components/clairpostgres/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Clair component adds Clair v4 security scanner and its database.
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
resources:
resources:
- ./postgres.serviceaccount.yaml
- ./postgres.persistentvolumeclaim.yaml
- ./postgres.deployment.yaml
- ./postgres.statefulset.yaml
- ./postgres.service.yaml
- ./clair-postgres-conf-sample.configmap.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
apiVersion: apps/v1
kind: Deployment
kind: StatefulSet
metadata:
name: clair-postgres
labels:
quay-component: clair-postgres
annotations:
quay-component: clair-postgres
spec:
serviceName: clair-postgres
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
quay-component: clair-postgres
Expand Down Expand Up @@ -57,3 +56,4 @@ spec:
requests:
cpu: 500m
memory: 2Gi
volumeClaimTemplates: []
2 changes: 2 additions & 0 deletions pkg/kustomize/kustomize.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ func ModelFor(gvk schema.GroupVersionKind) client.Object {
return &prometheusv1.ServiceMonitor{}
case schema.GroupVersionKind{Group: "monitoring.coreos.com", Version: "v1", Kind: "PrometheusRule"}.String():
return &prometheusv1.PrometheusRule{}
case schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "StatefulSet"}.String():
return &apps.StatefulSet{}
default:
panic(fmt.Sprintf("Missing model for GVK %s", gvk.String()))
}
Expand Down
Loading