Slide 1

Slide 1 text

Kubernetes Anywhere! Ilya Dmitrichenko Kubernetes Anywhere: Cluster portability with Weave Net @errordeveloper 20/01/2016

Slide 2

Slide 2 text

Problem Outline • Overview of Kubernetes cluster architecture • Decisions to be made when deploying a cluster • Variety of existing examples on the Internet

Slide 3

Slide 3 text

Problem Outline • Overview of Kubernetes cluster architecture • Decisions to be made when deploying a cluster • Variety of existing examples on the Internet

Slide 4

Slide 4 text

Problem Outline • Overview of Kubernetes cluster architecture • Decisions to be made when deploying a cluster • Variety of existing examples on the Internet

Slide 5

Slide 5 text

Problem Outline • Let’s make cluster deployment • simpler to implement in any environment • more robust and easier to manage

Slide 6

Slide 6 text

Architecture Overview

Slide 7

Slide 7 text

Main Kubernetes Cluster Components

Slide 8

Slide 8 text

etcd1 etcd2 etcd3

Slide 9

Slide 9 text

API Server [kube-apiserver] etcd1 etcd2 etcd3

Slide 10

Slide 10 text

Scheduler [kube-scheduler] API Server [kube-apiserver] etcd1 etcd2 etcd3

Slide 11

Slide 11 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] etcd1 etcd2 etcd3

Slide 12

Slide 12 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes etcd1 etcd2 etcd3

Slide 13

Slide 13 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes [kube-proxy] etcd1 etcd2 etcd3

Slide 14

Slide 14 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes [kube-proxy] [kubelet] etcd1 etcd2 etcd3

Slide 15

Slide 15 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes [kube-proxy] [kubelet] etcd1 etcd2 etcd3

Slide 16

Slide 16 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes [kube-proxy] [kubelet] etcd1 etcd2 etcd3

Slide 17

Slide 17 text

Controller Manager [kube-controller-manager] Scheduler [kube-scheduler] API Server [kube-apiserver] Cluster Nodes [kube-proxy] [kubelet] etcd1 etcd2 etcd3

Slide 18

Slide 18 text

kube-apiserver [...] \ --etcd-servers=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 kube-controller-manager [...] \ --master=http://localhost:8080 kube-scheduler [...] \ --master=http://localhost:8080 kube-proxy [...] \ --master=http://kube0:8080 kubelet [...] \ --api-servers=http://kube0:8080 etcd1:2379 etcd2:2379 etcd3:2379 Cluster Component Discovery Options

Slide 19

Slide 19 text

kube-apiserver [...] \ --etcd-servers=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 kube-controller-manager [...] \ --master=http://localhost:8080 kube-scheduler [...] \ --master=http://localhost:8080 kube-proxy [...] \ --master=http://kube0:8080 kubelet [...] \ --api-servers=http://kube0:8080 etcd1:2379 etcd2:2379 etcd3:2379 etcdX.cluster.internal Master kube0.cluster.internal [172.17.28.0.14] Nodes kubeX.cluster.internal [172.17.28.0.0/16]

Slide 20

Slide 20 text

Deployment Choices • Which cloud? May be PaaS? What instance size? • Overlay network? What’s the L3 vs L2 again? • Virtualised or may be actually bare-metal?

Slide 21

Slide 21 text

Deployment Choices • Can I use my favourite Linux distribution? • Is CoreOS so much better or may be Atomic is? • Deployment automation? I might like to try X…

Slide 22

Slide 22 text

More Questions!? • How to CI/CD? …I still barely understand those! • May be Mesos would be easier? • How to docker my DB? How do I backup etcd?

Slide 23

Slide 23 text

Existing Examples github.com/kubernetes/kubernetes

Slide 24

Slide 24 text

