Zur wachsenden Popularität von Kubernetes

Hallo, Habr!

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

Zur wachsenden Popularität von Kubernetes

Viel Spaß beim Lesen!

Zum Zeitpunkt der Erstellung dieses Artikels ist Kubernetes etwa sechs Jahre alt, und in den letzten zwei Jahren ist seine Popularität so gestiegen, dass es stabil zu den beliebtesten Plattformen gehört. In diesem Jahr belegt Kubernetes den dritten Platz. Zur Erinnerung: Kubernetes ist eine Plattform, die für das Ausführen und die Orchestrierung containerisierter Arbeitslasten entwickelt wurde.

Container entstanden als spezielle Struktur zur Isolierung von Prozessen in Linux; seit 2007 gehören zu den Containern cgroups, und seit 2002 - Namespaces. Die Container haben sich bis 2008 weiter verbessert, als verfügbar wurde LXC, und Google entwickelte ein internes System namens . Unten erläutern wir den Vergleich der beiden Anwendungen, aber zunächst möchten wir erklären, wie wir das gesamte Schema organisert haben., wo „alle Arbeiten in Containern erfolgen“. Lassen Sie uns ins Jahr 2013 zurückkehren, als die erste Docker-Version veröffentlicht wurde und Container endgültig zu beliebten Massenlösungen wurden. Zu diesem Zeitpunkt war das Hauptwerkzeug zur Orchestrierung von Containern Mesos, jedoch erfreute es sich nicht der großen Beliebtheit. Die erste Veröffentlichung von Kubernetes fand im Jahr 2015 statt, und seitdem hat sich dieses Werkzeug de facto zum Standard in der Container-Orchestrierung entwickelt.

Um zu verstehen, warum Kubernetes so beliebt ist, lassen Sie uns versuchen, einige Fragen zu beantworten. Wann hatten Entwickler zuletzt die Möglichkeit, sich über die Bereitstellung von Anwendungen in der Produktion einig zu werden? Wie viele Entwickler kennen Sie, die Werkzeuge so verwenden, wie sie 'out of the box' bereitgestellt werden? Wie viele Cloud-Administratoren von heute verstehen nicht, wie Anwendungen funktionieren? Die Antworten auf diese Fragen werden wir in diesem Artikel betrachten.

Infrastruktur als YAML

In einer Welt, die von Puppet und Chef zu Kubernetes übergegangen ist, bestand eine der größten Veränderungen im Wechsel von 'Infrastruktur als Code' zu 'Infrastruktur als Daten' — konkret, als YAML. Alle Ressourcen in Kubernetes, zu denen Pods, Konfigurationen, bereitgestellte Instanzen, Volumes usw. gehören, können leicht 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

Mit dieser Darstellung können DevOps- oder SRE-Spezialisten ihre Workloads vollständig ausdrücken, ohne Code in Sprachen wie Python oder JavaScript schreiben zu müssen.

Weitere Vorteile der Dateninfrastrukturorganisation sind insbesondere:

  • GitOps oder Versionierung von Git-Operationen. Dieser Ansatz ermöglicht es, alle YAML-Dateien von Kubernetes in Git-Repositories zu halten, wodurch Sie genau nachvollziehen können, wann eine Änderung vorgenommen wurde, wer sie vorgenommen hat und was genau geändert wurde. Dadurch erhöht sich die Transparenz der Operationen in der gesamten Organisation, und die Effizienz wird gesteigert, da Unklarheiten beseitigt werden, insbesondere darüber, wo Mitarbeiter die benötigten Ressourcen suchen sollen. Gleichzeitig wird es einfacher, Änderungen an Kubernetes-Ressourcen automatisch vorzunehmen – durch einfaches Zusammenführen von Pull-Requests.
  • Skalierbarkeit. Wenn Ressourcen in YAML definiert sind, wird es für Cluster-Operatoren extrem einfach, eine oder zwei Zahlen in der Kubernetes-Ressource zu ändern, wodurch die Skalierungsprinzipien angepasst werden. Kubernetes bietet Mechanismen für die horizontale Autoskalierung von Pods, mit denen es bequem ist, die Mindest- und Höchstanzahl von Pods zu bestimmen, die in einer bestimmten bereitgestellten Konfiguration erforderlich sind, um mit niedrigem und hohem Verkehrsaufkommen umzugehen. Zum Beispiel, wenn Sie eine Konfiguration bereitgestellt haben, die zusätzliche Kapazitäten aufgrund eines plötzlichen Anstiegs des Verkehrs benötigt, kann der Wert für 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, wie bestimmte Dinge in Kubernetes bereitgestellt werden. Ein ernstes Sicherheitsproblem besteht darin, ob Ihre Arbeitslasten unter einem Benutzer ohne Administratorrechte ausgeführt werden. In diesem Fall können Tools wie conftest, YAML/JSON-Validator, sowie Open Policy Agent, Richtlinien-Validator, der sicherstellt, dass der Kontext SecurityContext Ihrer Arbeitslasten es dem Container nicht ermöglicht, mit Administratorrechten zu arbeiten. Wenn dies erforderlich ist, können Benutzer eine einfache Richtlinie anwenden regohinzu, so:

package main

deny[msg] {
  input.kind = "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot = true
  msg = "Container dürfen nicht als root ausgeführt werden"
}

  • Integrationsmöglichkeiten mit dem Cloud-Anbieter. Eine der auffälligsten Tendenzen in der modernen Technologie besteht darin, Arbeitslasten auf den Ressourcen öffentlicher Cloud-Anbieter auszuführen. Mit Hilfe des Komponenten cloud-provider Kubernetes ermöglicht es jedem Cluster, sich mit dem Cloud-Anbieter zu integrieren, auf dem es ausgeführt wird. Wenn ein Benutzer beispielsweise eine Anwendung in Kubernetes auf AWS gestartet hat und den Zugriff auf diese Anwendung über einen Dienst öffnen möchte, unterstützt der Cloud-Anbieter dabei, automatisch einen Dienst zu erstellen. LoadBalancer, der automatisch einen Lastenausgleichsanbieter bereitstellt. Amazon Elastic Load Balancer, um den Datenverkehr an die Anwendungs-Pods weiterzuleiten.

Erweiterbarkeit

Kubernetes lässt sich sehr gut skalieren, was die Entwickler begeistert. Es gibt eine Reihe verfügbarer Ressourcen, wie Pods, Deployments, StatefulSets, Secrets, ConfigMaps, etc. Tatsächlich können Benutzer und Entwickler auch andere Ressourcen in Form von benutzerdefinierten Ressourcendefinitionen.

definieren. Wenn wir zum Beispiel eine Ressource namens CronTabdefinieren möchten, könnten wir so etwas ähnliches 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 in etwa so erstellen:

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 Entwickler ihre eigenen Operatoren schreiben können. Der Befehl – ist ein spezieller Prozess im Kubernetes-Cluster, der nach dem Muster „Management-Controller“ operiert. Mit einem Operator kann der Benutzer das Management von CRDs (Custom Resource Definitions) automatisieren und Informationen mit der Kubernetes-API austauschen.

In der Community gibt es mehrere Werkzeuge, die es Entwicklern erleichtern, eigene Operatoren zu erstellen. Dazu gehören — Operator Framework und seinem Operator SDK. Dieses SDK bietet eine Grundlage, auf der Entwickler sehr schnell mit der Erstellung eines Operators beginnen können. Man könnte beispielsweise mit der Eingabeaufforderung so starten:

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

So wird der gesamte Standardcode für Ihren Operator erstellt, einschließlich der YAML-Dateien und des Codes 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

Dann können Sie die benötigten APIs und den 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

Anschließend können Sie den Operator endlich bauen und in Ihr Container-Registry hochladen:

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

Wenn der Entwickler noch mehr Kontrolle benötigt, kann er den Standardcode in den Go-Dateien anpassen. Um beispielsweise die Spezifikationen des Controllers zu ändern, können Änderungen in die Datei vorgenommen werden controller.go.

Ein anderes Projekt, KUDO, ermöglicht es, Operatoren lediglich mit deklarativen YAML-Dateien zu erstellen. Ein Operator für Apache Kafka wird beispielsweise ungefähr so definiert, so. Damit kann man mit nur ein paar Befehlen ein Kafka-Cluster über Kubernetes installieren:

$ kubectl kudo install zookeeper
$ kubectl kudo install kafka

Und dann kann es mit einem weiteren Befehl konfiguriert werden:

$ 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 erscheinen große Kubernetes-Releases alle paar Monate – also drei bis vier große Releases pro Jahr. Die Anzahl der neuen Funktionen, die in jedem von ihnen implementiert werden, nimmt nicht ab. Darüber hinaus gibt es keine Anzeichen für eine Verlangsamung, selbst in unserer heutigen komplexen Zeit – schauen Sie sich an, wie aktiv das Kubernetes-Projekt auf GitHub ist.

Neue Möglichkeiten ermöglichen eine flexiblere Clusterbildung bei unterschiedlichen Arbeitslasten. Außerdem schätzen Programmierer die umfassendere Kontrolle beim Bereitstellen von Anwendungen direkt in der Produktion.

Gemeinschaft

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

Es gibt auch diverse Communities SIG (Special Interest Groups), die sich mit verschiedenen Bereichen von Kubernetes befassen, während sich dieses Projekt weiterentwickelt. Diese Gruppen fügen ständig neue Funktionen hinzu, wodurch die Arbeit mit Kubernetes immer einfacher und benutzerfreundlicher wird.

Die Cloud Native Foundation veranstaltet außerdem die CloudNativeCon/KubeCon, die zum Zeitpunkt der Erstellung dieses Textes die größte Open-Source-Konferenz der Welt ist. In der Regel findet sie dreimal im Jahr statt und bringt Tausende von Fachleuten zusammen, die Kubernetes und sein Ökosystem verbessern wollen sowie neue Funktionen erlernen möchten, die alle drei Monate hinzukommen.

Darüber hinaus gibt es in der Cloud Native Foundation einen Technischen Aufsichtsausschuss, der zusammen mit den SIGs neue und bestehende Projekte Projekte des Fonds, die auf das Cloud-Ökosystem ausgerichtet sind, prüft. Die meisten dieser Projekte tragen dazu bei, die Stärken von Kubernetes zu verbessern.

Letztendlich bin ich überzeugt, dass Kubernetes ohne das bewusste Engagement der gesamten Community, in der sich die Menschen gegenseitig unterstützen und gleichzeitig Neue willkommen heißen, nicht so erfolgreich gewesen wäre.

Zukunft

Eine der zentralen Herausforderungen, mit denen Entwickler in Zukunft konfrontiert sein werden, besteht darin, sich auf die Details des Codes selbst zu konzentrieren und nicht auf die Infrastruktur, in der er ausgeführt wird. Genau diesen Trends wird die serverlose Architektureparadigma, das heute eines der führenden ist, Rechnung getragen. Es gibt bereits fortschrittliche Frameworks wie Knative und OpenFaas, die Kubernetes nutzen, um die Infrastruktur vom Entwickler zu abstrahieren.

In diesem Artikel haben wir nur einen allgemeinen Überblick über den aktuellen Stand von Kubernetes gegeben – tatsächlich ist das erst die Spitze des Eisbergs. Den Nutzern von Kubernetes stehen auch viele andere Ressourcen, Möglichkeiten und Konfigurationen zur Verfügung.

Quelle: habr.com

Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы 🔥 Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы | ProHoster