I think the way Crossplane explains this could be clearer.
CompositeResourceDefinition (XRD, related but not exactly the same as a CRD) – this is like the interface for a function that defines the parameters, their types and which are required.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xglobal-vault-accesses.azure.simbachain.com
spec:
group: azure.simbachain.com
# for the CompositeResource XR, the actual resource created by the claim
names:
kind: XGlobal-Vault-Access
plural: xglobal-vault-accesses
claimNames:
kind: Global-Vault-Access
plural: global-vault-accesses
versions:
- name: v1beta1
served: true
referenceable: true
schema:
openAPIV3Schema:
<<snip>>
Composition – this is like the internal implementation code of the function, note however that there can be more than one implementation of a given function with labels used to distinguish them.
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: global-vault-access
labels:
crossplane.io/xrd: xglobal-vault-accesses.azure.simbachain.com
provider: azure
spec:
compositeTypeRef:
apiVersion: azure.simbachain.com/v1beta1
kind: XGlobal-Vault-Access
resources:
<<snip>>
Claim – this is a request like the invocation of the function, you pass in your parameters. Note: the kind is not Claim, it will be whatever was under claimNames > kind. The word Claim generally does not appear anywhere, you can add it to a comment if that helps
# below is a crossplane claim that requests an instance of XGlobal-Vault-Access and its managed resources
---
apiVersion: azure.simbachain.com/v1beta1
kind: Global-Vault-Access
metadata:
annotations:
crossplane.io/external-name: blocks-simba-kongtest
# will be used to generate names for the resources in the composition
name: blocks-simba-kongtest
namespace: blocks-simba-kongtest
spec:
compositionRef:
name: global-vault-access
parameters:
location: eastus
<<snip>>
CompositeResource (XR) – Sometimes this is talked about as if it’s the same as the claim but it’s a separate Kubernetes resource and it’s important to differentiate them. This results from the resources above instead of being defined directly. You define an XRD, make a Composition that defines the internal implementation of that XRD, make a claim that passes parameters then a CompositeResource will be created automatically. When I am troubleshooting this is the first place I want to look because it will has Synced and Ready status and contains resource refs to all the individual resources. Note: the kind is not CompositeResource, it will be whatever was under names > kind. It is traditionally named starting with X in the XRD.
kubectl describe xGlobal-Vault-Access