Slide 1

Slide 1 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Developing Kubernetes Operators with Golang and Operator SDK Aykut M. Bulgu Principal Software Engineer @ Red Hat @SystemCraftsman

Slide 2

Slide 2 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com About Me #oc apply -f aykutbulgu.yaml apiVersion: redhat/v6 kind: Principal Software Engineer metadata: name: Aykut Bulgu namespace: Red Hat Ansible Engineering (previously Kafka) annotations: twitter: @SystemCraftsman bsky: @SystemCraftsman.com email: - [email protected] - [email protected] ex-organizer: Software Craftsmanship Turkey founder: System Craftsman labels: married: yes children: 2 interests: - basketball/nba/rockets - gamification - stoicism spec: replicas: 1 containers: - image: aykut:latest

Slide 3

Slide 3 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Schedule ● What is Kubernetes? β—‹ Container Orchestration β—‹ Kubernetes Architecture β—‹ The Controller Pattern ● Extending Kubernetes β—‹ Controllers β—‹ Operators ● Developing Operators β—‹ Kubernetes Clients β—‹ Operator Development Frameworks ● Developing Operators with Golang β—‹ Kubebuilder β—‹ Operator SDK ● Demo: KubeGame

Slide 4

Slide 4 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com What is Kubernetes? and why do we need it?

Slide 5

Slide 5 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Container Orchestration but…

Slide 6

Slide 6 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Container Orchestration $ docker build -t app:v1 .

Slide 7

Slide 7 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com $ docker build -t app:v1 . $ docker run app:v1 Container Orchestration

Slide 8

Slide 8 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com ? Container Orchestration

Slide 9

Slide 9 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com $ docker run app/frontend:v1 link-to-backend $ docker run app/frontend:v1 link-to-backend $ docker run app/backend:v1 link-to-db-cache-messaging $ docker run app/backend:v1 link-to-db-cache-messaging $ docker run app/database:v1 $ docker run app/cache:v1 link-to-db $ docker run app/messaging:v1 Container Orchestration

Slide 10

Slide 10 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com $ docker-compose up Container Orchestration

Slide 11

Slide 11 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com We need more than just containers kubernetes ? Scheduling Decide where to deploy containers Lifecycle and health Keep containers running despite failures Discovery Find other containers on the network Monitoring Visibility into running containers Security Control who can do what Scaling Scale containers up and down Persistence Survive data beyond container lifecycle Aggregation Compose apps from multiple containers

Slide 12

Slide 12 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com What is Kubernetes? Kubernetes is an open-source system for automating deployment, operations, and scaling of containerized applications across multiple hosts kubernetes

Slide 13

Slide 13 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubernetes Architecture and a quick look at the concepts.

Slide 14

Slide 14 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubernetes Architecture

Slide 15

Slide 15 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Declarative Model https://itnext.io/kubernetes-for-dummies-life-of-a-pod-fc8158e27aa YAML file Kubernetes

Slide 16

Slide 16 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubernetes Architecture https://itnext.io/kubernetes-for-dummies-life-of-a-pod-fc8158e27aa

Slide 17

Slide 17 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com The Controller Pattern

Slide 18

Slide 18 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com The Control Loop In robotics and automation, a control loop is a non-terminating loop that regulates the state of a system. In Kubernetes, controllers are control loops that watch the state of your cluster, then make or request changes where needed.

Slide 19

Slide 19 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com The Controller Pattern Actual Desired Action 2 replicas 3 replicas Scale up v1.0 v2.0 Update Object Deleted Delete Observe Analyze Act

Slide 20

Slide 20 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Extending Kubernetes

Slide 21

Slide 21 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Extending Kubernetes 1. Kubectl plugins 2. API Access extensions 3. API extensions 4. Scheduling extensions 5. Controllers and Operators 6. Network plugins 7. Device and Storage plugins https://kubernetes.io/docs/concepts/extend-kubernetes/

Slide 22

Slide 22 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Controllers

Slide 23

Slide 23 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Controllers Observe Analyze Act Reconciliation Loop

Slide 24

Slide 24 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Controllers apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:stable-alpine ports: - containerPort: 80

Slide 25

Slide 25 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Developing Controllers

Slide 26

Slide 26 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Developing Controllers You can develop Controllers with any language, such as: To manage Kubernetes resources by using: ● Labels ● Annotations ● ConfigMaps

Slide 27

Slide 27 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com A Controller Written in Bash apiVersion : apps/v1 kind: Deployment ... name: config-watcher-controller ... spec: serviceAccountName : config-watcher-controller containers : - name: kubeapi-proxy image: k8spatterns/kubeapi-proxy - name: config-watcher image: k8spatterns/curl-jq env: - name: WATCH_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace command: - "sh" - "/watcher/config-watcher-controller.sh" volumeMounts : ... https://k8spatterns.io/

Slide 28

Slide 28 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operators

Slide 29

Slide 29 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operators Operator extends Controller ● Labels ● Annotations ● ConfigMaps Custom Resources

Slide 30

Slide 30 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operators apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:stable-alpine ports: - containerPort: 80 Prometheus YAML ? ?

Slide 31

Slide 31 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Custom Resource Definition https://k8spatterns.io/

Slide 32

Slide 32 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operators’ Controller apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:stable-alpine ports: - containerPort: 80 Prometheus YAML Prometheus Controller

Slide 33

Slide 33 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com When to use which? https://k8spatterns.io/

Slide 34

Slide 34 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Developing Operators

Slide 35

Slide 35 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Options for Developing Operators ● Calling the API directly ● Using the Clients ● Using Operator Development Frameworks

Slide 36

Slide 36 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Pure Bash (Again!)

Slide 37

Slide 37 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubernetes Clients

Slide 38

Slide 38 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Python Client https://blog.palark.com/writing-a-kubernetes-operator-in-python-without-frameworks-and-sdk/

Slide 39

Slide 39 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Fabric8 Client (Java)

Slide 40

Slide 40 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator Development Frameworks ● Kubebuilder ● Operator SDK ● Metacontroller ● Charmed Operator SDK ● KubeOps

Slide 41

Slide 41 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Developing Operators with Golang

Slide 42

Slide 42 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Why Golang?

Slide 43

Slide 43 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Golang is faster than the fastest! https://medium.com/swlh/cloud-native-java-vs-golang-2a72c0531b05

Slide 44

Slide 44 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Java Developers, keep trying! :P

Slide 45

Slide 45 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator Development Tools for Golang ● Kubebuilder ● Operator SDK ● Metacontroller ● Charmed Operator SDK ● KubeOps

Slide 46

Slide 46 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubebuilder

Slide 47

Slide 47 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubebuilder $ kubebuilder init … Kubebuilder is a framework for building Kubernetes APIs using custom resource definitions (CRDs).

Slide 48

Slide 48 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Kubebuilder as a Library https://github.com/kubernetes-sigs/kubebuilder

Slide 49

Slide 49 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK

Slide 50

Slide 50 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK

Slide 51

Slide 51 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK - GitHub

Slide 52

Slide 52 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK ● Ansible ● Helm ● Go ● Java (Quarkus) Java Operator SDK (with Quarkus Extension)

Slide 53

Slide 53 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK

Slide 54

Slide 54 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Operator SDK $ operator-sdk init … … --plugins helm … --plugins ansible … --plugins quarkus

Slide 55

Slide 55 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Why Use Operator SDK? ● Built-in Scaffolding ● Leverages Kubebuilder ● Rich CLI ● Operator Lifecycle Manager (OLM) Integration ● Built-in Testing and Validation ● Helm, Ansible, and Java (Quarkus) Support ● Comprehensive Documentation and Community

Slide 56

Slide 56 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Key Benefits for Golang Developers ● Rapid Development: β—‹ Faster project setup with less boilerplate code. ● Reusability: β—‹ Scaffolded code aligns with Kubernetes best practices, reducing maintenance overhead ● Improved Debugging and Testing: β—‹ Pre-built utilities for simulating Kubernetes clusters locally. ● Production-ready Features: β—‹ OLM integration and packaging make it easier to distribute Operators.

Slide 57

Slide 57 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Example - Grafana Operator https://github.com/grafana/grafana-operator

Slide 58

Slide 58 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Initializing the Operator

Slide 59

Slide 59 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Creating the API and Reconcilers

Slide 60

Slide 60 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Creating the API and Reconcilers

Slide 61

Slide 61 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com MyCustomResource Type

Slide 62

Slide 62 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com MyCustomResource Reconciler

Slide 63

Slide 63 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Demo

Slide 64

Slide 64 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Ready Player One

Slide 65

Slide 65 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com KubeGame: A Gamification Operator oasis-postgres Oasis oasis-postgres ● Archaide ● Chthonia ● Incipio ● Middle-earth

Slide 66

Slide 66 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Talk is Cheap, Let’s See the Demo!

Slide 67

Slide 67 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Demo on GitHub

Slide 68

Slide 68 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Tribute to a Master https://github.com/vigo/dinozorus Uğur β€œvigo” Γ–zyΔ±lmazel

Slide 69

Slide 69 text

X: @systemcraftsman | πŸ¦‹: @systemcraftsman.com Thank You! Xwitter: @systemcraftsman πŸ¦‹Bluesky: @systemcraftsman.com Email: [email protected] Linkedin: https://www.linkedin.com/in/mabulgu/ Website: https://www.systemcraftsman.com/ GitHub: https://github.com/mabulgu