• Home  / 
  • Docker
  •  /  Kubernetes + Rancher : premiers pas excitants

Kubernetes + Rancher : premiers pas excitants

By KrustyHack / 6 months ago
kubernetes-et-rancher

Ay à toutes et à tous,

Petit retour furtif pour alimenter un petit peu mon blog qui n’est pas à l’abandon, loin de là, mais juste un peu moins mis à jour qu’au début. Mais cela devrait changer une fois que la plupart de mes projets seront stables. S’ils le sont un jour… 😀

Bref, aujourd’hui un petit article suite à quelques amusements hier soir avec Kubernetes et Rancher. J’ai toujours galéré à installer depuis 0 un cluster Kubernetes (sans passer par GCE) mais aujourd’hui est un jour nouveau grâce à mon pote Rancher !

Préparer l’environnement Rancher

Alors là on va pas tourner 100 fois autour du pot, on va directement installer notre terrain de jeu Kubernetes avec Rancher 1.2.0 qui est sorti y a pas si longtemps que ça. Alors par contre je vous met direct en garde : installez-le sur une instance propre. Moi j’ai vraqué mon Rancher 1.4 en voulant update le bousin. Heureusement j’avais un backup mais bon, j’ai perdu du temps à tout remonter. Donc, partez de 0, comme moi !

Voici là stack pour le Rancher master :

rancher-server:
  image: rancher/server:v1.2.0
  volumes:
    - '/home/docker/rancher-serverv2/mysql:/var/lib/mysql:rw'
  environment:
    VIRTUAL_PORT: 8080
    VIRTUAL_HOST: rancher.yourdomainhere.com
    LETSENCRYPT_HOST: rancherv2.yourdomainhere.com
    LETSENCRYPT_EMAIL: webmaster@yourdomainhere.com

Et la stack pour le frontal Nginx que j’utilise :

letsencrypt:
  tty: true
  image: thomastweets/docker-letsencrypt-nginx-proxy-companion:latest
  volumes:
  - /home/docker/nginx-proxy/ssl:/etc/nginx/certs:rw
  - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
  - proxy
  stdin_open: true
proxy:
  ports:
  - 443:443/tcp
  - 80:80/tcp
  tty: true
  image: jwilder/nginx-proxy:latest
  volumes:
  - /home/docker/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
  - /usr/share/nginx/html
  - /var/run/docker.sock:/tmp/docker.sock:ro
  - /home/docker/nginx-proxy/ssl:/etc/nginx/certs:ro
  stdin_open: true

Un coup de docker-compose et vous me montez tout ça en deux minutes. Je vous passe les détails pour le paramétrage du master (ACL et compagnie).

C’est bon ? Votre Rancher est tout frais, tout prêt ? Passon à la suite alors !

Déployer un cluster Kubernetes avec Rancher

La partie la plus intéressante et la plus simple : on va déployer un cluster Kubernetes avec notre petit Rancher des familles. Pour ça, trouvez-vous 3 nodes avec Docker d’installé (moi j’utilise 3 VPS CoreOS que je gère sous Xen) puis préparez l’environnement Rancher dans votre UI :

kubernetes-rancher-1

Une fois l’environnement créé il va falloir ajouter au moins 1 host pour instancier le cluster Kubernetes. Cliquez donc sur « Add host » et ajoutez les 3 que vous avez préparé avec Docker. Rancher va alors tout préparer pour vous sur vos 3 nodes et cela peut prendre quelques minutes.

Une fois l’environnement installé, récupérez votre config Kubernetes :

kubernetes-rancher-2

Il vous suffit de cliquer sur « Generate Config » et de copier/coller le résultat dans ~/.kube/config afin de pouvoir travailler sur votre cluster depuis votre PC. Une fois cela fait, faites un petit kubectl get no et vérifiez que vos 3 nodes sont ups :

root@KrustyDev:~/sysadmin/rancher-catalog/kube/ghost/0# k get no
NAME        STATUS    AGE
coreos001   Ready     21h
coreos002   Ready     21h
coreos003   Ready     21h

Parfait ! On peut continuer !

Déployer Ghost sur Kubernetes

Alors bien évidemment vous pouvez utiliser l’interface Rancher pour déployer des stacks Kubernetes mais pour l’instant j’effectue mes tests via kubectl. Et pour cet article, nous allons déployer un blog Ghost. Ci-dessous, les fichiers YAML nécessaires pour le déploiement de notre app.

# ghost-service.yaml
apiVersion: v1
kind: Service
metadata: 
  labels: 
    name: ghost-lb
  name: ghost-lb
spec: 
  ports:
    - port: 80
      targetPort: 2368
  selector: 
    name: ghost
    app: ghost
  type: LoadBalancer
# ghost.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ghost
  labels: 
    name: ghost
    app: ghost
spec:
  restartPolicy: Always
  containers: 
    - image: "ghost:0.11.3"
      name: "ghost"
      ports:
      - containerPort: 2368
        name: ghost
      volumeMounts:
        - name: "ghost-storage"
          mountPath: /var/lib/ghost
  volumes:
    - name: "ghost-storage"
      hostPath:
        path: /mnt/data1/ghost

Pour le volume je l’ai monté directement sur le host : /mnt/data1/ghost qui est un partage NFS privé (merci Xen) entre mes 3 instances CoreOS. De ce fait si le container est recréé ailleurs il retrouvera ses petits. Alors je ne sais pas si c’est la meilleure des solutions mais pour l’instant ça me suffit pour mes tests. 🙂

Ensuite, déployez le tout :

root@KrustyDev:~/sysadmin/rancher-catalog/kube/ghost/0# k create -f ghost.yaml 
pod "ghost" created

root@KrustyDev:~/sysadmin/rancher-catalog/kube/ghost/0# k create -f ghost-service.yaml 
service "ghost-lb" created

Attendez un petit peu puis vérifiez que tout s’est bien déployé :

root@KrustyDev:~/sysadmin/rancher-catalog/kube/ghost/0# k get po
NAME      READY     STATUS    RESTARTS   AGE
ghost     1/1       Running   0          44s

root@KrustyDev:~/sysadmin/rancher-catalog/kube/ghost/0# k get svc
NAME         CLUSTER-IP    EXTERNAL-IP     PORT(S)   AGE
ghost-lb     10.43.79.36   aa.bb.cc.dd   80/TCP    28s
kubernetes   10.43.0.1     <none>          443/TCP   21h

Super ! Tout tourne comme sur des roulettes ! Allez voir votre blog Ghost via l’ip notée aa.bb.cc.dd en remplaçant évidemment par l’EXTERNAL-IP que vous a sorti Kubernetes :

kubernetes-rancher-ghostYes ! Excellent ! Notre blog Ghost tourne et est accessible publiquement ! Alors bon on a pas mis de RC mais c’est déjà un bon début pour la suite. N’oubliez pas aussi de regarder un peu la config de Ghost car actuellement votre blog est déployé en env de dev.Il me semble également que l’on peut utiliser Mysql avec. A voir.

A vous de jouer maintenant !

Leave a comment: