En un contenedor dentro de un pod, ¿cómo puedo ejecutar un comando usando kubectl? Por ejemplo, si necesito hacer algo como esto dentro de un contenedor:
kubectl obtener vainas
He intentado esto: en mi dockerfile, tengo estos comandos:
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/kubectlEDITAR: estaba probando el archivo OSX, lo he corregido al archivo binario de Linux. (corregido por @svenwltr
Al crear el archivo docker, esto es exitoso, pero cuando ejecuto kubectl get pods dentro de un contenedor,
kubectl get podsme sale este error:
La conexión al servidor: fue rechazada. ¿Especificó el host o puerto correcto?
Cuando estaba implementando localmente, me encontraba con este error si mi máquina acoplable no se estaba ejecutando, pero dentro de un contenedor, ¿cómo se puede ejecutar una máquina acoplable?
Localmente, soluciono este error ejecutando los siguientes comandos: (dev es el nombre de la máquina acoplable)
docker-machine env dev eval $(docker-machine env dev)¿Puede alguien decirme qué es lo que tengo que hacer?
Usaría kubernetes api, solo necesita instalar curl, en lugar de kubectl y el resto es tranquilo.
curl http://localhost:8080/api/v1/namespaces/default/podsEstoy ejecutando por encima del comando en uno de mis servidores ap. Cambie el host local a la dirección IP del servidor ap/nombre dns .
Dependiendo de su configuración, es posible que deba usar SSL o proporcionar un certificado de cliente.
Para encontrar puntos finales de api, puede usar --v=8 con kubectl .
ejemplo:
kubectl get pods --v=8Recursos:
Documentación de la API de Kubernetes
Actualización para RBAC:
Supongo que ya configuró rbac, creó una cuenta de servicio para su pod y la usó. Esta cuenta de servicio debe tener permisos de lista en los pods en el espacio de nombres requerido. Para hacer eso, debe crear un rol y un enlace de rol para esa cuenta de servicio.
Cada contenedor en un clúster se llena con un token que se puede usar para autenticarse en el servidor API. Para verificar, dentro del contenedor ejecute:
cat /var/run/secrets/kubernetes.io/serviceaccount/tokenPara realizar una solicitud a apserver, dentro del contenedor ejecute:
curl -ik \ -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ https://kubernetes.default.svc.cluster.local/api/v1/namespaces/default/podsUn poco tarde para la fiesta aquí, pero estos son mis dos centavos:
Descubrí que usar kubectl dentro de un contenedor es mucho más fácil que llamar a la API del clúster
(¿Por qué? ¡Autenticación automática!)
Supongamos que está implementando un proyecto de Node.js que necesita el uso kubectl .
kubectl dentro del contenedorkubectl a su contenedorkubectl proporciona un cli enriquecido para administrar su clúster de kubernetes--- EDICIONES ---
Después de trabajar con kubectl en mis módulos de clúster, encontré una forma más eficaz de autenticar los módulos para poder realizar llamadas a la API k8s. Este método proporciona una autenticación más estricta.
ServiceAccount y configure su pod para usar dicha cuenta. Documentos de la cuenta de servicio k8sRoleBinding o ClusterRoleBinding para permitir que los servicios tengan la autorización para comunicarse con la API de k8s. Documentos de vinculación de roles de k8s Cuando haya terminado, tendrá lo siguiente: ServiceAccount , ClusterRoleBinding , Deployment (sus pods)
Siéntase libre de comentar si necesita una dirección más clara, intentaré ayudar tanto como pueda :)
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 La salathielgenese/k8s-101 contiene kubectl . Entonces, uno puede simplemente iniciar sesión en un contenedor de pod y ejecutar kubectl como si lo estuviera ejecutando en el host k8s: kubectl exec -it pod-container-id -- kubectl get pods
/usr/local/bin/kubectl: cannot execute binary file
Parece que descargó el binario OSX para kubectl . Cuando se ejecuta en Docker, probablemente necesite el 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 ejecuta kubectl en un clúster de Kubernetes configurado correctamente, debería poder conectarse al servidor ap.
kubectl básicamente usa este código para encontrar el servidor ap y autenticar: github.com/kubernetes/client-go/rest.InClusterConfig
Esto significa:
KUBERNETES_SERVICE_HOST y KUBERNETES_SERVICE_PORT .var/run/secrets/kubernetes.io/serviceaccount/token ./var/run/secrets/kubernetes.io/serviceaccount/ca.crt . Estos son todos los datos que kubectl necesita saber para conectarse al servidor ap.
Algunas ideas de por qué esto podría no funcionar:
spec.serviceAccountName ).