Libro "Kubernetes para DevOps"

Libro "Kubernetes para DevOps" ¡Hola residentes de Khabro! Kubernetes es uno de los elementos clave del ecosistema de nube moderno. Esta tecnología proporciona confiabilidad, escalabilidad y resiliencia a la virtualización de contenedores. John Arundel y Justin Domingus hablan sobre el ecosistema de Kubernetes y presentan soluciones comprobadas a los problemas cotidianos. Paso a paso, creará su propia aplicación nativa de la nube y creará la infraestructura para respaldarla, configurará un entorno de desarrollo y un canal de implementación continua que lo ayudará mientras trabaja en sus próximas aplicaciones.

• Comience a utilizar contenedores y Kubernetes desde lo básico: no se requiere experiencia especial para aprender el tema. • Ejecute sus propios clústeres o elija un servicio de Kubernetes administrado de Amazon, Google, etc. • Utilice Kubernetes para administrar el ciclo de vida de los contenedores y el consumo de recursos. • Optimice los clústeres en función del costo, el rendimiento, la resiliencia, la potencia y la escalabilidad. • Conozca las mejores herramientas para desarrollar, probar e implementar sus aplicaciones. • Aprovechar las prácticas actuales de la industria para garantizar la seguridad y el control. • Implemente los principios de DevOps en toda su empresa para que los equipos de desarrollo puedan actuar de manera más flexible, rápida y eficiente.

¿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 involucrados en la creación de nuevos servicios en la nube o en la migración de aplicaciones existentes a Kubernetes y la nube. No te preocupes, no necesitas saber cómo trabajar con Kubernetes o contenedores: te enseñaremos todo.

Los usuarios experimentados de Kubernetes también encontrarán mucho valor, con una cobertura en profundidad de temas como RBAC, implementación continua, gestión de datos confidenciales y observabilidad. Esperamos que las páginas del libro definitivamente contengan algo interesante para usted, independientemente de sus habilidades y experiencia.

¿Qué preguntas responde el libro?

Mientras planificamos y escribimos el libro, hablamos sobre la tecnología de la nube y Kubernetes con cientos de personas, hablando con líderes y expertos de la industria, así como con novatos. A continuación se presentan preguntas seleccionadas que les gustaría ver respondidas en esta publicación.

  • “Me interesa saber por qué debería dedicar tiempo a esta tecnología. ¿Qué problemas nos ayudará a mí y a mi equipo a resolver?
  • “Kubernetes parece interesante, pero tiene una barrera de entrada bastante alta. Preparar un ejemplo sencillo no es difícil, pero una mayor administración y depuración es desalentadora. Nos gustaría recibir consejos confiables sobre cómo las personas administran los clústeres de Kubernetes en el mundo real y qué problemas es probable que encontremos".
  • “Un consejo subjetivo sería útil. El ecosistema de Kubernetes ofrece a los nuevos equipos demasiadas opciones para elegir. Cuando hay varias formas de hacer lo mismo, ¿cómo saber cuál es mejor? ¿Cómo hacer una elección?

Y quizás la más importante de todas las preguntas:

  • "¿Cómo puedo utilizar Kubernetes sin afectar a mi empresa?"

Extracto. Configuración y objetos secretos.

La capacidad de separar la lógica de una 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 suelen incluir configuraciones específicas del entorno, direcciones DNS de servicios de terceros y credenciales de autenticación.

Por supuesto, todo esto se puede poner directamente en el código, pero este enfoque no es lo suficientemente flexible. Por ejemplo, cambiar un valor de configuración requeriría que usted compilara e implementara su código nuevamente. Una solución mucho mejor sería separar la configuración del código y leerlo desde un archivo o variables de entorno.

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

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

Actualización de shells de pod cuando cambia la configuración

Imagine que tiene una implementación en su clúster y desea cambiar algunos valores en su ConfigMap. Si utiliza el gráfico de Helm (consulte “Helm: Administrador de paquetes para Kubernetes” en la página 102), puede detectar automáticamente un cambio de configuración y recargar los shells de su pod con un sencillo truco. Agregue la siguiente anotación a su especificación de implementación:

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

La plantilla de implementación ahora contiene una suma de verificación de los parámetros de configuración: si se cambian los parámetros, la suma se actualizará. Si ejecuta la actualización de helm, Helm detectará 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 datos de configuración en un clúster. Sin embargo, la mayoría de las aplicaciones tienen información sensible y confidencial, como contraseñas o claves API. También se puede almacenar en ConfigMap, pero esta solución no es la ideal.

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

