Slide 1

Slide 1 text

@shahidh_k Continuous Deployment to Kubernetes using Git Push

Slide 2

Slide 2 text

@shahidh_k Guten Morgen! I’m Shahidh GraphQL on Postgres

Slide 3

Slide 3 text

@shahidh_k git push

Slide 4

Slide 4 text

@shahidh_k Before <> After $ git push dev master $ docker build -t registry.com/my-image:my-tag $ docker push registry.com/my-image:my-tag $ kubectl set image deployment/my-deployment container=registry.com/my-image:my-tag

Slide 5

Slide 5 text

@shahidh_k Git hooks client-side > pre-push Exit can abort push server-side > pre-receive Exit can abort push > post-receive Cannot abort push Executable files in .git/hooks/ named .git/hooks/pre-receive

Slide 6

Slide 6 text

@shahidh_k Demo time (In case Gods are not kind enough today!)

Slide 7

Slide 7 text

@shahidh_k Architecture - Git remote agent on the cluster. Pre-receive hook: - Build docker image - Apply to k8s deployment - Configuration: - SSH keys - Dockerfile path - Sync configuration changes with the git-remote agent - K8s Operator git-remote k8s :: deployment,svc Exposed externally SSH-key based auth deployment $ git push dev master CRD configuration k8s :: CRD Deployments to update authorized-keys Dockerfile path controller k8s :: operator Apply changes $ kubectl ... remote.yaml your computer Kubernetes cluster

Slide 8

Slide 8 text

@shahidh_k remote.yaml apiVersion: gitkube.sh/v1alpha1 kind: Remote metadata: name: dev spec: authorizedKeys: - "ssh-rsa your-ssh-public-key" deployments: - name: app containers: - name: app path: app dockerfile: app/Dockerfile Kubernetes CRD

Slide 9

Slide 9 text

@shahidh_k remote.yaml apiVersion: gitkube.sh/v1alpha1 kind: Remote metadata: name: dev spec: authorizedKeys: - "ssh-rsa your-ssh-public-key" deployments: - name: app containers: - name: app path: app dockerfile: app/Dockerfile Access control

Slide 10

Slide 10 text

@shahidh_k remote.yaml apiVersion: gitkube.sh/v1alpha1 kind: Remote metadata: name: dev spec: authorizedKeys: - "ssh-rsa your-ssh-public-key" deployments: - name: app containers: - name: app path: app dockerfile: app/Dockerfile app ├── Dockerfile ├── k8s.yaml └── src ├── app.py ├── requirements.txt └── server.py

Slide 11

Slide 11 text

@shahidh_k Why Gitkube? git just works for AllTheThings™ git checkout git push dev my-branch:master ● git push to apply changes to kubernetes objects. ● Every developer is familiar with git. ● Quick iteration time when used on dev/staging clusters ● Simple permission system based on public keys ● Very small surface area. Can easily be replaced with more sophisticated CI/CD pipelines when moving to production.

Slide 12

Slide 12 text

@shahidh_k Thanks for listening. Questions?