run hub deploy container compose docker kubernetes dockerfile

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 y KUBERNETES_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 .

  1. Descargar y construir kubectl dentro del contenedor
  2. Construye tu aplicación, copiando kubectl a tu contenedor
  3. Voila! kubectl proporciona un cli rico para administrar su clúster kubernetes

Documentación útil

--- 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.

  1. Cree una cuenta de servicio para su pod y configure su pod para usar dicha cuenta. Documentos de la cuenta de servicio k8s
  2. Configure un RoleBinding o ClusterRoleBinding para permitir que los servicios tengan la autorización para comunicarse con la API de k8s. K8s Role Binding docs
  3. 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