Para comenzar, eche un vistazo al manifiesto de Kubernetes para el objeto Secret (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 suele ser muy útil en el mundo de la informática. De manera similar a ConfigMap, puede almacenar varias claves y valores en un objeto secreto. Aquí, por simplicidad, utilizamos solo un par clave-valor.

Usar objetos secretos como variables de entorno

Al igual que ConfigMap, el objeto Secret puede estar disponible en el contenedor como variables de entorno o como un archivo en su disco. En el siguiente ejemplo, asignaremos una variable de entorno al 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 los manifiestos:

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

Como antes, reenvíe 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

Al abrir una dirección localhost:9999/ deberías ver lo siguiente:

The magic word is "xyzzy"

Escribir objetos secretos en archivos

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

Para conectar Secret como un archivo, usaremos 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. 240, creamos un volumen (en este caso demo-secret-volume) y lo montamos en el contenedor en la sección volumeMounts de la especificación. El campo mountPath es /secrets, por lo que Kubernetes creará un archivo en esta carpeta para cada par clave/valor definido en el objeto Secret.

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

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

The magic word is "xyzzy"

Leer objetos secretos

En la sección anterior, utilizamos el comando kubectl describe para mostrar el contenido de un ConfigMap. ¿Se puede 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, lo que significa que su contenido no se muestra en la salida de kubectl describe, en las entradas del registro o en la terminal, lo que hace imposible revelar accidentalmente información confidencial.

Para ver una versión YAML codificada de datos confidenciales, 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=, completamente diferente de nuestro valor original? En realidad, se trata de un objeto secreto, representado en codificación base64. Base64 es un esquema para codificar datos binarios arbitrarios como una cadena de caracteres.

Debido a que la información confidencial puede ser binaria y no generarse (como es el caso de una 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 ejecutando el comando base64 —decode en la terminal:

echo "eHl6enk=" | base64 --decode
xyzzy

Entonces, si bien Kubernetes lo protege de generar accidentalmente datos confidenciales en el terminal o archivos de registro, si tiene permisos de lectura sobre objetos secretos en un espacio de nombres específico, esos datos se pueden basar en 64 y posteriormente decodificarlos.

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

echo xyzzy | base64
eHl6enkK

Accediendo a objetos secretos

¿Quién puede leer y editar objetos secretos? Esto lo determina RBAC, un mecanismo de control de acceso (lo analizaremos en detalle en la subsección “Introducción al control de acceso basado en roles” en la página 258). Si está ejecutando un clúster que no tiene RBAC o no está habilitado, todos sus objetos secretos están disponibles para cualquier usuario y contenedor (más adelante explicaremos que no debe tener ningún clúster de producción sin RBAC).

Cifrado de datos pasivo

¿Qué pasa con quienes tienen acceso a la base de datos etcd donde Kubernetes almacena toda su información? ¿Pueden leer datos confidenciales sin tener permiso para leer objetos secretos a través de la API?

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

Puedes comprobar si el cifrado pasivo funciona en tu clúster de esta manera:

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

Si no ve el indicador experimental-encryption-provider-config, el cifrado pasivo no está habilitado. Cuando utiliza Google Kubernetes Engine u otros servicios de administración de Kubernetes, sus datos se cifran mediante un mecanismo diferente, por lo que la bandera no estará presente. Consulte con su proveedor de Kubernetes para ver si el contenido de etcd está cifrado.

Almacenamiento de datos confidenciales

Hay algunos recursos de Kubernetes que nunca deben eliminarse del clúster, como los objetos secretos altamente confidenciales. Puede proteger un recurso para que no se elimine mediante una anotación proporcionada por el administrador de Helm:

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 almacenaban como texto sin formato.

Nunca debe colocar información confidencial en archivos que estén bajo control de versiones. ¿Cómo puede administrar y almacenar de forma segura esta información antes de aplicarla a su clúster de Kubernetes?

Puede elegir cualquier herramienta o estrategia para manejar datos confidenciales en sus aplicaciones, pero aún así deberá responder al menos a las siguientes preguntas.

  • ¿Dónde deberían almacenarse los datos confidenciales para que sean altamente accesibles?
  • ¿Cómo hacer que los datos confidenciales sean accesibles para sus aplicaciones activas?
  • ¿Qué debería suceder con sus aplicaciones cuando reemplaza o edita datos confidenciales?

Sobre los autores

Juan Arundel es un 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ándolas sobre infraestructura nativa de la nube y Kubernetes. En su tiempo libre le gusta surfear, es un buen tirador de pistola y toca el piano como aficionado. Vive en una cabaña de cuento de hadas en Cornwall, Inglaterra.

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

» Puede encontrar más detalles sobre el libro en sitio web del editor
» tabla de contenidos
» Extracto

Para Khabrozhiteley 25% de descuento usando cupón - Kubernetes

Previo pago de la versión impresa del libro, se enviará por correo electrónico un libro electrónico.

Fuente: habr.com

Añadir un comentario