In the world of modern DevOps, deployment automation tools have become essential for streamlining processes and ensuring consistent, reliable deployments. GitOps and ArgoCD are at the cutting edge of deployment automation, making it easy to deploy complex applications and reducing the risk of human error in the deployment process. In this blog post, we will explore how to deploy the Percona Operator for PostgreSQL v2 using GitOps and ArgoCD.
The setup we are looking for is the following:
- Teams or CICD roll out the manifests to Github
- ArgoCD reads the changes and compares the changes to what we have in Kubernetes
- ArgoCD creates/modifies Percona Operator and PostgreSQL custom resources
- Percona Operator takes care of day-1 and day-2 operations based on the changes pushed by ArgoCD to custom resources
Prerequisites:
- Kubernetes cluster
- GitHub repository. You can find my manifests here.
Start it up
Deploy and prepare ArgoCD
ArgoCD has quite detailed documentation explaining the installation process. I did the following:
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Expose the ArgoCD server. You might want to use ingress or some other approach. I’m using a Load Balancer in a public cloud:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
Get the Load Balancer endpoint; we will use it later:
kubectl -n argocd get svc argocd-server NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE argocd-server LoadBalancer 10.88.1.239 123.21.23.21 80:30480/TCP,443:32623/TCP 6h28m
I’m not a big fan of Web User Interfaces, so I took the path of using
argocd CLI. Install it by following the CLI installation documentation.
Retrieve the admin password to log in using the CLI:
argocd admin initial-password -n argocd
Login to the server. Use the Load Balancer endpoint from above:
argocd login 123.21.23.21
PostgreSQL
Github and manifests
Put YAML manifests into the github repository. I have two:
- bundle.yaml – deploys Custom Resource Definitions, Service Account, and the Deployment of the Operator
- argo-test.yaml – deploys the PostgreSQL Custom Resource manifest that Operator will process
There are some changes that you would need to make to ensure that ArgoCD works with Percona Operator.
Server Side sync
Percona relies on OpenAPI v3.0 validation for Custom Resources. When done properly, it increases the size of a Custom Resource Definition manifest (CRDS) in some cases. As a result, you might see the following error when you apply the bundle:
kubectl apply -f deploy/bundle.yaml ... Error from server (Invalid): error when creating "deploy/bundle.yaml": CustomResourceDefinition.apiextensions.k8s.io "perconapgclusters.pg.percona.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
To avoid it, use the
–server–side flag. ArgoCD supports Server-Side apply. In the manifests, I added them through annotations to
CustomResourceDefinition objects:
kind: CustomResourceDefinition metadata: annotations: ... argocd.argoproj.io/sync-options: ServerSideApply=true name: perconapgclusters.pgv2.percona.com
Phases and waves
ArgoCD comes with Phases and Waves that allow you to apply manifests and resources in them in a specific order. You should use Waves for two reasons:
- To deploy Operator before Percona PostgreSQL Custom Resource
- It is also important to delete the Custom Resource first (so perform operations in reverse order)
I added the waves through annotations to the resources.
- All resources in bundle.yaml are assigned to wave “1”:
kind: CustomResourceDefinition metadata: annotations: ... argocd.argoproj.io/sync-wave: "1" name: perconapgclusters.pgv2.percona.com
- PostgreSQL Custom Resource in argo-test.yaml has wave “5”:
apiVersion: pgv2.percona.com/v2 kind: PerconaPGCluster metadata: annotations: argocd.argoproj.io/sync-wave: "5" name: argo-test
The bigger the number in wave, the later the resource will be created. In our case, PerconaPGCluster resource will be created after the Custom Resource Definitions from bundle.yaml.
Deploy with ArgoCD
Create the application in ArgoCD:
argocd app create percona-pg --repo https://github.com/spron-in/blog-data.git --path gitops-argocd-postgresql --dest-server https://kubernetes.default.svc --dest-namespace default
The commands do the following:
- Creates an application called percona-pg
- Uses the GitHub repo and a folder in it as a source of YAML manifests
- Uses local k8s API. It is possible to have multiple k8s clusters.
- Deploys into default namespace
Now perform a manual sync. The command will roll out manifests:
argocd app sync percona-pg
Check for pg object in the default namespace:
kubectl get pg NAME ENDPOINT STATUS POSTGRES PGBOUNCER AGE argo-test 33.22.11.44 ready 3 3 80s
Operational tasks
Now let’s say we want to change something. The change should be merged into git, and ArgoCD will detect it. The sync interval is 180 seconds by default. You can change it in argocd-cm ConfigMap if needed.
Even when ArgoCD detects the change, it marks it as out of sync. For example, I reduced the number of CPUs for pgBouncer. ArgoCD detected the change:
argocd app get percona-pg ... 2023-07-07T10:11:22+03:00 pgv2.percona.com PerconaPGCluster default argo-test OutOfSync perconapgcluster.pgv2.percona.com/argo-test configured
Now I can manually sync the change again. To automate the whole flow, just set the sync policy:
argocd app set percona-pg --sync-policy automated
Now all the changes in git will be automatically synced with Kubernetes once ArgoCD detects them.
Conclusion
GitOps, combined with Kubernetes and the Percona Operator for PostgreSQL, provides a powerful toolset for rapidly deploying and managing complex database infrastructures. By leveraging automation and deployment best practices, teams can reduce the risk of human error, increase deployment velocity, and focus on delivering business value. Additionally, the ability to declaratively manage infrastructure and application state enables teams to quickly recover from outages and respond to changes with confidence.
Try out the Operator by following the quickstart guide here.
You can get early access to new product features, invite-only ”ask me anything” sessions with Percona Kubernetes experts, and monthly swag raffles. Interested? Fill in the form at percona.com/k8s.
Percona Distribution for PostgreSQL provides the best and most critical enterprise components from the open-source community in a single distribution, designed and tested to work together.