web-dev-qa-db-fra.com

Comment exécuter les commandes kubectl dans un conteneur?

Dans un conteneur à l'intérieur d'un pod, comment puis-je exécuter une commande à l'aide de kubectl? Par exemple, si j'ai besoin de faire quelque chose comme ça dans un conteneur:

kubectl get pods

J'ai essayé ceci: Dans mon fichier de docker, j'ai ces commandes:

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/AMD64/kubectl
RUN chmod +x ./kubectl
RUN Sudo mv ./kubectl /usr/local/bin/kubectl

EDIT: J'essayais le fichier OSX, je l'ai corrigé dans le fichier binaire Linux. (corrigé par @svenwltr

Lors de la création du fichier Docker, cela a réussi, mais lorsque je lance le kubectl, récupérez des pods dans un conteneur,

kubectl get pods

Je reçois cette erreur:

La connexion au serveur: a été refusée - avez-vous spécifié le bon hôte ou le bon port?

Lorsque je déployais localement, je rencontrais cette erreur si mon docker-machine ne fonctionnait pas, mais dans un conteneur, comment un docker-machine pouvait-il fonctionner?

Localement, je contourne cette erreur en lançant les commandes suivantes: (dev est le nom du docker-machine)

docker-machine env dev
eval $(docker-machine env dev)

Quelqu'un peut-il s'il vous plaît me dire qu'est-ce que je dois faire?

40
Dreams

Je voudrais utiliser kubernetes api, il vous suffit d’installer curl, au lieu de kubectl et le reste est reposant.

curl http://localhost:8080/api/v1/namespaces/default/pods

Je cours au-dessus de la commande sur l'un de mes apiservers. Changez le localhost en apiserver adresse IP/nom du DNS .

Selon votre configuration, vous devrez peut-être utiliser SSL ou fournir un certificat client.

Pour trouver les points de terminaison api, vous pouvez utiliser --v=8 avec kubectl.

exemple:

kubectl get pods --v=8

Ressources:

Kubernetes documentation de l'API

Mise à jour pour RBAC:

Je suppose que vous avez déjà configuré rbac, créé un compte de service pour votre pod et exécuté en l’utilisant. Ce compte de service doit disposer d'autorisations de liste sur les pods de l'espace de noms requis. Pour ce faire, vous devez créer un rôle et une liaison de rôle pour ce compte de service.

Chaque conteneur d'un cluster est rempli avec un jeton qui peut être utilisé pour l'authentification auprès du serveur d'API. Pour vérifier, dans le conteneur, exécutez:

cat /var/run/secrets/kubernetes.io/serviceaccount/token

Pour faire une demande à apiserver, dans le conteneur, exécutez:

curl -ik \
     -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
     https://kubernetes.default.svc.cluster.local/api/v1/namespaces/default/pods
21
Farhad Farahi

Un peu en retard pour la fête ici, mais ce sont mes deux cents:

J'ai trouvé qu'il était beaucoup plus facile d'utiliser kubectl dans un conteneur que d'appeler l'API du cluster

(Pourquoi? Authentification automatique!)

Supposons que vous déployez un projet Node.js qui nécessite kubectl usage.

  1. Télécharger & Construire kubectl à l'intérieur du conteneur
  2. Construisez votre application en copiant kubectl dans votre conteneur
  3. Voila! kubectl fournit un riche cli pour la gestion de votre cluster de kubernetes

Documentation utile

--- EDITS ---

Après avoir utilisé kubectl dans mes pods de cluster, j'ai trouvé un moyen plus efficace d'authentifier les pods pour pouvoir effectuer des appels d'API k8s. Cette méthode fournit une authentification plus stricte.

  1. Créez un ServiceAccount pour votre pod et configurez-le pour qu'il utilise ce compte. Documents du compte de service k8s
  2. Configurez un RoleBinding ou ClusterRoleBinding pour autoriser les services à avoir l'autorisation de communiquer avec l'API k8s. documents de liaison de rôle k8s
  3. Appelez directement l'API ou utilisez un k8s-client pour gérer les appels d'API pour vous. Je recommande vivement d'utiliser le client, il a une configuration automatique pour les pods qui supprime l'étape de jeton d'authentification requise avec les requêtes normales.

Lorsque vous aurez terminé, vous obtiendrez les informations suivantes: ServiceAccount, ClusterRoleBinding, Deployment (vos pods)

N'hésitez pas à commenter si vous avez besoin d'indications plus claires. Je vais essayer de vous aider le plus possible :)

Exemple tout-en-un

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: k8s-101
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: k8s-101
    spec:
      serviceAccountName: k8s-101-role
      containers:
      - name: k8s-101
        imagePullPolicy: Always
        image: salathielgenese/k8s-101
        ports:
        - name: app
          containerPort: 3000
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: k8s-101-role
subjects:
- kind: ServiceAccount
  name: k8s-101-role
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-101-role

Le salathielgenese/k8s-101 image contient kubectl. On peut donc simplement se connecter à un conteneur de pod et exécuter kubectl comme s’il l’exécutait sur l’hôte k8s: kubectl exec -it pod-container-id -- kubectl get pods

15
mster

Première question

/usr/local/bin/kubectl: cannot execute binary file

Il semble que vous ayez téléchargé le fichier binaire OSX pour kubectl. Lorsque vous utilisez Docker, vous avez probablement besoin de Linux:

https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/AMD64/kubectl

Deuxième question

Si vous exécutez kubectl dans un cluster Kubernetes correctement configuré, il devrait pouvoir se connecter à apiserver.

kubectl utilise essentiellement ce code pour trouver le serveur apis et s'authentifier: github.com/kubernetes/client-go/rest.InClusterConfig

Ça signifie:

  • L'hôte et le port de l'apiserver sont stockés dans les variables d'environnement KUBERNETES_SERVICE_Host et KUBERNETES_SERVICE_PORT.
  • Le jeton d'accès est monté sur var/run/secrets/kubernetes.io/serviceaccount/token.
  • Le certificat de serveur est monté sur /var/run/secrets/kubernetes.io/serviceaccount/ca.crt.

C’est toutes les données que kubectl a besoin de savoir pour se connecter à l’apiserver.

Quelques idées sur la raison pour laquelle cela pourrait ne pas fonctionner

  • Le conteneur ne fonctionne pas dans Kubernetes.
    • Il ne suffit pas d'utiliser le même hôte Docker; le conteneur doit être exécuté dans le cadre d'une définition de pod.
  • L'accès est limité en utilisant un autorisation plugin (ce qui n'est pas le cas par défaut).
  • Les informations d'identification du compte de service sont écrasées par le définition du module (spec.serviceAccountName).
12
svenwltr