Skip to content

Commit b4b2d8f

Browse files
author
Jonathan S. Katz
committed
Do not require pgBackRest Secret for cluster creation
This changes the methodology for how a pgBackRest Secret is generated such that it is no longer required at the time a cluster is created vis-a-vis the pgcluster custom resource. Instead, the Operator follows this heuristic: - If a pgBackRest Secret is provided, this Secret is used - If the pgBackRest Secret is partially filled out, the missing pieces are filled in - If no Secret is provided, a Secret is generated. Note that if you want to use S3 or a S3-like storage system, you will need to still create the Secret with the appropriate S3 credentials. This also updates various documentation to show the easier workflow. Issue: [ch9451]
1 parent 9e75d66 commit b4b2d8f

File tree

7 files changed

+210
-159
lines changed

7 files changed

+210
-159
lines changed

docs/content/custom-resources/_index.md

Lines changed: 2 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -255,68 +255,7 @@ create additional secrets.
255255
The following guide goes through how to create a PostgreSQL cluster called
256256
`hippo` by creating a new custom resource.
257257

258-
#### Step 1: Create the pgBackRest Secret
259-
260-
pgBackRest is a fundamental part of a PostgreSQL deployment with the PostgreSQL
261-
Operator: not only is it a backup and archive repository, but it also helps with
262-
operations such as self-healing. A PostgreSQL instance a pgBackRest communicate
263-
using ssh, and as such, we need to generate a unique ssh keypair for
264-
communication for each PostgreSQL cluster we deploy.
265-
266-
In this example, we generate a ssh keypair using ED25519 keys, but if your
267-
environment requires it, you can also use RSA keys.
268-
269-
In your working directory, run the following commands:
270-
271-
<pre style="overflow-x: auto; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">
272-
# this variable is the name of the cluster being created
273-
export pgo_cluster_name=hippo
274-
# this variable is the namespace the cluster is being deployed into
275-
export cluster_namespace=pgo
276-
277-
# generate a SSH public/private keypair for use by pgBackRest
278-
ssh-keygen -t ed25519 -N '' -f "${pgo_cluster_name}-key"
279-
280-
# base64 encoded the keys for the generation of the Kubernetes secret, and place
281-
# them into variables temporarily
282-
public_key_temp=$(cat "${pgo_cluster_name}-key.pub" | base64)
283-
private_key_temp=$(cat "${pgo_cluster_name}-key" | base64)
284-
export pgbackrest_public_key="${public_key_temp//[$'\n']}" pgbackrest_private_key="${private_key_temp//[$'\n']}"
285-
286-
# create the backrest-repo-config example file and substitute in the newly
287-
# created keys
288-
#
289-
# (Note: that the "config" / "sshd_config" entries contain configuration to
290-
# ensure that PostgreSQL instances are able to communicate with the pgBackRest
291-
# repository, which houses backups and archives, and vice versa. Most of the
292-
# settings follow the sshd defaults, with a few overrides. Edit at your own
293-
# discretion.)
294-
cat <<-EOF > "${pgo_cluster_name}-backrest-repo-config.yaml"
295-
apiVersion: v1
296-
kind: Secret
297-
type: Opaque
298-
metadata:
299-
labels:
300-
pg-cluster: ${pgo_cluster_name}
301-
pgo-backrest-repo: "true"
302-
name: ${pgo_cluster_name}-backrest-repo-config
303-
namespace: ${cluster_namespace}
304-
data:
305-
authorized_keys: ${pgbackrest_public_key}
306-
id_ed25519: ${pgbackrest_private_key}
307-
ssh_host_ed25519_key: ${pgbackrest_private_key}
308-
config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK
309-
sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCiNBdXRob3JpemVkS2V5c0ZpbGUJL3BnY29uZi9hdXRob3JpemVkX2tleXMKQXV0aG9yaXplZEtleXNGaWxlCS9zc2hkL2F1dGhvcml6ZWRfa2V5cwoKI0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBub25lCgojQXV0aG9yaXplZEtleXNDb21tYW5kIG5vbmUKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZFVzZXIgbm9ib2R5CgojIEZvciB0aGlzIHRvIHdvcmsgeW91IHdpbGwgYWxzbyBuZWVkIGhvc3Qga2V5cyBpbiAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCiMgQ2hhbmdlIHRvIHllcyBpZiB5b3UgZG9uJ3QgdHJ1c3Qgfi8uc3NoL2tub3duX2hvc3RzIGZvcgojIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCiNJZ25vcmVVc2VyS25vd25Ib3N0cyBubwojIERvbid0IHJlYWQgdGhlIHVzZXIncyB+Ly5yaG9zdHMgYW5kIH4vLnNob3N0cyBmaWxlcwojSWdub3JlUmhvc3RzIHllcwoKIyBUbyBkaXNhYmxlIHR1bm5lbGVkIGNsZWFyIHRleHQgcGFzc3dvcmRzLCBjaGFuZ2UgdG8gbm8gaGVyZSEKI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCiNQZXJtaXRFbXB0eVBhc3N3b3JkcyBubwpQYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCgojIENoYW5nZSB0byBubyB0byBkaXNhYmxlIHMva2V5IHBhc3N3b3JkcwpDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcwojQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBubwoKIyBLZXJiZXJvcyBvcHRpb25zCiNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCiNLZXJiZXJvc09yTG9jYWxQYXNzd2QgeWVzCiNLZXJiZXJvc1RpY2tldENsZWFudXAgeWVzCiNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCiNLZXJiZXJvc1VzZUt1c2Vyb2sgeWVzCgojIEdTU0FQSSBvcHRpb25zCiNHU1NBUElBdXRoZW50aWNhdGlvbiB5ZXMKI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyBubwojR1NTQVBJU3RyaWN0QWNjZXB0b3JDaGVjayB5ZXMKI0dTU0FQSUtleUV4Y2hhbmdlIG5vCiNHU1NBUElFbmFibGVrNXVzZXJzIG5vCgojIFNldCB0aGlzIHRvICd5ZXMnIHRvIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24sIGFjY291bnQgcHJvY2Vzc2luZywKIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsCiMgYmUgYWxsb3dlZCB0aHJvdWdoIHRoZSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZAojIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKIyBQQU0gYXV0aGVudGljYXRpb24gdmlhIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbWF5IGJ5cGFzcwojIHRoZSBzZXR0aW5nIG9mICJQZXJtaXRSb290TG9naW4gd2l0aG91dC1wYXNzd29yZCIuCiMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0CiMgUEFNIGF1dGhlbnRpY2F0aW9uLCB0aGVuIGVuYWJsZSB0aGlzIGJ1dCBzZXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgojIGFuZCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHRvICdubycuCiMgV0FSTklORzogJ1VzZVBBTSBubycgaXMgbm90IHN1cHBvcnRlZCBpbiBSZWQgSGF0IEVudGVycHJpc2UgTGludXggYW5kIG1heSBjYXVzZSBzZXZlcmFsCiMgcHJvYmxlbXMuClVzZVBBTSB5ZXMKCiNBbGxvd0FnZW50Rm9yd2FyZGluZyB5ZXMKI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKI0dhdGV3YXlQb3J0cyBubwpYMTFGb3J3YXJkaW5nIHllcwojWDExRGlzcGxheU9mZnNldCAxMAojWDExVXNlTG9jYWxob3N0IHllcwojUGVybWl0VFRZIHllcwojUHJpbnRNb3RkIHllcwojUHJpbnRMYXN0TG9nIHllcwojVENQS2VlcEFsaXZlIHllcwojVXNlTG9naW4gbm8KI1Blcm1pdFVzZXJFbnZpcm9ubWVudCBubwojQ29tcHJlc3Npb24gZGVsYXllZAojQ2xpZW50QWxpdmVJbnRlcnZhbCAwCiNDbGllbnRBbGl2ZUNvdW50TWF4IDMKI1Nob3dQYXRjaExldmVsIG5vCiNVc2VETlMgeWVzCiNQaWRGaWxlIC92YXIvcnVuL3NzaGQucGlkCiNNYXhTdGFydHVwcyAxMDozMDoxMDAKI1Blcm1pdFR1bm5lbCBubwojQ2hyb290RGlyZWN0b3J5IG5vbmUKI1ZlcnNpb25BZGRlbmR1bSBub25lCgojIG5vIGRlZmF1bHQgYmFubmVyIHBhdGgKI0Jhbm5lciBub25lCgojIEFjY2VwdCBsb2NhbGUtcmVsYXRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKQWNjZXB0RW52IExBTkcgTENfQ1RZUEUgTENfTlVNRVJJQyBMQ19USU1FIExDX0NPTExBVEUgTENfTU9ORVRBUlkgTENfTUVTU0FHRVMKQWNjZXB0RW52IExDX1BBUEVSIExDX05BTUUgTENfQUREUkVTUyBMQ19URUxFUEhPTkUgTENfTUVBU1VSRU1FTlQKQWNjZXB0RW52IExDX0lERU5USUZJQ0FUSU9OIExDX0FMTCBMQU5HVUFHRQpBY2NlcHRFbnYgWE1PRElGSUVSUwoKIyBvdmVycmlkZSBkZWZhdWx0IG9mIG5vIHN1YnN5c3RlbXMKU3Vic3lzdGVtCXNmdHAJL3Vzci9saWJleGVjL29wZW5zc2gvc2Z0cC1zZXJ2ZXIKCiMgRXhhbXBsZSBvZiBvdmVycmlkaW5nIHNldHRpbmdzIG9uIGEgcGVyLXVzZXIgYmFzaXMKI01hdGNoIFVzZXIgYW5vbmN2cwojCVgxMUZvcndhcmRpbmcgbm8KIwlBbGxvd1RjcEZvcndhcmRpbmcgbm8KIwlQZXJtaXRUVFkgbm8KIwlGb3JjZUNvbW1hbmQgY3ZzIHNlcnZlcgo=
310-
EOF
311-
312-
# remove the pgBackRest ssh keypair from the shell session
313-
unset pgbackrest_public_key pgbackrest_private_key
314-
315-
# create the pgBackRest secret
316-
kubectl apply -f "${pgo_cluster_name}-backrest-repo-config.yaml"
317-
</pre>
318-
319-
#### Step 2: Creating the PostgreSQL User Secrets
258+
#### Step 1: Creating the PostgreSQL User Secrets
320259

