Sulla crescente popolarità di Kubernetes

Ehi Habr!

A fine estate, vogliamo ricordarvi che continuiamo a lavorare sull'argomento kubernetes e abbiamo deciso di pubblicare un articolo di Stackoverflow che dimostrasse lo stato delle cose in questo progetto all'inizio di giugno.

Sulla crescente popolarità di Kubernetes

Buona lettura!

Al momento della stesura di questo articolo, l'età di Kubernetes è di ca. sei anni, e negli ultimi due anni la sua popolarità è cresciuta così tanto che è costantemente classificato tra questi più preferito piattaforme. Kubernetes quest'anno è al terzo posto. Ricapitolando: Kubernetes è una piattaforma progettata per eseguire e orchestrare carichi di lavoro containerizzati.

I contenitori sono nati come un progetto speciale per isolare i processi in Linux; i contenitori includono dal 2007 cgroupe dal 2002 – namespace. I contenitori sono stati progettati ancora meglio nel 2008, quando sono diventati disponibili LXCe Google ha sviluppato un proprio meccanismo aziendale interno chiamato Borg, dove “tutto il lavoro viene svolto in contenitori”. Da qui arriviamo rapidamente al 2013, quando ha avuto luogo il primo rilascio di Docker e i container sono finalmente diventati una soluzione di massa popolare. A quel tempo, lo strumento principale per l’orchestrazione dei contenitori era mesos, sebbene non fosse molto popolare. Kubernetes è stato rilasciato per la prima volta nel 2015, dopodiché questo strumento è diventato di fatto lo standard nel campo dell’orchestrazione dei container.

Per cercare di capire perché Kubernetes è così popolare, proviamo a rispondere ad alcune domande. Quando è stata l'ultima volta che gli sviluppatori sono riusciti a mettersi d'accordo su come distribuire le applicazioni in produzione? Quanti sviluppatori conosci che utilizzano gli strumenti così come vengono forniti immediatamente? Quanti amministratori cloud ci sono oggi che non capiscono come funzionano le applicazioni? Vedremo le risposte a queste domande in questo articolo.

Infrastruttura come YAML

Nel mondo che è passato da Puppet e Chef a Kubernetes, uno dei cambiamenti più grandi è stato il passaggio da "infrastruttura come codice" a "infrastruttura come dati", in particolare, come YAML. Tutte le risorse in Kubernetes, che includono pod, configurazioni, istanze distribuite, volumi, ecc., possono essere facilmente descritte in un file YAML. Per esempio:

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

Questa visione rende più semplice per i professionisti DevOps o SRE esprimere appieno i propri carichi di lavoro senza dover scrivere codice in linguaggi come Python o Javascript.

Altri vantaggi dell'organizzazione dell'infrastruttura come dati includono:

  • Controllo della versione di GitOps o Git Operations. Questo approccio ti consente di conservare tutti i file YAML Kubernetes nei repository git, in modo da poter tenere traccia esattamente quando è stata apportata una modifica, chi l'ha apportata e cosa è cambiato esattamente. Ciò aumenta la trasparenza delle operazioni in tutta l'organizzazione e migliora l'efficienza operativa eliminando le ambiguità, in particolare dove i dipendenti dovrebbero cercare le risorse di cui hanno bisogno. Allo stesso tempo, diventa più semplice apportare automaticamente modifiche alle risorse Kubernetes semplicemente unendo una richiesta pull.
  • Scalabilità. Quando le risorse sono definite come YAML, diventa estremamente facile per gli operatori del cluster modificare uno o due numeri in una risorsa Kubernetes, modificandone così la scalabilità. Kubernetes fornisce un meccanismo per la scalabilità automatica orizzontale dei pod, che può essere utilizzato per determinare in modo pratico il numero minimo e massimo di pod richiesti in una particolare configurazione di distribuzione per gestire livelli di traffico bassi e alti. Ad esempio, se hai distribuito una configurazione che richiede capacità aggiuntiva a causa di un improvviso picco di traffico, maxReplicas può essere modificato da 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

  • Sicurezza e gestione. YAML è ottimo per valutare come vengono distribuiti gli elementi in Kubernetes. Ad esempio, una delle principali preoccupazioni per la sicurezza riguarda se i carichi di lavoro vengono eseguiti come utente non amministratore. In questo caso, potremmo aver bisogno di strumenti come conftest, validatore YAML/JSON, oltre a Agente di politica aperto, un validatore di policy per garantire che il contesto Contesto di sicurezza i tuoi carichi di lavoro non consentono l'esecuzione del contenitore con privilegi di amministratore. Se ciò è necessario, gli utenti possono applicare una policy semplice Regoin questo modo:

package main

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

  • Opzioni per l'integrazione con un fornitore di servizi cloud. Una delle tendenze più importanti nell'alta tecnologia di oggi è quella di eseguire carichi di lavoro su provider di cloud pubblici. Utilizzo del componente fornitore di servizi cloud Kubernetes consente a qualsiasi cluster di integrarsi con il provider cloud su cui viene eseguito. Ad esempio, se un utente esegue un'applicazione in Kubernetes su AWS e desidera esporre tale applicazione tramite un servizio, il fornitore di servizi cloud aiuta a creare automaticamente il servizio LoadBalancerche fornirà automaticamente il bilanciatore del carico Amazon Elastic Load Balancerper reindirizzare il traffico ai pod dell'applicazione.

