Über die wachsende Popularität von Kubernetes

Hey Habr!

Zum Ende des Sommers möchten wir Sie daran erinnern, dass wir weiterhin an dem Thema arbeiten Kubernetes und beschlossen, Anfang Juni einen Artikel von Stackoverflow zu veröffentlichen, der den Stand der Dinge in diesem Projekt demonstriert.

Über die wachsende Popularität von Kubernetes

Viel Spaß beim Lesen!

Zum Zeitpunkt des Verfassens dieses Artikels beträgt das Alter von Kubernetes ca. sechs Jahre alt, und in den letzten zwei Jahren ist seine Beliebtheit so stark gewachsen, dass es immer wieder auf der Liste steht am liebsten Plattformen. Kubernetes belegt dieses Jahr den dritten Platz. Um es noch einmal zusammenzufassen: Kubernetes ist eine Plattform, die für die Ausführung und Orchestrierung von Container-Workloads konzipiert ist.

Container waren ursprünglich ein spezielles Design zur Isolierung von Prozessen unter Linux. Container sind seit 2007 enthalten Gruppen, und seit 2002 – Namensräume. Als sie 2008 auf den Markt kamen, wurden die Container sogar noch besser gestaltet LXC, und Google entwickelte einen eigenen internen Unternehmensmechanismus namens Kaution, wo „die gesamte Arbeit in Containern erledigt wird“. Von hier aus spulen wir vor ins Jahr 2013, als die erste Veröffentlichung von Docker stattfand und Container schließlich zu einer beliebten Massenlösung wurden. Zu dieser Zeit war das Hauptwerkzeug für die Container-Orchestrierung Mesos, obwohl er nicht besonders beliebt war. Kubernetes wurde erstmals im Jahr 2015 veröffentlicht, danach wurde dieses Tool zum De-facto-Standard im Bereich der Container-Orchestrierung.

Um zu verstehen, warum Kubernetes so beliebt ist, versuchen wir, ein paar Fragen zu beantworten. Wann konnten sich Entwickler das letzte Mal darauf einigen, wie Anwendungen in der Produktion bereitgestellt werden? Wie viele Entwickler kennen Sie, die die Tools so verwenden, wie sie standardmäßig bereitgestellt werden? Wie viele Cloud-Administratoren verstehen heute nicht, wie Anwendungen funktionieren? Die Antworten auf diese Fragen werden wir uns in diesem Artikel ansehen.

Infrastruktur als YAML

In der Welt, die sich von Puppet und Chef zu Kubernetes entwickelt hat, war eine der größten Veränderungen der Übergang von „Infrastruktur als Code“ zu „Infrastruktur als Daten“ – insbesondere wie YAML. Alle Ressourcen in Kubernetes, darunter Pods, Konfigurationen, bereitgestellte Instanzen, Volumes usw., können einfach in einer YAML-Datei beschrieben werden. Zum Beispiel:

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

Diese Ansicht erleichtert es DevOps- oder SRE-Experten, ihre Arbeitslasten vollständig auszudrücken, ohne Code in Sprachen wie Python oder Javascript schreiben zu müssen.

Weitere Vorteile der Organisation der Infrastruktur als Daten sind:

  • GitOps- oder Git Operations-Versionskontrolle. Mit diesem Ansatz können Sie alle Kubernetes-YAML-Dateien in Git-Repositorys aufbewahren, sodass Sie genau nachverfolgen können, wann eine Änderung vorgenommen wurde, wer sie vorgenommen hat und was sich genau geändert hat. Dies erhöht die Transparenz der Abläufe im gesamten Unternehmen und verbessert die betriebliche Effizienz, indem Unklarheiten beseitigt werden, insbesondere darüber, wo Mitarbeiter nach den Ressourcen suchen sollen, die sie benötigen. Gleichzeitig wird es einfacher, automatisch Änderungen an Kubernetes-Ressourcen vorzunehmen, indem einfach eine Pull-Anfrage zusammengeführt wird.
  • Skalierbarkeit. Wenn Ressourcen als YAML definiert sind, ist es für Clusterbetreiber äußerst einfach, eine oder zwei Zahlen in einer Kubernetes-Ressource zu ändern und dadurch deren Skalierung zu ändern. Kubernetes bietet einen Mechanismus zur horizontalen automatischen Skalierung von Pods, mit dem bequem ermittelt werden kann, wie viele Pods in einer bestimmten Bereitstellungskonfiguration mindestens und maximal erforderlich sind, um niedrige und hohe Datenverkehrsmengen zu bewältigen. Wenn Sie beispielsweise eine Konfiguration bereitgestellt haben, die aufgrund eines plötzlichen Datenverkehrsanstiegs zusätzliche Kapazität erfordert, kann maxReplicas von 10 auf 20 geändert werden:

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

  • Sicherheit und Verwaltung. YAML eignet sich hervorragend zur Bewertung der Bereitstellung von Dingen in Kubernetes. Ein großes Sicherheitsrisiko besteht beispielsweise darin, ob Ihre Workloads als Benutzer ohne Administratorrechte ausgeführt werden. In diesem Fall benötigen wir möglicherweise Tools wie conftest, YAML/JSON-Validator, plus Richtlinien-Agent öffnen, ein Richtlinienvalidator, um den Kontext sicherzustellen Sicherheitskontext Aufgrund Ihrer Workloads kann der Container nicht mit Administratorrechten ausgeführt werden. Wenn dies erforderlich ist, können Benutzer eine einfache Richtlinie anwenden Rego, so:

package main

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

  • Optionen zur Integration mit einem Cloud-Anbieter. Einer der bemerkenswertesten Trends in der heutigen Hochtechnologie ist die Ausführung von Workloads über öffentliche Cloud-Anbieter. Verwendung der Komponente Cloud-Anbieter Kubernetes ermöglicht die Integration jedes Clusters in den Cloud-Anbieter, auf dem er ausgeführt wird. Wenn ein Benutzer beispielsweise eine Anwendung in Kubernetes auf AWS ausführt und diese Anwendung über einen Dienst verfügbar machen möchte, hilft der Cloud-Anbieter automatisch bei der Erstellung des Dienstes LoadBalancerDadurch wird automatisch der Load Balancer bereitgestellt Amazon Elastic Load Balancerum den Datenverkehr an Anwendungs-Pods umzuleiten.

Erweiterbarkeit

Kubernetes ist sehr erweiterbar und Entwickler lieben es. Es gibt eine Reihe verfügbarer Ressourcen wie Pods, Bereitstellungen usw. StatefulSets, Geheimnisse, ConfigMaps, usw. Zwar können Benutzer und Entwickler dem Formular weitere Ressourcen hinzufügen benutzerdefinierte Ressourcendefinitionen.

Zum Beispiel, wenn wir eine Ressource definieren möchten CronTab, dann könnten Sie so etwas tun:

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

Später können wir eine CronTab-Ressource erstellen, etwa so:

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

Eine weitere Möglichkeit zur Erweiterbarkeit in Kubernetes besteht darin, dass der Entwickler eigene Anweisungen schreiben kann. Operator ist ein spezieller Prozess im Kubernetes-Cluster, der nach dem „Steuerkreis" Mithilfe eines Operators kann der Benutzer die Verwaltung von CRDs (benutzerdefinierten Ressourcendefinitionen) automatisieren, indem er Informationen mit der Kubernetes-API austauscht.

In der Community gibt es mehrere Tools, die es Entwicklern erleichtern, eigene Operatoren zu erstellen. Unter ihnen - Operator-Framework und Betreiber-SDK. Dieses SDK bietet eine Grundlage, auf der ein Entwickler schnell mit der Erstellung eines Operators beginnen kann. Nehmen wir an, Sie können von der Befehlszeile aus etwa so beginnen:

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

Dadurch wird der gesamte Standardcode für Ihren Operator erstellt, einschließlich YAML-Dateien und Golang-Code:

.
|____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

Anschließend können Sie die erforderlichen APIs und Controller wie folgt hinzufügen:

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

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

Stellen Sie dann abschließend den Operator zusammen und senden Sie ihn an die Registrierung Ihres Containers:

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

Wenn der Entwickler noch mehr Kontrolle wünscht, kann der Boilerplate-Code in Go-Dateien geändert werden. Um beispielsweise die Besonderheiten des Controllers zu ändern, können Sie Änderungen an der Datei vornehmen controller.go.

Ein weiteres Projekt KUDOermöglicht Ihnen die Erstellung von Anweisungen ausschließlich mit deklarativen YAML-Dateien. Beispielsweise würde ein Operator für Apache Kafka ungefähr definiert werden so. Damit können Sie mit nur wenigen Befehlen einen Kafka-Cluster auf Kubernetes installieren:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Und konfigurieren Sie es dann mit einem anderen Befehl:

$ 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

Innovationen

In den letzten Jahren erschienen alle paar Monate große Kubernetes-Releases, also drei bis vier Major-Releases pro Jahr. Die Anzahl der in jedem von ihnen eingeführten neuen Funktionen nimmt nicht ab. Darüber hinaus gibt es auch in diesen schwierigen Zeiten keine Anzeichen einer Verlangsamung – schauen Sie sich die aktuelle Situation an Kubernetes-Projektaktivität auf Github.

Neue Funktionen ermöglichen Ihnen eine flexiblere Clusterung von Vorgängen über verschiedene Arbeitslasten hinweg. Darüber hinaus genießen Programmierer eine größere Kontrolle, wenn sie Anwendungen direkt in der Produktion bereitstellen.

Gemeinde

Ein weiterer wichtiger Aspekt der Popularität von Kubernetes ist die Stärke seiner Community. Im Jahr 2015, als Kubernetes Version 1.0 erreichte, wurde es von gesponsert Cloud Native Computing Foundation.

Es gibt auch verschiedene Gemeinschaften SIG (Special Interest Groups) konzentrierten sich im Verlauf des Projekts auf die Arbeit an verschiedenen Bereichen von Kubernetes. Diese Gruppen fügen ständig neue Funktionen hinzu, wodurch die Arbeit mit Kubernetes komfortabler und komfortabler wird.

Die Cloud Native Foundation veranstaltet außerdem die CloudNativeCon/KubeCon, die zum Zeitpunkt des Verfassens dieses Artikels die größte Open-Source-Konferenz der Welt ist. Sie findet in der Regel dreimal im Jahr statt und bringt Tausende von Fachleuten zusammen, die Kubernetes und sein Ökosystem verbessern und alle drei Monate neue Funktionen kennenlernen möchten.

Darüber hinaus hat die Cloud Native Foundation Technischer Überwachungsausschuss, das zusammen mit SIGs neue und bestehende überprüft Projekte Fonds, die sich auf das Cloud-Ökosystem konzentrieren. Die meisten dieser Projekte tragen dazu bei, die Stärken von Kubernetes zu verbessern.

Abschließend glaube ich, dass Kubernetes ohne die bewussten Bemühungen der gesamten Community, in der Menschen zusammenhalten, aber gleichzeitig Neulinge willkommen heißen, nicht so erfolgreich wäre wie jetzt.

Die Zukunft

Eine der größten Herausforderungen, mit denen sich Entwickler in Zukunft auseinandersetzen müssen, ist die Fähigkeit, sich auf die Details des Codes selbst zu konzentrieren und nicht auf die Infrastruktur, in der er ausgeführt wird. Es entspricht diesen Trends serverloses Architekturparadigma, das heute eines der führenden ist. Es gibt bereits fortgeschrittene Frameworks, z.B. Knative и OpenFaas, die Kubernetes verwenden, um die Infrastruktur vom Entwickler zu abstrahieren.

In diesem Artikel haben wir nur an der Oberfläche des aktuellen Stands von Kubernetes gekratzt – tatsächlich ist es nur die Spitze des Eisbergs. Kubernetes-Benutzern stehen viele weitere Ressourcen, Fähigkeiten und Konfigurationen zur Verfügung.

Source: habr.com

Kommentar hinzufügen