In this guided tutorial we are going to see step-by-step how to create self-service ephemeral infrastructure using Crossplane and kube-green.
provider-kubernetes.yaml
with the
following content:
# provider-kubernetes.yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-kubernetes
spec:
package: xpkg.upbound.io/crossplane-contrib/provider-kubernetes:v0.18.0
provider-kubernetes-config.yaml
file to
configure the Kubernetes Crossplane provider with the
following content:
# provider-kubernetes-config.yaml
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
name: kubernetes-in-cluster
spec:
credentials:
source: InjectedIdentity
# xrd-postgrescluster.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xpostgresclusters.demo.crossplane.io
spec:
group: demo.crossplane.io
names:
kind: XPostgresCluster
plural: xpostgresclusters
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
instances:
type: integer
description: "Number of PostgreSQL instances in the cluster."
default: 1
hibernation:
type: string
description: "Set to 'on' to hibernate the cluster, 'off' to wake it up."
default: "off"
required:
- instances
XPostgresCluster
).
# composition-postgrescluster.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: postgrescluster.demo.crossplane.io
spec:
compositeTypeRef:
apiVersion: demo.crossplane.io/v1alpha1
kind: XPostgresCluster
resources:
- name: postgres-cluster-object
base:
apiVersion: kubernetes.crossplane.io/v1alpha2
kind: Object
spec:
managementPolicies: ["*"]
forProvider:
manifest:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
namespace: default
spec:
storage:
size: 1Gi
bootstrap:
initdb:
database: appdb
owner: appuser
providerConfigRef:
name: kubernetes-in-cluster
patches:
- fromFieldPath: "metadata.name"
toFieldPath: "spec.forProvider.manifest.metadata.name"
- fromFieldPath: "spec.instances"
toFieldPath: "spec.forProvider.manifest.spec.instances"
- type: FromCompositeFieldPath
fromFieldPath: spec.hibernation
toFieldPath: spec.forProvider.manifest.metadata.annotations[cnpg.io/hibernation]
policy:
fromFieldPath: Optional
# my-postgres-db.yaml
apiVersion: demo.crossplane.io/v1alpha1
kind: XPostgresCluster
metadata:
name: my-production-db
namespace: default
spec:
instances: 1
hibernation: "off"
XPostgresCluster
# kube-green-rbac-for-postgres.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-green-xpostgrescluster-patcher
rules:
- apiGroups:
- "demo.crossplane.io"
resources:
- "xpostgresclusters"
verbs:
- "get"
- "list"
- "watch"
- "patch"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-green-patch-xpostgrescluster
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-green-xpostgrescluster-patcher
subjects:
- kind: ServiceAccount
name: kube-green-controller-manager
namespace: kube-green
# schedule-sleep-postgres.yaml
apiVersion: kube-green.com/v1alpha1
kind: SleepInfo
metadata:
name: sleep-schedule-for-postgres
namespace: default
spec:
weekdays: "*"
sleepAt: "18:47"
wakeUpAt: "18:49"
patches:
- target:
group: demo.crossplane.io
kind: XPostgresCluster
patch: |
- op: replace
path: /spec/hibernation
value: "on"
SleepInfo
resource will stop your db pods at
every 5 minutes and restart at every 7 minutes of each hour in
the day.
SleepInfo
hibernation
at off
. When kube-green
runs it will modify this property to on
.
Cluster
Object: