Sobre la creciente popularidad de Kubernetes

¡Hola, Habr!

A finales de verano queremos recordaros que seguimos trabajando en el tema. Kubernetes y decidió publicar un artículo de Stackoverflow que demuestra la situación de este proyecto a principios de junio.

Sobre la creciente popularidad de Kubernetes

¡Disfruta leyendo!

Al momento de escribir este artículo, la edad de Kubernetes es de aprox. seis años de edad, y en los últimos dos años su popularidad ha crecido tanto que se clasifica constantemente entre mas favorito plataformas. Kubernetes ocupa el tercer lugar este año. En resumen: Kubernetes es una plataforma diseñada para ejecutar y orquestar cargas de trabajo en contenedores.

Los contenedores comenzaron como un diseño especial para aislar procesos en Linux; Se incluyen contenedores desde 2007. cgrupos, y desde 2002 – espacios de nombres. Los contenedores se diseñaron aún mejor en 2008, cuando estuvieron disponibles LXC, y Google desarrolló su propio mecanismo corporativo interno llamado Borg, donde “todo el trabajo se realiza en contenedores”. De aquí avanzamos rápidamente hasta 2013, cuando tuvo lugar el primer lanzamiento de Docker y los contenedores finalmente se convirtieron en una solución masiva popular. En ese momento, la principal herramienta para la orquestación de contenedores era mesos, aunque no era muy popular. Kubernetes se lanzó por primera vez en 2015, después de lo cual esta herramienta se convirtió en el estándar de facto en el campo de la orquestación de contenedores.

Para intentar comprender por qué Kubernetes es tan popular, intentemos responder algunas preguntas. ¿Cuándo fue la última vez que los desarrolladores pudieron ponerse de acuerdo sobre cómo implementar aplicaciones en producción? ¿Cuántos desarrolladores conoces que utilicen las herramientas tal como se proporcionan de fábrica? ¿Cuántos administradores de la nube hay hoy que no entienden cómo funcionan las aplicaciones? Analizaremos las respuestas a estas preguntas en este artículo.

Infraestructura como YAML

En el mundo que pasó de Puppet and Chef a Kubernetes, uno de los mayores cambios fue el paso de “infraestructura como código” a “infraestructura como datos”, específicamente, como YAML. Todos los recursos de Kubernetes, que incluyen pods, configuraciones, instancias implementadas, volúmenes, etc., se pueden describir fácilmente en un archivo YAML. Por ejemplo:

apiVersion: v1
kind: Pod
metadata:
  name: site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80

Esta vista facilita que los profesionales de DevOps o SRE expresen completamente sus cargas de trabajo sin tener que escribir código en lenguajes como Python o Javascript.

Otras ventajas de organizar la infraestructura como datos incluyen:

  • Control de versiones de GitOps o Git Operations. Este enfoque le permite mantener todos los archivos YAML de Kubernetes en repositorios de git, de modo que pueda realizar un seguimiento exacto de cuándo se realizó un cambio, quién lo realizó y qué cambió exactamente. Esto aumenta la transparencia de las operaciones en toda la organización y mejora la eficiencia operativa al eliminar la ambigüedad, particularmente en dónde los empleados deben buscar los recursos que necesitan. Al mismo tiempo, resulta más fácil realizar cambios automáticamente en los recursos de Kubernetes simplemente fusionando una solicitud de extracción.
  • Escalabilidad. Cuando los recursos se definen como YAML, resulta extremadamente fácil para los operadores de clúster cambiar uno o dos números en un recurso de Kubernetes, cambiando así su escala. Kubernetes proporciona un mecanismo para el escalado automático horizontal de pods, que se puede utilizar para determinar convenientemente cuál es el número mínimo y máximo de pods que se requieren en una configuración de implementación particular para manejar niveles altos y bajos de tráfico. Por ejemplo, si implementó una configuración que requiere capacidad adicional debido a un aumento repentino en el tráfico, entonces maxReplicas se puede cambiar de 10 a 20:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deployment
  minReplicas: 1
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

  • Seguridad y gestión. YAML es excelente para evaluar cómo se implementan las cosas en Kubernetes. Por ejemplo, una preocupación importante de seguridad tiene que ver con si sus cargas de trabajo se ejecutan como un usuario no administrador. En este caso, es posible que necesitemos herramientas como concurso, validador YAML/JSON, más Agente de políticas abierto, un validador de políticas para garantizar que el contexto Contexto de seguridad sus cargas de trabajo no permiten que el contenedor se ejecute con privilegios de administrador. Si esto es necesario, los usuarios pueden aplicar una política simple. rego, así:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Containers must not run as root"
}

  • Opciones de integración con un proveedor de nube. Una de las tendencias más notables en la alta tecnología actual es ejecutar cargas de trabajo en proveedores de nube pública. Usando el componente proveedor de nube Kubernetes permite que cualquier clúster se integre con el proveedor de nube en el que se ejecuta. Por ejemplo, si un usuario ejecuta una aplicación en Kubernetes en AWS y desea exponer esa aplicación a través de un servicio, el proveedor de la nube ayuda a crear el servicio automáticamente. LoadBalancerque proporcionará automáticamente el balanceador de carga Balanceador de carga elástico de Amazonpara redirigir el tráfico a los pods de aplicaciones.

Extensibilidad

