¿Cuál es la diferencia entre un pod y un despliegue?

241

He estado creando pods type:deploymentpero veo que algunos usos de documentación type:pod, más específicamente la documentación para pods de contenedores múltiples :

apiVersion: v1
kind: Pod
metadata:
  name: ""
  labels:
    name: ""
  namespace: ""
  annotations: []
  generateName: ""
spec:
  ? "// See 'The spec schema' for details."
  : ~

Pero para crear pods solo puedo usar un tipo de implementación :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ""
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ""
    spec:
      containers:
        etc

Noté que la documentación del pod dice:

El comando crear puede usarse para crear un pod directamente, o puede crear un pod o pods a través de una implementación. Se recomienda encarecidamente que utilice una implementación para crear sus pods. Vigila las vainas fallidas y pondrá en marcha nuevas vainas según sea necesario para mantener el número especificado. Si no desea que una Implementación monitoree su pod (por ejemplo, su pod está escribiendo datos no persistentes que no sobrevivirán a un reinicio, o su pod está destinado a ser muy breve), puede crear un pod directamente con El comando Crear.

Nota: Recomendamos usar una Implementación para crear pods. Debe usar las instrucciones a continuación solo si no desea crear una Implementación.

¿Pero esto plantea la pregunta de para qué kind:podsirve? ¿Puedes de alguna manera hacer referencia a pods en una implementación? No vi un camino. Parece que lo que obtienes con los pods son algunos metadatos adicionales, pero ninguna de las opciones de implementación, como replicauna política de reinicio. ¿De qué sirve un pod que no conserva datos, sobrevive a un reinicio? Creo que también podría crear un pod de contenedores múltiples con una implementación.

Bjorn
fuente

Respuestas:

191

Tanto Pod como Deployment son objetos completos en la API de Kubernetes. La implementación gestiona la creación de Pods mediante ReplicaSets. Todo se reduce a que la implementación creará Pods con especificaciones tomadas de la plantilla. Es bastante improbable que alguna vez necesite crear Pods directamente para un caso de uso de producción.

Radek 'Goblin' Pieczonka
fuente
77
Gracias, pero ¿cuándo crearías pods directamente?
Bjorn
11
Tener un controlador personalizado es un caso en el que probablemente desee crear y administrar pods directamente, en lugar de utilizar una de las abstracciones de nivel superior.
Anirudh Ramanathan
24
@BjornTipling Creo pods sin despliegue cuando no necesito kubernetes para volver a crear pods cuando se eliminan. Un caso de uso es probar cosas creando primero un pod.
user2526795
243

La respuesta de Radek es muy buena, pero me gustaría comentar desde mi experiencia, que casi nunca usarás un objeto con el pod amable , porque eso no tiene ningún sentido en la práctica.

Debido a que necesita un objeto de implementación , u otros objetos de la API de Kubernetes, como un controlador de replicación o un conjunto de réplicas , que necesita mantener vivas las réplicas (pods) (ese es el punto de usar kubernetes).

Lo que usará en la práctica para una aplicación típica son:

  1. Objeto de implementación (donde especificará el contenedor / contenedores de sus aplicaciones) que alojará el contenedor de su aplicación con algunas otras especificaciones.

  2. Objeto de servicio (que es como un objeto de agrupación y le da una llamada IP virtual (IP de clúster) para los podsque tienen una determinada etiqueta, y esos podsson básicamente los contenedores de aplicaciones que implementó con el objeto de implementación anterior ).

Debe tener el objeto de servicio porque el objeto podsdel despliegue se puede eliminar, escalar hacia arriba y hacia abajo, y no puede confiar en sus direcciones IP porque no serán persistentes.

Por lo tanto, necesita un objeto como un servicio que les brinde a los podsIP una IP estable.

Solo quería darle un poco de contexto pods, para que sepa cómo funcionan las cosas juntas.

Espero que te aclare algunas cosas, no hace mucho que estaba en tus zapatos :)

