Sulla crescente popolarità di Kubernetes

Ciao, Habr!

Alla fine dell'estate vogliamo ricordare che stiamo continuando a lavorare sul tema Kubernetes e abbiamo deciso di pubblicare un articolo di Stackoverflow che mostra lo stato attuale di questo progetto all'inizio di giugno.

Sulla crescente popolarità di Kubernetes

Buona lettura!

Al momento della scrittura di questo articolo, Kubernetes ha circa sei anni, e negli ultimi due anni la sua popolarità è aumentata così tanto che è costantemente tra le piattaforme più amate. Quest'anno, Kubernetes occupa il terzo posto. Ricordiamo: Kubernetes è una piattaforma progettata per l'esecuzione e l'orchestrazione di carichi di lavoro in container.

I container sono nati come una costruzione speciale per isolare i processi in Linux; dal 2007 i container includono cgroups, e dal 2002 i namespace. I container si sono evoluti ulteriormente nel 2008, quando è stata resa disponibile LXC, mentre in Google hanno sviluppato il loro meccanismo interno chiamato Borg, dove "tutto il lavoro avviene nei container." Ci spostiamo quindi nel 2013, quando è stata rilasciata la prima versione di Docker, e i container sono definitivamente entrati nel novero delle soluzioni popolari di massa. All'epoca, lo strumento principale per l'orchestrazione dei container era Mesos, anche se non godeva di una popolarità sfrenata. La prima versione di Kubernetes è stata rilasciata nel 2015, dopo di che questo strumento è diventato de facto lo standard nel campo dell'orchestrazione dei container.

Per cercare di capire perché Kubernetes sia così popolare, cerchiamo di rispondere a qualche domanda. Quando è stata l'ultima volta che gli sviluppatori sono riusciti a trovare un accordo su come distribuire le applicazioni in produzione? Quanti sviluppatori conoscete che utilizzano gli strumenti così come vengono forniti "out of the box"? Quanti oggi sono gli amministratori di cloud che non capiscono come funzionano le applicazioni? Le risposte a queste domande verranno esaminate in questo articolo.

Infrastruttura come YAML

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

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

Con questa impostazione, per i professionisti di DevOps o SRE è più facile esprimere completamente i propri carichi di lavoro, senza dover scrivere codice in lingue come Python o Javascript.

Altri vantaggi dell'organizzazione dell'infrastruttura dei dati, in particolare, sono:

  • GitOps, o controllo delle versioni delle operazioni Git. Questo approccio consente di mantenere tutti i file YAML di Kubernetes nei repository git, permettendo di tracciare esattamente quando è stata effettuata una modifica, chi l'ha effettuata e cosa è esattamente cambiato. Ciò aumenta la trasparenza delle operazioni all'interno dell'intera organizzazione e migliora l'efficienza del lavoro eliminando ambiguità, in particolare riguardo a dove i dipendenti devono cercare le risorse di cui hanno bisogno. Allo stesso tempo, diventa più semplice apportare automaticamente modifiche alle risorse Kubernetes, tramite una normale fusione di pull request.
  • Scalabilità. Quando le risorse sono definite come YAML, agli operatori del cluster diventa estremamente semplice modificare uno o due numeri nella risorsa Kubernetes, cambiando così i principi della sua scalabilità. Kubernetes prevede un meccanismo per l'autoscalamento orizzontale dei pod, che consente di definire facilmente qual è il numero minimo e massimo di pod richiesti in una particolare configurazione distribuita per gestire livelli di traffico bassi o alti. Ad esempio, se hai distribuito una configurazione che richiede ulteriori risorse a causa di un improvviso aumento del traffico, puoi modificare il valore di maxReplicas 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 è particolarmente adatto per valutare come certe cose vengono distribuite in Kubernetes. Ad esempio, una seria preoccupazione riguardante la sicurezza è se i tuoi carichi di lavoro vengano eseguiti da un utente che non ha diritti di amministratore. In questo caso, strumenti come possono tornare utili conftest, un validatore YAML/JSON, più Open Policy Agent, un validatore di politiche, che garantisce che il contesto SecurityContext Il carico di lavoro non consente al contenitore di funzionare con privilegi da amministratore. Se questo deve essere garantito, gli utenti possono applicare una semplice policy rego, in questo modo:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "I contenitori non devono essere eseguiti come root"
}

  • Opzioni di integrazione con il fornitore di cloud. Una delle tendenze più evidenti nelle moderne tecnologie è l'esecuzione dei carichi di lavoro sulle risorse dei fornitori di cloud pubblici. Con il componente cloud-provider Kubernetes consente a qualsiasi cluster di integrarsi con il fornitore di cloud su cui è in esecuzione. Ad esempio, se un utente ha avviato un'applicazione in Kubernetes su AWS e desidera aprire l'accesso a quest'applicazione attraverso un servizio, il fornitore di cloud aiuta a creare automaticamente un servizio LoadBalancer, che fornirà automaticamente un bilanciatore di carico Amazon Elastic Load Balancer, per reindirizzare il traffico ai pod delle applicazioni.

Scalabilità

Kubernetes è molto scalabile, e questo piace agli sviluppatori. Esiste un insieme di risorse disponibili, come pod, deployment, StatefulSets, segreti, ConfigMaps, ecc. Infatti, gli utenti e gli sviluppatori possono aggiungere altre risorse sotto forma di definizioni di risorse personalizzate.

Ad esempio, se vogliamo definire una risorsa CronTab, potremmo fare qualcosa di simile:

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

In seguito possiamo creare una risorsa CronTab in questo modo:

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

Un'altra opzione di scalabilità in Kubernetes è che lo sviluppatore può scrivere i propri operatori. Operatore è un processo speciale nel cluster Kubernetes, che segue il modello del "controllo di gestione". Con l'operatore, l'utente può automatizzare la gestione delle CRD (definizioni delle risorse personalizzate), scambiando informazioni con l'API di Kubernetes.

Nella community ci sono diversi strumenti attraverso i quali gli sviluppatori possono facilmente creare i propri operatori. Tra questi c'è Operator Framework e i suoi Operator SDK. Questo SDK fornisce una base da cui lo sviluppatore può iniziare a creare un operatore molto rapidamente. Ad esempio, si può iniziare dalla riga di comando in questo modo:

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

In questo modo si crea tutto il codice di base per il tuo operatore, inclusi i file YAML e il codice in 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

Poi si possono aggiungere le API e il controller necessari, 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

Dopo di che, infine, si compila l'operatore e lo si invia al registro del tuo container:

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

Se lo sviluppatore ha bisogno di un controllo ancora più completo, può modificare il codice di base nei file Go. Ad esempio, per modificare le specifiche del controller, si possono apportare modifiche al file controller.go.

Un altro progetto, KUDO, consente di creare operatori utilizzando solo file YAML dichiarativi. Ad esempio, un operatore per Apache Kafka può essere definito in questo modo così. Con esso si può installare un cluster Kafka sopra Kubernetes con poche righe di comando:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

E poi configurarlo 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, grandi versioni di Kubernetes sono state rilasciate ogni pochi mesi, ovvero tre o quattro grandi versioni all'anno. Il numero di nuove funzionalità introdotte in ognuna di esse non diminuisce. Inoltre, non ci sono segni di rallentamento nemmeno nei nostri tempi difficili: guardate com'è adesso l'attività del progetto Kubernetes su Github.

Nuove opportunità consentono di clusterizzare le operazioni in modo più flessibile in presenza di carichi di lavoro diversi. Inoltre, agli sviluppatori piace avere un controllo più completo nel distribuire le applicazioni direttamente in produzione.

La comunità

Un altro aspetto serio della popolarità di Kubernetes risiede nella forza della sua comunità. Nel 2015, al raggiungimento della versione 1.0, Kubernetes è stato sponsorizzato Cloud Native Computing Foundation.

Esistono anche diverse comunità SIG (special interest groups), mirate a esplorare diverse aree di Kubernetes man mano che questo progetto si sviluppa. Questi gruppi aggiungono costantemente nuove funzionalità, rendendo l'utilizzo di Kubernetes sempre più comodo.

La Cloud Native Foundation organizza anche CloudNativeCon/KubeCon, che, al momento della scrittura di questo testo, è la più grande conferenza open source al mondo. Di solito, si tiene tre volte all'anno e riunisce migliaia di professionisti desiderosi di migliorare Kubernetes e il suo ecosistema, così come di apprendere nuove funzionalità che emergono ogni tre mesi.

Inoltre, nella Cloud Native Foundation c'è un Comitato per la supervisione tecnica, che, insieme agli SIG, analizza nuovi e attuali progetti della fondazione focalizzati sull'ecosistema cloud. La maggior parte di questi progetti contribuisce a migliorare i punti di forza di Kubernetes.

Infine, credo che Kubernetes non avrebbe avuto tale successo senza il costante impegno dell'intera comunità, dove le persone si sostengono a vicenda, ma, allo stesso tempo, accolgono volentieri i nuovi arrivati.

Futuro

Una delle principali sfide che gli sviluppatori dovranno affrontare in futuro è la capacità di concentrarsi sui dettagli del codice stesso, piuttosto che sull'infrastruttura in cui opera. È a queste tendenze che risponde il paradigma architetturale serverless, che oggi è uno dei più avanzati. Esistono già framework avanzati, come Knative e OpenFaas, che utilizzano Kubernetes per astrarre l'infrastruttura dallo sviluppatore.

In questo articolo abbiamo solo brevemente esaminato lo stato attuale di Kubernetes: in realtà, è solo la punta dell'iceberg. Gli utenti di Kubernetes hanno a disposizione anche molte altre risorse, opportunità e configurazioni.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster