Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Le Kubernetes Dashboard est un outil simple à utiliser pour obtenir des informations à jour sur un cluster en fonctionnement et en effectuer une gestion minimale. On finit par l'apprécier d'autant plus lorsque l'accès à ces fonctionnalités est nécessaire non seulement pour les administrateurs ou les ingénieurs DevOps, mais aussi pour ceux qui sont moins familiers avec la console et/ou qui ne souhaitent pas s'immerger dans toutes les subtilités de l'interaction avec kubectl et d'autres utilitaires. C'est exactement ce qui s'est passé pour nous : les développeurs ont souhaité un accès rapide à l'interface web de Kubernetes, et comme nous utilisons GitLab, la solution s'est imposée d'elle-même.

Pourquoi faire cela ?

Les développeurs peuvent être intéressés par un outil comme le Kubernetes Dashboard pour des tâches de débogage. Parfois, ils veulent consulter des journaux et des ressources, et parfois, ils souhaitent même arrêter des pod, mettre à l'échelle des Deployments/StatefulSets et même accéder à la console des conteneurs (ce qui arrive et pour résoudre ces demandes, il existe d'autres moyens, par exemple par kubectl-debug).

De plus, il y a un aspect psychologique pour les responsables, qui souhaitent jeter un œil au cluster — voir que 'tout est vert' et ainsi se rassurer que 'tout fonctionne' (ce qui, bien sûr, est très relatif... mais cela sort du cadre de cet article).

Comme système CI standard, nous utilisons GitLab : tous les développeurs l'utilisent. Donc, pour leur donner accès, il était logique d'intégrer le Dashboard avec les comptes GitLab.

Je note également que nous utilisons NGINX Ingress. Si vous travaillez avec d'autres solutions d'ingress, vous devrez trouver vous-même des équivalents pour les annotations d'autorisation.

Testons l'intégration

Installation du Dashboard

Attention: Si vous prévoyez de répéter les étapes décrites ci-dessous, veuillez d'abord lire jusqu'à la sous-section suivante pour éviter des opérations superflues.

Étant donné que cette intégration est utilisée par nous dans de nombreuses installations, nous avons automatisé son installation. Les sources nécessaires à cela sont publiées dans un référentiel GitHub spécial. Elles reposent sur des configurations YAML légèrement modifiées issues de référentiel officiel du Dashboard, ainsi qu'un script Bash pour un déploiement rapide.

Le script installe le Dashboard dans le cluster et le configure pour l'intégration avec GitLab :

$ .\/ctl.sh  
Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL
Installe le kubernetes-dashboard sur le cluster Kubernetes.
Arguments obligatoires:
 -i, --install                installe dans l'espace de noms 'kube-system'
 -u, --upgrade                met à niveau l'installation existante, réutilisera les mots de passe et les noms d'hôte
 -d, --delete                 supprime tout, y compris l'espace de noms
     --gitlab-url             définit l'url gitlab avec schéma (https://gitlab.example.com)
     --oauth2-id              définit OAUTH2_PROXY_CLIENT_ID depuis gitlab
     --oauth2-secret          définit OAUTH2_PROXY_CLIENT_SECRET depuis gitlab
     --dashboard-url          définit l'url du tableau de bord sans schéma (dashboard.example.com)
Arguments optionnels:
 -h, --help                   affiche ce message

Cependant, avant de l'utiliser, il est nécessaire de se rendre sur GitLab : zone d'administration → Applications — et d'ajouter une nouvelle application pour le tableau de bord futur. Appelons-la « kubernetes dashboard » :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

En conséquence de son ajout, GitLab fournira des clés :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Celles-ci sont utilisées comme arguments pour le script. En conséquence, l'installation apparaît comme suit :

$ .\/ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com

Après cela, vérifions que tout a démarré :

$ kubectl -n kube-system get pod | egrep '(dash|oauth)'
kubernetes-dashboard-76b55bc9f8-xpncp   1\/1       En cours d'exécution   0          14s
oauth2-proxy-5586ccf95c-czp2v           1\/1       En cours d'exécution   0          14s

