SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
Microservice Deployments


mit


Kubernetes Operatoren
Frank Müller
Oldenburg

Baujahr 1965

Team Lead PS & Solution Engineer

Kubermatic GmbH

frank.mueller@themue.dev

@themue
Auf dem Weg zum Microservice
Wandel von Monolithen zu Microservices
Wandel von Monolithen zu Microservices
Wandel von Monolithen zu Microservices
Flexible Architekturen
Chaos vermeiden
Kubernetes als Laufzeitumgebung
Abstraktion der Laufzeitumgebung
Wichtige Bausteine
Kontrollschleife für den Wunschzustand
Erweiterbar durch eigene Ressourcen-Typen
Controller reagieren auf diese Ressourcen
Standardisierung und Einfachheit
Vielfalt erschwert Wartung
Einen Rahmen geben
Dynamik
Der Weg zu eigenen Bausteinen
De
fi
nition einer Custom Resource
Versionierte API
• Versions-Nummern und Level

• Start mit v1alpha1, v1alpha2, ...

• Bei zunehmender Stabilität und Tests mit v1beta1

• Stabile Versionen ohne Level, wie v1, v2, ...
Bestandteile des Microservice Deployments
apiVersion: apiextensions.k8s.io/v1


kind: CustomResourceDe
fi
nition


metadata:


name: mechanic.k8s.tideland.dev


spec:


group: k8s.tideland.dev


scope: Namespaced


names:


plural: mechanics


singular: mechanic


kind: Mechanic


shortNames:


- mech
De
fi
nition in YAML – Rahmen
De
fi
nition in YAML – Spezi
fi
kation
versions:


- name: v1alpha1


served: true


storage: true


schema:


openAPIV3Schema:


type: object


properties:


spec:


....


status:


...
De
fi
nition in Go – Rahmen
package v1alpha1


import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"


type Mechanic struct {


metav1.TypeMeta `json:",inline"`


metav1.ObjectMeta `json:"metadata"`


Spec MechanicSpec `json:"spec"`


Status MechanicStatus `json:"status"`


}
De
fi
nition in Go – Spezi
fi
kation
package v1alpha1


import corev1 "k8s.io/api/core/v1"


type Microservice struct {


Scaling MicroserviceScaling `json:"scaling"`


Containers []Container `json:"containers"`


Volumes []corev1.Volume `json:"volumes,omitempty"`


}


...


type MechanicSpec struct {


Microservice Microservice `json:"microservice"`


Dependencies Dependencies `json:"dependencies"`


Network Network `json:"network"`


}
DeepCopy wird benötigt
func (in *Mechanic) DeepCopyInto(out *Mechanic) {


out.TypeMeta = in.TypeMeta


out.ObjectMeta = in.ObjectMeta


out.Spec = MechanicSpec{...}


}


func (in *Mechanic) DeepCopyObject() runtime.Object {


out := Mechanic{}


in.DeepCopyInto(&out)


return &out


}
Vorbereitung der Registratur (Schritt 1a)
package v1alpha1


var (


SchemaGroupVersion = schema.GroupVersion{


Group: "k8s.tideland.dev",


Version: "v1alpha1",


}


SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)


AddToScheme = SchemeBuilder.AddToScheme


)
Vorbereitung der Registratur (Schritt 1b)
package v1alpha1


func addKnownTypes(scheme *runtime.Scheme) error {


scheme.AddKnownTypes(SchemeGroupVersion,


&Mechanic{},


&MechanicList{},


)


metav1.AddToGroupVersion(scheme, SchemeGroupVersion)


return nil


}
Hinzufügen zum Schema (Schritt 2)
package main


import "k8s.io/client-go/kubernetes/scheme"


func main() {


...


v1alpha1.AddToScheme(scheme.Scheme)


...


}
REST Client bedarfsgerecht kapseln
Create eingepackt
func (mi *MechanicInterface) Create(


m *Mechanic,


opts metav1.CreateOptions) (*Mechanic, error) {


result := &Mechanic{}


err := mi.restClient().


Post().


Namespace(di.namespace).


Resource("mechanic").


Body(m).


VersionedParams(&opts, scheme.ParameterCodes).


Do().


Into(&result)


return result, err


}
Information über Änderungen
Lister für das Microservice Deployment
package v1alpha1


