Libro Kubernetes para DevOps

imagenHola habrozhiteli! Kubernetes es uno de los elementos clave del ecosistema moderno de la nube. Esta tecnología proporciona la confiabilidad, escalabilidad y resistencia de la virtualización de contenedores. John Arundel y Justin Domingus hablan sobre el ecosistema de Kubernetes e introducen soluciones comprobadas para los problemas cotidianos. Paso a paso, creará su propia aplicación basada en la nube y creará la infraestructura para admitirla, configurará el entorno de desarrollo y la canalización de implementación continua, lo que le será útil cuando trabaje en las siguientes aplicaciones.

• Comience con los contenedores y Kubernetes desde cero: no se requiere experiencia especial para aprender el tema. • Inicie sus propios clústeres o elija un servicio administrado de Kubernetes de Amazon, Google, etc. • Use Kubernetes para administrar el ciclo de vida del contenedor y el consumo de recursos. • Optimice los clústeres en cuanto a costo, rendimiento, resistencia, potencia y escalabilidad. • Conozca las mejores herramientas para desarrollar, probar e implementar sus aplicaciones. • Aproveche las prácticas actuales de la industria para la seguridad y el control. • Implemente los principios de DevOps en su empresa para que los equipos de desarrollo se vuelvan más flexibles, rápidos y eficientes.

¿Para quién es el libro?


El libro es más relevante para los empleados de los departamentos de administración responsables de servidores, aplicaciones y servicios, así como para los desarrolladores que participan en la creación de nuevos servicios en la nube o en la migración de aplicaciones existentes a Kubernetes y la nube. No se preocupe, no es necesario saber cómo trabajar con Kubernetes y contenedores, le enseñaremos todo.

Los usuarios experimentados de Kubernetes también encontrarán mucho por descubrir: temas como RBAC, implementación continua, gestión de datos confidenciales y observabilidad están cubiertos en profundidad. Esperamos que las páginas del libro seguramente tengan algo interesante para usted, independientemente de sus habilidades y experiencia.

¿Qué preguntas responde el libro?


Durante la planificación y redacción del libro, discutimos las tecnologías de nube y Kubernetes con cientos de personas, hablamos con líderes y expertos en la industria, así como con principiantes absolutos. Las siguientes son preguntas individuales a las que les gustaría ver respuestas en esta publicación.

  • “Me interesa saber por qué se debe dedicar tiempo a esta tecnología. ¿Qué problemas nos ayudará ella y mi equipo a resolver?
  • “Kubernetes parece interesante, pero tiene un umbral de entrada bastante alto. Preparar un ejemplo simple no es difícil, pero la administración y depuración posteriores son aterradoras. Nos gustaría obtener consejos confiables sobre cómo las personas manejan los grupos de Kubernetes en la vida real y qué problemas es probable que enfrentemos ”.
  • “Un consejo subjetivo sería útil. El ecosistema de Kubernetes ofrece a los equipos novatos demasiadas opciones para elegir. Cuando se puede hacer lo mismo de varias maneras, ¿cómo entender cuál es mejor? ¿Cómo hacer una elección?

Y, probablemente, la más importante de todas las preguntas:

  • "¿Cómo usar Kubernetes sin interrumpir mi empresa?"

Extracto. Configuración y objetos secretos


La capacidad de separar la lógica de la aplicación Kubernetes de su configuración (es decir, de cualquier valor o configuración que pueda cambiar con el tiempo) es muy útil. Los valores de configuración generalmente incluyen configuraciones para un entorno específico, direcciones DNS de servicios de terceros y credenciales para la autenticación.

Por supuesto, todo esto se puede colocar directamente en el código, pero este enfoque no es lo suficientemente flexible. Por ejemplo, para cambiar el valor de configuración, deberá volver a ensamblar e implementar su código. Una solución mucho mejor sería separar la configuración del código y leerla desde el archivo o las variables de entorno.

Kubernetes proporciona varias formas diferentes de administrar su configuración. Primero, puede pasar valores a la aplicación a través de las variables de entorno especificadas en la especificación del shell de pod (consulte la sección "Variables de entorno" en la página 192). En segundo lugar, los datos de configuración se pueden almacenar directamente en Kubernetes utilizando los objetos ConfigMap y Secret.

En este capítulo, examinaremos estos objetos en detalle y consideraremos algunos enfoques prácticos para administrar la configuración y los datos confidenciales utilizando una aplicación de demostración de ejemplo.