Tomislav Mikulin
fuente
1
Buena respuesta, ¿necesitamos un replicaSet o un ReplicationController porque pensé que el objeto Deployment envuelve estos objetos que controlan las réplicas?
user_mda
3
sí, el objeto de implementación maneja el conjunto de réplicas, pero también podría usar un objeto con el tipo: ReplicationController o kind: ReplicaSet por sí mismo si realmente lo desea, pero no he visto mucho de eso en la práctica ...
Tomislav Mikulin
2
¿Por qué dan varios documentos de kubernetes kind: Podcomo ejemplo? Por ejemplo, Cómo consumir secretos como env vars: kubernetes.io/docs/concepts/configuration/secret/…
rm.rf.etc
1
No estoy muy seguro, tal vez porque es más fácil explicar los conceptos en k8 ... sin dar el peso de los controladores, implementaciones, etc ...
Tomislav Mikulin
1
Hay algunos casos en los que desea crear un pod, por ejemplo, si está ejecutando un sidecar de prueba (ejemplo helm test) en el que no necesita ejecutar la aplicación para siempre, y no necesitamos múltiples réplicas, en ese caso el pod es adecuado.
Balkrishna
61

Kubernetes tiene tres tipos de objetos que debes conocer:

  • Pods : ejecuta uno o más contenedores estrechamente relacionados
  • Servicios : configura redes en un clúster de Kubernetes
  • Despliegue : mantiene un conjunto de pods idénticos, asegurando que tengan la configuración correcta y que exista el número correcto de ellos.

Vainas:

  • Ejecuta un único conjunto de contenedores.
  • Bueno para propósitos de desarrollo únicos
  • Raramente usado directamente en producción

Despliegue:

  • Ejecuta un conjunto de pods idénticos
  • Monitorea el estado de cada pod, actualizando según sea necesario
  • Bueno para dev
  • Bueno para la producción

Y estaría de acuerdo con otras respuestas, olvidarme de Pods y simplemente usar Deployment. ¿Por qué? Mire la segunda viñeta, monitorea el estado de cada pod, actualizando según sea necesario.

Entonces, en lugar de luchar con mensajes de error como este:

Prohibido: las actualizaciones de pod no pueden cambiar los campos que no sean spec.containers[*].image

Así que simplemente refactorice o vuelva a crear completamente su Pod en una implementación que cree un pod para hacer lo que necesita hacer. Con la implementación, puede cambiar cualquier configuración que desee y no necesita preocuparse por ver ese mensaje de error.

Daniel
fuente
9

Pod es instancia de contenedor.

ingrese la descripción de la imagen aquí

Esa es la salida de replicas: 3

Piense en uno deploymentpuede tener muchas instancias en ejecución (réplica).

//deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: tomcat-deployment222
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 3
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 8080
serkan
fuente
La mejor respuesta hasta ahora. Las otras respuestas se centran en mostrar cómo las implementaciones son un concepto más importante y que rara vez se utilizan Pods en la producción, pero carecen de una información clara sobre cómo se relacionan entre sí.
Diego Queiroz
Entonces, ¿podemos nombrar el pod como uno de las réplicas de la implementación?
kioria
@kioria, ¿qué quieres decir con "réplicas de implementación"?
serkan
@serkan me refiero a estas réplicas: 3 de la especificación de implementación.
kioria
@kioria, replicas: 3referencias a la parte superior de la imagen, significa "oye, cuando ejecutes este proceso, crea 3 computadoras virtuales / reales - instancias". es como "despliegues" es un hogar y los "grupos" son personas. Una casa y tres personas adentro hacen el trabajo. ¿Qué estás tratando de hacer específico a esto?
serkan
6

Pod es una colección de contenedores y objeto básico de Kuberntes. Todos los contenedores de pod se encuentran en el mismo nodo.

  • No apto para producción.
  • Sin actualizaciones continuas

La implementación es un tipo de controlador en Kubernetes.

Controllers use a Pod Template that you provide to create the Pods for which it is responsible.