Tôt ou tard, tout sera lancé, cependant l'authentification ne fonctionnera pas immédiatement! Le problème est que l'image utilisée (la situation dans d'autres images est similaire) a mal implémenté le processus de capture de la redirection dans le callback. Cela entraîne le fait que oauth supprime le cookie, que lui-même (oauth) nous fournit…

Le problème se résout en construisant sa propre image oauth avec le patch.

Patch pour oauth et réinstallation

Pour cela, nous utiliserons le Dockerfile suivant :

FROM golang:1.9-alpine3.7
WORKDIR \/go\/src\/github.com\/bitly\/oauth2_proxy

RUN apk --update add make git build-base curl bash ca-certificates wget 
&& update-ca-certificates 
&& curl -sSO https://raw.githubusercontent.com/pote/gpm/v1.4.0/bin/gpm 
&& chmod +x gpm 
&& mv gpm \/usr\/local\/bin
RUN git clone https://github.com/bitly/oauth2_proxy.git . 
&& git checkout bfda078caa55958cc37dcba39e57fc37f6a3c842  
ADD rd.patch .
RUN patch -p1 < rd.patch 
&& .\/dist.sh

FROM alpine:3.7
RUN apk --update add curl bash  ca-certificates && update-ca-certificates
COPY --from=0 \/go\/src\/github.com\/bitly\/oauth2_proxy\/dist\/ \/bin\/ 

EXPOSE 8080 4180
ENTRYPOINT [ \

Voici à quoi ressemble le patch rd.patch

diff --git a/dist.sh b/dist.sh
index a00318b..92990d4 100755
--- a/dist.sh
+++ b/dist.sh
@@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}')
sha256sum=()
 
echo "... exécution des tests"
-. /test.sh
+#. /test.sh
 
-for os in windows linux darwin; do
-    echo "... construction de v$version pour $os/$arch"
-    EXT=
-    if [ $os = windows ]; then
-        EXT=".exe"
-    fi
-    BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX)
-    TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
-    FILENAME="oauth2_proxy-$version.$os-$arch$EXT"
-    GOOS=$os GOARCH=$arch CGO_ENABLED=0 
-        go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1
-    pushd $BUILD/$TARGET
-    sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)")
-    cd .. && tar czvf $TARGET.tar.gz $TARGET
-    mv $TARGET.tar.gz $DIR/dist
-    popd
-done
+os='linux'
+echo "... construction de v$version pour $os/$arch"
+TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
+GOOS=$os GOARCH=$arch CGO_ENABLED=0 
+    go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1
  
checksum_file="sha256sum.txt"
cd $DIR/dists
diff --git a/oauthproxy.go b/oauthproxy.go
index 21e5dfc..df9101a 100644
--- a/oauthproxy.go
+++ b/oauthproxy.go
@@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code
       if redirect_url == p.SignInPath {
               redirect_url = "/"
       }
