kubernetes - paso - ¿Cuál es la diferencia entre un pod y un despliegue?
kubernetes vs docker (7)
He estado creando pods con
type:deployment
pero veo que cierta documentación usa
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 se puede usar 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 qué
kind:pod
es buena?
¿Puede 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 una
replica
o una 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.
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 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, si desea 5 réplicas de una aplicación, mencionó
replicas: 5
en 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.
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 asegurar que el número deseado de Pods esté siempre disponible y especifica una estrategia para reemplazar Pods, como RollingUpdate.
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
- Implementación : 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
despec.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.
La respuesta de Radek es muy buena, pero me gustaría comentar desde mi experiencia, 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:
-
Objeto de implementación (donde especificará el contenedor / contenedores de sus aplicaciones) que alojará el contenedor de su aplicación con algunas otras especificaciones.
-
Objeto de servicio (que es como un objeto de agrupación y le da una llamada IP virtual (IP de clúster) para los
pods
que tienen una etiqueta determinada, y esospods
son básicamente los contenedores de aplicaciones que implementó con el objeto de implementación anterior).
Debe tener el objeto de
servicio
porque los
pods
del objeto de implementación se pueden 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 le dé a esos
pods
una IP estable.
Solo quería darle algo de contexto en torno a los
pods
, para que sepa cómo funcionan las cosas juntas.
Espero que te aclare algunas cosas, no hace mucho tiempo que estaba en tus zapatos :)
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 las Réplicas deseadas sean siempre las mismas que las Réplicas actuales.
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
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 poco probable que alguna vez necesite crear Pods directamente para un caso de uso de producción.
Pod es instancia de contenedor.
Ese es el resultado de las
replicas: 3
Piense en una
deployment
puede 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