Ende des Sommers möchten wir Sie daran erinnern, dass wir weiterhin am Thema Kubernetes arbeiten, und beschlossen, Anfang Juni einen Artikel über Stackoverflow zu veröffentlichen, der den Stand der Dinge in diesem Projekt demonstriert.
Viel Spaß beim Lesen!
Zum Zeitpunkt dieses Schreibens ist Kubernetes ungefähr sechs Jahre alt und hat in den letzten zwei Jahren so an Popularität gewonnen, dass es durchweg zu den beliebtesten Plattformen gehört. Kubernetes belegt in diesem Jahr den dritten Platz. Zusammenfassend ist Kubernetes eine Plattform zum Ausführen und Orchestrieren von containerisierten Workloads.
Container entstanden als spezielles Konstrukt für die Prozessisolierung unter Linux. Container sind seit 2007 cgroups und seit 2002 Namespaces. Die Container nahmen 2008 noch besser Gestalt an, als LXC verfügbar wurde und Google einen eigenen internen Mechanismus namens Borg entwickelte.wo "alle Arbeiten in Containern erledigt werden". Von hier aus schnell vorwärts bis 2013, als die erste Docker-Version stattfand und Container schließlich in die Kategorie der beliebten Massenlösungen übergingen. Zu dieser Zeit war Mesos das Hauptwerkzeug für die Orchestrierung von Containern , obwohl es nicht sehr beliebt war. Die erste Veröffentlichung von Kubernetes fand 2015 statt. Danach wurde dieses Tool zum De-facto-Standard im Bereich der Container-Orchestrierung.
Um zu verstehen, warum Kubernetes so beliebt ist, versuchen wir, einige Fragen zu beantworten. Wann konnten sich Entwickler das letzte Mal darauf einigen, wie Anwendungen für die Produktion bereitgestellt werden sollen? Wie viele Entwickler verwenden Tools, die standardmäßig bereitgestellt werden? Wie viele Cloud-Administratoren gibt es heute, die nicht verstehen, wie Anwendungen funktionieren? Wir werden die Antworten auf diese Fragen in diesem Artikel betrachten.
Infrastruktur als YAML
In der Welt, die von Puppet und Chef zu Kubernetes gewechselt ist, war eine der größten Veränderungen der Übergang von Infrastruktur als Code zu Infrastruktur als Daten - speziell wie bei YAML. Alle Ressourcen in Kubernetes, einschließlich Pods, Konfigurationen, bereitgestellten 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 SREs, ihre Workloads 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 insbesondere folgende:
- GitOps Git Operations Version. YAML- Kubernetes git, , , , . , , , , . , Kubernetes – pull-.
- . YAML, Kubernetes, . Kubernetes , , , , . , , - , maxReplicas 10 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
- . YAML , Kubernetes. , , , , - , . conftest, YAML/JSON, Open Policy Agent, , , SecurityContext . , rego, :
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
- . – . cloud-provider Kubernetes , . , Kubernetes AWS ,
LoadBalancer, Amazon Elastic Load Balancer, .
Kubernetes ist sehr erweiterbar und Entwickler lieben es. Es steht eine Sammlung von Ressourcen zur Verfügung, z. B. Pods, Sweeps,
StatefulSetsGeheimnisse ConfigMapsusw. Benutzer und Entwickler können jedoch andere Ressourcen in Form von benutzerdefinierten Ressourcendefinitionen hinzufügen .
Wenn wir beispielsweise eine Ressource definieren möchten
CronTab, können wir Folgendes 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 wie folgt erstellen:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Eine weitere Option für die Erweiterbarkeit in Kubernetes besteht darin, dass der Entwickler seine eigenen Operatoren schreiben kann. Ein Operator ist ein spezieller Prozess in einem Kubernetes-Cluster, der in einem " Regelkreis " -Muster arbeitet . Mithilfe eines Bedieners kann der Benutzer die Verwaltung von CRDs (benutzerdefinierten Ressourcendefinitionen) automatisieren, indem er Informationen mit der Kubernetes-API austauscht.
Es gibt verschiedene Tools in der Community, die es Entwicklern erleichtern, ihre eigenen Operatoren zu erstellen. Darunter befinden sich das Operator Framework und sein Operator SDK . Dieses SDK bietet ein Framework, mit dem ein Entwickler sehr schnell eine Anweisung erstellen kann. Angenommen, Sie können über die Befehlszeile wie folgt beginnen:
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
Dadurch wird der gesamte stereotype Code für Ihren Bediener erstellt, einschließlich der YAML-Dateien und des Golang-Codes:
.
|____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 gewünschten 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
Sammeln Sie schließlich den Operator und senden Sie ihn an die Registrierung Ihres Containers:
$ operator-sdk build your.container.registry/youruser/myapp-operator
Wenn der Entwickler noch mehr Kontrolle benötigt, können Sie den stereotypen Code in den Go-Dateien ändern. Um beispielsweise die Besonderheiten des Controllers zu ändern, können Sie Änderungen an der Datei vornehmen
controller.go.
In einem anderen Projekt, KUDO , können Sie Anweisungen nur mit deklarativen YAML-Dateien erstellen. Zum Beispiel würde ein Operator für Apache Kafka definiert werden wie folgt aus . Damit können Sie mit nur wenigen Befehlen einen Kafka-Cluster auf Kubernetes installieren:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafka
Und dann konfigurieren Sie es 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
Innovation
In den letzten Jahren wurden alle paar Monate wichtige Kubernetes-Veröffentlichungen veröffentlicht, dh drei bis vier große Veröffentlichungen pro Jahr. Die Anzahl der in jedem von ihnen implementierten neuen Funktionen nimmt nicht ab. Darüber hinaus gibt es auch in schwierigen Zeiten keine Anzeichen einer Verlangsamung - sehen Sie sich die aktuelle Aktivität des Kubernetes-Projekts auf Github an .
Mit neuen Funktionen können Sie Vorgänge flexibler über eine Vielzahl von Workloads hinweg gruppieren. Außerdem möchten Programmierer mehr Kontrolle, wenn sie Anwendungen direkt in der Produktion bereitstellen.
Gemeinschaft
Ein weiterer wichtiger Aspekt der Popularität von Kubernetes ist die Stärke seiner Community. Im Jahr 2015 wurde Kubernetes nach Erreichen der Version 1.0 von der Cloud Native Computing Foundation gesponsert .
Es gibt auch eine Vielzahl von SIG- Communities (Special Interest Groups), die verschiedene Bereiche von Kubernetes erkunden, während sich das Projekt weiterentwickelt. Diese Teams fügen ständig neue Funktionen hinzu, um die Arbeit mit Kubernetes bequemer und bequemer zu gestalten.
Die Cloud Native Foundation veranstaltet auch CloudNativeCon / KubeCon, die zum Zeitpunkt dieses Schreibens die größte Open Source-Konferenz der Welt ist. In der Regel dreimal im Jahr finden Tausende von Fachleuten statt, die Kubernetes und sein Ökosystem verbessern sowie alle drei Monate neue Funktionen beherrschen möchten.
Darüber hinaus verfügt die Cloud Native Foundation über ein Technical Oversight Committee , das in Zusammenarbeit mit SIGs neue und bestehende Projekte der Stiftung prüft, die sich auf das Cloud-Ökosystem konzentrieren. Die meisten dieser Projekte tragen dazu bei, die Stärken von Kubernetes zu verbessern.
Schließlich glaube ich, dass Kubernetes ohne die bewussten Bemühungen der gesamten Gemeinschaft, in der sich die Menschen aneinander klammern, keinen solchen Erfolg gehabt hätte, aber gleichzeitig gerne Neuankömmlinge in ihre Reihen aufgenommen hätte.
Zukunft
Eine der größten Herausforderungen, mit denen sich Entwickler in Zukunft befassen müssen, ist die Möglichkeit, sich auf die Details des Codes selbst zu konzentrieren und nicht auf die Infrastruktur, in der er betrieben wird. Auf diese Trends reagiert das Paradigma der serverlosen Architektur , das heute eines der führenden ist. Es gibt bereits erweiterte Frameworks wie Knative und OpenFaas , die Kubernetes verwenden, um die Infrastruktur vom Entwickler zu abstrahieren.
In diesem Artikel haben wir den aktuellen Zustand von Kubernetes nur kurz behandelt - tatsächlich ist dies nur die Spitze des Eisbergs. Kubernetes-Benutzer verfügen über viele andere Ressourcen, Funktionen und Konfigurationen.