--- stage: Configure group: Configure info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- # Crossplane configuration Once Crossplane [is installed](applications.md#crossplane), it must be configured for use. The process of configuring Crossplane includes: 1. Configuring RBAC permissions. 1. Configuring Crossplane with a cloud provider. 1. Configure managed service access. 1. Setting up Resource classes. 1. Using Auto DevOps configuration options. 1. Connect to the PostgreSQL instance. To allow Crossplane to provision cloud services such as PostgreSQL, the cloud provider stack must be configured with a user account. For example: - A service account for GCP. - An IAM user for AWS. Important notes: - This guide uses GCP as an example. However, the process for AWS and Azure will be similar. - Crossplane requires the Kubernetes cluster to be VPC native with Alias IPs enabled so that the IP address of the pods are routable within the GCP network. First, we need to declare some environment variables with configuration that will be used throughout this guide: ```shell export PROJECT_ID=crossplane-playground # the GCP project where all resources reside. export NETWORK_NAME=default # the GCP network where your GKE is provisioned. export REGION=us-central1 # the GCP region where the GKE cluster is provisioned. ``` ## Configure RBAC permissions - For GitLab-managed clusters, RBAC is configured automatically. - For non-GitLab managed clusters, ensure that the service account for the token provided can manage resources in the `database.crossplane.io` API group: 1. Save the following YAML as `crossplane-database-role.yaml`: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: crossplane-database-role labels: rbac.authorization.k8s.io/aggregate-to-edit: "true" rules: - apiGroups: - database.crossplane.io resources: - postgresqlinstances verbs: - get - list - create - update - delete - patch - watch ``` 1. Apply the cluster role to the cluster: ```shell kubectl apply -f crossplane-database-role.yaml ``` ## Configure Crossplane with a cloud provider See [Configure Your Cloud Provider Account](https://crossplane.github.io/docs/v0.4/cloud-providers.html) to configure the installed cloud provider stack with a user account. Note that the Secret and the Provider resource referencing the Secret needs to be applied to the `gitlab-managed-apps` namespace in the guide. Make sure you change that while following the process. [Configure Providers](https://crossplane.github.io/docs/v0.4/cloud-providers.html) ## Configure Managed Service Access We need to configure connectivity between the PostgreSQL database and the GKE cluster. This can done by either: - Using Crossplane as demonstrated below. - Directly in the GCP console by [configuring private services access](https://cloud.google.com/vpc/docs/configure-private-services-access). Create a GlobalAddress and Connection resources: ```shell cat > network.yaml < gcp-postgres-standard.yaml < Annotations: crossplane.io/propagate-from-name: 108e460e-06c7-11ea-b907-42010a8000bd crossplane.io/propagate-from-namespace: gitlab-managed-apps crossplane.io/propagate-from-uid: 10c79605-06c7-11ea-b907-42010a8000bd Type: Opaque Data ==== privateIP: 8 bytes publicIP: 13 bytes serverCACertificateCert: 1272 bytes serverCACertificateCertSerialNumber: 1 bytes serverCACertificateCreateTime: 24 bytes serverCACertificateExpirationTime: 24 bytes username: 8 bytes endpoint: 8 bytes password: 27 bytes serverCACertificateCommonName: 98 bytes serverCACertificateInstance: 41 bytes serverCACertificateSha1Fingerprint: 40 bytes ``` ## Connect to the PostgreSQL instance Follow this [GCP guide](https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine) if you would like to connect to the newly provisioned PostgreSQL database instance on CloudSQL.