Sélectionner une page

Formation > Blog > Kubernetes > Configurer son propre Kubectl

configurer son Kubectl

L’outil de ligne de commande Kubectl est indispensable lors de l’utilisation de Kubernetes. Il est nécessaire pour récupérer les informations relatives au pod et aux différents services pendant le développement comme durant le déploiement. Kubectl a cependant quelques problèmes de stabilité. Bien que Kubernetes le maintienne officiellement, les correctifs sont parfois longs à se mettre en place.

Dans cet article, nous verrons comment configurer notre propre Kubectl stable grâce aux plugins à notre disposition

Utiliser des Plugins Kubectl

Kubernetes fournit officiellement l’outil krew comme gestionnaire de plugins, il est comparable à des outils tels que brew et apt. Pour l’installer, il faut d’abord installer Git avec la commande suivante :

(
  set -x; cd "$(mktemp -d)" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
  tar zxvf krew.tar.gz &&
  KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm.*$/arm/')" &&
  "$KREW" install krew
)
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

Vous pouvez ensuite chercher et installer le plugin de votre choix. Kubectl-tree est par exemple, très populaire. Cependant, il peut arriver que vous ne trouviez pas le plugin adapté à vos besoins.

Comment créer un plugin DIY ?

Vous pouvez parfaitement personnaliser un plugin existant si vous voulez qu’il réponde précisément à votre cas d’usage.

La commande kubectl peut supporter le mécanisme de plugin à partir de la version 1.8.0, après quoi nous pouvons étendre la commande kubectl dans toutes les versions suivantes. Le plugin kubectl après la version 1.12 est directement un fichier binaire avec des commandes commençant par kubectl-*, puis il entre dans l’AG dès la version 1.14. Grâce à ces améliorations, les utilisateurs peuvent étendre leurs sous-commandes kubectl sous la forme de fichiers binaires.

Pour l’exemple, nous prendrons l’implémentation d’un script bash qui est une opération très simple. La commande suivante, que nous transformons en plugin kubectl, est celle utilisée pour demander si les ressources GCP et les ressources liées à IAM sont prêtes.

kubectl get all,gcp,iamserviceaccount,iampolicymember,iampolicy --all-namespaces \
          -ocustom-columns='KIND:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.conditions[?(@.type=="Ready")].status,MESSAGE:.status.conditions[?(@.type=="Ready")].message'

Placez la commande dans un script kubectl-getready et accordez les permissions d’exécution.

$ cat << EOF >> kubectl-getready
kubectl get all,gcp,iamserviceaccount,iampolicymember,iampolicy --all-namespaces \
          -ocustom-columns='KIND:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.conditions[?(@.type=="Ready")].status,MESSAGE:.status.conditions[?(@.type=="Ready")].message'
EOF
$ chmod +x kubectl-getready

Déplacez la commande sous le répertoire /usr/local/bin.

mv kubectl-getready /usr/local/bin

Exécutez kubectl getready.

$ kubectl getready 

Plugin DIY avec Golang

La plupart des plugins kubectl sont écrits en Go. L’utilisation de la bibliothèque k8s.io/cli-runtime est officiellement recommandée.

L’objectif de l’utilisation des plugins est simple : interroger Pod par le biais d’une correspondance regex, puis récupérer des informations telles que name, namespace, conditions, events, logs, etc.

Pour implémenter un tel outil de ligne de commande en Go, vous pouvez utiliser la bibliothèque cobra, qui permet de définir Command, de lire Flag, et d’encapsuler l’entrée de la ligne de commande.

Définissez la command et le flag

 r := &QueryDetail{}
	o := config.NewQueryDetaiConfig()
	c := &cobra.Command{
		Use:          "ff [flags]",
		Short:        "View pods logs & status & events",
		Example:      fmt.Sprintf(logExample, "kubectl ff"),
		SilenceUsage: true,
		Args:         cobra.MinimumNArgs(1),
		PreRunE:      r.preRunE,
		RunE:         r.runE,
	}

	//cmdutil.FixDocs("kpt", parent, c)
	c.PersistentFlags().StringVarP(&o.Namespace, "all-namespaces", "A", "","search all the namespaces")
	c.PersistentFlags().StringVarP(&o.Namespace, "namespace", "n", "","Namespace for search. (default: \"default\")")
	c.Flags().IntVarP(&o.ShowSize, "size", "s", 3, "If present, list the number of pods matches the regex (default:3)")
	c.Flags().IntVarP(&o.LogSize, "log-size", "b", 10, "If present, show number of lines(default:10)")

	r.Command = c

Initialisez le traitement des paramètres, analysez les arguments entrants et déterminez s’il faut utiliser la correspondance des préfixes.

func (r *QueryDetail) Complete(cmd *cobra.Command, args []string) error {
  if strings.HasSuffix(args[0], "*") {
    r.IsPrefix = true
    r.NamePrefix = args[0][0 : len(args[1])-1]
  } else {
    r.IsPrefix = false
    r.NamePrefix = args[0]
  }
  return nil
}

Vous pouvez ensuite exécuter le plugin en accédant à l’API Kubernetes via client-go et tester votre plugin.

Pour aller plus loin

Si vous souhaitez rapidement vous former à Kubernetes. Nous vous proposons deux articles qui énumèrent les méthodes les plus simples pour vous former sur l’outil : « Comment vous former à Kubernetes en 2023 ? » et « Comment vous former sur Kubernetes gratuitement en 2023 ?« .

UNE QUESTION ? UN PROJET ? UN AUDIT DE CODE / D'INFRASTRUCTURE ?

Pour vos besoins d’expertise que vous ne trouvez nulle part ailleurs, n’hésitez pas à nous contacter.

ILS SE SONT FORMÉS CHEZ NOUS

partenaire sncf
partenaire hp
partenaire allianz
partenaire sfr
partenaire engie
partenaire boursorama
partenaire invivo
partenaire orange
partenaire psa
partenaire bnp
partenaire sncf
partenaire hp
partenaire allianz
partenaire sfr
partenaire engie
partenaire boursorama
partenaire invivo
partenaire orange
partenaire psa
partenaire bnp