hub - kubernetes install docker image
Kubernetes-¿Cómo ejecutar comandos kubectl dentro de un contenedor? (3)
Primera pregunta
/usr/local/bin/kubectl: cannot execute binary file
Parece que descargaste el binario de OSX para kubectl
. Cuando corres en Docker, probablemente necesites 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
Segunda pregunta
Si ejecuta kubectl
en un clúster de Kubernetes correctamente configurado, debería poder conectarse al apiserver.
kubectl
básicamente usa este código para encontrar el apiserver y autenticar: github.com/kubernetes/client-go/rest.InClusterConfig
Esto significa:
- El host y el puerto del apiserver se almacenan en las variables de entorno
KUBERNETES_SERVICE_HOST
yKUBERNETES_SERVICE_PORT
. - El token de acceso se monta en
var/run/secrets/kubernetes.io/serviceaccount/token
. - El certificado del servidor se monta en
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
.
Esto es todo lo que kubectl
necesita saber para conectarse al apiserver.
Algunos pensamientos de por qué esto podría no funcionar:
- El contenedor no se ejecuta en Kubernetes.
- No es suficiente usar el mismo host Docker; el contenedor debe ejecutarse como parte de una definición de pod.
- El acceso se restringe mediante el uso de un complemento de autorización (que no es el predeterminado).
- Las credenciales de la cuenta de servicio se sobrescriben con la definición del pod (
spec.serviceAccountName
).
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 conseguir 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/kubectl
EDITAR: Estaba intentando el archivo OSX, lo he corregido en el archivo binario de Linux. (corregido por @svenwltr
Al crear el archivo docker, esto tiene éxito, pero cuando ejecuto los pods de Kubectl get dentro de un contenedor,
kubectl get pods
Me sale este error:
La conexión al servidor: se rechazó: ¿especificó el host o puerto correcto?
Cuando estaba implementando localmente, me encontraba con este error si mi máquina de conexión no estaba funcionando, pero dentro de un contenedor, ¿cómo puede estar funcionando una máquina de conexión?
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 debo hacer?
Poco tarde a la fiesta aquí, pero estos son mis dos centavos:
He encontrado 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 Node.js que necesita el uso de kubectl
.
- Descargar y construir
kubectl
dentro del contenedor - Construye tu aplicación, copiando
kubectl
a tu contenedor - Voila!
kubectl
proporciona un cli rico para administrar su clúster kubernetes
--- EDICIONES ---
Después de trabajar con kubectl
en mis pods de clúster, encontré una forma más efectiva de autenticar pods para poder hacer llamadas a la API de k8s. Este método proporciona una autenticación más estricta.
- Cree una cuenta de servicio para su pod y configure su pod para usar dicha cuenta. Documentos de la cuenta de servicio k8s
- Configure un
RoleBinding
oClusterRoleBinding
para permitir que los servicios tengan la autorización para comunicarse con la API de k8s. K8s Role Binding docs - Llame a la API directamente o use el k8s-client para administrar las llamadas a la API por usted. Recomiendo encarecidamente el uso del cliente, tiene una configuración automática para los pods que elimina el paso de token de autenticación requerido con las solicitudes normales.
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é ayudarlo todo lo que pueda :)
Ejemplo todo en uno
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 imagen de la salathielgenese/k8s-101
contiene kubectl
. Así que uno puede simplemente iniciar sesión en un contenedor de pod y ejecutar kubectl
como si lo estuviera ejecutando en el host de kubectl exec -it pod-container-id -- kubectl get pods
: kubectl exec -it pod-container-id -- kubectl get pods
Yo usaría kubernetes api, solo necesitas instalar curl, en lugar de kubectl
y el resto es tranquilo.
curl http://localhost:8080/api/v1/namespaces/default/pods
Estoy ejecutando por encima del comando en uno de mis servidores. Cambie el nombre de localhost a apiserver ip address / dns .
Dependiendo de su configuración, es posible que necesite 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=8
Recursos:
Documentación API Kubernetes
Actualización para RBAC:
Supongo que ya configuró rbac, creó una cuenta de servicio para su pod y la ejecuta. Esta cuenta de servicio debe tener permisos de lista en pods en el espacio de nombres requerido. Para hacer eso, necesita 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 autenticar en el servidor API. Para verificar, dentro del contenedor ejecutar:
cat /var/run/secrets/kubernetes.io/serviceaccount/token
Para realizar la solicitud al apiserver, 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/pods