321260
As mentioned above, there are a minimum of three PostgreSQL user accounts that
322261
you must create in order to bootstrap a PostgreSQL cluster. These are:
@@ -354,7 +293,7 @@ kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-primaryuser
354293
kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-hippo-secret" "pg-cluster=${pgo_cluster_name}"
355294
```
356295

357-
#### Step 3: Create the PostgreSQL Cluster
296+
#### Step 2: Create the PostgreSQL Cluster
358297

359298
With the Secrets in place. It is now time to create the PostgreSQL cluster.
360299

examples/create-by-resource/run.sh

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -41,49 +41,10 @@ rm $DIR/fromcrd-key $DIR/fromcrd-key.pub
4141
# EXAMPLE RUN #
4242
###############
4343

44-
# generate a SSH public/private keypair for use by pgBackRest
45-
ssh-keygen -t ed25519 -N '' -f $DIR/fromcrd-key
46-
47-
# base64 encoded the keys for the generation of the Kube secret, and place
48-
# them into variables temporarily
49-
PUBLIC_KEY_TEMP=$(cat $DIR/fromcrd-key.pub | base64)
50-
PRIVATE_KEY_TEMP=$(cat $DIR/fromcrd-key | base64)
51-
52-
export PUBLIC_KEY="${PUBLIC_KEY_TEMP//[$'\n']}"
53-
export PRIVATE_KEY="${PRIVATE_KEY_TEMP//[$'\n']}"
54-
55-
unset PUBLIC_KEY_TEMP
56-
unset PRIVATE_KEY_TEMP
57-
58-
# create the backrest-repo-config example file and substitute in the newly
59-
# created keys
60-
cat <<-EOF > $DIR/backrest-repo-config.yaml
61-
apiVersion: v1
62-
data:
63-
authorized_keys: ${PUBLIC_KEY}
64-
id_ed25519: ${PRIVATE_KEY}
65-
ssh_host_ed25519_key: ${PRIVATE_KEY}
66-
config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK
67-
sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCkF1dGhvcml6ZWRLZXlzRmlsZQkvc3NoZC9hdXRob3JpemVkX2tleXMKCiNBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgbm9uZQoKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZCBub25lCiNBdXRob3JpemVkS2V5c0NvbW1hbmRVc2VyIG5vYm9keQoKIyBGb3IgdGhpcyB0byB3b3JrIHlvdSB3aWxsIGFsc28gbmVlZCBob3N0IGtleXMgaW4gL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCiNIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiBubwojIENoYW5nZSB0byB5ZXMgaWYgeW91IGRvbid0IHRydXN0IH4vLnNzaC9rbm93bl9ob3N0cyBmb3IKIyBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbgojSWdub3JlVXNlcktub3duSG9zdHMgbm8KIyBEb24ndCByZWFkIHRoZSB1c2VyJ3Mgfi8ucmhvc3RzIGFuZCB+Ly5zaG9zdHMgZmlsZXMKI0lnbm9yZVJob3N0cyB5ZXMKCiMgVG8gZGlzYWJsZSB0dW5uZWxlZCBjbGVhciB0ZXh0IHBhc3N3b3JkcywgY2hhbmdlIHRvIG5vIGhlcmUhCiNQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcwojUGVybWl0RW1wdHlQYXNzd29yZHMgbm8KUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBubwoKIyBDaGFuZ2UgdG8gbm8gdG8gZGlzYWJsZSBzL2tleSBwYXNzd29yZHMKQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB5ZXMKI0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbm8KCiMgS2VyYmVyb3Mgb3B0aW9ucwojS2VyYmVyb3NBdXRoZW50aWNhdGlvbiBubwojS2VyYmVyb3NPckxvY2FsUGFzc3dkIHllcwojS2VyYmVyb3NUaWNrZXRDbGVhbnVwIHllcwojS2VyYmVyb3NHZXRBRlNUb2tlbiBubwojS2VyYmVyb3NVc2VLdXNlcm9rIHllcwoKIyBHU1NBUEkgb3B0aW9ucwojR1NTQVBJQXV0aGVudGljYXRpb24geWVzCiNHU1NBUElDbGVhbnVwQ3JlZGVudGlhbHMgbm8KI0dTU0FQSVN0cmljdEFjY2VwdG9yQ2hlY2sgeWVzCiNHU1NBUElLZXlFeGNoYW5nZSBubwojR1NTQVBJRW5hYmxlazV1c2VycyBubwoKIyBTZXQgdGhpcyB0byAneWVzJyB0byBlbmFibGUgUEFNIGF1dGhlbnRpY2F0aW9uLCBhY2NvdW50IHByb2Nlc3NpbmcsCiMgYW5kIHNlc3Npb24gcHJvY2Vzc2luZy4gSWYgdGhpcyBpcyBlbmFibGVkLCBQQU0gYXV0aGVudGljYXRpb24gd2lsbAojIGJlIGFsbG93ZWQgdGhyb3VnaCB0aGUgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBhbmQKIyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uLiAgRGVwZW5kaW5nIG9uIHlvdXIgUEFNIGNvbmZpZ3VyYXRpb24sCiMgUEFNIGF1dGhlbnRpY2F0aW9uIHZpYSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIG1heSBieXBhc3MKIyB0aGUgc2V0dGluZyBvZiAiUGVybWl0Um9vdExvZ2luIHdpdGhvdXQtcGFzc3dvcmQiLgojIElmIHlvdSBqdXN0IHdhbnQgdGhlIFBBTSBhY2NvdW50IGFuZCBzZXNzaW9uIGNoZWNrcyB0byBydW4gd2l0aG91dAojIFBBTSBhdXRoZW50aWNhdGlvbiwgdGhlbiBlbmFibGUgdGhpcyBidXQgc2V0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KIyBhbmQgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB0byAnbm8nLgojIFdBUk5JTkc6ICdVc2VQQU0gbm8nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4IGFuZCBtYXkgY2F1c2Ugc2V2ZXJhbAojIHByb2JsZW1zLgpVc2VQQU0geWVzIAoKI0FsbG93QWdlbnRGb3J3YXJkaW5nIHllcwojQWxsb3dUY3BGb3J3YXJkaW5nIHllcwojR2F0ZXdheVBvcnRzIG5vClgxMUZvcndhcmRpbmcgeWVzCiNYMTFEaXNwbGF5T2Zmc2V0IDEwCiNYMTFVc2VMb2NhbGhvc3QgeWVzCiNQZXJtaXRUVFkgeWVzCiNQcmludE1vdGQgeWVzCiNQcmludExhc3RMb2cgeWVzCiNUQ1BLZWVwQWxpdmUgeWVzCiNVc2VMb2dpbiBubwpVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIG5vCiNQZXJtaXRVc2VyRW52aXJvbm1lbnQgbm8KI0NvbXByZXNzaW9uIGRlbGF5ZWQKI0NsaWVudEFsaXZlSW50ZXJ2YWwgMAojQ2xpZW50QWxpdmVDb3VudE1heCAzCiNTaG93UGF0Y2hMZXZlbCBubwojVXNlRE5TIHllcwojUGlkRmlsZSAvdmFyL3J1bi9zc2hkLnBpZAojTWF4U3RhcnR1cHMgMTA6MzA6MTAwCiNQZXJtaXRUdW5uZWwgbm8KI0Nocm9vdERpcmVjdG9yeSBub25lCiNWZXJzaW9uQWRkZW5kdW0gbm9uZQoKIyBubyBkZWZhdWx0IGJhbm5lciBwYXRoCiNCYW5uZXIgbm9uZQoKIyBBY2NlcHQgbG9jYWxlLXJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCkFjY2VwdEVudiBMQU5HIExDX0NUWVBFIExDX05VTUVSSUMgTENfVElNRSBMQ19DT0xMQVRFIExDX01PTkVUQVJZIExDX01FU1NBR0VTCkFjY2VwdEVudiBMQ19QQVBFUiBMQ19OQU1FIExDX0FERFJFU1MgTENfVEVMRVBIT05FIExDX01FQVNVUkVNRU5UCkFjY2VwdEVudiBMQ19JREVOVElGSUNBVElPTiBMQ19BTEwgTEFOR1VBR0UKQWNjZXB0RW52IFhNT0RJRklFUlMKCiMgb3ZlcnJpZGUgZGVmYXVsdCBvZiBubyBzdWJzeXN0ZW1zClN1YnN5c3RlbQlzZnRwCS91c3IvbGliZXhlYy9vcGVuc3NoL3NmdHAtc2VydmVyCgojIEV4YW1wbGUgb2Ygb3ZlcnJpZGluZyBzZXR0aW5ncyBvbiBhIHBlci11c2VyIGJhc2lzCiNNYXRjaCBVc2VyIGFub25jdnMKIwlYMTFGb3J3YXJkaW5nIG5vCiMJQWxsb3dUY3BGb3J3YXJkaW5nIG5vCiMJUGVybWl0VFRZIG5vCiMJRm9yY2VDb21tYW5kIGN2cyBzZXJ2ZXI=
68-
kind: Secret
69-
metadata:
70-
labels:
71-
pg-cluster: fromcrd
72-
pgo-backrest-repo: "true"
73-
name: fromcrd-backrest-repo-config
74-
namespace: ${NS}
75-
type: Opaque
76-
EOF
77-
78-
# unset the *_KEY environmental variables
79-
unset PUBLIC_KEY
80-
unset PRIVATE_KEY
81-
8244
# create the required postgres credentials for the fromcrd cluster
8345
$PGO_CMD -n $NS create -f $DIR/postgres-secret.yaml
8446
$PGO_CMD -n $NS create -f $DIR/primaryuser-secret.yaml
8547
$PGO_CMD -n $NS create -f $DIR/testuser-secret.yaml
86-
$PGO_CMD -n $NS create -f $DIR/backrest-repo-config.yaml
8748

8849
# create the pgcluster CRD for the fromcrd cluster
8950
$PGO_CMD -n $NS create -f $DIR/fromcrd.json

examples/helm/README.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# create-cluster
2+
3+
This is a working example of how to create a cluster via the crd workflow
4+
using a [Helm](https://helm.sh/) chart.
5+
6+
## Prerequisites
7+
8+
### Postgres Operator
9+
10+
This example assumes you have the Crunchy PostgreSQL Operator installed
11+
in a namespace called `pgo`.
12+
13+
### Helm
14+
15+
Helm will also need to be installed for this example to run
16+
17+
## Documentation
18+
19+
Please see the documentation for more guidance using custom resources:
20+
21+
https://access.crunchydata.com/documentation/postgres-operator/latest/custom-resources/
22+
23+
## Setup
24+
25+
If you are running Postgres Operator 4.5.1 or later, you can skip the below
26+
step.
27+
28+
### Before 4.5.1
29+
30+
```
31+
cd postgres-operator/examples/helm/create-cluster
32+
33+
mkdir certs
34+
cd certs
35+
36+
# this variable is the name of the cluster being created
37+
export pgo_cluster_name=hippo
38+
39+
# generate a SSH public/private keypair for use by pgBackRest
40+
ssh-keygen -t ed25519 -N '' -f "${pgo_cluster_name}-key"
41+
```
42+
43+
## Running the Example
44+
45+
For this example we will deploy the cluster into the `pgo` namespace where the
46+
Postgres Operator is installed and running.
47+
48+
Return to the `create-cluster` directory:
49+
50+
```
51+
cd postgres-operator/examples/helm/create-cluster
52+
```
53+
54+
The following commands will allow you to execute a dry run first with debug
55+
if you want to verify everything is set correctly. Then after everything looks
56+
good run the install command with out the flags:
57+
58+
```
59+
helm install --dry-run --debug postgres-operator-create-cluster . -n pgo
60+
helm install postgres-operator-create-cluster . -n pgo
61+
```
62+
63+
## Verify
64+
65+
Now you can your Hippo cluster has deployed into the pgo namespace by running
66+
these few commands:
67+
68+
```
69+
kubectl get all -n pgo
70+
71+
pgo test hippo -n pgo
72+
73+
pgo show cluster hippo -n pgo
74+
```
75+
76+
## NOTE
77+
78+
As of operator version 4.5.0 when using helm uninstall you will have to manually
79+
clean up some left over artifacts after running the uninstall.

internal/apiserver/clusterservice/clusterimpl.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -994,17 +994,25 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs.
994994
backrestS3CACert = backrestSecret.Data[util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert]
995995
}
996996

997-
err := util.CreateBackrestRepoSecrets(apiserver.Clientset,
998-
util.BackrestRepoConfig{
999-
BackrestS3CA: backrestS3CACert,
1000-
BackrestS3Key: request.BackrestS3Key,
1001-
BackrestS3KeySecret: request.BackrestS3KeySecret,
1002-
ClusterName: clusterName,
1003-
ClusterNamespace: request.Namespace,
1004-
OperatorNamespace: apiserver.PgoNamespace,
1005-
})
1006-
1007-
if err != nil {
997+
// set up the secret for the cluster that contains the pgBackRest
998+
// information
999+
secret := &v1.Secret{
1000+
ObjectMeta: metav1.ObjectMeta{
1001+
Name: secretName,
1002+
Labels: map[string]string{
1003+
config.LABEL_VENDOR: config.LABEL_CRUNCHY,
1004+
config.LABEL_PG_CLUSTER: clusterName,
1005+
config.LABEL_PGO_BACKREST_REPO: "true",
1006+
},
1007+
},
1008+
Data: map[string][]byte{
1009+
util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert: backrestS3CACert,
1010+
util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key: []byte(request.BackrestS3Key),
1011+
util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret: []byte(request.BackrestS3KeySecret),
1012+
},
1013+
}
1014+
1015+
if _, err := apiserver.Clientset.CoreV1().Secrets(ns).Create(ctx, secret, metav1.CreateOptions{}); err != nil && !kubeapi.IsAlreadyExists(err) {
10081016
resp.Status.Code = msgs.Error
10091017
resp.Status.Msg = fmt.Sprintf("could not create backrest repo secret: %s", err)
10101018
return resp

internal/operator/backrest/repo.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,19 @@ func CreateRepoDeployment(clientset kubernetes.Interface, cluster *crv1.Pgcluste
157157
return nil
158158
}
159159

160+
// CreateRepoSecret allows for the creation of the Secret used to populate
161+
// some (mostly) sensitive fields for managing the pgBackRest repository.
162+
//
163+
// If the Secret already exists, then missing fields will be overwritten.
164+
func CreateRepoSecret(clientset kubernetes.Interface, cluster *crv1.Pgcluster) error {
165+
return util.CreateBackrestRepoSecrets(clientset,
166+
util.BackrestRepoConfig{
167+
ClusterName: cluster.Name,
168+
ClusterNamespace: cluster.Namespace,
169+
OperatorNamespace: operator.PgoNamespace,
170+
})
171+
}
172+
160173
// setBootstrapRepoOverrides overrides certain fields used to populate the pgBackRest repository template
161174
// as needed to support the creation of a bootstrap repository need to bootstrap a new cluster from an
162175
// existing data source.

internal/operator/cluster/cluster.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ func AddClusterBase(clientset kubeapi.Interface, cl *crv1.Pgcluster, namespace s
8787
return
8888
}
8989

90+
// ensure the the pgBackRest Secret is created. If this fails, we have to
91+
// abort
92+
if err := backrest.CreateRepoSecret(clientset, cl); err != nil {
93+
log.Error(err)
94+
publishClusterCreateFailure(cl, err.Error())
95+
return
96+
}
97+
9098
if err := annotateBackrestSecret(clientset, cl); err != nil {
9199
log.Error(err)
92100
publishClusterCreateFailure(cl, err.Error())

0 commit comments

Comments
 (0)