Skip to content

Commit 9dc479d

Browse files
Upgrade Sidecar Containers & Cleanup Metrics Secrets (#1046)
* The 'crunchy-prometheus' ConfigMap is now deleted when uninstall the metrics stack using the Ansible installer (specifically when specifying the 'uninstall-mertics' tag). * Add 'pgo_disable_eventing' to the default inventory file for the Ansible installer. * The available sidecar containers for the postgres pod (i.e. 'crunchy-collect and 'crunchy-pgbadger') are now patched and upgraded along with the primary and replica postgres containers during a minor upgrade.
1 parent e127e72 commit 9dc479d

File tree

6 files changed

+69
-25
lines changed

6 files changed

+69
-25
lines changed

ansible/inventory

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ pgo_client_version='v4.1.0'
7777
#pgo_disable_tls='false'
7878
#pgo_apiserver_port=8443
7979

80+
# PGO Event Settings
81+
#pgo_disable_eventing='false'
82+
8083
# Set to 'true' to assign the cluster-admin role to the PGO service account. Needed for
8184
# OCP installs to enable dynamic namespace creation (see the PGO docs for more details).
8285
#pgo_cluster_admin='false'

ansible/roles/pgo-metrics/tasks/cleanup.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,11 @@
7979
no_log: false
8080
tags:
8181
- uninstall-metrics
82+
83+
- name: Delete Prometheus ConfigMap
84+
shell: |
85+
{{ kubectl_or_oc }} delete configmap crunchy-prometheus -n {{ metrics_namespace }}
86+
ignore_errors: yes
87+
no_log: false
88+
tags:
89+
- uninstall-metrics

config/labels.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const LABEL_PGREMOVE = "pgremove"
3838
const LABEL_PVCNAME = "pvcname"
3939
const LABEL_COLLECT = "crunchy_collect"
4040
const LABEL_COLLECT_PG_USER = "ccp_monitoring"
41+
const LABEL_COLLECT_CCPIMAGE = "crunchy-collect"
4142
const LABEL_ARCHIVE = "archive"
4243
const LABEL_ARCHIVE_TIMEOUT = "archive-timeout"
4344
const LABEL_CUSTOM_CONFIG = "custom-config"
@@ -83,6 +84,7 @@ const LABEL_BACKREST_OPTS = "backrest-opts"
8384
const LABEL_BACKREST_PITR_TARGET = "backrest-pitr-target"
8485
const LABEL_BACKREST_STORAGE_TYPE = "backrest-storage-type"
8586
const LABEL_BADGER = "crunchy-pgbadger"
87+
const LABEL_BADGER_CCPIMAGE = "crunchy-pgbadger"
8688
const LABEL_BACKUP_TYPE_BASEBACKUP = "pgbasebackup"
8789
const LABEL_BACKUP_TYPE_BACKREST = "pgbackrest"
8890
const LABEL_BACKUP_TYPE_PGDUMP = "pgdump"

controller/podcontroller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (c *PodController) onUpdate(oldObj, newObj interface{}) {
122122
// have a pod coming back up from upgrade and is ready - time to kick off the next pod.
123123
if clusterInMinorUpgrade && isUpgradedPostgresPod(newpod, oldpod) {
124124
upgradeTaskName := clusterName + "-" + config.LABEL_MINOR_UPGRADE
125-
clusteroperator.ProcessNextUpgradeItem(c.PodClientset, c.PodClient, clusterName, upgradeTaskName, newpod.ObjectMeta.Namespace)
125+
clusteroperator.ProcessNextUpgradeItem(c.PodClientset, c.PodClient, pgcluster, upgradeTaskName, newpod.ObjectMeta.Namespace)
126126
}
127127

128128
//handle the case when a pg database pod is updated

kubeapi/deployment.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,22 @@ type ThingSpec struct {
106106
}
107107

108108
// PatchDeployment patches a deployment
109-
func PatchDeployment(clientset *kubernetes.Clientset, name, namespace, jsonpath, patchvalue string) error {
109+
func PatchDeployment(clientset *kubernetes.Clientset, name, namespace string, pathValueMap map[string]string) error {
110110
var patchBytes []byte
111111
var err error
112112

113-
things := make([]ThingSpec, 1)
114-
things[0].Op = "replace"
115-
things[0].Path = jsonpath
116-
things[0].Value = patchvalue
113+
things := make([]ThingSpec, 0)
114+
for path, val := range pathValueMap {
115+
things = append(things, ThingSpec{"replace", path, val})
116+
}
117117

118118
patchBytes, err = json.Marshal(things)
119119
if err != nil {
120120
log.Error("error in converting patch " + err.Error())
121121
return err
122122
}
123123

124+
log.Debug("about to patch deployment using" + string(patchBytes))
124125
_, err = clientset.AppsV1().Deployments(namespace).Patch(name, types.JSONPatchType, patchBytes)
125126
if err != nil {
126127
log.Error(err)

operator/cluster/upgrade.go

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package cluster
1717

1818
import (
1919
"strings"
20+
"strconv"
2021
"time"
2122

2223
crv1 "github.com/crunchydata/postgres-operator/apis/cr/v1"
@@ -100,7 +101,7 @@ func AddUpgrade(clientset *kubernetes.Clientset, restclient *rest.RESTClient, up
100101
publishMinorUpgradeStartedEvent(&currentTask, &cl, namespace)
101102

102103
// start the upgrade
103-
ProcessNextUpgradeItem(clientset, restclient, cl.Spec.Name, currentTask.Spec.Name, namespace)
104+
ProcessNextUpgradeItem(clientset, restclient, cl, currentTask.Spec.Name, namespace)
104105

105106
}
106107

@@ -109,7 +110,7 @@ func AddUpgrade(clientset *kubernetes.Clientset, restclient *rest.RESTClient, up
109110
// If more than one replica is in the list, they are done one at a time, once per call
110111
// with an item getting removed from the list each time. This method should get called
111112
// after the pod goes ready from the previous item, which is handled by the pod controller.
112-
func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RESTClient, clusterName, upgradeTaskName, namespace string) {
113+
func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RESTClient, cluster crv1.Pgcluster, upgradeTaskName, namespace string) {
113114

114115
log.Debug("Upgrade: ProcessNextUpgradeItem.... ", upgradeTaskName)
115116

@@ -122,15 +123,6 @@ func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RE
122123
log.Error(err)
123124
}
124125

125-
cluster := crv1.Pgcluster{}
126-
// get the cluster
127-
_, err = kubeapi.Getpgcluster(restclient, &cluster, clusterName, namespace)
128-
if err != nil {
129-
log.Error("cound not find pgcluster for minor upgrade")
130-
log.Error(err)
131-
return // make this failed upgrade with error?
132-
}
133-
134126
replicaTargets := upgradeTask.Spec.Parameters[config.LABEL_UPGRADE_REPLICA]
135127
backrestTargetName := upgradeTask.Spec.Parameters[config.LABEL_UPGRADE_BACKREST]
136128
primaryTargetName := upgradeTask.Spec.Parameters[config.LABEL_UPGRADE_PRIMARY]
@@ -155,8 +147,15 @@ func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RE
155147
//the new image tag.
156148

157149
log.Debug("About to patch replica: ", replicaTargetName)
158-
err = kubeapi.PatchDeployment(clientset, replicaTargetName, namespace, "/spec/template/spec/containers/0/image",
159-
operator.Pgo.Cluster.CCPImagePrefix+"/"+cluster.Spec.CCPImage+":"+upgradeTask.Spec.Parameters["CCPImageTag"])
150+
151+
patchMap := make(map[string]string)
152+
patchMap["/spec/template/spec/containers/0/image"] =
153+
operator.Pgo.Cluster.CCPImagePrefix+"/"+cluster.Spec.CCPImage+":"+upgradeTask.Spec.Parameters["CCPImageTag"]
154+
155+
addSidecarsToPgUpgradePatch(patchMap, cluster, operator.Pgo.Cluster.CCPImagePrefix,
156+
upgradeTask.Spec.Parameters["CCPImageTag"])
157+
158+
err = kubeapi.PatchDeployment(clientset, replicaTargetName, namespace, patchMap)
160159
if err != nil {
161160
log.Error(err)
162161
log.Error("error in doing replica minor upgrade")
@@ -176,8 +175,12 @@ func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RE
176175
log.Debug("Minor Upgrade: backrest")
177176

178177
log.Debug("About to patch backrest: ", backrestTargetName)
179-
err = kubeapi.PatchDeployment(clientset, backrestTargetName, namespace, "/spec/template/spec/containers/0/image",
180-
operator.Pgo.Cluster.CCPImagePrefix+"/pgo-backrest-repo:"+upgradeTask.Spec.Parameters["CCPImageTag"])
178+
179+
patchMap := make(map[string]string)
180+
patchMap["/spec/template/spec/containers/0/image"] =
181+
operator.Pgo.Cluster.CCPImagePrefix+"/pgo-backrest-repo:"+upgradeTask.Spec.Parameters["CCPImageTag"]
182+
183+
err = kubeapi.PatchDeployment(clientset, backrestTargetName, namespace, patchMap)
181184
if err != nil {
182185
log.Error(err)
183186
log.Error("error in doing backrest minor upgrade")
@@ -199,13 +202,20 @@ func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RE
199202
// If we don't do this now, then one of the replicas will come back up with the old container image.
200203
if autoFailEnabled {
201204
upgradedImageTag := upgradeTask.Spec.Parameters["CCPImageTag"]
202-
updateClusterCCPImage(restclient, upgradedImageTag, clusterName, namespace)
205+
updateClusterCCPImage(restclient, upgradedImageTag, cluster.Spec.Name, namespace)
203206
}
204207

205208
log.Debug("Minor Upgrade: primary")
206209
log.Debug("About to patch primary: ", primaryTargetName)
207-
err = kubeapi.PatchDeployment(clientset, primaryTargetName, namespace, "/spec/template/spec/containers/0/image",
208-
operator.Pgo.Cluster.CCPImagePrefix+"/"+cluster.Spec.CCPImage+":"+upgradeTask.Spec.Parameters["CCPImageTag"])
210+
211+
patchMap := make(map[string]string)
212+
patchMap["/spec/template/spec/containers/0/image"] =
213+
operator.Pgo.Cluster.CCPImagePrefix+"/"+cluster.Spec.CCPImage+":"+upgradeTask.Spec.Parameters["CCPImageTag"]
214+
215+
addSidecarsToPgUpgradePatch(patchMap, cluster, operator.Pgo.Cluster.CCPImagePrefix,
216+
upgradeTask.Spec.Parameters["CCPImageTag"])
217+
218+
err = kubeapi.PatchDeployment(clientset, primaryTargetName, namespace, patchMap)
209219
if err != nil {
210220
log.Error(err)
211221
log.Error("error in doing primary minor upgrade")
@@ -222,12 +232,32 @@ func ProcessNextUpgradeItem(clientset *kubernetes.Clientset, restclient *rest.RE
222232

223233
} else {
224234
// No other deployments left to upgrade, complete the upgrade
225-
completeUpgrade(clientset, restclient, &upgradeTask, autoFailEnabled, clusterName, namespace)
235+
completeUpgrade(clientset, restclient, &upgradeTask, autoFailEnabled, cluster.Spec.Name, namespace)
226236

227237
publishMinorUpgradeCompleteEvent(&upgradeTask, &cluster, namespace)
228238
}
229239
}
230240

241+
func addSidecarsToPgUpgradePatch(patchMap map[string]string, cluster crv1.Pgcluster, ccpImagePrefix,
242+
ccpImageTag string) {
243+
244+
collectEnabled, _ := strconv.ParseBool(cluster.Labels[config.LABEL_COLLECT])
245+
badgerEnabled, _ := strconv.ParseBool(cluster.Labels[config.LABEL_BADGER])
246+
247+
if collectEnabled && badgerEnabled {
248+
patchMap["/spec/template/spec/containers/1/image"] =
249+
ccpImagePrefix+"/"+config.LABEL_COLLECT_CCPIMAGE+":"+ccpImageTag
250+
patchMap["/spec/template/spec/containers/2/image"] =
251+
ccpImagePrefix+"/"+config.LABEL_BADGER_CCPIMAGE+":"+ccpImageTag
252+
} else if collectEnabled && !badgerEnabled {
253+
patchMap["/spec/template/spec/containers/1/image"] =
254+
ccpImagePrefix+"/"+config.LABEL_COLLECT_CCPIMAGE+":"+ccpImageTag
255+
} else if badgerEnabled && !collectEnabled {
256+
patchMap["/spec/template/spec/containers/1/image"] =
257+
ccpImagePrefix+"/"+config.LABEL_BADGER+":"+ccpImageTag
258+
}
259+
}
260+
231261
// completeUpgrade - makes any finishing changes required to complete the upgrade and
232262
// does final updates to the task and cluster.
233263
func completeUpgrade(clientset *kubernetes.Clientset, restclient *rest.RESTClient, upgradeTask *crv1.Pgtask, autoFail bool, clusterName, namespace string) {

0 commit comments

Comments
 (0)