Rancher Labs vient d’introduire son nouveau projet dénommé Rio. Rio est un MicroPaaS qui peut être superposé sur n’importe quel cluster Kubernetes standard. Composé de quelques ressources personnalisées et d’un outil en ligne de commande pour améliorer l’expérience utilisateur, on peut facilement déployer des services vers Kubernetes et obtenir automatiquement un processus de livraison continue, un service de ReverseDNS, du routage, de la surveillance, de la mise à l’échelle automatique et bien plus encore …

Tout ce qu’il faut pour démarrer, c’est un cluster Kubernetes existant et le Rio CLI.

Je pars au préalable d’un déploiement d’un cluster Kubernetes via GKE.

MacBook-Pro-de-admin:~ admin$ gcloud container clusters create ghost-cluster   --enable-cloud-logging   --enable-cloud-monitoring   --subnetwork default

Ce qui donne au bout de quelque secondes :

kubeconfig entry generated for ghost-cluster.
NAME           LOCATION        MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
ghost-cluster  europe-west1-b  1.12.8-gke.10   35.195.19.118  n1-standard-1  1.12.8-gke.10  3          RUNNING
MacBook-Pro-de-admin:~ admin$ gcloud container clusters get-credentials ghost-cluster

Après quoi on vérifie l'état des serveurs :

MacBook-Pro-de-admin:~ admin$ kubectl cluster-info
Kubernetes master is running at https://35.195.19.118
GLBCDefaultBackend is running at https://35.195.19.118/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
Heapster is running at https://35.195.19.118/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://35.195.19.118/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://35.195.19.118/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

Et on lance Rio :

MacBook-Pro-de-admin:~ admin$ curl -sfL https://get.rio.io | sh - 
Password:
[INFO]  Finding latest release
[INFO]  Using v0.1.1 as release
[INFO]  Downloading hash https://github.com/rancher/rio/releases/download/v0.1.1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/rancher/rio/releases/download/v0.1.1/rio-darwin-amd64
[INFO]  Verifying binary download
[INFO]  Installing rio to /usr/local/bin/rio

On installe :

MacBook-Pro-de-admin:~ admin$ rio install
Defaulting cluster CIDR to 10.20.0.1/16
Deploying Rio control plane....
Welcome to Rio!

Run `rio run https://github.com/rancher/rio-demo` as an example
MacBook-Pro-de-admin:~ admin$ kubectl get po -n rio-system

On vérifie si tout est prêt :

MacBook-Pro-de-admin:~ admin$ kubectl get po -n rio-system
NAME                                READY   STATUS    RESTARTS   AGE
autoscaler-df59df498-mkpvt          1/1     Running   0          3m45s
build-controller-7468d8c455-thxrs   2/2     Running   0          3m44s
buildkit-5f944f4cd8-mm485           2/2     Running   0          3m44s
cert-manager-cd7b5788-pxqs6         1/1     Running   0          2m56s
grafana-6ddd6b87c4-tjvgk            2/2     Running   0          3m37s
istio-citadel-7c48c8d9d5-bbf9m      1/1     Running   0          3m36s
istio-gateway-5pds7                 2/2     Running   0          3m27s
istio-gateway-pdswq                 2/2     Running   0          3m27s
istio-gateway-r7pbr                 2/2     Running   0          3m28s
istio-pilot-5d847f8b48-27j7r        2/2     Running   0          3m28s
istio-telemetry-9b5f45488-l4jxw     2/2     Running   0          3m38s
kiali-97c4cb7d9-8lw89               2/2     Running   0          2m56s
prometheus-7c55879d46-dnpl2         1/1     Running   0          3m45s
registry-98568d48d-2htcr            2/2     Running   0          3m44s
registry-proxy-4h7qg                1/1     Running   0          3m42s
registry-proxy-5s96j                1/1     Running   0          3m42s
registry-proxy-7vm8d                1/1     Running   0          3m42s
rio-controller-56cc89bf6b-brmf7     1/1     Running   0          3m58s
webhook-77c7c9bdcc-8s7cg            2/2     Running   0          3m44s

On peut lancer un service web en démo :

rio run https://github.com/rancher/rio-demo

Et checker l'état du déploiement en live :