La implementación crea un ReplicaSet que, a su vez, se asegura de que CurrentReplicas siempre sea el mismo que el deseado.

Ventajas:

  • Puede implementar y deshacer sus cambios utilizando la implementación
  • Monitorea el estado de cada pod
  • El más adecuado para la producción.
  • Admite actualizaciones continuas
Nikhil Kumar
fuente
4

Quiero agregar información del libro Kubernetes In Action , para que pueda ver toda la imagen y la relación de conexión entre los recursos de Kubernetes como Pod, Deployment y ReplicationController (ReplicaSet)

Vainas

son la unidad básica desplegable en Kubernetes. Pero en casos de uso del mundo real, desea que sus implementaciones se mantengan en funcionamiento automáticamente y se mantengan saludables sin ninguna intervención manual. Para esto, el enfoque recomendado es usar un Despliegue , que debajo del capó crea un ReplicaSet .

Un ReplicaSet , como su nombre lo indica, es un conjunto de réplicas (Pods) mantenidas con su historial de Revisión .

(ReplicaSet extiende un objeto antiguo llamado ReplicationController , que es exactamente el mismo pero sin el historial de revisión).

Un ReplicaSet monitorea constantemente la lista de pods en ejecución y se asegura de que el número de pods que coincidan con una determinada especificación siempre coincida con el número deseado.

ingrese la descripción de la imagen aquí

Removing a pod from the scope of the ReplicationController comes in handy
when you want to perform actions on a specific pod. For example, you might 
have a bug that causes your pod to start behaving badly after a specific amount 
of time or a specific event.

Un despliegue

es un recurso de nivel superior destinado a implementar aplicaciones y actualizarlas declarativamente.

Cuando crea una implementación , se crea un recurso ReplicaSet debajo (eventualmente más de ellos). ReplicaSets también replica y gestiona pods. Cuando se utiliza un despliegue, las vainas reales son creados y administrados por el despliegue ‘s ReplicaSets , no por el despliegue directamente ingrese la descripción de la imagen aquí

Pensemos en lo que ha sucedido. Al cambiar la plantilla de pod en su recurso de implementación, ha actualizado su aplicación a una versión más nueva, ¡cambiando un solo campo!

ingrese la descripción de la imagen aquí

Finalmente, revierta una implementación a la revisión anterior o a cualquier revisión anterior tan fácil con el recurso de implementación.

Estas imágenes son del libro de Kubernetes In Action , también.

fgul
fuente
2

Intente evitar Pods e implemente Implementaciones para administrar contenedores, ya que los objetos de tipo Pod no se reprogramarán (ni se auto curarán) en caso de falla de un nodo o terminación del pod.

Una implementación es generalmente preferible porque define un ReplicaSet para garantizar que el número deseado de Pods esté siempre disponible y especifica una estrategia para reemplazar Pods, como RollingUpdate.

maelga
fuente
1

En kubernetes, las vainas son las unidades desplegables más pequeñas. Cada vez que creamos un objeto kubernetes como Deployments, replica-sets, statefulsets, daemonsets, crea un pod.

Como se mencionó anteriormente, las implementaciones crean módulos basados ​​en el estado deseado mencionado en su objeto de implementación. Entonces, por ejemplo, desea 5 réplicas de una aplicación, que mencionó replicas: 5en su manifiesto de implementación. Ahora el controlador de implementación es responsable de crear 5 réplicas idénticas (no menos, no más) de la aplicación dada con todos los metadatos como la política RBAC, la política de redes, etiquetas, anotaciones, verificación de estado, cuotas de recursos, contaminación / tolerancias y otros, y asociarse con cada pod. crea.

Hay algunos casos en los que desea crear un pod, por ejemplo, si está ejecutando un sidecar de prueba en el que no necesita ejecutar la aplicación para siempre, no necesita múltiples réplicas y ejecuta la aplicación cuando desea ejecutar en ese La vaina de la caja es adecuada. Por ejemplo helm test, que es una definición de pod que especifica un contenedor con un comando dado para ejecutar.

Balkrishna
fuente