Si vous êtes spécial dans OpenShift, il est peu probable que ce message vous révèle beaucoup. Mais si vous commencez tout juste à le maîtriser, cela vous fera économiser beaucoup de temps et de nerfs. Nous avons demandé à Jorge Tudela González de Riancho, consultant cloud au bureau espagnol de Red Hat, d'écrire quelques astuces de vie pour l'utilitaire 
oc .

C'est une équipe sympa, elle est bien pensée, elle est puissante, elle est flexible et, comme vous le verrez, elle a de nombreuses fonctionnalités cachées qui valent la peine d'être essayées.
1. Tout d'abord: le débogage
Lorsque je ne sais pas ce qui se passe ou que j'obtiens un message d'erreur incompréhensible, j'utilise toujours l'indicateur 
--loglevell , qui permet de se 
connecter à stderr. Selon la valeur de cet indicateur, vous pouvez voir les appels curl API Rest, le contenu des réponses API Rest ou des informations encore plus détaillées.

$ oc --loglevel 7 get pod
...
I0216 21:24:12.027793 973 cached_discovery.go:72] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/v1/serverresources.json
I0216 21:24:12.028046 973 round_trippers.go:383] GET https://192.168.42.77:8443/api/v1/namespaces/myproject/pods
I0216 21:24:12.028052 973 round_trippers.go:390] Request Headers:
I0216 21:24:12.028057 973 round_trippers.go:393] Accept: application/json
I0216 21:24:12.028061 973 round_trippers.go:393] User-Agent: oc/v1.7.6+a08f5eeb62 (linux/amd64) kubernetes/c84beff
I0216 21:24:12.053230 973 round_trippers.go:408] Response Status: 200 OK in 25 milliseconds
I0216 21:24:12.055143 973 cached_discovery.go:119] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/servergroups.json
I0216 21:24:12.055228 973 cached_discovery.go:72] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/authentication.k8s.io/v1/serverresources.json
I0216 21:24:12.055288 973 cached_discovery.go:72]
...
Par exemple, loglevel 9 est très pratique lorsque vous corrigez un objet OCP, car il vous permet de voir le correctif lui-même (le contenu de la demande d'API).
Si, par exemple, un patch change le nom du service en «app: hello-jorge», il ressemblera à ceci:
$ oc --loglevel 9 edit svc hello-openshift
...
I0216 21:33:15.786463 1389 request.go:994] Request Body: {"metadata":{"labels":{"app":"hello-jorge"}}}
I0216 21:33:15.786590 1389 round_trippers.go:386] curl -k -v -XPATCH -H "Accept: application/json" -H "Content-Type: application/strategic-merge-patch+json" -H "User-Agent: oc/v1.7.6+a08f5eeb62 (linux/amd64) kubernetes/c84beff" https://192.168.42.77:8443/api/v1/namespaces/myproject/services/hello-openshift
I0216 21:33:15.797185 1389 round_trippers.go:405] PATCH https://192.168.42.77:8443/api/v1/namespaces/myproject/services/hello-openshift 200 OK in 10 milliseconds
...
Remarque En période de désespoir, au lieu d'un neuf, vous pouvez conduire plusieurs à la fois. La sortie de la commande 
oc ne changera pas à partir de cela, mais cela peut vous sembler mieux.
$ oc --loglevel 9999 get pod
2. su -
Oui, vous avez bien compris. La commande 
oc peut être exécutée au nom d'un autre utilisateur ou, en utilisant le langage OCP, utiliser l' 
emprunt d'identité . Bien sûr, avec les droits appropriés. Et pour cela, il suffit d'utiliser le drapeau 
--as .
Par exemple:
# jorge
$ oc --as=jorge get pods
L'emprunt d'identité fonctionne non seulement pour les utilisateurs, mais aussi pour les groupes:
# developers
$ oc --as-group=developers get pods
L'emprunt d'identité est utile dans divers cas. Par exemple, lorsque vous devez vérifier si l'utilisateur peut effectuer l'une ou l'autre action, ou voir ce que lui 
envoie la commande 
oc . L'emprunt d'identité contribue également beaucoup à la confusion avec les rôles et les autorisations.
3. Whoami
L'équipe 
oc whoami est probablement familière à tout le monde. Surtout le drapeau 
-t , qui vous permet d'obtenir le jeton de média pour l'utilisateur / session en cours. Mais que se passe-t-il si vous avez un jeton, mais que vous n'en êtes pas le propriétaire?
Dans ce cas, vous pouvez vous connecter à OpenShift à l'aide de ce jeton, puis exécuter la 
commande oc whoami . Bien, attendez, vous pouvez immédiatement trouver le nom du propriétaire en passant simplement le jeton à la 
commande oc whoami comme troisième argument sans aucun indicateur.
Voir:
#
$ token=$(oc whoami -t)
#
$ oc whoami $token
jorge
4. oc debug
Comme vous le savez, un shell peut être exécuté directement dans un pod en cours d'exécution. Parfois, il est utile de faire une copie complète de la configuration du pod en cours d'exécution et de dépanner le shell. Il s'agit de la méthode dite par défaut.
Jetez maintenant un œil à ce que les options de 
débogage oc vous permettent de faire: vous pouvez exécuter le conteneur en tant que root ou tout autre utilisateur; vous pouvez l'exécuter sur le nœud sélectionné ou vous pouvez l'exécuter non pas un shell, mais une autre commande.
Dans ce cas, vous devez spécifier le bon DC, par exemple:
# shell pod' dc/jorge
$ oc debug dc/jorge
# , root
$ oc debug --as-root=true dc/jorge
5. oc expliquer
Les objets OpenShift / Kubernetes ont parfois un grand nombre de champs. Lorsque vous recherchez des exemples de définitions pour de tels objets, vous devez souvent vous tourner vers la documentation d'OCP ou d'autres sources principales. Cependant, vous pouvez également utiliser la commande 
oc expliquer .
Cette commande affiche la documentation sur les ressources et leurs champs, ce qui est très utile lors de la déclaration de nouveaux objets OCP ou dans les cas où vous n'avez pas accès à la documentation OCP officielle.
Par exemple, voici comment obtenir la documentation du pod et une description des champs d'affinité:
 # obtenir de l'aide sur le pod
 $ oc expliquer pod
 DESCRIPTION:
 Pod est une collection de conteneurs pouvant s'exécuter sur un hôte.  Cette ressource est créée par les clients et planifiée sur les hôtes.
 CHAMPS:
   métadonnées <Objet>
     Métadonnées de l'objet standard.  Plus d'infos:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
   spec <Objet>
     Spécification du comportement souhaité du pod.  Plus d'infos:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
   statut <Objet>
     Dernier état observé de la gousse.  Ces données peuvent ne pas être à jour.
     Peuplé par le système.  Lecture seule.  Plus d'infos:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
   apiVersion <chaîne>
     APIVersion définit le schéma versionné de cette représentation d'un
     objet.  Les serveurs doivent convertir les schémas reconnus vers la dernière version interne
     et peut rejeter des valeurs non reconnues.  Plus d'infos:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources
   genre <chaîne>
     Kind est une valeur de chaîne représentant la ressource REST de cet objet
     représente.  Les serveurs peuvent déduire cela du point final soumis par le client
     demande.  Ne peut être mis à jour.  Dans CamelCase.  Plus d'infos:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds
 # obtenir la description du champ d'affinité
 $ oc explique pod.spec.affinity
 RESSOURCE: affinité <Objet>
 DESCRIPTION:
     Si spécifié, les contraintes de planification du pod
    L'affinité est un groupe de règles de planification d'affinité.
 CHAMPS:
   nodeAffinity <Object>
     Décrit les règles de planification d'affinité de nœud pour le pod.
   podAffinity <Object>
     Décrit les règles de programmation d'affinité des pods (par exemple, colocaliser ce pod dans le
     même noeud, zone, etc.  comme certains autres pods).
   podAntiAffinity <Objet>
     Décrit les règles de planification anti-affinité des pods (par exemple, évitez de placer ce pod
     dans le même nœud, zone, etc.  comme certains autres pods).