Actualización de shells de pod al cambiar configuraciones


Imagine que su clúster tiene una implementación y desea cambiar algunos valores en su ConfigMap. Si usa la tabla Helm (consulte la sección "Helm: Administrador de paquetes para Kubernetes" en la página 102), puede detectar un cambio de configuración y reiniciar sus shells de pod con un elegante truco. Agregue la siguiente anotación a su especificación de implementación:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

Ahora la plantilla de implementación contiene la suma de comprobación de los parámetros de configuración: cuando se cambian los parámetros, se actualiza la suma. Si ejecuta el comando de actualización de helm, Helm encontrará que la especificación de implementación ha cambiado y reiniciará todos los shells de pod.

Datos confidenciales en Kubernetes


Ya sabemos que el objeto ConfigMap proporciona un mecanismo flexible para almacenar y acceder a los datos de configuración en un clúster. Sin embargo, la mayoría de las aplicaciones tienen información secreta y confidencial: por ejemplo, contraseñas o claves API. También se puede almacenar en ConfigMap, pero esa solución no es ideal.

En cambio, Kubernetes ofrece un tipo especial de objeto diseñado para almacenar datos confidenciales: secreto. A continuación, consideramos un ejemplo de cómo se puede aplicar este objeto en nuestra aplicación de demostración.

Para comenzar, eche un vistazo al manifiesto de Kubernetes para el objeto Secreto (consulte hello-secret-env / k8s / secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

En este ejemplo, la clave privada de magicWord es xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). La palabra xyzzy es generalmente muy útil en el mundo de las computadoras. Similar a ConfigMap, puede colocar muchas claves y valores en un objeto secreto. Aquí, por simplicidad, usamos solo un par clave-valor.

Usando objetos secretos como variables de entorno


Al igual que ConfigMap, el objeto secreto puede estar disponible en el contenedor como variables de entorno o como un archivo en su disco. En el siguiente ejemplo, asignaremos a la variable de entorno el valor de Secret:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord


Ejecute el siguiente comando en el repositorio de demostración para aplicar manifiestos:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

Como antes, redirija el puerto local a la implementación para ver el resultado en su navegador:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

Cuando abre la dirección localhost : 9999 / debería ver lo siguiente:

The magic word is "xyzzy"

Escribir objetos secretos en archivos


En este ejemplo, adjuntaremos el objeto secreto al contenedor como un archivo. El código está en la carpeta hello-secret-file del repositorio de demostración.

Para conectar Secret como un archivo, utilizaremos la siguiente implementación:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

Como en la subsección "Creación de archivos de configuración a partir de objetos ConfigMap" en la pág. 240, creamos un volumen (en este caso, demo-secret-volume) y lo conectamos al contenedor en la sección de especificaciones de volumeMounts. MountPath es / secretos, por lo que Kubernetes creará un archivo para cada par clave-valor definido en el objeto Secreto en esta carpeta.

En nuestro ejemplo, definimos solo un par clave-valor llamado magicWord, por lo que el manifiesto creará un único archivo / secrets / magicWord con datos confidenciales en el contenedor que es de solo lectura.

Si aplica este manifiesto de la misma manera que en el ejemplo anterior, debería obtener el mismo resultado:

The magic word is "xyzzy"

Lectura de objetos secretos


En la sección anterior, utilizamos el comando kubectl describe para mostrar el contenido de ConfigMap. ¿Puedes hacer lo mismo con Secret?

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

Tenga en cuenta que los datos en sí no se muestran. Los objetos secretos en Kubernetes son de tipo opaco: esto significa que su contenido no se muestra en la salida de kubectl describe, las entradas de diario y el terminal, lo que hace imposible revelar accidentalmente información confidencial.

Para ver la versión codificada de datos confidenciales en formato YAML, use el comando kubectl get:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64


¿Qué es eHl6enk =, que es completamente diferente de nuestro valor original? Esto es en realidad un objeto secreto, representado en codificación base64. Base64 es un esquema de codificación para datos binarios arbitrarios como una cadena de caracteres.

Dado que la información confidencial puede ser binaria e inaccesible para la salida (como, por ejemplo, en el caso de la clave de cifrado TLS), los objetos secretos siempre se almacenan en formato base64.