repo: github.com/kubernetes/kubernetes code: cluster/rackspace/cloud-config/node-cloud-config.yaml - path: /opt/bin/regen-apiserver-list.sh permissions: 0755 content: | #!/bin/sh m=$(echo $(etcdctl ls --recursive /corekube/apiservers \ | cut -d/ -f4 | sort) | tr ' ' ,) mkdir -p /run/kubelet echo "APISERVER_IPS=$m" > /run/kubelet/apiservers.env echo “FIRST_APISERVER_URL=https://${m%%\,*}:6443” \ >> /run/kubelet/apiservers.env

Slide 25

Slide 25 text

repo: github.com/kubernetes/kubernetes code: cluster/rackspace/cloud-config/node-cloud-config.yaml - name: kubelet-sighup.path command: start content: | [Path] PathChanged=/run/kubelet/apiservers.env - name: kubelet-sighup.service command: start content: | [Service] ExecStart=/usr/bin/pkill -SIGHUP -f kubelet

Slide 26

Slide 26 text

repo: github.com/kubernetes/kubernetes code: cluster/rackspace/cloud-config/node-cloud-config.yaml - name: kube-proxy-sighup.path command: start content: | [Path] PathChanged=/run/kubelet/apiservers.env - name: kube-proxy-sighup.service command: start content: | [Service] ExecStart=/usr/bin/pkill -SIGHUP -f kube-proxy

Slide 27

Slide 27 text

repo: github.com/kubernetes/kubernetes code: cluster/rackspace/cloud-config/kubelet.service ... [Service] EnvironmentFile=/run/kubelet/apiservers.env ExecStartPre=/run/config-kubelet.sh ExecStart=/opt/bin/kubelet \ --address=$private_ipv4 \ --api-servers=${FIRST_APISERVER_URL} \ ...

Slide 28

Slide 28 text

