YAML is Optional · 2019-12-20 · YAML is Optional Exploring an App Developer's Kubernetes Options...

Post on 22-May-2020

15 views 0 download

transcript

YAML is Optional Exploring an App Developer's Kubernetes Options

A link to this deck is bit.ly/2NPZTWE

Outline

2

1. Why containers? +/-2. The tragedy of YAML3. Summarizing dev issues4. Exploring solutions5. Summary

3

V12.13.0

4

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Part 1

It works on my local

5

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Hell is other people

6

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Hell is other people ‘s

Dev E r en

7

So… no more `nodemon` ?

8

9

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

FROM node:6.11.5

WORKDIR /usr/src/appCOPY package.json .RUN npm install COPY . .

CMD [ "npm", "start" ]

10

11

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Part 2

Oh, hey there Kubernetes...

12

Learningcurve

13

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

YAML

14

---

15

16

17

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

18

19

20

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

21

kubeletkube-proxycontainerDkubectlCoreDNSmetrics-serverPodDeploymentReplica Set

JobServiceIngressConfigMapNamespaceSecretServiceAccountLabelAnnotation

StatefulSetPersistentVolumePersistentVolumeClaimsNetworkPolicyAdmissionControllerCustomResourceDefinitionTaintsTolerationsRuntimeClass

22

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Space Shuttle Design

23

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Human Centered Design

24

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL — 24

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Part 3

Developers, Developers, Developers

DockerfilesDev env setupIterative dev loopCI workflowDebugging toolsContainer patternsK8s learning curveYAML avoidance

25

DockerfilesDev env setupIterative dev loopCI workflowDebugging toolsContainer patternsK8s learning curveYAML avoidance

26

V12.13.0

VS

YAML is optional

27

YAML sucks less

28

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL — 28

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Part 4

Ksonnet

Kustomize

Whatever, just use

sed

Brigade

29

30

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

BrigadeSolves: integrating CI deeper with Kubernetes, and opens the door to `git push` workflows

31

Metaparticle

32

33

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

...@containerize( 'docker.io/your-docker-user-goes-here', options={ 'replicas': 4, 'executor': 'metaparticle', 'ports': [8080], 'name': 'my-image', 'publish': True })...

34

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

MetaparticleSolves: the need to learn Dockerfile and k8s YAML formats, lowering the learning curve.

35

Isopod

36

37

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

CLUSTERS = [ onprem(env="dev", cluster="minikube"), gke( env="prod", cluster="paas-prod", location="us-west1", project="cruise-paas-prod", ),]

def clusters(ctx): if ctx.cluster != None: return [c for c in CLUSTERS if c.cluster == ctx.cluster] elif ctx.env != None: return [c for c in CLUSTERS if c.env == ctx.env] return CLUSTERS

def addons(ctx) return [ addon("ingress", "configs/ingress.ipd", ctx), ]

IsopodSolves: Configs are an important part of code, and need testing. A single language used for Dockerfiles, k8s resources, and pushing code.

38

CNAB

39

CNAB

40

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

41

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

42

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

43

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

CNABSolves: how to organize containers into a logical app in a platform and vendor neutral way.

44

OAM implemented as Rudr

45

46

47

48

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

apiVersion: core.oam.dev/v1alpha1kind: ComponentSchematicmetadata: name: nginx-replicatedspec: workloadType: core.oam.dev/v1alpha1.Server osType: linux arch: amd64 containers: - name: server image: nginx:latest config: - name: "/etc/access/default_user.txt" - value: "admin" ports: - name: http containerPort: 80 protocol: TCP parameters: - name: poet type: string default: Yeats

OAM implemented as RudrSolves: Conway’s Law. The communication structure of your org can be reflected in YAML to improve collaboration between dev and ops roles.

49

Buildpacks

50

51

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

{ "name": "Start on Heroku: Node.js", "description": "A barebones Node.js app using Express 4", "repository": "https://github.com/heroku/node-js-getting-started", "logo": "https://cdn.rawgit.com/heroku/node-js-getting-started/master/public/node.svg", "keywords": ["node", "express", "heroku"], "image": "heroku/nodejs"}

