Managed OVH Kubernetes
On peut distinguer deux types de clusters Kubernetes, ceux qui sont managés et ceux qui ne le sont pas. Un Kubernetes managé est un cluster Kubernetes dont vous ne gérez pas le control plane. Généralement via une interface web ou une API, vous pouvez demander la création d’un cluster Kubernetes. On considère que le control plane est managé car vous n’aurez pas à faire les updates vous même, la supervision est souvent déjà configurée etc. Les workers peuvent être parfois managés, c’est le cas notamment avec les managed node groups sur EKS ou les node pools sur GKE.
Les workers peuvent parfois être serverless, par exemple avec EKS/Fargate associé par Virtual Kubelet dont nous avons parlé sur ce blog
Dans les deux cas, les ressources de calcul sont généralement à votre charge.
La quasi totalité des cloud public providers fournissent une solution managée de Kubernetes :
- Elastic Kubernetes Engine (EKS) pour Amazon Web Services
- Google Kubernetes Engine (GKE) pour Google
- Azure Kubernetes Service (AKS) pour Microsoft Azure
- Managed Kubernetes Service pour OVH
- Managed Kubernetes chez DigitalOcean
- Kubernetes Kapsule chez Scaleway
Toutes ces solutions ont en commun d’être certifiées conformes par la CNCF.
Après avoir testé la solution Kapsule de Scaleway, nous allons aujourd’hui tester le Kubernetes managé d’OVH.
Pricing
Comme beaucoup de fournisseurs, le service managé est gratuit et la facturation est realisée uniquement sur les noeuds, suivant les types d’instances.
Déploiement d’OVH Kubernetes
Il est possible dans un premier temps d’accéder au service Kubernetes managé depuis votre console OVH public Cloud.
Il est ensuite possible de sélectionner la région ainsi que la version du cluster. Les versions proposées vont de 1.15 à 1.17. Nous allons déployer un cluster en 1.17.
Le cluster est disponible en 5 minutes, il est temps d’ajouter des nœuds. La console OVH propose une interface pour gérer le cluster et les nœuds. Les nœuds disponibles sont les même instances que celles proposées par le public cloud OVH. Pour le moment les nœuds sont rajoutés de manière individuelle mais le concept de node pool et d’autoscaling sera disponible cette année.
Pour le moment, pas de GPU avec Kubernetes mais un OVH lab est en cours d’élaboration qui permettra d’ajouter des nœuds bare metal avec des GPU.
Rajouter des nœuds se fait simplement dans l’interface :
Récupération du Kubeconfig
Le Kubeconfig est téléchargeable également depuis l’interface. Il est ensuite possible d’accéder au cluster:
$ export KUBECONFIG=$(pwd)/kubeconfig.yml
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
particule Ready <none> 17m v1.17.5 51.210.39.198 <none> Ubuntu 18.04.4 LTS 4.15.0-96-generic docker://18.6.3
particule-b Ready <none> 109s v1.17.5 51.210.36.244 <none> Ubuntu 18.04.4 LTS 4.15.0-96-generic docker://18.6.3
$ kubectl get pods -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system canal-br6v7 2/2 Running 0 2m21s 51.210.36.244 particule-b <none> <none>
kube-system canal-zrl4j 2/2 Running 0 17m 51.210.39.198 particule <none> <none>
kube-system coredns-76bd8dbd8c-gm9bk 1/1 Running 0 2m11s 10.2.0.5 particule <none> <none>
kube-system coredns-76bd8dbd8c-hg49c 1/1 Running 0 32m 10.2.0.2 particule <none> <none>
kube-system kube-dns-autoscaler-64bc6d94b9-79x2z 1/1 Running 0 32m 10.2.0.3 particule <none> <none>
kube-system kube-proxy-rmglz 1/1 Running 0 17m 51.210.39.198 particule <none> <none>
kube-system kube-proxy-tr8s9 1/1 Running 0 2m21s 51.210.36.244 particule-b <none> <none>
kube-system metrics-server-857c75cd6f-7mxx6 1/1 Running 0 31m 10.2.0.4 particule <none> <none>
kube-system wormhole-4dztq 1/1 Running 0 2m21s 51.210.36.244 particule-b <none> <none>
kube-system wormhole-pvzjf 1/1 Running 0 17m 51.210.39.198 particule <none> <none>
La solution de CNI utilisée est canal, qui combine flannel et calico pour les network policy.
Pour l’instant le trafic transit sur le réseau public d’OVH et est chiffré via la solution CNI wormhole. L’integration au vRack et la possibilité de créer des clusters privés sera ajoutée dans l’année.
Comment automatiser ?
OVH dispose d’un provider Terraform, malheureusement la ressource Kubernetes n’est pas disponible pour le moment mais on nous dit dans l’oreillette que ca ne saurait tarder.
Il est tout de même possible de déployer via l’API, cette API est également accessible via une WebUI qui propose de piloter les différents services offert par OVH.
Fonctionnalités disponibles
Parmi les fonctionnalités exposées, on notera l’intégration au stockage persistant Cinder pour les workloads statefuls (support du redimensionnement), la gestion de l’autoscaling des pods via HPA ainsi que l’intégration des loadbalancers.
Une liste des différentes fonctionnalités est disponible ici.
Mini demo
Pour tester les loadbalancers et les volumes Cinder, vous pouvez utiliser ce
yaml
:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
labels:
app: hello-world
spec:
replicas: 1
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: particule/helloworld:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/claim"
name: pv-storage
volumes:
- name: pv-storage
persistentVolumeClaim:
claimName: pv-claim
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello-world
name: hello-world
spec:
ports:
- name: http
port: 80
protocol: TCP
selector:
app: hello-world
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Puis:
$ kubectl apply -f ovh.yaml
deployment.apps/hello-world created
service/hello-world created
persistentvolumeclaim/pv-claim created
Après quelques minutes, les ressources sont disponibles.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-6cf5f597cb-6jvrj 1/1 Running 0 5m19s
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
ovh-managed-kubernetes-rq4ajb-pvc-aa2e0e0c-d44b-4210-89f0-293f6ed7f94a 10Gi RWO Delete Bound default/pv-claim csi-cinder-high-speed 10m
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pv-claim Bound ovh-managed-kubernetes-rq4ajb-pvc-aa2e0e0c-d44b-4210-89f0-293f6ed7f94a 10Gi RWO csi-cinder-high-speed 10m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world LoadBalancer 10.3.46.3 6epat74kjk.lb.c1.gra7.k8s.ovh.net 80:32063/TCP 8m3s
Notre service est accessible sur l’url http://6epat74kjk.lb.c1.gra7.k8s.ovh.net
On peut également voir dans le pod notre volume persistant monté dans /claim
.
$ kubectl exec -it hello-world-6cf5f597cb-6jvrj -- /bin/sh
$ df -h
Filesystem Size Used Available Use% Mounted on
/dev/sdb 9.8G 36.0M 9.7G 0% /claim
Fonctionnalité prévues
Nous les avons mentionnées en cours d’article mais un petit récapitulatif ne fait pas de mal :
- Intégration au vRack pour les clusters et réseaux privés.
- Autoscaling des nœuds via la fonction de node groups
- Nœuds baremetal et GPU.
Conclusion
Le service reste pour le moment un peu limité en terme de fonctionnalités mais une fois intégré avec le catalogue de services OVH et notamment le vRack, les possibilités d’intégration seront fortement étendues. Pour nous, intégrer ce service aux modules Terraform est également un “must have”.