repo: github.com/kubernetes/kubernetes code: cluster/aws/util.sh function get_elbs_in_vpc { # ELB doesn't seem to be on the same platform as the rest of AWS; doesn't support filtering aws elb --output json describe-load-balancers | \ python -c "import json,sys; lst = [str(lb['LoadBalancerName']) for lb in json.load(sys.stdin) ['LoadBalancerDescriptions'] if lb['VPCId'] == '$1']; print('\n'.join(lst))" }

Slide 29

Slide 29 text

repo: github.com/kubernetes/kubernetes code: cluster/aws/util.sh function wait-master() { detect-master > $LOG # TODO(justinsb): This is really not necessary any more # Wait 3 minutes for cluster to come up. We hit it with a "highstate" after that to # make sure that everything is well configured. # TODO: Can we poll here? local i for (( i=0; i < 6*3; i++)); do printf "." sleep 10 done echo "Re-running salt highstate" ssh -oStrictHostKeyChecking=no -i "${AWS_SSH_KEY}" ${SSH_USER}@${KUBE_MASTER_IP} \ sudo salt '*' state.highstate > $LOG # This might loop forever if there was some uncaught error during start up until $(curl --insecure --user ${KUBE_USER}:${KUBE_PASSWORD} --max-time 5 \ --fail --output $LOG --silent https://${KUBE_MASTER_IP}/healthz); do printf "." sleep 2 done }

Slide 30

Slide 30 text

> wc -l cluster/{gce,aws}/util.sh 1493 cluster/gce/util.sh 1449 cluster/aws/util.sh repo: github.com/kubernetes/kubernetes Many lines of fun!

Slide 31

Slide 31 text

> find cluster/saltbase -name “*.sls”\ | wc -l 42 ## Salt YAML files > find cluster/saltbase -name “*.sls”\ | xargs cat | wc -l 1529 ## Lines of YAML repo: github.com/kubernetes/kubernetes Have you done any Salt?

Slide 32

Slide 32 text

How about “non-official” ones? github.com/ansibl8s/setup-kubernetes github.com/Samsung-AG/kraken github.com/coreos/coreos-kubernetes Plenty of great examples if you’d like some of: Ansible and/or CoreOS and maybe Terrform… (Those are just the ones I had a brief look at)

Slide 33

Slide 33 text

Oh… and you still need to chose and figure out all the other things!

Slide 34

Slide 34 text

Kubernetes Anywhere github.com/weaveworks/weave-kubernetes-anywhere

Slide 35

Slide 35 text

Project Goals • Dramatically simplify Kubernetes deployment • Easiest way to get started • Scale-out to any infrastructure seamlessly

Slide 36

Slide 36 text

Project Goals • Enable complete portability, zero config • Allow user to move or clone the entire cluster • Make TLS setup fully transparent

Slide 37

Slide 37 text

Approach • 100% containerised deployment • Use Weave Net as a cluster management network • Works with any provisioning/config tools

Slide 38

Slide 38 text

Kubernetes Anywhere in a nutshell

Slide 39

Slide 39 text

Step 1: Infrastructure Setup Let's say you'd like to have a cluster of 5 servers with Docker installed • 3 dedicated etcd hosts ($KUBE_ETCD_1, $KUBE_ETCD_2, $KUBE_ETCD_3) • 1 host running all master components ($KUBE_MASTER_0) • 2 worker nodes ($KUBE_WORKER_1, $KUBE_WORKER_2)

Slide 40

Slide 40 text

Step 2: Install Weave Net On all of the machines run: sudo curl --location --silent git.io/weave \ --output /usr/local/bin/weave sudo chmod +x /usr/local/bin/weave

Slide 41

Slide 41 text

Step 3: Launch Weave Net On all of the machines run: weave launch-router \ $KUBE_ETCD_1 $KUBE_ETCD_2 $KUBE_ETCD_3 \ $KUBE_MASTER_0 \ $KUBE_WORKER_1 $KUBE_WORKER_2 weave launch-proxy --rewrite-inspect weave expose -h "$(hostname).weave.local" eval $(weave env)

Slide 42

Slide 42 text

Step 3: Launch etcd cluster On each of the 3 etcd hosts run these commands in turns: docker run -d -e ETCD_CLUSTER_SIZE=3 \ --name=etcd1 weaveworks/kubernetes-anywhere:etcd docker run -d -e ETCD_CLUSTER_SIZE=3 \ --name=etcd2 weaveworks/kubernetes-anywhere:etcd docker run -d -e ETCD_CLUSTER_SIZE=3 \ --name=etcd3 weaveworks/kubernetes-anywhere:etcd

Slide 43

Slide 43 text

Step 4: Master components On $KUBE_MASTER_0 run these Docker commands: docker run -d --name=kube-apiserver \ -e ETCD_CLUSTER_SIZE=3 \ weaveworks/kubernetes-anywhere:apiserver docker run -d --name=kube-controller-manager \ weaveworks/kubernetes-anywhere:controller-manager docker run -d --name=kube-scheduler \ weaveworks/kubernetes-anywhere:scheduler

Slide 44

Slide 44 text

Step 5.1: Worker components On $KUBE_WORKER_1 and $KUBE_WORKER_2 run: docker run \ --volume="/:/rootfs" \ --volume="/var/run/weave/weave.sock:/weave.sock" \ weaveworks/kubernetes-anywhere:tools \ setup-kubelet-volumes

Slide 45

Slide 45 text

Step 5.2: Worker components On $KUBE_WORKER_1 and $KUBE_WORKER_2 run kubelet: docker run -d \ --name=kubelet \ --privileged=true --net=host --pid=host \ --volumes-from=kubelet-volumes \ weaveworks/kubernetes-anywhere:kubelet

Slide 46

Slide 46 text

Step 5.3: Worker components On $KUBE_WORKER_1 and $KUBE_WORKER_2 run kube-proxy: docker run -d \ --name=kube-proxy \ --privileged=true --net=host --pid=host \ weaveworks/kubernetes-anywhere:proxy

Slide 47

Slide 47 text

Step 6: Live demo!

Slide 48

Slide 48 text

Try it yourself! github.com/weaveworks/weave-kubernetes-anywhere @errordeveloper @weaveworks