Kubernetes es muy extensible y a los desarrolladores les encanta. Hay un conjunto de recursos disponibles, como pods, implementaciones, StatefulSets, secretos, ConfigMaps, etc. Es cierto que los usuarios y desarrolladores pueden agregar otros recursos en el formulario. definiciones de recursos personalizados.

Por ejemplo, si queremos definir un recurso CronTab, entonces podrías hacer algo como esto:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: crontabs.my.org
spec:
  group: my.org
  versions:
    - name: v1
      served: true
      storage: true
      Schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                  pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
  scope: Namespaced
  names:
    plural: crontabs
    singular: crontab
    kind: CronTab
    shortNames:
    - ct

Posteriormente podemos crear un recurso CronTab similar a este:

apiVersion: "my.org/v1"
kind: CronTab
metadata:
  name: my-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-cron-image
  replicas: 5

Otra opción de extensibilidad en Kubernetes es que el desarrollador puede escribir sus propias declaraciones. Operador es un proceso especial en el clúster de Kubernetes que funciona de acuerdo con el "circuito de control" Con la ayuda de un operador, el usuario puede automatizar la gestión de CRD (definiciones de recursos personalizados) intercambiando información con la API de Kubernetes.

Hay varias herramientas en la comunidad que facilitan a los desarrolladores la creación de sus propios operadores. Entre ellos - Marco del operador y SDK del operador. Este SDK proporciona una base a partir de la cual un desarrollador puede comenzar rápidamente a crear un operador. Digamos que puedes comenzar desde la línea de comando con algo como esto:

$ operator-sdk new my-operator --repo github.com/myuser/my-operator

Esto crea todo el código repetitivo para su operador, incluidos los archivos YAML y el código Golang:

.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go

Luego puede agregar las API y el controlador necesarios, así:

$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService

$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService

Luego, finalmente, ensambla el operador y envíalo al registro de tu contenedor:

$ operator-sdk build your.container.registry/youruser/myapp-operator

Si el desarrollador desea tener aún más control, se puede cambiar el código repetitivo de los archivos Go. Por ejemplo, para modificar los detalles del controlador, puede realizar cambios en el archivo controller.go.

Otro proyecto KUDO, le permite crear declaraciones utilizando solo archivos YAML declarativos. Por ejemplo, un operador para Apache Kafka se definiría aproximadamente tan. Con él, puedes instalar un clúster Kafka sobre Kubernetes con solo un par de comandos:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Y luego configúrelo con otro comando:

$ kubectl kudo install kafka --instance=my-kafka-name 
            -p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 
            -p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m 
            -p BROKER_COUNT=5 -p BROKER_MEM=4096m 
            -p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 
            -p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20

Innovación

En los últimos años, se han publicado lanzamientos importantes de Kubernetes cada pocos meses, es decir, de tres a cuatro lanzamientos importantes por año. El número de novedades introducidas en cada uno de ellos no disminuye. Además, ni siquiera en estos tiempos difíciles hay signos de desaceleración: mire cuál es la situación ahora. Actividad del proyecto Kubernetes en Github.

Las nuevas capacidades le permiten agrupar operaciones de manera más flexible en diversas cargas de trabajo. Además, los programadores disfrutan de un mayor control al implementar aplicaciones directamente en producción.

Comunidad

Otro aspecto importante de la popularidad de Kubernetes es la fortaleza de su comunidad. En 2015, al llegar a la versión 1.0, Kubernetes fue patrocinado por Fundación de computación nativa de la nube.

También hay varias comunidades SIG (Grupos de Interés Especial) enfocados en trabajar en diferentes áreas de Kubernetes a medida que evoluciona el proyecto. Estos grupos agregan constantemente nuevas funciones, lo que hace que trabajar con Kubernetes sea más conveniente y conveniente.

La Cloud Native Foundation también organiza CloudNativeCon/KubeCon, que, en el momento de escribir este artículo, es la conferencia de código abierto más grande del mundo. Normalmente se celebra tres veces al año y reúne a miles de profesionales que quieren mejorar Kubernetes y su ecosistema, así como aprender nuevas funciones que aparecen cada tres meses.

Además, Cloud Native Foundation ha Comité de Supervisión Técnica, que, junto con los SIG, revisa las nuevas y existentes Proyectos fondos enfocados en el ecosistema de la nube. La mayoría de estos proyectos ayudan a mejorar las fortalezas de Kubernetes.

Finalmente, creo que Kubernetes no tendría tanto éxito sin los esfuerzos conscientes de toda la comunidad, donde las personas se mantienen unidas pero al mismo tiempo dan la bienvenida a los recién llegados.

El futuro

Uno de los principales desafíos a los que los desarrolladores tendrán que enfrentarse en el futuro es la capacidad de centrarse en los detalles del código en sí y no en la infraestructura en la que se ejecuta. Cumple con estas tendencias. paradigma arquitectónico sin servidor, que es uno de los líderes en la actualidad. Ya existen marcos avanzados, p. Knativo и AbiertoFaas, que utilizan Kubernetes para abstraer la infraestructura del desarrollador.

En este artículo, solo hemos arañado la superficie del estado actual de Kubernetes; de hecho, es solo la punta del iceberg. Los usuarios de Kubernetes tienen muchos otros recursos, capacidades y configuraciones a su disposición.

Fuente: habr.com

Añadir un comentario