type MechanicLister interface {


List(selector labels.Selector) ([]*Mechanic, error)


Get(name string) (*Mechanic, error)


}


type mechanicLister struct {


// REST Client.


mif MechanicInterface


}


func (ml mechanicLister) Get(name string) (*Mechanic, error) {


return ml.mif.Get(name, metav1.GetOptions{})


}
Informer für das Microservice Deployment erzeugen
package v1alpha1


type MechanicInformer interface {


Informer() cache.SharedIndexInformer


Lister() MechanicLister


}


type mechanicInformer struct {


// REST Client.


mif MechanicInterface


}


func NewMechanicInformerWithInterface(mif MechanicInterface) MechanicInformer {


return &mechanicInformer{


mif: mif,


}


}
Informer für das Microservice Deployment nutzen
func (mi *mechanicInformer) Informer() cache.SharedIndexInformer {


return cache.NewSharedIndexInformer(


&cache.ListWatch{


ListFunc: func(opts metav1.ListOptions) (result runtime.Object, err error) {


return mi.mif.List(opts)


		 	 },


WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {


return mi.mif.Watch(opts)


		 	 },


},


&Mechanics{},


30*time.Second,


cache.Indexers{},


)


}
Von der API zum Controller
Aufgaben
• Kon
fi
guration

• Informer erzeugen und Handler registrieren

• Ein bis N Informer im Hintergrund arbeiten lassen

• Auf Callbacks entsprechend reagieren
De
fi
nition
package mechanic


type Mechanic struct {


con
fi
g *rest.Con
fi
g


client kubernetes.Interface


namespace string


mif mechanicv1alpha1.MechanicInterface


minfo cache.SharedIndexInformer


}
Den Controller erzeugen
package mechanic


func New(con
fi
g *rest.Con
fi
g, namespace string) (*Mechanic, error) {


m := &Mechanic{...}


namespaceableMIF, err := mechanicv1alpha1.NewForCon
fi
g(m.con
fi
g)


...


m.mif = namespaceableMIF.Namespace(namespace)


client, err := kubernetes.NewForCon
fi
g(con
fi
g)


...


m.client = client


m.minfo = mechanicv1alpha1.NewMechanicInformerWithInterface(m.mif).Informer()


return m, nil


}
Auf geht es zur Arbeit
package mechanic


func (m *Mechanic) Run(ctx context.Context) {


// Add handler functions to informer.


m.minfo.AddEventHandler(cache.ResourceEventHandlerFuncs{


AddFunc: m.addMechanicHandler,


UpdateFunc: m.updateMechanicHandler,


DeleteFunc: m.deleteMechanicHandler,


})


// Let it work.


go m.minfo.Run(wait.NeverStop)


// Run based on context.


select {


case <-ctx.Done:


}


}
Hinzufügen einer Instanz
package mechanic


func (m *Mechanic) addMechanicHandler(obj interface{}) {


mechanic := obj.(*mechanicv1alpha1Mechanic)


if mechanic.GetNamespace() != m.namespace {


return


}


m.addMicroservice(mechanic.Spec.Microservice, mechanic.Status)


m.addDependencies(mechanic.Spec.Dependencies, mechanic.Status)


m.addNetwork(mechanic.Spec.Network, mechanic.Status)


}
Hierarchische Abarbeitung
Externe Abhängigkeiten abstrahieren
• Struktur mit Name, Typ als String und Schlüssel-Wert-
Parametern

• Iteration über die Abhängigkeiten

• Instanzierung auf Basis des Typs

• Parameter übergeben

• Aktion ausführen
Auf geht es
Hauptprogramm
package main


