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?
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
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.
kubectl
à l'intérieur du conteneurkubectl
dans votre conteneurkubectl
fournit un riche cli pour la gestion de votre cluster de kubernetes--- 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.
ServiceAccount
pour votre pod et configurez-le pour qu'il utilise ce compte. Documents du compte de service k8sRoleBinding
ou ClusterRoleBinding
pour autoriser les services à avoir l'autorisation de communiquer avec l'API k8s. documents de liaison de rôle k8sLorsque 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 :)
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
/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
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:
KUBERNETES_SERVICE_Host
et KUBERNETES_SERVICE_PORT
.var/run/secrets/kubernetes.io/serviceaccount/token
./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
spec.serviceAccountName
).