Skip to content

Commit

Permalink
feat: temporary commit to test in CI local md table render bug
Browse files Browse the repository at this point in the history
  • Loading branch information
dimitri-fert committed Apr 15, 2024
1 parent ea996d0 commit e7b8b4f
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 0 deletions.
250 changes: 250 additions & 0 deletions _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
<p align="center"><iframe width="640" height="385" src="https://www.youtube.com/embed/S2BQz-5cboA" title="Crossplane Intro and Deep Dive - the Cloud Native Control Plane Framework" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>


TEST

| Month | Savings |
| -------- | ------- |
| January | $250 |
| February | $80 |
| March | $420 |
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.

0 comments on commit e7b8b4f

Please sign in to comment.