El texto beHl6enk = es la versión codificada en base64 de nuestra palabra secreta xyzzy. Puede verificar esto si ejecuta el comando base64 --decode en el terminal:

echo "eHl6enk=" | base64 --decode
xyzzy

Por lo tanto, a pesar de que Kubernetes lo protege de mostrar accidentalmente datos confidenciales en un terminal o archivos de registro, si tiene derecho a leer objetos secretos en un espacio de nombres específico, estos datos pueden recibirse en formato base64 y posteriormente decodificarse.

Si necesita codificar algún texto en base64 (por ejemplo, para ponerlo en secreto), use el comando base64 sin argumentos:

echo xyzzy | base64
eHl6enkK

Acceso a objetos secretos.


¿Quién puede leer y editar objetos secretos? Esto está determinado por RBAC, el mecanismo de control de acceso (lo discutiremos en detalle en la sección Introducción al control de acceso basado en roles en la página 258). Si usa un clúster en el que el sistema RBAC está ausente o no está habilitado, todos sus objetos secretos estarán accesibles para cualquier usuario y contenedor (explicaremos más adelante que no debería tener ningún clúster industrial sin RBAC).

Encriptación pasiva de datos


¿Qué pasa con aquellos que tienen acceso a la base de datos etcd, en la que Kubernetes almacena toda su información? ¿Pueden leer datos confidenciales sin derecho a leer objetos secretos a través de la API?

A partir de la versión 1.7, Kubernetes admite el cifrado de datos pasivo. Esto significa que la información confidencial dentro de etcd se almacena en el disco en forma cifrada y no puede ser leída ni siquiera por aquellos que tienen acceso directo a la base de datos. Para descifrarlo, necesita una clave que solo tenga el servidor API de Kubernetes. En un clúster configurado correctamente, el cifrado pasivo debe estar habilitado.

Verifique si el cifrado pasivo funciona en su clúster haciendo esto:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

Si no ve el indicador experimental-cifrado-proveedor-configuración, el cifrado pasivo no está habilitado. Al usar Google Kubernetes Engine u otros servicios de administración de Kubernetes, sus datos se cifran con un mecanismo diferente, por lo que el indicador estará ausente. Consulte con su proveedor de Kubernetes para ver si el contenido de etcd está encriptado.

Almacenamiento de datos confidenciales


Hay recursos de Kubernetes que nunca deberían eliminarse de un clúster: por ejemplo, objetos secretos especialmente importantes. Puede proteger el recurso para que no se elimine utilizando la anotación proporcionada por Helm Manager:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

Estrategias de gestión de objetos secretos


En el ejemplo de la sección anterior, los datos confidenciales se protegieron del acceso no autorizado inmediatamente después de almacenarse en el clúster. Pero en los archivos de manifiesto, se almacenaron en texto sin formato.

Nunca debe colocar información confidencial en archivos que están en el sistema de control de versiones. ¿Cómo administrar y almacenar esta información de manera segura antes de aplicarla a un clúster de Kubernetes?

Puede elegir cualquier herramienta o estrategia para trabajar con datos confidenciales en sus aplicaciones, pero aún necesita responder al menos las siguientes preguntas.

  • ¿Dónde almacenar datos confidenciales para que sean altamente accesibles?
  • ¿Cómo hacer que los datos sensibles estén disponibles para sus aplicaciones activas?
  • , ?


John Arundel es consultor con 30 años de experiencia en la industria informática. Ha escrito varios libros y trabaja con muchas empresas de diferentes países, asesorándolos sobre infraestructura basada en la nube y Kubernetes. En su tiempo libre le gusta surfear, dispara una buena pistola y toca el piano de forma amateur. Vive en una fabulosa cabaña en Cornwall, Inglaterra.

Justin Domingus es un ingeniero de administración de sistemas que trabaja en un entorno DevOps con Kubernetes y tecnologías en la nube. Le gusta pasar tiempo al aire libre, tomar café, atrapar cangrejos y sentarse frente a la computadora. Vive en Seattle, Washington, junto con un gato maravilloso y una esposa aún más maravillosa y su mejor amiga Adrienne a tiempo parcial.

»Se puede encontrar más información sobre el libro en el sitio web de la editorial
» Contenido
» Extracto de

Khabrozhiteley 25% de cupón de descuento - Kubernetes

Tras el pago de la versión en papel del libro, se envía un libro electrónico por correo electrónico.

All Articles