func main() {


// Read
fl
ags and con
fi
guration.


...


con
fi
g, err := clientcmd.BuildCon
fi
gFromFlags(masterURL, kubecon
fi
g)


...


// Run mechanic.


m, err := mechanic.New(con
fi
g, namespace)


...


mechanicv1alpha1.AddToScheme(scheme.Scheme)


m.Run(context.Background())


}
Werkzeuge
Kubebuilder
• Manuelle Schritte zeigen die prinzipielle Arbeitsweise

• Kubebuilder unterstützt dies als Framework

• Basierend auf API Quellen mit Kommentaren wird
Standard-Code generiert

• Anstatt Handler werden Reconcile-Funktionen mit
Requests erzeugt und später aufgerufen

• Generator-Aufrufe sind idempotent
Fazit
Zusammenfassung
• Initial ein komplexer Weg zur Installation und dem Betrieb
von Anwendungssystemen im Netz

• Stellt komfortable Möglichkeiten aber auch gewünschte
Grenzen für die Installation von Microservices zur
Verfügung

• Keine Abweichung der Kon
fi
gurationssprache der
Anwendungen und der Anwendungsinstallation
Vielen Dank. Guten Appetit beim Kaffee.

Weitere ähnliche Inhalte

Ähnlich wie 2021 OOP - Kubernetes Operatoren

TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkdie.agilen GmbH
 
Windows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauWindows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauDigicomp Academy AG
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Migration zum Zend Framework 3
Migration zum Zend Framework 3Migration zum Zend Framework 3
Migration zum Zend Framework 3Ralf Eggert
 
MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]Dominik Obermaier
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumTorsten Fink
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoFrank Müller
 
Anbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAnbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAndré Wussow
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackQAware GmbH
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfMario-Leander Reimer
 
Entwicklungsumgebungen - Packer, Vagrant, Puppet
Entwicklungsumgebungen - Packer, Vagrant, PuppetEntwicklungsumgebungen - Packer, Vagrant, Puppet
Entwicklungsumgebungen - Packer, Vagrant, Puppetinovex GmbH
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...Bernd Zuther
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013NETWAYS
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScriptManfred Steyer
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Managementinovex GmbH
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinStephan Kaps
 

Ähnlich wie 2021 OOP - Kubernetes Operatoren (20)

TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
 
Windows Server 8 - eine Vorschau
Windows Server 8 - eine VorschauWindows Server 8 - eine Vorschau
Windows Server 8 - eine Vorschau
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Migration zum Zend Framework 3
Migration zum Zend Framework 3Migration zum Zend Framework 3
Migration zum Zend Framework 3
 
MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]MQTT Deep Dive Workshop [GERMAN]
MQTT Deep Dive Workshop [GERMAN]
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in Go
 
Anbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAnbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web Services
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native Stack
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
 
Entwicklungsumgebungen - Packer, Vagrant, Puppet
Entwicklungsumgebungen - Packer, Vagrant, PuppetEntwicklungsumgebungen - Packer, Vagrant, Puppet
Entwicklungsumgebungen - Packer, Vagrant, Puppet
 
MVVM Pattern
MVVM Pattern MVVM Pattern
MVVM Pattern
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...
Java Aktuell Bernd Zuther Canary Releases mit der Very Awesome Microservices ...
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Management
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 

Mehr von Frank Müller

JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in GoFrank Müller
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do ItFrank Müller
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenFrank Müller
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitFrank Müller
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit JujuFrank Müller
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google GoFrank Müller
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google GoFrank Müller
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbarFrank Müller
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoFrank Müller
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudFrank Müller
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentFrank Müller
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareFrank Müller
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of GoFrank Müller
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaFrank Müller
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven ArchitectureFrank Müller
 

Mehr von Frank Müller (20)

JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in Go
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do It
 
Concurrency with Go
Concurrency with GoConcurrency with Go
Concurrency with Go
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Fun with functions
Fun with functionsFun with functions
Fun with functions
 
Ein Gopher im Netz
Ein Gopher im NetzEin Gopher im Netz
Ein Gopher im Netz
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale Währungen
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google Go
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google Go
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbar
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google Go
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable Environment
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source Software
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of Go
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
 
Go to the Cloud
Go to the CloudGo to the Cloud
Go to the Cloud
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven Architecture
 

2021 OOP - Kubernetes Operatoren

  • 2. Frank Müller Oldenburg Baujahr 1965 Team Lead PS & Solution Engineer
 Kubermatic GmbH frank.mueller@themue.dev @themue
  • 3. Auf dem Weg zum Microservice
  • 4. Wandel von Monolithen zu Microservices
  • 5. Wandel von Monolithen zu Microservices
  • 6. Wandel von Monolithen zu Microservices
  • 12. Kontrollschleife für den Wunschzustand
  • 13. Erweiterbar durch eigene Ressourcen-Typen
  • 14. Controller reagieren auf diese Ressourcen
  • 19. Der Weg zu eigenen Bausteinen
  • 21. Versionierte API • Versions-Nummern und Level • Start mit v1alpha1, v1alpha2, ... • Bei zunehmender Stabilität und Tests mit v1beta1 • Stabile Versionen ohne Level, wie v1, v2, ...
  • 23. apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDe fi nition metadata: name: mechanic.k8s.tideland.dev spec: group: k8s.tideland.dev scope: Namespaced names: plural: mechanics singular: mechanic kind: Mechanic shortNames: - mech De fi nition in YAML – Rahmen
  • 24. De fi nition in YAML – Spezi fi kation versions: - name: v1alpha1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: .... status: ...
  • 25. De fi nition in Go – Rahmen package v1alpha1 import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" type Mechanic struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata"` Spec MechanicSpec `json:"spec"` Status MechanicStatus `json:"status"` }
  • 26. De fi nition in Go – Spezi fi kation package v1alpha1 import corev1 "k8s.io/api/core/v1" type Microservice struct { Scaling MicroserviceScaling `json:"scaling"` Containers []Container `json:"containers"` Volumes []corev1.Volume `json:"volumes,omitempty"` } ... type MechanicSpec struct { Microservice Microservice `json:"microservice"` Dependencies Dependencies `json:"dependencies"` Network Network `json:"network"` }
  • 27. DeepCopy wird benötigt func (in *Mechanic) DeepCopyInto(out *Mechanic) { out.TypeMeta = in.TypeMeta out.ObjectMeta = in.ObjectMeta out.Spec = MechanicSpec{...} } func (in *Mechanic) DeepCopyObject() runtime.Object { out := Mechanic{} in.DeepCopyInto(&out) return &out }
  • 28. Vorbereitung der Registratur (Schritt 1a) package v1alpha1 var ( SchemaGroupVersion = schema.GroupVersion{ Group: "k8s.tideland.dev", Version: "v1alpha1", } SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) AddToScheme = SchemeBuilder.AddToScheme )
  • 29. Vorbereitung der Registratur (Schritt 1b) package v1alpha1 func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Mechanic{}, &MechanicList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil }
  • 30. Hinzufügen zum Schema (Schritt 2) package main import "k8s.io/client-go/kubernetes/scheme" func main() { ... v1alpha1.AddToScheme(scheme.Scheme) ... }
  • 32. Create eingepackt func (mi *MechanicInterface) Create( m *Mechanic, opts metav1.CreateOptions) (*Mechanic, error) { result := &Mechanic{} err := mi.restClient(). Post(). Namespace(di.namespace). Resource("mechanic"). Body(m). VersionedParams(&opts, scheme.ParameterCodes). Do(). Into(&result) return result, err }
  • 34. Lister für das Microservice Deployment package v1alpha1 type MechanicLister interface { List(selector labels.Selector) ([]*Mechanic, error) Get(name string) (*Mechanic, error) } type mechanicLister struct { // REST Client. mif MechanicInterface } func (ml mechanicLister) Get(name string) (*Mechanic, error) { return ml.mif.Get(name, metav1.GetOptions{}) }
  • 35. Informer für das Microservice Deployment erzeugen package v1alpha1 type MechanicInformer interface { Informer() cache.SharedIndexInformer Lister() MechanicLister } type mechanicInformer struct { // REST Client. mif MechanicInterface } func NewMechanicInformerWithInterface(mif MechanicInterface) MechanicInformer { return &mechanicInformer{ mif: mif, } }
  • 36. Informer für das Microservice Deployment nutzen func (mi *mechanicInformer) Informer() cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(opts metav1.ListOptions) (result runtime.Object, err error) { return mi.mif.List(opts) }, WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) { return mi.mif.Watch(opts) }, }, &Mechanics{}, 30*time.Second, cache.Indexers{}, ) }
  • 37. Von der API zum Controller
  • 38. Aufgaben • Kon fi guration • Informer erzeugen und Handler registrieren • Ein bis N Informer im Hintergrund arbeiten lassen • Auf Callbacks entsprechend reagieren
  • 39. De fi nition package mechanic type Mechanic struct { con fi g *rest.Con fi g client kubernetes.Interface namespace string mif mechanicv1alpha1.MechanicInterface minfo cache.SharedIndexInformer }
  • 40. Den Controller erzeugen package mechanic func New(con fi g *rest.Con fi g, namespace string) (*Mechanic, error) { m := &Mechanic{...} namespaceableMIF, err := mechanicv1alpha1.NewForCon fi g(m.con fi g) ... m.mif = namespaceableMIF.Namespace(namespace) client, err := kubernetes.NewForCon fi g(con fi g) ... m.client = client m.minfo = mechanicv1alpha1.NewMechanicInformerWithInterface(m.mif).Informer() return m, nil }
  • 41. Auf geht es zur Arbeit package mechanic func (m *Mechanic) Run(ctx context.Context) { // Add handler functions to informer. m.minfo.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: m.addMechanicHandler, UpdateFunc: m.updateMechanicHandler, DeleteFunc: m.deleteMechanicHandler, }) // Let it work. go m.minfo.Run(wait.NeverStop) // Run based on context. select { case <-ctx.Done: } }
  • 42. Hinzufügen einer Instanz package mechanic func (m *Mechanic) addMechanicHandler(obj interface{}) { mechanic := obj.(*mechanicv1alpha1Mechanic) if mechanic.GetNamespace() != m.namespace { return } m.addMicroservice(mechanic.Spec.Microservice, mechanic.Status) m.addDependencies(mechanic.Spec.Dependencies, mechanic.Status) m.addNetwork(mechanic.Spec.Network, mechanic.Status) }
  • 44. Externe Abhängigkeiten abstrahieren • Struktur mit Name, Typ als String und Schlüssel-Wert- Parametern • Iteration über die Abhängigkeiten • Instanzierung auf Basis des Typs • Parameter übergeben • Aktion ausführen
  • 46. Hauptprogramm package main func main() { // Read fl ags and con fi guration. ... con fi g, err := clientcmd.BuildCon fi gFromFlags(masterURL, kubecon fi g) ... // Run mechanic. m, err := mechanic.New(con fi g, namespace) ... mechanicv1alpha1.AddToScheme(scheme.Scheme) m.Run(context.Background()) }
  • 48. Kubebuilder • Manuelle Schritte zeigen die prinzipielle Arbeitsweise • Kubebuilder unterstützt dies als Framework • Basierend auf API Quellen mit Kommentaren wird Standard-Code generiert • Anstatt Handler werden Reconcile-Funktionen mit Requests erzeugt und später aufgerufen • Generator-Aufrufe sind idempotent
  • 49. Fazit
  • 50. Zusammenfassung • Initial ein komplexer Weg zur Installation und dem Betrieb von Anwendungssystemen im Netz • Stellt komfortable Möglichkeiten aber auch gewünschte Grenzen für die Installation von Microservices zur Verfügung • Keine Abweichung der Kon fi gurationssprache der Anwendungen und der Anwendungsinstallation
  • 51. Vielen Dank. Guten Appetit beim Kaffee.