Déployer Cloud Foundry sur Kubernetes en utilisant KubeCF, AKS-Engine et CF-Operator …
Tags: cloudfoundry, kubernetes, docker, azure
Published: 2020-02-23 02:56:40

---
title: Déployer Cloud Foundry sur Kubernetes en utilisant KubeCF, AKS-Engine et CF-Operator …
published: true
date: 2020-02-23 02:30:40 UTC
tags: cloud-foundry,kubernetes,docker,azure
canonical_url: https://medium.com/@abenahmed1/d%C3%A9ployer-cloud-foundry-sur-kubernetes-en-utilisant-kubecf-aks-engine-et-cf-operator-49bf73afca8
---


![](https://cdn-images-1.medium.com/max/7168/1*6HQ8NEFY7VxZ-NIzaRHHRQ.png)

Pour ceux qui ont déjà installé Cloud Foundry dans le passé, BOSH était le seul moyen d’installer et de gérer un cluster Cloud Foundry. Enfin, c’était avant l’arrivée de CF-Operator, Cloud Foundry Quarks, Eirini, et KubeCF …
[**Une expérience locale rapide et facile de Cloud Foundry pour les développeurs via CF Dev / Stratos…**
*Je vais m’intéresser dans cet article à l’un projet de l’incubateur de Cloud Foundry à savoir CF Dev et son pendant…*medium.com](https://medium.com/@abenahmed1/une-exp%C3%A9rience-locale-rapide-et-facile-de-cloud-foundry-pour-les-d%C3%A9veloppeurs-via-cf-dev-stratos-19f4afb4b4e)
[**Déploiement d’un cluster Cloud Foundry avec Stratos dans Azure et mise en oeuvre de pipelines de…**
*Je vais m’interesser à Cloud Foundry, une plate-forme d’application multi-cloud open source et multi-cloud sous forme…*medium.com](https://medium.com/@abenahmed1/d%C3%A9ploiement-dun-cluster-cloud-foundry-avec-stratos-dans-azure-et-mise-en-oeuvre-de-pipelines-de-841b9c54c67b)

Dans cette nouvelle expérience, je commence par lancer un cluster Kubernetes par l’entremise d’AKS-Engine. AKS Engine fournit des outils pratiques permettant d’amorcer rapidement via ARM (Azure Resource Manager), de créer, de détruire et de maintenir des clusters Kubernetes approvisionnés en ressources IaaS sur Azure. AKS Engine est également la bibliothèque utilisée par AKS pour effectuer ces opérations afin de fournir des implémentations de services gérés :
[**Azure/aks-engine**
*AKS Engine is the easiest way to provision a self-managed Kubernetes cluster on Azure. AKS Engine provides convenient…*github.com](https://github.com/Azure/aks-engine)

Après avoir cloné localement le dépôt d’AKS-Engine sur Github, je récupère le fichier JSON qui permet de profiter des machines virtuelles Spot dans Azure dans le cluster Kubernetes à provisionner. Les machines virtuelles Spot Azure vous donnent accès à une capacité de calcul Azure inutilisée en échange de remises importantes. Les tarifs Spot sont disponibles sur les machines virtuelles uniques, en plus de groupes de machines virtuelles identiques (VMSS — Virtual Machine Scale Sets). Cela vous permet de déployer sur Azure un plus large éventail de charges de travail tout en bénéficiant de prix réduits. Les machines virtuelles Spot offrent les mêmes caractéristiques que les machines virtuelles avec paiement à l’utilisation, et se distinguent en termes de tarification et de suppression. Les machines virtuelles Spot peuvent être supprimées à tout moment si Azure a besoin de capacité :
[**Machines virtuelles Spot désormais en préversion | Mises à jour Azure | Microsoft Azure**
*Les Machines virtuelles Azure Spot vous permettent d'accéder à la capacité de calcul inutilisée d'Azure en bénéficiant…*azure.microsoft.com](https://azure.microsoft.com/fr-fr/updates/azure-spot-vms-now-in-preview/)

Au préalable, j’ai récupéré le binaire AKS-Engine sur Github :
[**Azure/aks-engine**
*You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or…*github.com](https://github.com/Azure/aks-engine/releases)

et j’ai généré un principal du service Azure AD pouvant créer des ressources :
[**Utilisez des principaux du service Azure avec Azure CLI**
*Les outils automatisés qui utilisent les services Azure doivent toujours avoir des autorisations restreintes. Automated…*docs.microsoft.com](https://docs.microsoft.com/fr-fr/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest)

Je lance la création du nouveau cluster Kubernetes avec le binaire AKS-Engine :

![](https://cdn-images-1.medium.com/max/4096/1*l4MwHysihjYod-dso_78NA.png)

![kubernetes.json](https://cdn-images-1.medium.com/max/2524/1*NI7R7c_AxpURLzYn3Yvd-Q.png)

Le cluster AKS est présent et opérationnel dans Azure :

![](https://cdn-images-1.medium.com/max/2668/1*QY48vGRw1OCUwIyf5MTLmg.jpeg)

![](https://cdn-images-1.medium.com/max/2664/1*j7amf41LKfPb3CufCzn45A.jpeg)

![](https://cdn-images-1.medium.com/max/2722/1*Rwe7THizICko-ciECkEPqQ.jpeg)

Je bénéficie normalement du service de Load Balancing dans AKS-Engine mais pour initier mon plan d’adressage, j’ai initié un plan d’adressage avec ZeroTier dans ce cluster :

![](https://cdn-images-1.medium.com/max/4096/1*zjPLqkeWCn_aEzg4n_qVLA.png)

![](https://cdn-images-1.medium.com/max/2634/1*A1wiW0n6VYC-s3M0NgMULQ.jpeg)

Pour la suite, j’ai besoin d’installer Helm 3 dans ce cluster et je récupère le binaire depuis Github :
[**helm/helm**
*Create your free GitHub account today to subscribe to this repository for new releases and build software alongside 40…*github.com](https://github.com/helm/helm/releases)

![](https://cdn-images-1.medium.com/max/4096/1*UU4Ym1F4dz25LIEPJ60hYQ.png)
>  CF-Operator est un opérateur Kubernetes déployé via un Helm Chart qui installe une série de définitions de ressources personnalisées (CRD) qui convertissent les versions BOSH en ressources Kubernetes telles que des pods, des déploiements et des ensembles avec état. Cela n‘entraîne pas à lui seul un déploiement de Cloud Foundry.
>  KubeCF est une version de Cloud Foundry déployée sous la forme d’un Helm Chart, principalement développée par SUSE, qui exploite CF-Operator.
>  Eirini échange le backend Diego contre Kubernetes, ce qui signifie que lorsque vous poussez, vos applications s’exécutent en tant que pods Kubernetes à l’intérieur d’un ensemble avec état.
>  En utilisant ces outils ensemble, on peut déployer un plan de contrôle Cloud Foundry et faire fonctionner les applications en tant que Pods dans Kubernetes.
[**Project Quarks for Application Runtime | Cloud Foundry**
*Project Quarks is an incubating effort within the Cloud Foundry Foundation that packages Cloud Foundry Application…*www.cloudfoundry.org](https://www.cloudfoundry.org/project-quarks/)
[**Project Eirini | Application Runtime & Kubernetes | Cloud Foundry**
*Project Eirini is an incubating effort within the Cloud Foundry Foundation enabling pluggable scheduling for the Cloud…*www.cloudfoundry.org](https://www.cloudfoundry.org/project-eirini/)

Je lance le déploiement de CF-Operator dans le cluster via un Helm Chart :

    $ kubectl create cf-operator

    $ helm install cf-operator \
      --namespace cf-operator \
      --set "global.operator.watchNamespace=kubecf" \
      https://s3.amazonaws.com/cf-operators/release/helm-charts/cf-operator-v2.0.0-0.g0142d1e9.tgz

Je vérifie que les Pods / CRD sont bien lancés :

![](https://cdn-images-1.medium.com/max/3940/1*20Mt_zsw4g-PqFIu6GqgHg.png)

![](https://cdn-images-1.medium.com/max/2000/1*vJ-UDaBNXV1C5OhHCLXyhg.jpeg)

Pour définir les bons plans d’adressage à déclarer dans le fichier de configuration nommé *values.yaml*, je lance ces commandes :

    $ kubectl cluster-info dump --output yaml \
      | awk 'match($0, /cluster-cidr=(.*)/, cidr) { print cidr[1] }'

    $ kubectl cluster-info dump --output yaml \
      | awk 'match($0, /service-cluster-ip-range=(.*)/, range) { print range[1] }'

![](https://cdn-images-1.medium.com/max/3300/1*vVYlOnxoLzIxPbX7fBj1IQ.png)

d’où le fichier avec une configuration minimale pour le déploiement de Cloud Foundry (en prenant un domaine Wilcard qui pointera sur l’adresse IP du segment déclaré dans MetalLB qui sera attribuée au service nommé kubecf-router-public) :

![values.yaml](https://cdn-images-1.medium.com/max/2152/1*Q0v0gv_rRC1wPBZF-8JSeA.png)

Installation de KubeCF via un autre Helm Chart :

    $ helm install kubecf \
      --namespace kubecf \
      --values values.yaml \
      https://github.com/SUSE/kubecf/releases/download/v0.2.0/kubecf-0.2.0.tgz

![](https://cdn-images-1.medium.com/max/4096/1*gR9jwYPeKl7zZah0mXwwUg.png)

avec ce fichier YAML minimal par défaut. Je possède l’adresse IP fournie par le service de Load Balancing via MetalLB pour le service nommé kubecf-router-public :

![](https://cdn-images-1.medium.com/max/2708/1*t_pE_rqmoUVlZ3HVFM1aTA.jpeg)

Un lancement des Pods avec ces valeurs s’opèrent dans le cluster (après une dizaine de minutes) :

![](https://cdn-images-1.medium.com/max/2716/1*b9yZfxJ7OmQRsvbiBCIaQw.jpeg)

Je charge CF CLI depuis Github pour me connecter à Cloud Foundry :

![](https://cdn-images-1.medium.com/max/2870/1*lyMNLQpaeYJuzQSqEVeA2A.jpeg)

![](https://cdn-images-1.medium.com/max/3164/1*V-8K_pYvxjjAJSJwtSwHLw.png)

Avec le client CF déjà installé, je peux cibler et m’authentifier sur Cloud Foundry en utilisant l’URL du domaine qui correspond à celui enregistré dans le fichier de configuration *values.yaml* :
[**Getting Started with the cf CLI**
*This topic describes configuring and getting started with the Cloud Foundry Command Line Interface (cf CLI). The cf CLI…*docs.cloudfoundry.org](https://docs.cloudfoundry.org/cf-cli/getting-started.html)

![](https://cdn-images-1.medium.com/max/4096/1*dREL5U2Jm4DgOgraM_2Bew.png)

ce que je peux alors faire :

    $ admin_pass=$(kubectl get secret \
    >         --namespace kubecf kubecf.var-cf-admin-password \
    >         -o jsonpath='{.data.password}' \
    >         | base64 --decode)

    $ cf auth admin "${admin_pass}"

![](https://cdn-images-1.medium.com/max/2792/1*VdP-ke43DL8JlJUWvnBVPw.png)

Je crée mon Espace et mon Organisation :

    $ cf create-org MAS
    $ cf create-space TEST -o MAS
    $ cf target -o MAS

![](https://cdn-images-1.medium.com/max/2682/1*6VfymjPNU9QOHv9Xigu1RQ.jpeg)

Je peux activer dans Cloud Foundry, Diego un système de gestion de containers auto-réparables qui tente de maintenir le nombre correct d’instances en cours d’exécution dans les cellules afin d’éviter les pannes et les plantages du réseau. Diego programme et exécute des tâches et des processus de longue durée :

    $ cf enable-feature-flag diego_docker
[**Diego Components and Architecture**
*This topic describes the components that form and interact with the Diego system in Cloud Foundry Application Runtime…*docs.cloudfoundry.org](https://docs.cloudfoundry.org/concepts/diego/diego-architecture.html)

![](https://cdn-images-1.medium.com/max/2700/1*gktN9Q1bIaBPnNVOMk6iYg.jpeg)

Il est dès lors possible de lancer une image Docker via le client CF :

    $ cf push fcdemo -o mcas/franceconnect-agent-demo:master -m 128M -k 384M

![](https://cdn-images-1.medium.com/max/2718/1*n2w4A_WU3Z2W3mA3INmGMQ.jpeg)

![](https://cdn-images-1.medium.com/max/2696/1*yvA2x301J2J_keMwxZn7Ow.jpeg)

J’installe Stratos, une interface utilisateur Web (console) open source pour la gestion de Cloud Foundry. Cela permet aux utilisateurs et aux administrateurs de gérer les applications et d’effectuer des tâches de gestion du cluster :

    $ cf push console -o splatform/stratos:stable -m 128M -k 384M
[**cloudfoundry/stratos**
*Stratos is an Open Source Web-based UI (Console) for managing Cloud Foundry. It allows users and administrators to both…*github.com](https://github.com/cloudfoundry/stratos)

![](https://cdn-images-1.medium.com/max/2712/1*VAGvSmKowc7PqbVdb3Nmgg.jpeg)

Connexion à Stratos avec les mêmes identifiants utilisés avec le client CF :

![](https://cdn-images-1.medium.com/max/2716/1*ME2jsDIdEM_K97n-zWp_aQ.jpeg)

![](https://cdn-images-1.medium.com/max/2716/1*9rpbe1d1L5QdkFb9XNQcZg.jpeg)

Je peux visualiser l’application lancée précédemment :

![](https://cdn-images-1.medium.com/max/2700/1*Po7Ra1jpoTbFrmXLBlDb3Q.jpeg)

![](https://cdn-images-1.medium.com/max/2726/1*AhI2DPoiSbKCQzcAJgo0nw.jpeg)

![](https://cdn-images-1.medium.com/max/2724/1*qAPDZsgGqkZQc-QXhjBWTQ.jpeg)

![](https://cdn-images-1.medium.com/max/2698/1*qVPf2slBmzXYtnsCLXZo_A.jpeg)

Autre test avec le lancement directement depuis un dépôt source récupéré depuis Github (avec encore une fois le démonstrateur FC) qui va engendrer le chargement des buildpacks dans Cloud Foundry :

![](https://cdn-images-1.medium.com/max/4096/1*nh2yu53ymvWZz2w0pDmpmA.png)

visualisable dans la console Stratos :

![](https://cdn-images-1.medium.com/max/2690/1*eWwXL0sQ1RqMZ9-ngyEn2A.jpeg)

![](https://cdn-images-1.medium.com/max/2718/1*k12Uc2_lvTw1BzL2Fk2TLA.jpeg)

![](https://cdn-images-1.medium.com/max/2716/1*geLW3FSbQ2UHPJUQ9SvITw.jpeg)

Rapide test de mise à l’echelle horizontale et verticale de cette application :

![](https://cdn-images-1.medium.com/max/3300/1*N0RU7kNEkTwycA0M1r-6QQ.png)

![](https://cdn-images-1.medium.com/max/2712/1*8wGWSqj7rl3cSxrlJImDFg.jpeg)

![](https://cdn-images-1.medium.com/max/2704/1*wtU_EY9l42VehDIS3anTpQ.jpeg)

On peut visualiser les Pods engendrés par cette application dans le cluster Kubernetes :

![](https://cdn-images-1.medium.com/max/2760/1*4m9eOI3XjSJfeLfRvo-iNA.png)

également via Weave Scope :

![](https://cdn-images-1.medium.com/max/4096/1*l5c3oLWkXkf-nPujMO2MgA.png)

![](https://cdn-images-1.medium.com/max/2706/1*Xe1POOveAqxTsQBwjqhpeQ.jpeg)

![](https://cdn-images-1.medium.com/max/2710/1*uXA_a0Tk9_UuLJiwsUvtfQ.jpeg)

![](https://cdn-images-1.medium.com/max/2694/1*h_TTA_f4BB-mXBYhCfklag.jpeg)

Avec accès à l’application via la route fournie dans Cloud Foundry :

![](https://cdn-images-1.medium.com/max/2730/1*Vtx69pXDlBa9DbeabusEVQ.jpeg)

![](https://cdn-images-1.medium.com/max/2692/1*dBj7nmqXwlilumQMUdfHug.jpeg)

![](https://cdn-images-1.medium.com/max/2690/1*2q6j3nS_5988m1yZLx6zsQ.jpeg)

![](https://cdn-images-1.medium.com/max/2714/1*9o_y6LYxaQBqh7mA-RnasQ.jpeg)

On pourrait aller plus loin dans ce cluster Cloud Foundry via l’initiation de Pipelines de CI/CD via Concourse :
[**7. Concourse Pipeline (Cloud Foundry)**
*Important In this chapter, we assume that you deploy your application to Cloud Foundry PaaS. The Spring Cloud Pipelines…*cloud.spring.io](https://cloud.spring.io/spring-cloud-pipelines/multi/multi_concourse-pipeline-cf.html)

![](https://cdn-images-1.medium.com/max/2800/0*yWzyp7KembL5u4ZV.png)

***Quelques liens sur le sujet :***
[**Integrate Cloud Foundry with Kubernetes using the cf-operator and kubecf**
*If you work in the software industry, you have more then likely come across the terms IaaS, PaaS and SaaS. IaaS stands…*www.careyscloud.ie](https://www.careyscloud.ie/kube-cf/)
[**Running Cloud Foundry on Kubernetes using KubeCF**
*At Stark & Wayne, we've spent a ton of time figuring out the best solutions to problems using the open source tools we…*starkandwayne.com](https://starkandwayne.com/blog/running-cloud-foundry-on-kubernetes-using-kubecf/)
[**Deploying CloudFoundry on a local Kubernetes**
*I have met a lot of people which uses Docker/Kubernetes but which never used CloudFoundry so I will start with a short…*medium.com](https://medium.com/@jmpinto/deploying-cloudfoundry-on-a-local-kubernetes-9103a57bf713)

KubeCF et CF-Operator sont amenés à évoluer rapidement pour simplifier l’usage et le déploiement d’applications dans Kubernetes via … Cloud Foundry. En effet, avec ceci on a la possibilité de fournir une offre de type PaaS plus complète aux équipes de développement tout en profitant de déploiements dans Kubernetes. Cela permettrait aux équipes de développement de décider lequel de ces deux types de services ou d’applications convient le mieux en sélectionnant l’une de ces deux plate-formes voire les deux. Les équipes disposant d’applications de base pourraient les déployer en exécutant simplement un “*cf push*” par exemple …

![](https://cdn-images-1.medium.com/max/2000/1*uY8HNXm3AUY4F6o7CTyMDQ.jpeg)

À suivre …