Skip to content
This repository was archived by the owner on Dec 10, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions examples/aks-cluster/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# AKS Cluster Example

This example demonstrates how to provision an AKS cluster using Crossplane v1.

## Prerequisites

- Kubernetes cluster (v1.31+)
- Helm v3.x

## Install Crossplane v1 via Helm

1. **Add the Crossplane Helm repository:**
```sh
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
```

2. **Install Crossplane v1:**
```sh
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane --version 1.x.x
```
Replace `1.x.x` with the desired Crossplane v1 release.

3. **Verify installation:**
```sh
kubectl get pods -n crossplane-system
```

4. **Apply the manifests:**
```sh
./install.sh
```
63 changes: 63 additions & 0 deletions examples/aks-cluster/cluster-function-pythonic.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
apiVersion: pkg.crossplane.io/v1
kind: Function
metadata:
name: function-pythonic
spec:
package: ghcr.io/fortra/function-pythonic:v0.0.8
runtimeConfigRef:
name: function-pythonic
---
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: function-pythonic
spec:
deploymentTemplate:
spec:
selector: {}
template:
spec:
containers:
- name: package-runtime
args:
- --debug
- --packages
- --packages-namespace=crossplane-system
serviceAccountName: function-pythonic
serviceAccountTemplate:
metadata:
name: function-pythonic
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: crossplane-system
name: function-pythonic
rules:
- apiGroups:
- ''
resources:
- configmaps
verbs:
- list
- watch
- patch
- apiGroups:
- ''
resources:
- events
verbs:
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: crossplane-system
name: function-pythonic
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: function-pythonic
subjects:
- kind: ServiceAccount
name: function-pythonic
24 changes: 24 additions & 0 deletions examples/aks-cluster/composition.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: aks-cluster
spec:
compositeTypeRef:
apiVersion: example.crossplane.io/v1
kind: AzureKubernetesCluster
mode: Pipeline
pipeline:
- step: create-resourcegroup
functionRef:
name: function-pythonic
input:
apiVersion: pythonic.fn.fortra.com/v1alpha1
kind: Composite
composite: resourcegroup.ResourceGroupComposite
- step: create-aks-cluster
functionRef:
name: function-pythonic
input:
apiVersion: pythonic.fn.fortra.com/v1alpha1
kind: Composite
composite: kubernetescluster.KubernetesClusterComposite
43 changes: 43 additions & 0 deletions examples/aks-cluster/definition.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: azurekubernetesclusters.example.crossplane.io
spec:
group: example.crossplane.io
names:
kind: AzureKubernetesCluster
plural: azurekubernetesclusters
claimNames:
kind: AzureKubernetesClusterClaim
plural: azurekubernetesclusterclaims
versions:
- name: v1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
defaultNodePool:
type: object
properties:
autoScaling:
type: object
properties:
enabled:
type: boolean
minCount:
type: integer
maxCount:
type: integer
nodeCount:
type: integer
vmSize:
type: string
resourceGroupName:
type: string
location:
type: string
10 changes: 10 additions & 0 deletions examples/aks-cluster/functions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-pythonic
annotations:
render.crossplane.io/runtime: Development
spec:
package: ghcr.io/fortra/function-pythonic:v0.0.8
runtimeConfigRef:
name: function-pythonic
13 changes: 13 additions & 0 deletions examples/aks-cluster/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash

# Install function-pythonic and azure providers
kubectl apply -f cluster-function-pythonic.yaml
kubectl apply -f providers.yaml

# Install AKS Crossplane XRDs and Compositions
kubectl apply -f definition.yaml
# Wait for the generated CRDs to be created
sleep 5

# Create the AKS cluster
kubectl apply -k .
29 changes: 29 additions & 0 deletions examples/aks-cluster/kubernetescluster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from crossplane.pythonic import BaseComposite

class KubernetesClusterComposite(BaseComposite):
def compose(self):
labels = {'example.crossplane.io/AzureKubernetesCluster': self.metadata.name}
self.logger.info(f"Composing AKS cluster {self.metadata.name}")

aks = self.resources.KubernetesCluster(
'containerservice.azure.upbound.io/v1beta2', 'KubernetesCluster'
)
aks.metadata.name = self.metadata.name
aks.metadata.labels = labels

aks.spec.forProvider.location = self.spec.location
aks.spec.forProvider.resourceGroupNameRef.name = self.spec.resourceGroupName
aks.spec.forProvider.identity.type = 'SystemAssigned'

if self.spec.defaultNodePool.autoScaling.enabled:
aks.spec.forProvider.defaultNodePool.autoScalingEnabled = True
aks.spec.forProvider.defaultNodePool.minCount = self.spec.defaultNodePool.autoScaling.minCount
aks.spec.forProvider.defaultNodePool.maxCount = self.spec.defaultNodePool.autoScaling.maxCount
else:
aks.spec.forProvider.defaultNodePool.nodeCount = self.spec.nodeCount

aks.spec.forProvider.defaultNodePool.name = 'systempool1'
aks.spec.forProvider.defaultNodePool.vmSize = self.spec.vmSize
aks.spec.forProvider.dnsPrefix = self.metadata.name

self.status.aks = aks.status.endpoint
20 changes: 20 additions & 0 deletions examples/aks-cluster/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

generatorOptions:
disableNameSuffixHash: true

configMapGenerator:

- namespace: crossplane-system
name: pythonic-aks
options:
labels:
function-pythonic.package: ''
files:
- kubernetescluster.py
- resourcegroup.py

resources:
- composition.yaml
- xr.yaml
14 changes: 14 additions & 0 deletions examples/aks-cluster/providers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: upbound-provider-family-azure
spec:
package: xpkg.upbound.io/upbound/provider-family-azure:v1
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: upbound-provider-azure-containerservice
spec:
package: xpkg.upbound.io/upbound/provider-azure-containerservice:v1
9 changes: 9 additions & 0 deletions examples/aks-cluster/render.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash

# In one terminal
# PYTHONPATH=. function-pythonic --insecure --debug

# In another terminal:

cd $(dirname $(realpath $0))
exec crossplane render xr.yaml composition.yaml functions.yaml
14 changes: 14 additions & 0 deletions examples/aks-cluster/resourcegroup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from crossplane.pythonic import BaseComposite

class ResourceGroupComposite(BaseComposite):
def compose(self):
labels = {'example.crossplane.io/AzureKubernetesCluster': self.metadata.name}
self.logger.info(f"Composing Azure ResourceGroup {self.spec.resourceGroupName}")

rg = self.resources.ResourceGroup(
'azure.upbound.io/v1beta1', 'ResourceGroup'
)
rg.metadata.name = self.spec.resourceGroupName
rg.metadata.labels = labels

rg.spec.forProvider.location = self.spec.location
15 changes: 15 additions & 0 deletions examples/aks-cluster/xr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
apiVersion: example.crossplane.io/v1
kind: AzureKubernetesCluster
metadata:
namespace: my-aks-namespace
name: my-aks-cluster
spec:
defaultNodePool:
autoScaling:
enabled: False
minCount: 1
maxCount: 3
nodeCount: 1
vmSize: Standard_B2ms
resourceGroupName: my-resource-group
location: westeurope