Espandibilità

Kubernetes è molto estensibile e gli sviluppatori lo adorano. Esiste una serie di risorse disponibili come pod, distribuzioni, StatefulSets, segreti, ConfigMaps, eccetera. È vero, utenti e sviluppatori possono aggiungere altre risorse nel modulo definizioni di risorse personalizzate.

Ad esempio, se vogliamo definire una risorsa CronTab, allora potresti fare qualcosa del genere:

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

Successivamente possiamo creare una risorsa CronTab simile a questa:

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

Un'altra opzione per l'estensibilità in Kubernetes è che lo sviluppatore può scrivere le proprie istruzioni. operatore è un processo speciale nel cluster Kubernetes che funziona secondo il "circuito di controllo" Con l'aiuto di un operatore, l'utente può automatizzare la gestione delle CRD (custom Resource Definitions) scambiando informazioni con le API Kubernetes.

Esistono diversi strumenti nella community che consentono agli sviluppatori di creare facilmente i propri operatori. Tra loro - Struttura dell'operatore e SDK dell'operatore. Questo SDK fornisce una base da cui uno sviluppatore può iniziare rapidamente a creare un operatore. Diciamo che puoi iniziare dalla riga di comando qualcosa del genere:

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

Questo crea tutto il codice boilerplate per il tuo operatore, inclusi i file YAML e il codice 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

Quindi puoi aggiungere le API e il controller richiesti, in questo modo:

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

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

Quindi, infine, assembla l'operatore e invialo al registro del tuo contenitore:

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

Se lo sviluppatore desidera un controllo ancora maggiore, è possibile modificare il codice boilerplate nei file Go. Ad esempio, per modificare le specifiche del controller, è possibile apportare modifiche al file controller.go.

Un altro progetto KUDO, consente di creare istruzioni utilizzando solo file YAML dichiarativi. Ad esempio, un operatore per Apache Kafka verrebbe definito approssimativamente così. Con esso, puoi installare un cluster Kafka su Kubernetes con solo un paio di comandi:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

E poi configuralo con un altro 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

innovazioni

Negli ultimi anni, le principali versioni di Kubernetes sono uscite ogni pochi mesi, ovvero da tre a quattro versioni principali all'anno. Il numero di nuove funzionalità introdotte in ciascuna di esse non diminuisce. Inoltre, non ci sono segni di rallentamento nemmeno in questi tempi difficili: guarda com'è la situazione adesso Attività del progetto Kubernetes su Github.

Le nuove funzionalità ti consentono di raggruppare le operazioni in modo più flessibile su diversi carichi di lavoro. Inoltre, i programmatori godono di un maggiore controllo durante la distribuzione delle applicazioni direttamente in produzione.

Comunità

Un altro aspetto importante della popolarità di Kubernetes è la forza della sua comunità. Nel 2015, al raggiungimento della versione 1.0, Kubernetes è stato sponsorizzato da Fondamenta del cloud nativo per il computing.

Ci sono anche varie comunità SIG (Gruppi di interesse speciale) si sono concentrati sul lavoro su diverse aree di Kubernetes man mano che il progetto evolve. Questi gruppi aggiungono costantemente nuove funzionalità, rendendo il lavoro con Kubernetes più comodo e conveniente.

La Cloud Native Foundation ospita anche CloudNativeCon/KubeCon, che, al momento in cui scriviamo, è la più grande conferenza open source al mondo. Di solito si tiene tre volte l'anno e riunisce migliaia di professionisti che desiderano migliorare Kubernetes e il suo ecosistema, oltre ad apprendere nuove funzionalità che appaiono ogni tre mesi.

Inoltre, Cloud Native Foundation ha Comitato di vigilanza tecnica, che, insieme ai SIG, esamina quelli nuovi ed esistenti Progetti fondi focalizzati sull’ecosistema cloud. La maggior parte di questi progetti contribuiscono a migliorare i punti di forza di Kubernetes.

Infine, credo che Kubernetes non avrebbe lo stesso successo senza gli sforzi consapevoli dell’intera comunità, dove le persone restano unite ma allo stesso tempo accolgono i nuovi arrivati ​​nell’ovile.

Il futuro

Una delle principali sfide che gli sviluppatori dovranno affrontare in futuro è la capacità di concentrarsi sui dettagli del codice stesso e non sull’infrastruttura in cui viene eseguito. Soddisfa queste tendenze paradigma architettonico serverless, che è uno dei principali oggi. Esistono già framework avanzati, ad es. Knative и OpenFaas, che utilizzano Kubernetes per astrarre l'infrastruttura dallo sviluppatore.

In questo articolo abbiamo solo scalfito la superficie dello stato attuale di Kubernetes: in realtà, è solo la punta dell'iceberg. Gli utenti Kubernetes hanno a disposizione molte altre risorse, funzionalità e configurazioni.

Fonte: habr.com

Aggiungi un commento