6. Oubliez grep, awk, cut, etc.
Une autre fonctionnalité intéressante de la commande 
oc est les fonctions de formatage de sortie intégrées. 
Tout le monde connaît les 
options -o json ou 
-o yaml , mais le drapeau 
-o a de nombreuses autres options.
Les plus puissants sont probablement 
go-template et 
jsonpath :
json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...
Supposons que vous souhaitiez savoir quel service est fourni par une route spécifique (la route du registre des dockers):
# , , my-docker-registry.example.com
$ oc get routes -o=go-template='{{range .items}}{{if eq .spec.host "my-docker-registry.example.com"}}{{.metadata.name}}{{end}}{{end}}'
docker-registry
Ou, disons que vous devez connaître la stratégie de déploiement du routeur dc router:
#
$ oc get dc router -o=go-template='{{ .spec.strategy.type }}'
Rolling
Comme vous pouvez le voir, 
oc est une équipe incroyable. Cela vaut vraiment la peine de jouer avec, car c'est l'une des choses les plus cool d'OpenShift.
Si vous souhaitez en savoir plus sur les fonctionnalités intéressantes d'OpenShift, nous vous recommandons de consulter notre blog des 
développeurs Red Hat - vous y trouverez non seulement des articles de nos développeurs sur presque tous les sujets, mais également un énorme catalogue de 
littérature gratuite . Et vous pouvez rafraîchir notre article sur la 
façon de déployer Minishift sur votre ordinateur portable et de commencer à vivre .