Comment gérer efficacement plusieurs clusters K8s à l’aide de kubectl
Parfois, vous devez configurer plusieurs clusters K8s pour différents scénarios d’utilisation, tels que l’isolement requis par la conformité, la disponibilité accrue, les environnements de développement/prod. ou le désir d’éliminer le verrouillage du fournisseur, etc.
Voici trois cas d’utilisation courants :
L’outil de ligne de commande de K8s, kubectl, est le meilleur ami des administrateurs de K8s. Il vous permet d’exécuter des commandes administratives sur les clusters K8s. Pour la configuration, kubectl recherche un fichier nommé config dans le répertoire $HOME/.kube. Vous pouvez spécifier d’autres fichiers kubeconfig en définissant la variable d’environnement KUBECONFIG ou en définissant l’option --kubeconfig.
Extrait de la documentation officielle de K8 : « Configurer l’accès à plusieurs clusters » (Configurer l’accès à plusieurs clusters | Kubernetes), elle décrit deux façons de configurer l’accès à plusieurs clusters K8s.
Dans cette méthode, vous utilisez un seul fichier de configuration pour définir les clusters, les utilisateurs et les contextes pour tous vos clusters K8s, par exemple :
# config-demo file
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: scratch
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: scratch
namespace: default
user: experimenter
name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
password: some-password
username: exp
Le fichier de configuration ci-dessus définit deux clusters : développement et scratch, deux utilisateurs et trois contextes. Pour basculer entre les différents clusters, vous pouvez utiliser la commande kubectl suivante :
$ kubectl config --kubeconfig=config-demo use-context dev-frontend
Le cluster défini dans dev-frontend (qui est le cluster de développement) sera utilisé.
Le problème avec cette approche est que vous ne configurerez pas toujours vos fichiers kubeconfig de cette façon. Si vous avez plusieurs clusters K8s, ce fichier devient rapidement désordonné. Et vous devez définir le contexte à chaque fois que vous voulez changer.
La deuxième approche consiste à créer un fichier de configuration distinct pour chaque cluster. Ainsi, le fichier de configuration unique ci-dessus peut être séparé en :
# config-development
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
et
# config-scratch
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: scratch
contexts:
- context:
cluster: scratch
namespace: default
user: experimenter
name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: experimenter
user:
password: some-password
username: exp
Vous pouvez alors utiliser une fonctionnalité intéressante de la variable d’environnement $KUBECONFIG, qui vous permet de spécifier plusieurs fichiers kubeconfig séparés par des deux-points. Cela devrait ressembler à cela lorsque vous avez plusieurs fichiers de configuration :
$KUBECONFIG=/$HOME/.kube/contexts/config-development:/$HOME/.kube/contexts/config-scratch
Vous pouvez ensuite utiliser kubectl config use-context <context_name> pour basculer entre les différents contextes. Cela résout le problème de nous permettre d’avoir plusieurs fichiers de configuration, mais reste assez manuel puisque chaque fois que vous redémarrez le terminal ou si vous avez un nouveau kubeconfig (ou supprimez un ancien), vous devez mettre à jour cette variable d’environnement.
C’est là que kubectx et kubens entrent en jeu ! Ils vous permettent de vérifier facilement tous les contextes et espaces de noms disponibles et de passer de l’un à l’autre en tapant kubectx nom-contexte ou kubens espace de noms et c’est tout !
kubectx est un outil permettant de basculer plus rapidement entre les contextes (clusters) sur kubectl. kubens est un outil permettant de basculer facilement entre les espaces de noms Kubernetes (et de les configurer pour kubectl).
$ kubectl krew install ctx
Updated the local copy of plugin index.
Installing plugin: ctx
Installed plugin: ctx
\
| Use this plugin:
| kubectl ctx
| Documentation:
| https://github.com/ahmetb/kubectx
| Caveats:
| \
| | If fzf is installed on your machine, you can interactively choose
| | between the entries using the arrow keys, or by fuzzy searching
| | as you type.
| | See https://github.com/ahmetb/kubectx for customization and details.
| /
/
$ k krew install ns
Updated the local copy of plugin index.
Installing plugin: ns
Installed plugin: ns
\
| Use this plugin:
| kubectl ns
| Documentation:
| https://github.com/ahmetb/kubectx
| Caveats:
| \
| | If fzf is installed on your machine, you can interactively choose
| | between the entries using the arrow keys, or by fuzzy searching
| | as you type.
| /
/
# List all the contexts
$ kubectl ctx
cluster-dev
**cluster-prd**
cluster-test# Switch to another cluster that's in kubeconfig
$ kubectl ctx cluster-dev
Switched to context "cluster-dev".# Switch back to previous cluster
$ kubectl ctx -
Switched to context "cluster-prd".# Create an alias for the context
$ kubectl ctx dublin=gke_ahmetb_europe-west1-b_dublin
Context "dublin" set.
Aliased "gke_ahmetb_europe-west1-b_dublin" as "dublin".# List all namespace
$ kubectl ns
kube-system
namespace1
namespace2
...# Change the active namespace on kubectl
$ kubectl ns kube-system
Context "test" set.
Active namespace is "kube-system".# Go back to the previous namespace
$ kubectl nss -
Context "test" set.
Active namespace is "default".
J’espère qu’avec les plugins kubectx et kubens, votre travail quotidien d’administration de K8s sera plus efficace et votre productivité plus élevée.