Hallo, Habra!
Am Ende des Sommers möchten wir daran erinnern, dass wir weiterhin am Thema arbeiten und haben beschlossen, einen Artikel von Stackoverflow zu veröffentlichen, der den Stand der Dinge in diesem Projekt zu Beginn des 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 stark gewachsen, dass es stabil zu den Plattformen gehört. In diesem Jahr belegt Kubernetes den dritten Platz. Erinnern wir uns: Kubernetes ist eine Plattform, die für den Betrieb und die Orchestrierung von Container-Workloads konzipiert ist.
Container entstanden als spezielle Struktur zur Isolation von Prozessen in Linux; seit 2007 gehören dazu , und seit 2002 – Namespaces. Container haben sich bis 2008 noch weiter entwickelt, als verfügbar wurde , und Google entwickelte sein internes Mechanismus namens , wo „alle Arbeiten in Containern durchgeführt werden“. Lassen Sie uns ins Jahr 2013 zurückspringen, als die erste Version von Docker veröffentlicht wurde und Container endgültig zu beliebten Massenlösungen wurden. Zu diesem Zeitpunkt war das Hauptwerkzeug zur Orchestrierung von Containern , obwohl es nicht übermäßig populär war. Die erste Veröffentlichung von Kubernetes fand 2015 statt, danach wurde dieses Tool de facto zum Standard im Bereich der Container-Orchestrierung.
Um zu versuchen, zu verstehen, warum Kubernetes so beliebt ist, lassen Sie uns einige Fragen beantworten. Wann gelang es den Entwicklern zuletzt, sich darüber zu einigen, wie man Anwendungen in der Produktion bereitstellt? Wie viele Entwickler kennen Sie, die Werkzeuge so verwenden, wie sie „out of the box“ bereitgestellt werden? Wie viele Cloud-Administratoren von heute haben kein Verständnis dafür, wie Anwendungen funktionieren? Die Antworten auf diese Fragen werden wir in diesem Artikel betrachten.
Infrastructure as YAML
In einer Welt, die von Puppet und Chef zu Kubernetes übergegangen ist, bestand eine der größten Veränderungen darin, von „Infrastructure as Code“ zu „Infrastructure as Data“ — konkret, in Form von YAML. Alle Ressourcen in Kubernetes, einschließlich 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: 80Mit dieser Präsentation können DevOps- oder SRE-Spezialisten ihre Arbeitslasten vollständig ausdrücken, ohne den Programmcode in Sprachen wie Python oder Javascript schreiben zu müssen.
Weitere Vorteile der Organisation von Infrastruktur als Daten sind unter anderem:
- GitOps oder Versionskontrolle von Git Operations Version. Dieser Ansatz ermöglicht es, alle YAML-Dateien von Kubernetes in Git-Repositories zu halten, wodurch Sie genau nachverfolgen können, wann eine Änderung vorgenommen wurde, wer sie vorgenommen hat und was genau sich geändert hat. Dies erhöht die Transparenz der Operationen innerhalb der gesamten Organisation und steigert die Effizienz, da Unklarheiten, insbesondere bezüglich des Standortes, an dem Mitarbeiter die benötigten Ressourcen suchen, beseitigt werden. Gleichzeitig wird es einfacher, Änderungen an Kubernetes-Ressourcen automatisch vorzunehmen - durch einfaches Zusammenführen von Pull-Requests.
- Skalierbarkeit. Wenn Ressourcen in Form von YAML definiert sind, wird es den Cluster-Operatoren extrem einfach, eine oder zwei Zahlen in der Kubernetes-Ressource zu ändern, wodurch sich die Skalierungsprinzipien ändern. Kubernetes hat einen Mechanismus zum horizontalen automatischen Skalieren von Pods, mit dem einfach festgelegt werden kann, wie viele Pods minimum und maximum in einer bestimmten bereitgestellten Konfiguration erforderlich sind, um mit niedrigem und hohem Verkehrsaufkommen umzugehen. Beispielsweise, wenn Sie eine Konfiguration bereitgestellt haben, die aufgrund eines plötzlichen Anstiegs des Verkehrs zusätzliche Ressourcen benötigt, kann der Wert von 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 verschiedene Dinge in Kubernetes bereitgestellt werden. Ein ernsthaftes Sicherheitsproblem betrifft die Frage, ob Ihre Arbeitslasten unter einem Benutzer ausgeführt werden, der keine Administratorrechte hat. In diesem Fall können uns Werkzeuge wie , YAML/JSON-Validator, plus , Policy-Validator, um sicherzustellen, dass der Kontext Ihre Arbeitslasten erlauben es dem Container nicht, mit Administratorrechten zu arbeiten. Wenn dies erforderlich ist, können die Benutzer eine einfache Richtlinie anwenden. , 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. Einer der auffälligsten Trends in der modernen Hochtechnologie ist das Ausführen von Arbeitslasten auf den Ressourcen öffentlicher Cloud-Anbieter. Mit Hilfe des Components ermöglicht Kubernetes jedem Cluster die Integration mit dem Cloud-Anbieter, auf dem es läuft. Wenn ein Benutzer beispielsweise eine Anwendung in Kubernetes auf AWS gestartet hat und den Zugriff auf diese Anwendung über einen Service eröffnen möchte, hilft der Cloud-Anbieter dabei, automatisch einen Service zu erstellen,
LoadBalancer, der automatisch einen Lastenausgleich bereitstellt. , um den Traffic auf die Pods der Anwendungen umzuleiten.
Erweiterbarkeit
Kubernetes ist sehr skalierbar, und das gefällt den Entwicklern. Es gibt eine Reihe vorhandener Ressourcen wie Pods, Deployments, StatefulSets, Secrets, ConfigMaps, usw. Tatsächlich können Benutzer und Entwickler weitere Ressourcen in Form von .
definieren. Wenn wir beispielsweise eine Ressource definieren möchten CronTab, könnten wir so etwas machen:
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 Ressource CronTab ungefähr 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 eigene Operatoren schreiben können. – dies ist ein spezieller Prozess im Kubernetes-Cluster, der nach dem Muster „“ funktioniert. Mithilfe des 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 Werkzeuge, mit denen Entwickler ihre eigenen Operatoren einfach erstellen können. Dazu gehört stabilen Zweigen . Dieses SDK bietet eine Grundlage, von der aus der Entwickler sehr schnell mit der Erstellung eines Operators beginnen kann. Zum Beispiel kann man mit der Befehlszeile ungefähr so anfangen:
$ 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 dem 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.goDanach können die erforderlichen APIs und der Controller so hinzugefügt werden:
$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppServiceAnschließend kann der Operator schließlich gesammelt und in das Container-Registry Ihrer Wahl hochgeladen werden:
$ operator-sdk build your.container.registry/youruser/myapp-operator Falls der Entwickler noch mehr Kontrolle benötigt, kann er den Standardcode in den Go-Dateien anpassen. Zum Beispiel kann man Änderungen an der Datei vornehmen, um die spezifische Funktionsweise des Controllers zu modifizieren. controller.go.
Ein weiteres Projekt, , ermöglicht es, Operatoren allein mit deklarativen YAML-Dateien zu erstellen. Beispielsweise wird der Operator für Apache Kafka ungefähr so definiert . Damit kann man mit nur ein paar Befehlen einen Kafka-Cluster auf Kubernetes installieren:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafkaUnd dann kann er 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-Versionen alle paar Monate – also drei bis vier große Versionen pro Jahr. Die Anzahl neuer Funktionen, die in jeder einzelnen implementiert werden, nimmt nicht ab. Darüber hinaus sind selbst in unseren schwierigen Zeiten keine Anzeichen einer Verlangsamung zu beobachten – schauen Sie sich an, wie aktiv das .
. Neue Möglichkeiten ermöglichen eine flexiblere Clusterbildung der Operationen bei unterschiedlichen Arbeitslasten. Außerdem schätzen Programmierer eine umfassendere Kontrolle beim Bereitstellen von Anwendungen direkt in der Produktion.
Die Community
Ein weiterer ernsthafter Aspekt der Popularität von Kubernetes liegt in der Stärke seiner Community. Im Jahr 2015, nach der Veröffentlichung von Version 1.0, wurde Kubernetes gesponsert .
Es gibt auch verschiedene Gemeinschaften (Sondergruppen, die darauf abzielen, verschiedene Bereiche von Kubernetes zu bearbeiten, während sich das Projekt weiterentwickelt. Diese Gruppen fügen ständig neue Funktionen hinzu, wodurch die Arbeit mit Kubernetes immer praktischer wird.
Die Cloud Native Foundation veranstaltet auch die CloudNativeCon/KubeCon, die zum Zeitpunkt des Verfassens dieses Textes die größte Open-Source-Konferenz der Welt ist. In der Regel findet sie dreimal im Jahr statt und versammelt Tausende von Fachleuten, die Kubernetes und sein Ökosystem verbessern möchten sowie neue Möglichkeiten erlernen, die alle drei Monate entstehen.
Darüber hinaus gibt es in der Cloud Native Foundation , das zusammen mit den SIGs neue und bestehende Fonds, die auf das Cloud-Ökosystem ausgerichtet sind. Die meisten dieser Projekte tragen zur Verbesserung der Stärken von Kubernetes bei.
Schließlich glaube ich, dass Kubernetes nicht so erfolgreich wäre, hätte es nicht das bewusste Engagement der gesamten Community, in der sich die Menschen gegenseitig unterstützen, während sie gleichzeitig neue Mitglieder herzlich willkommen heißen.
Zukunft
Eine der größten Herausforderungen, mit denen Entwickler in Zukunft konfrontiert sein werden, ist die Fähigkeit, sich auf die Details des Codes selbst zu konzentrieren und nicht auf die Infrastruktur, in der er ausgeführt wird. Genau auf diese Trends reagiert , das heute zu den führenden gehört. Es gibt bereits fortschrittliche Frameworks, wie zum Beispiel und , die Kubernetes zur Abstraktion der Infrastruktur vom Entwickler nutzen.
In diesem Artikel haben wir nur einen allgemeinen Überblick über den aktuellen Stand von Kubernetes gegeben – tatsächlich ist das nur die Spitze des Eisbergs. Den Nutzern von Kubernetes stehen viele weitere Ressourcen, Möglichkeiten und Konfigurationen zur Verfügung.
Quelle: habr.com