-
+       if req.FormValue("rd") != "" {
+               redirect_url = req.FormValue("rd")
+       }
       t := struct {
               ProviderName  string
               SignInMessage string

Il est maintenant possible de construire l'image et de la pousser dans notre GitLab. Ensuite, dans manifests/kube-dashboard-oauth2-proxy.yaml nous allons spécifier l'utilisation de l'image nécessaire (remplacez-la par la vôtre) :

 image: docker.io/colemickens/oauth2_proxy:latest

Si vous avez un registre protégé par authentification, n'oubliez pas d'ajouter l'utilisation du secret pour tirer les images :

      imagePullSecrets:
     - name: gitlab-registry

… et ajoutez le secret lui-même pour le registre :

---
apiVersion: v1
data:
 .dockercfg: eyJyZWdpc3RyeS5jb21wYW55LmNvbSI6IHsKICJ1c2VybmFtZSI6ICJvYXV0aDIiLAogInBhc3N3b3JkIjogIlBBU1NXT1JEIiwKICJhdXRoIjogIkFVVEhfVE9LRU4iLAogImVtYWlsIjogIm1haWxAY29tcGFueS5jb20iCn0KfQoK
=
kind: Secret
metadata:
 annotations:
 name: gitlab-registry
 namespace: kube-system
type: kubernetes.io/dockercfg

L lecteur attentif remarquera que la longue chaîne ci-dessus est un base64 du config :

{"registry.company.com": {
 "username": "oauth2",
 "password": "PASSWORD",
 "auth": "AUTH_TOKEN",
 "email": "mail@company.com"
}
}

Ce sont les données de l'utilisateur dans GitLab, que Kubernetes utilisera pour tirer l'image du registre.

Après avoir tout fait, vous pouvez supprimer l'installation actuelle (qui ne fonctionne pas correctement) du Dashboard avec la commande :

$ ./ctl.sh -d

… et tout réinstaller :

$ .\/ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com

Il est temps d'entrer dans le Dashboard et de trouver ce bouton d'authentification quelque peu archaïque :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Après avoir cliqué dessus, nous serons accueillis par GitLab, nous proposant de nous authentifier sur notre page habituelle (bien sûr, si nous n'avons pas été préalablement authentifiés là-bas) :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Nous nous authentifions avec nos identifiants GitLab — et tout est accompli :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Les fonctionnalités du Dashboard

Si vous êtes développeur et que vous n'avez jamais travaillé avec Kubernetes, ou simplement pour une raison quelconque vous n'avez pas encore rencontré le Dashboard, je vais illustrer certaines de ses fonctionnalités.

Tout d'abord, vous pouvez voir que « tout est en vert » :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Pour les pods, des données plus détaillées sont disponibles, telles que les variables d'environnement, l'image récupérée, les arguments de lancement, leur état :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Pour les déploiements, les statuts sont visibles :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

… et d'autres détails :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

… ainsi qu'une possibilité de redimensionner le déploiement :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Le résultat de cette opération :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Parmi d'autres fonctionnalités utiles, déjà mentionnées au début de l'article, il y a la visualisation des logs :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

… et la fonction d'accès à la console des conteneurs du pod sélectionné :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Il est aussi possible de consulter les limites/ressources sur les nœuds :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Bien sûr, ce n'est pas toutes les fonctionnalités du panel, mais j'espère que cela donne une idée générale.

Inconvénients de l'intégration et du Dashboard

Dans l'intégration décrite, il n'y a pas de séparation des accès. Tous les utilisateurs ayant accès à GitLab ont accès au Dashboard. Leur accès dans le Dashboard est identique, correspondant aux droits du Dashboard lui-même, qui sont définis par RBAC. Cela ne conviendra pas à tout le monde, mais pour notre cas, cela s'est avéré suffisant.

Parmi les inconvénients notables du Dashboard, je souligne les suivants :

  • impossibilité d'accéder à la console du conteneur init ;
  • impossibilité d'éditer les Deployments et StatefulSets, même si cela peut être corrigé dans ClusterRole ;
  • la compatibilité du Dashboard avec les dernières versions de Kubernetes et l'avenir du projet soulèvent des questions.

Ce dernier problème mérite une attention particulière.

Statut et alternatives du Dashboard

Le tableau de compatibilité du Dashboard avec les versions de Kubernetes, présenté dans la dernière version du projet (v1.10.1), n'est pas très engageant :

Intégration du Kubernetes Dashboard et des utilisateurs GitLab

Malgré cela, il existe (déjà accepté en janvier) PR #3476, qui annonce le support de K8s 1.13. De plus, parmi les problèmes du projet, on peut trouver des mentions d'utilisateurs travaillant avec le panel dans K8s 1.14. Enfin, les commits dans la base de code du projet ne cessent pas. Ainsi, (au moins !) l'état réel du projet n'est pas aussi mauvais qu'il peut d'abord sembler d'après le tableau de compatibilité officiel.

Enfin, il existe des alternatives au Dashboard. Parmi elles :

  1. K8Dash — une interface jeune (les premiers commits datent de mars de cette année), déjà offrant de bonnes possibilités, telles qu'une représentation visuelle de l'état actuel du cluster et la gestion de ses objets. Elle se positionne comme une « interface en temps réel », car elle actualise automatiquement les données affichées sans nécessiter de recharger la page dans le navigateur.
  2. Console OpenShift — une interface web de Red Hat OpenShift, qui apportera cependant dans votre cluster d'autres développements du projet, ce qui ne convient pas à tout le monde.
  3. Kubernator — un projet intéressant, créé comme une interface de niveau inférieur (par rapport au Dashboard) permettant de visualiser tous les objets du cluster. Cependant, il semble que son développement ait été arrêté.
  4. Polaris — littéralement il y a quelques jours annoncé projet, qui combine des fonctions de tableau de bord (affiche l'état actuel du cluster, mais ne gère pas ses objets) et de « validation automatique des meilleures pratiques » (vérifie le cluster pour l'exactitude des configurations des Deployments qui y sont lancés).

Au lieu des conclusions

Le Dashboard est l'outil standard pour les clusters Kubernetes que nous gérons. Son intégration avec GitLab fait également partie de notre « installation par défaut », car de nombreux développeurs apprécient les possibilités qu'ils obtiennent avec ce tableau de bord.

Des alternatives au Kubernetes Dashboard apparaissent périodiquement dans la communauté Open Source (et nous sommes heureux de les examiner), toutefois à ce stade, nous restons avec cette solution.

P.S.

Lisez aussi dans notre blog :

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster