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

Viel Spaß beim Lesen!
Zum Zeitpunkt der Erstellung dieses Artikels ist Kubernetes etwa , und in den letzten zwei Jahren ist seine Popularität so gestiegen, dass es stabil zu den 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 , und seit 2002 - Namespaces. Die Container haben sich bis 2008 weiter verbessert, als verfügbar wurde , und Google entwickelte ein internes System namens , 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 , 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: 80Mit 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 , YAML/JSON-Validator, sowie , Richtlinien-Validator, der sicherstellt, dass der Kontext Ihrer Arbeitslasten es dem Container nicht ermöglicht, mit Administratorrechten zu arbeiten. Wenn dies erforderlich ist, können Benutzer eine einfache Richtlinie anwenden hinzu, 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 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. , 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 .
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. – ist ein spezieller Prozess im Kubernetes-Cluster, der nach dem Muster „“ 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 — und seinem . 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-operatorSo 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.goDann 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=MyAppServiceAnschließ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, , ermöglicht es, Operatoren lediglich mit deklarativen YAML-Dateien zu erstellen. Ein Operator für Apache Kafka wird beispielsweise ungefähr so definiert, . Damit kann man mit nur ein paar Befehlen ein Kafka-Cluster über Kubernetes installieren:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafkaUnd 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 .
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 .
Es gibt auch diverse Communities (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 , der zusammen mit den SIGs neue und bestehende 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 , das heute eines der führenden ist, Rechnung getragen. Es gibt bereits fortschrittliche Frameworks wie und , 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