$ rio ps
$ rio console
$ rio info

Voici l'état de chacun :

MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED              ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/romantic-knuth9   About a minute ago   https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          0/1       100%      v0 NotReady

et :

MacBook-Pro-de-admin:~ admin$ rio info
Rio Version: v0.1.1 (271d9196)
Rio CLI Version: v0.1.1 (271d9196)
Cluster Domain: ytckyt.on-rio.io
Cluster Domain IPs: 34.76.32.247
System Namespace: rio-system

System Components:
Autoscaler status: running
BuildController status: running
BuildKit status: running
CertManager status: running
Grafana status: running
IstioCitadel status: running
IstioPilot status: running
IstioTelemetry status: running
Kiali status: running
Prometheus status: running
Registry status: running
Webhook status: running

Puis au bout de quelques minutes nous obtenons :

MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED        ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/romantic-knuth9   16 hours ago   https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%      

Et en web :

Pour connaître l'état de tout les services sur votre cluster, la commande habituelle et son résultat :

MacBook-Pro-de-admin:~ admin$ sudo kubectl get svc --all-namespaces
NAMESPACE     NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                  AGE
default       kubernetes             ClusterIP      10.20.0.1      <none>         443/TCP                                  47h
default       romantic-knuth9        ClusterIP      10.20.5.90     <none>         80/TCP                                   46h
default       romantic-knuth9-v0     ClusterIP      10.20.14.181   <none>         80/TCP                                   46h
kube-system   default-http-backend   NodePort       10.20.14.164   <none>         80:30464/TCP                             47h
kube-system   heapster               ClusterIP      10.20.10.143   <none>         80/TCP                                   47h
kube-system   kube-dns               ClusterIP      10.20.0.10     <none>         53/UDP,53/TCP                            47h
kube-system   metrics-server         ClusterIP      10.20.4.186    <none>         443/TCP                                  47h
rio-system    autoscaler             ClusterIP      10.20.7.60     <none>         80/TCP                                   46h
rio-system    autoscaler-v0          ClusterIP      10.20.10.162   <none>         80/TCP                                   46h
rio-system    build-controller       ClusterIP      10.20.11.2     <none>         80/TCP                                   46h
rio-system    build-controller-v0    ClusterIP      10.20.5.209    <none>         80/TCP                                   46h
rio-system    buildkit               ClusterIP      10.20.1.55     <none>         9001/TCP                                 46h
rio-system    buildkit-v0            ClusterIP      10.20.14.226   <none>         9001/TCP                                 46h
rio-system    cert-manager           ClusterIP      10.20.14.151   <none>         80/TCP                                   46h
rio-system    cert-manager-v0        ClusterIP      10.20.5.92     <none>         80/TCP                                   46h
rio-system    grafana                ClusterIP      10.20.14.124   <none>         3000/TCP                                 46h
rio-system    grafana-v0             ClusterIP      10.20.15.184   <none>         3000/TCP                                 46h
rio-system    istio-citadel          ClusterIP      10.20.13.95    <none>         80/TCP                                   46h
rio-system    istio-citadel-v0       ClusterIP      10.20.13.68    <none>         80/TCP                                   46h
rio-system    istio-gateway          ClusterIP      10.20.4.5      <none>         80/TCP                                   46h
rio-system    istio-gateway-v0       LoadBalancer   10.20.3.166    34.76.32.247   9080:31973/TCP,9443:31128/TCP            46h
rio-system    istio-pilot            ClusterIP      10.20.9.9      <none>         8080/TCP,15010/TCP,15011/TCP,15014/TCP   46h
rio-system    istio-pilot-v0         ClusterIP      10.20.4.247    <none>         8080/TCP,15010/TCP,15014/TCP,15011/TCP   46h
rio-system    istio-telemetry        ClusterIP      10.20.13.139   <none>         9091/TCP,9093/TCP,15004/TCP,42422/TCP    46h
rio-system    istio-telemetry-v0     ClusterIP      10.20.5.143    <none>         42422/TCP,15004/TCP,9091/TCP,9093/TCP    46h
rio-system    kiali                  ClusterIP      10.20.15.238   <none>         20001/TCP                                46h
rio-system    kiali-v0               ClusterIP      10.20.15.253   <none>         20001/TCP                                46h
rio-system    prometheus             ClusterIP      10.20.8.255    <none>         9090/TCP                                 46h
rio-system    prometheus-v0          ClusterIP      10.20.13.207   <none>         9090/TCP                                 46h
rio-system    registry               ClusterIP      10.20.14.198   <none>         80/TCP                                   46h
rio-system    registry-v0            ClusterIP      10.20.9.176    <none>         80/TCP                                   46h
rio-system    webhook                ClusterIP      10.20.11.36    <none>         8090/TCP                                 46h
rio-system    webhook-v0             ClusterIP      10.20.0.155    <none>         8090/TCP                                 46h

Du beau monde installé sur notre cluster GKE !

Checker les logs ? rien de plus simple avec Rio :

MacBook-Pro-de-admin:~ admin$ rio systemlogs
rio-controller | time="2019-07-12T14:10:54Z" level=info msg="Starting admin.rio.cattle.io/v1, Kind=Feature controller"
rio-controller | time="2019-07-12T14:10:54Z" level=info msg="Starting feature stack"
rio-controller | time="2019-07-12T14:10:54Z" level=info msg="Starting feature prometheus"
rio-controller | time="2019-07-12T14:10:54Z" level=info msg="Starting feature mixer"
rio-controller | time="2019-07-12T14:10:55Z" level=info msg="Starting rio.cattle.io/v1, Kind=Service controller"
rio-controller | time="2019-07-12T14:10:55Z" level=info msg="Starting rio.cattle.io/v1, Kind=ExternalService controller"
rio-controller | time="2019-07-12T14:10:55Z" level=info msg="Starting rio.cattle.io/v1, Kind=Router controller"
rio-controller | time="2019-07-12T14:10:55Z" level=info msg="Starting rio.cattle.io/v1, Kind=App controller"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature grafana"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature kiali"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature letsencrypt"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature autoscaling"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature build"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting feature istio"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting apps/v1, Kind=Deployment controller"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting autoscale.rio.cattle.io/v1, Kind=ServiceScaleRecommendation controller"
rio-controller | time="2019-07-12T14:10:56Z" level=info msg="Starting build.knative.dev/v1alpha1, Kind=Build controller"

Déployer d'autres applications

Un autre exemple où nous allons scaler notre application web cette fois-ci :

MacBook-Pro-de-admin:~ admin$ rio run -p 80/http --name svc --scale=3 ibuildthecloud/demo:v1
default/svc:v0

Suivons l'état d'avancement :

MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED          ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/svc               23 seconds ago   https://svc-default.ytckyt.on-rio.io:9443               v0          3         100%      
default/romantic-knuth9   46 hours ago     https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%    

On run comme pour Docker en récupérant une image du Docker Hub conçue pour Rancher, on l'appelle démo et on déploie sur le port 8080 :

MacBook-Pro-de-admin:~ admin$ rio run -p 8080/http --name demo monachus/rancher-demo:yellow
default/demo:v0

Ce qui nous donne :

MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED              ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/demo              About a minute ago   https://demo-default.ytckyt.on-rio.io:9443              v0          1         100%      
default/svc               5 minutes ago        https://svc-default.ytckyt.on-rio.io:9443               v0          3         100%      
default/romantic-knuth9   47 hours ago         https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%   

avec l’accès à ces services par un dispositif de ReverseDNS inclus avec Rio. Par défaut, Rio créera un enregistrement DNS pointant vers le cluster Kubernetes. Rio utilise également Let’s Encrypt pour créer un certificat pour le domaine cluster afin que tous les services puissent supporter HTTPS par défaut :

Petit récapitulatif qui peut-être obtenu simplement :

MacBook-Pro-de-admin:~ admin$ rio info
Rio Version: v0.1.1 (271d9196)
Rio CLI Version: v0.1.1 (271d9196)
Cluster Domain: ytckyt.on-rio.io
Cluster Domain IPs: 34.76.32.247
System Namespace: rio-system

System Components:
Autoscaler status: running
BuildController status: running
BuildKit status: running
CertManager status: running
Grafana status: running
IstioCitadel status: running
IstioPilot status: running
IstioTelemetry status: running
Kiali status: running
Prometheus status: running
Registry status: running
Webhook status: running

Autoscaling or not ?

Rio permet la mise en oeuvre de l’Auto Scaling ou dimensionnement automatique.

"Identifier les ressources qui ne sont plus utiles
En production, il est fort probable qu’une application soit prévue pour fonctionner en continu, à un certain niveau. Vous n’avez donc pas à déterminer si elle doit ou non tourner, mais en revanche, il faut vous appuyer sur des services d’auto-scaling pour accroitre ou diminuer les ressources de compute (scale-up, scale-out) en fonction des fluctuations de la demande."

Mise en oeuvre de l’outil Hey en ligne de commande pour générer de la charge sur le démonstrateur :

hey -z 60s -n 400 -c 100 https://svc-default.ytckyt.on-rio.io:9443

Par défaut, Rio activera cette mise à l’échelle automatique des charges de travail. En fonction des Qps et des demandes actives en cours, Rio adaptera automatiquement la charge de travail à l’échelle appropriée …

Pour finir, test du maillage de service. Les services peuvent avoir plusieurs versions déployées en même temps. Le maillage du service peut alors décider du volume de trafic à acheminer vers chaque révision. La commande rio stage mettra en scène une nouvelle révision d’un service existant. Par exemple, ici un scénario pour faire un déploiement canari :

MacBook-Pro-de-admin:~ admin$ rio stage --image=ibuildthecloud/demo:v3 default/svc:v3
default/svc:v3
MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED          ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/fcdemo            2 minutes ago    https://fcdemo-default.ytckyt.on-rio.io:9443            v0          1         100%      
default/demo              26 minutes ago   https://demo-default.ytckyt.on-rio.io:9443              v0          1         100%      
default/svc               31 minutes ago   https://svc-default.ytckyt.on-rio.io:9443               v0          3         100%      
default/romantic-knuth9   47 hours ago     https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%  
MacBook-Pro-de-admin:~ admin$ rio promote default/svc:v3
MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED          ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/fcdemo            3 minutes ago    https://fcdemo-default.ytckyt.on-rio.io:9443            v0          1         100%      
default/demo              28 minutes ago   https://demo-default.ytckyt.on-rio.io:9443              v0,v3       1,1       85%,15%   
default/svc               32 minutes ago   https://svc-default.ytckyt.on-rio.io:9443               v0,v3       3,3       95%,5%    
default/romantic-knuth9   47 hours ago     https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%      
MacBook-Pro-de-admin:~ admin$ 
MacBook-Pro-de-admin:~ admin$ rio revision default/svc
Name             IMAGE                    CREATED          SCALE     ENDPOINT                                       WEIGHT    DETAIL
default/svc:v3   ibuildthecloud/demo:v3   3 minutes ago    3         https://svc-v3-default.ytckyt.on-rio.io:9443   95        
default/svc:v0   ibuildthecloud/demo:v1   34 minutes ago   3         https://svc-v0-default.ytckyt.on-rio.io:9443   5   

ce qui donne en web :

MacBook-Pro-de-admin:~ admin$ rio weight default/svc:v0=25% default/svc:v3=75%
MacBook-Pro-de-admin:~ admin$ rio ps
Name                      CREATED          ENDPOINT                                                REVISIONS   SCALE     WEIGHT    DETAIL
default/fcdemo            10 minutes ago   https://fcdemo-default.ytckyt.on-rio.io:9443            v0          1         100%      
default/demo              34 minutes ago   https://demo-default.ytckyt.on-rio.io:9443              v3          1         100%      
default/svc               39 minutes ago   https://svc-default.ytckyt.on-rio.io:9443               v0,v3       3,3       25%,75%   
default/romantic-knuth9   47 hours ago     https://romantic-knuth9-default.ytckyt.on-rio.io:9443   v0          1         100%   

Rio permet de lancer un service sur la base de source hébergée sur un dépôt Git ou même activer un webhook ainsi que d’autres fonctionnalités à explorer …

Par défaut, Rio déploie grafana et kiali pour permettre à l’utilisateur de surveiller toutes les métriques correspondant au maillage des services :

Nul doute que Rancher Labs va continuer à faire évoluer Rio, à suivre donc.