Comment j'ai monté mon blog ? [Partie 2]

[Part 1] [Part 3]

Avant de commencer

Dans la première partie on a fait:

Et dans cette partie, on va installer un Hugo (website framework) mais aussi un reverse proxy

On a besoin d’un RP devant Hugo sinon on ne peut pas relier kapelal.io -> Hugo

img

HELM

On ne va pas écrire directement des manifests mais des templates (accompagnés par des valeurs) grâce à Helm

Normalement si on fait les choses bien, on a un dépôt de chart versionné (comme Nexus pour les artifacts Java) qui permet de déployer les charts Helm. Par exemple, celui par défaut dans Helm: code + dépôt

Pour pas faire trop (ça m’arrange), je vais déployer ma chart Hugo en local. Dans un prochain article j’installerai chartmuseum

Prérequis

  • Helm ou un container avec
  • Une configuration de kubectl (~/.kube/config) qui fonctionne parce que Helm l’utilise
  • De Tiller, dans sa version 2 (version majeure courante), Helm ne discute pas directement avec le cluster mais avec Tiller

2 choix:

Je fais une parenthèse sur un composant majeur dans kubernetes. Les RBAC (gestion des droits dans K8s)

C’est un gros morceau. Comme en partie 1, cet article n’est pas un tuto. Je vous conseille d’aller regarder

  • Sans RBAC: helm init
  • Avec RBAC: script à déployer avec kubectl apply et ensuite helm init --service-account tiller

Reverse proxy … ou l’Ingress Controller

Avant d’aller plus loin il faut expliquer l’Ingress Controller

On peut grossièrement simplifier une application dans Kubernetes comme ça:

img

Le service sélectionne le(s) pod(s) et expose l’accès au pod à l’intérieur du cluster

#Tous les pods du même namespace qui ont le label `app: foo-ap` et `release: 1.0` sont exposés par le service
selector:
    app: foo-app
    release: 1.0

L’ingress sélectionne le service et expose l’accès à l’extérieur du cluster

rules:
  - host: foo.com
    http:
      paths:
        - path: /
          backend:
            serviceName: foo-service
            servicePort: 80

Sauf que l’ingress ce n’est que de la conf. J’ai besoin d’un composant qui absorbe mon ingress et qui crée une entrée dans un … reverse proxy

Kubernetes a donné pour nom Ingress Controller, un reverse proxy qui a la tâche d’absorber les ingress

Fin ~


J’utilise NGINX avec la chart officielle comme Ingress Controller

Petite particularité, dans mon dépôt terraform, j’ai demandé une IP publique

#https://github.com/kapelal/terraform/blob/master/dns/kapelal-io-ip.tf
resource "google_compute_address" "kapelal-ip" {
  region = "${var.region}"
  name   = "${var.ip_name}"
  }

Je vais demander à K8s de me donner un Load Balancer qui aura cette IP (par défaut c’est une IP aléatoire). La demande se fait côté Service

...
spec:
  loadBalancerIP: 35.195.111.35
  type: LoadBalancer
...

Pourquoi ? Parce que je ne veux pas refaire de manipulation terraform si je dois redéployer mon ingress controller

#https://github.com/kapelal/terraform/blob/master/dns/main.tf
resource "google_dns_record_set" "kapelal-dns-record" {
  managed_zone = "${google_dns_managed_zone.default.name}"
  name         = "kapelal.io."
  type         = "A"
  ttl          = 1800
  rrdatas      = ["${google_compute_address.kapelal-ip.address}"]
}

Le yaml qui doit être jouer avec la chart

# https://github.com/kapelal/helm/blob/master/ingress-controller.yaml
controller:
  tag: "0.12.0"
  ingressClass: nginx-kapelal
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
  replicaCount: 2
  service:
    loadBalancerIP: 35.195.111.35
  stats:
    enabled: true
  metrics:
    enabled: true
rbac:
  create: true
  serviceAccountName: default

Y’a plus qu’à

helm upgrade --install stable/nginx-ingress ingress-controller --version 0.20.0 --namespace reverse-proxy --values ./ingress-controller.yaml

La demande du Load Balancer est un peu longue. Un petit kubectl describe service service_name permet de voir la progression

Dernier point

ingressClass: nginx-kapelal

On peut avoir besoin de plusieurs d’Ingress Controller pour notre infra (nom de domaine interne et externe par exemple). Pour cela les ingress controller ont un paramètre qui permet de poser une annotation. L’ingress doit avoir cette même annotation pour être pris en compte

metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-kapelal

Hugooo

Je veux un container avec Hugo. J’utilise le dockerhub

Et pour le contenu du blog, le thème etc. un dépôt git

Donc je peux versionner mon blog et avoir une mécanique à l’intérieur de mon pod, afin de récupérer le contenu de mon blog

img

Dans notre pod il y a 3 containers:

Le dépôt de la chart et ses valeurs

Y’a plus qu’à

helm upgrade --install blog ./hugo --namespace blog --values ./hugo.yaml

La suite

Les prochains posts:

  • Helm Chart Repository
  • HTTPS avec Lets Encrypt
  • La CI
  • Logs avec Prometheus
  • Vault