BuildpacksSolves: the need to learn about containers, or kubernetes resources. Git as the source of truth for your platform.

52

Tilt

53

54

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

# tiltdemo1k8s_yaml('deployments/demoserver1.yaml')dm1_img_name = 'gcr.io/windmill-test-containers/tiltdemo/demoserver1'docker_build(dm1_img_name, '.', dockerfile='Dockerfile.server1', live_update=[ sync('cmd/demoserver1', '/go/src/github.com/windmilleng/tiltdemo/cmd/demoserver1'), run('go install github.com/windmilleng/tiltdemo/cmd/demoserver1'), restart_container(), ])

# tiltdemo2k8s_yaml('deployments/demoserver2.yaml')dm1_img_name = 'gcr.io/windmill-test-containers/tiltdemo/demoserver2'docker_build(dm1_img_name, '.', dockerfile='Dockerfile.server2', live_update=[ sync('cmd/demoserver2', '/go/src/github.com/windmilleng/tiltdemo/cmd/demoserver2'), run('go install github.com/windmilleng/tiltdemo/cmd/demoserver2'), restart_container(), ])

TiltSolves: the need for fast feedback loops as devs are writing new code, or debugging existing code.

55

Admission Controller

56

57

Admission ControllersSolves: reduces the number of fields devs have to remember to fill in on their YAML files.

58

Helm

59

60

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

apiVersion: v1kind: ReplicationControllermetadata: name: deis-database namespace: deis labels: app.kubernetes.io/managed-by: deisspec: replicas: 1 selector: app.kubernetes.io/name: deis-database template: metadata: labels: app.kubernetes.io/name: deis-database spec: serviceAccount: deis-database containers: - name: deis-database image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}} imagePullPolicy: {{.Values.pullPolicy}} ports: - containerPort: 5432 env: - name: DATABASE_STORAGE value: {{default "minio" .Values.storage}}

HelmSolves: providing a menu of options for devs to choose from, per org. Basic lifecycle.

61

Ksonnet

62

63

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

64

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

KSonnet

65

KSonnet

66

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

“I want easy things to be easy,And hard things to be possible”

KsonnetSolves: how to manage multi-cluster, multi-env, multiplicatively complex config scenarios. Keep your configs DRY.

67

Kustomize

68

69

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

70

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

# Create a directory to hold the basemkdir base# Create a base/deployment.yamlcat <<EOF > base/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: my-nginxspec: selector: matchLabels: run: my-nginx replicas: 2 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginxEOF

# Create a base/service.yaml filecat <<EOF > base/service.yamlapiVersion: v1kind: Servicemetadata: name: my-nginx labels: run: my-nginxspec: ports: - port: 80 protocol: TCP selector: run: my-nginxEOF# Create a base/kustomization.yamlcat <<EOF > base/kustomization.yamlresources:- deployment.yaml- service.yamlEOF

71

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

mkdir devcat <<EOF > dev/kustomization.yamlbases:- ../basenamePrefix: dev-EOF

mkdir prodcat <<EOF > prod/kustomization.yamlbases:- ../basenamePrefix: prod-EOF

72

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

73

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

KustomizeSolves: how to manage YAML complexity while still remaining Declarative. Keep your configs DRY.

74

75

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL — 75

© 2019 NetApp, Inc. All rights reserved. — NETAPP CONFIDENTIAL —

Part 5

Why is it all so

complex?

Shut up, Jeff

DEPLOY WITH A SIMPLEgit push nks master

Summary

77

1. Kubernetes is a “space shuttle” design2. There are a plethora of dev-focused tools3. No one tool does it all4. Some tools reduce the amount of YAML5. Others obviate YAML altogether6. To make k8s approachable to devs we

need to combine multiple approaches

YAML is Optional Exploring an App Developer's Kubernetes Options

A link to this deck is bit.ly/2NPZTWE