diff --git a/_articles/fr/2024-04-30-k8s-crossplane-introduction.md b/_articles/fr/2024-04-30-k8s-crossplane-introduction.md new file mode 100644 index 000000000..be59ae45c --- /dev/null +++ b/_articles/fr/2024-04-30-k8s-crossplane-introduction.md @@ -0,0 +1,250 @@ +--- +contentType: article +lang: fr +date: '2024-04-30' +slug: k8s-crossplane-introduction +title: 'Platform Engineering et gestion de ressources cloud depuis un cluster Kubernetes avec Crossplane🍩' +excerpt: >- + Crossplane offre une alternative Ă  Terraform pour la gestion des ressources cloud externes via des CRD Kubernetes et supporte des + modĂšles d'abstraction pour le platform engineering. +cover: + path: /imgs/articles/2024-04-30-k8s-crossplane-introduction/cover.jpg +categories: + - architecture +authors: + - dfert +keywords: + - kubernetes + - k8s + - cloud + - platform enineering +--- +![Logo Crossplane]({BASE_URL}/imgs/articles/2024-04-30-k8s-crossplane-introduction/crossplane-logo.webp) + +Si on schĂ©matise trĂšs grossiĂšrement, Crossplane reprends le but initial de Terraform — IaC dĂ©clarative, gestion de state, etc. — en l'adaptant au modĂšle Kubernetes. Il s'installe sur un cluster et rajoute tout un lot de CRD reprĂ©sentant les diffĂ©rentes ressources cloud qu'on va pouvoir lui demander de rĂ©concilier. _In fine_, ce cluster agira comme un _control plane_ pour ressources cloud et c'est pourquoi on prĂ©sente souvent Crossplane comme un _framework_ de _control plane cloud-natif_. Aussi, il s'intĂšgre bien dans la logique de platform engineering en permettant de dĂ©finir ses propres _compositions_ (comprendre par lĂ  un regroupement logiques de ressources infra). + +Le projet a rejoint la Cloud Native Computing Foundation (CNCF) en 2020 et est au niveau de maturitĂ© _incubating_ depuis Septembre 2021. Le projet est encore jeune donc, et ne me semble pas encore prĂȘt pour de la production. Toutefois, il me semble conceptuellement interessant et mĂ©rite qu'on suive son Ă©volution. + +### Platform engineering kĂ©zako ? đŸ€” +En quelques mots, c'est une approche visant Ă  amĂ©liorer l'experience dĂ©veloppeur — DX pour _Developer Experience_ — en abstrayant au mieux la complexitĂ© d'infrastructure par la mise Ă  disposition d'une platforme interne (les dĂ©veloppeur en sont alors clients). + +A travers son mĂ©canisme de _composition_, Crossplane va nous permettre de proposer des entitĂ©s de haut niveau aux dĂ©veloppeurs (e.g "Une base de donnĂ©e Postgres") en abstrayant toute la granularitĂ© sous jacente (e.g. instance AWS RDS, configuration des logs, du rĂ©seau, etc.) ; Ă  l'image d ce que proposent les modules Terraform. + +### In depth +On confonds souvent, mais Crossplane a 4 composants principaux : + +#### Composite Resource Definition +OpenAPIv3, dĂ©clare une API que les utilisateurs vont pouvoir utiliser pour utiliser les Compositions +En continuant avec l'exemple prĂ©cĂ©dant, on peut imaginer l'api group `database.exemple.com/v1alpha1` +- `Composite Resource Definition` (XRD) — A custom API specification. + +#### Composition +Pipeline de fonctions +- `Compositions` — Pour dĂ©finir un groupe de ressource + +##### Functions +DiffĂ©rent types (GoTemplate, function, CUE scripts, KCL, etc.) pour injecter des valeurs par exemple + +#### Composite Resource +- `Composite Resource` (XR) — Created by using the custom API defined in a Composite Resource Definition. XRs use the Composition template to create new managed resources. +#### Claims +- `Claims` (XRC) — Like a Composite Resource, but with namespace scoping. + +### Installation + +Commencez par installer la CLI qui contient notamment des outils pour le rendering et la validation des compositions et des fonctions en local : + + +Crossplane fournit un chart Helm pour faciliter l'installation + +```helm +helm install crossplane \ +crossplane-stable/crossplane \ +--namespace crossplane-system \ +--create-namespace \s +--set provider.packages='{xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0}' +``` + +Et comme c'est toujours mieux de savoir ce qu'il se passe, voici une liste de ressource qu'il dĂ©ploie : + +| kind | name | +|-------------------- |------------------------------------------- | +| Namespace | crossplane | +| ServiceAccount | crossplane | +| ServiceAccount | rbac-manager | +| Secret | crossplane-root-ca | +| Secret | crossplane-tls-server | +| Secret | crossplane-tls-client | +| ClusterRole | crossplane | +| ClusterRole | crossplane-admin | +| ClusterRole | crossplane-rbac-manager | +| ClusterRole | crossplane:system:aggregate-to-crossplane | +| ClusterRole | crossplane:allowed-provider-permissions | +| ClusterRole | crossplane-edit | +| ClusterRole | crossplane-view | +| ClusterRole | crossplane-browse | +| ClusterRole | crossplane:aggregate-to-admin | +| ClusterRole | crossplane:aggregate-to-edit | +| ClusterRole | crossplane:aggregate-to-view | +| ClusterRole | crossplane:aggregate-to-browse | +| ClusterRoleBinding | crossplane | +| ClusterRoleBinding | crossplane-admin | +| ClusterRoleBinding | crossplane-rbac-manager | +| Service | crossplane-webhooks | +| Deployment | crossplane (core) | +| Deployment | crossplane-rbac-manager | + +N.B : Les secrets sont crĂ©Ă©s vide et sont remplis par les initContainers pour faciliter la dĂ©sinstallation via Helm. + +On note que Crossplane vient avec : +- RBAC Manager qui gĂ©re dynamiquement les droits des services accounts utilisĂ©s par les entitĂ©s managĂ©es par Crossplane. Lorsque l'on ajoute un provider notamment (e.g. AWS), il est nĂ©cessaire que le service account utilisĂ© par <...> ait les droits de manipuler les diffĂ©rents CRD associĂ©es Ă  ce provider (e.g. Bucket), ce que gĂšre automatiquement RBAC Manager. (Plus d'info sur le sujet ici : https://github.com/crossplane/crossplane/blob/master/design/design-doc-rbac-manager.md) +- Le service crossplane-webhooks est fourni par Helm mais la partie configuration (i.e. `ValidatingWebhookConfiguration`) est gĂ©nĂ©rĂ©e Ă  la volĂ©e par l'init container de Crossplane. + + +### +- Providers (controller) +- Functions (serveur gRPC) + +### Usage + +#### Providers +A l'image de Terraform, Crossplane utilise la notion de _Provider_ pour dĂ©signer l'entitĂ© qui gĂšre les appels API vers un fournisseur de cloud. +Installation d'un provider + +Exemple d'objet provider pour AWS en version YAML +```yaml +apiVersion: pkg.crossplane.io/v1 +kind: Provider +metadata: + name: provider-aws +spec: + package: xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0 +``` + +Exemple identique en version HELM + + +N.B : On pourra par la suite mettre Ă  jour ce provider en modifiant la version specifiĂ©. Crossplane gĂšre un historique de rĂ©vision pour un Ă©ventuel rollback. + + +#### Suppression +Pour gĂ©rer la suppression, Crossplane applique des `Finalizers` sur les CRD de ressources managĂ©es. Cela permet de s'assurer que l'objet reste dans Kubernetes tant que le controller n'a pas fait la suppression effective. + +### Configuration +#### Provider + +##### DeploymentRuntimeConfig +UtilisĂ© pour configurer les Ă©lĂ©ments qui ont un runtime (`Provider` et `Function`) +Utilise le mĂȘme schema que Deployment. +On rajoute la ref dans l'objet initial (`spec.runtimeConfigRef.name`) et on crĂ©Ă© un objet de type `DeploymentRuntimeConfig` qui partage a ce mĂȘme nom (`metadata.name`) + +Exemple : + +```yaml +apiVersion: pkg.crossplane.io/v1 +kind: Provider +metadata: + name: provider-gcp-iam +spec: + package: xpkg.upbound.io/upbound/provider-gcp-iam:v0.37.0 + runtimeConfigRef: + name: enable-ess +--- +apiVersion: pkg.crossplane.io/v1beta1 +kind: DeploymentRuntimeConfig +metadata: + name: enable-ess +spec: + deploymentTemplate: + spec: + ... +``` + +##### Credentials +```yaml +apiVersion: aws.crossplane.io/v1beta1 +kind: ProviderConfig +metadata: + name: aws-provider +spec: + credentials: + source: Secret + secretRef: + namespace: crossplane-system + name: aws-creds + key: creds +``` +N.B : On utilise le provider AWS ici, notez que la configuration peut varier d'une provider Ă  l'autre + +On peut dĂ©terminer plusieurs `ProviderConfig` (imagniez un scĂ©nario avec diffĂ©rents types d'accĂšs) et on prĂ©cisera quel config on utilise dans les objets de type ressource + +```yaml +apiVersion: s3.aws.upbound.io/v1beta1 +kind: Bucket +metadata: + name: user-bucket +spec: + forProvider: + region: eu-west-3 + providerConfigRef: + name: user-keys +``` + + + + + +Ceci Ă©tant, on va pouvoir maintenant crĂ©Ă©r des ressources sur ce provider. + + +- On peut mettre Ă  jour et installer plusieurs version de providers. Crossplane ne garde par dĂ©fault qu'une seule version antĂ©rieur, mais c'est paramĂ©trable + + + +- Refresh toutes les minutes par dĂ©fault, Ă  ajuster si besoin pour limiter les calls API. + +### Terraform vs Crossplane +Conceptuellement, Crossplane est un control plane en lui mĂȘme lĂ  oĂč Terraform est plus une interface de control planes. +Terraform n'entre pas _de facto_ dans une logique de boucle de reconciliation. + + +Terraform offers a command-line interface to control plane APIs, while Crossplane is itself a control plane that can be used to build abstractions atop other control planes. + + +Une +Collaboration scales in Crossplane because the Crossplane Resource Model (XRM) promotes loose coupling and eventual consistency. In Crossplane every piece of infrastructure is an API endpoint that supports create, read, update, and delete operations. Crossplane does not need to calculate a graph of dependencies to make a change, so you can easily operate on a single database, even if you manage your entire production environment with Crossplane. + +### Platform engineering +- Claims + +### Migration +- L'outil propose des importers pour les controllers il me semble. + +### MaturitĂ© + +Passer + + +### L'oeuf đŸ„š et la poule 🐔 +Pour du k9s, il faut un cluster pour gĂ©rer son autre clusetr Un cluster peut gĂ©rer un cluster. +Par dĂ©fault, reconcilie toutes les heures, mais on peut descendre (/!\ aux quotas) + + +### Questions Ă  clarifier + +- Qu'est ce qu'il se passe si quelqu'un a dĂ©truit un s3 par exemple ? ça va le recrĂ©er vide et on n'est pas notifiĂ© ? N.B: Le problĂšme est identique Ă  TF on dirait. +- Est-ce qu'on peut supprimer des ressources comme un state rm (=sans destruction) + +### En savoir plus +- +- KubeCon Paris 2024 : Crossplane Intro and Deep Dive - the Cloud Native Control Plane Framework +

+ + +TEST + +| Month | Savings | +| -------- | ------- | +| January | $250 | +| February | $80 | +| March | $420 | diff --git a/_assets/articles/2024-04-30-k8s-crossplane-introduction/cover.jpg b/_assets/articles/2024-04-30-k8s-crossplane-introduction/cover.jpg new file mode 100644 index 000000000..b633603b9 Binary files /dev/null and b/_assets/articles/2024-04-30-k8s-crossplane-introduction/cover.jpg differ diff --git a/_assets/articles/2024-04-30-k8s-crossplane-introduction/crossplane-logo.webp b/_assets/articles/2024-04-30-k8s-crossplane-introduction/crossplane-logo.webp new file mode 100644 index 000000000..2109927ed Binary files /dev/null and b/_assets/articles/2024-04-30-k8s-crossplane-introduction/crossplane-logo.webp differ