Distributed Node #7

Kubernetes

Agenda:

  • Intro

  • Scaling & High availability

  • Kubernetes

  • Wrapping our current configuration to a K8S YAML

  • Monitoring tools

Intro

What if a server can't handle all user connections?

WS

WS

...lots of people..

Can we increase server resources?

How to handle high load?

HTTP

This is OK

I will add 128 GB RAM and more replace the CPU AMD Ryzen 9 3950X

Dinesh

Replacing hardware will require downtime,

lets add some separate cheap servers

Gilfoyle

ANTON

Horizontal Scaling

Vertical Scaling

VS

No limitation of horizontal scaled instances Hardware limitation
It is difficult to implement It is easy to implement
It is costlier, as new server racks comprises of a lot of resources It is cheaper as we need to just add new resources
It takes more time to be done It takes less time to be done
No downtime Downtime

Which one is your choice ?

Examples

Horizontal scaling is almost always more desirable than vertical scaling because you don’t get caught in a resource deficit. 

Scaling the Chat container

Chat Docker image

Container 1

Container 3

Container 2

Using the Docker

Easy!

docker run -p 3030:8080 -d localhost:32000/node-web-app:latest
docker run -p 3031:8080 -d localhost:32000/node-web-app:latest
docker run -p 3032:8080 -d localhost:32000/node-web-app:latest

Just create several instances of our chat containers on different ports

Right?

What if I want to run them on different hosts, how to organize the communication?

How to monitor and restart failed containers without manual actions ?

How to update the application automatically without downtime?

Auto-scale?

Load balancing?

Configuration stores?

SLI/SLO ?

Secrets?

There is a tool

with all these things!

Local development

Using Docker

Using docker-compose

Orchestration using Kubernetes

Kubernetes Alternatives?

But Kubernetes is still the gold standart

What clouds support Kubernetes?

Clouds services for Kubernetes

Amazon Elastic Kubernetes Service (EKS)

Azure Kubernetes Service (AKS)

Google Kubernetes Engine (GKE)

Container Service for Kubernetes (ACK)

Oracle Kubernetes Engine

Our strategy

1. Build a Docker chat image

2. Push it to a registry

3. Start a Kubernetes cluster

4. Create a Deployment configuration YAML file

5. Setup a replication factor 2 for the Chat Pod

6. Apply YAML config using kubectl CLI

7. Kill a chat Pod and watch how Kubernetes handles it

Kubernetes time 

Kubernetes, also known as K8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

It groups containers that make up an application into logical units for easy management and discovery. Kubernetes builds upon 15 years of experience running production workloads at Google, combined with best-of-breed ideas and practices from the community.

Planet Scale

Designed on the same principles that allow Google to run billions of containers a week, Kubernetes can scale without increasing your ops team.

Never Outgrow

Whether testing locally or running a global enterprise, Kubernetes flexibility grows with you to deliver your applications consistently and easily no matter how complex your need is.

Run K8s Anywhere

Kubernetes is open source giving you the freedom to take advantage of on-premises, hybrid, or public cloud infrastructure, letting you effortlessly move workloads to where it matters to you.

Kubernetes Features

IPv4/IPv6 dual-stack

Automated rollouts and rollbacks

Batch execution

Service Topology

Service discovery and load balancing

Horizontal scaling

Secret and configuration managment

Storage orchestration

Self-healing

Automatic bin packing

K8s Architecture and main components overview

Official diagram from kubernetes.io

Worker machine in K8s cluster

Node

DB

Pod

My app

Pod

  • each Node has multiple Pods on it
  • 3 processes must be installed on every Node
  • Worker Nodes do the actual work

Container runtime

Kubelet:

- interacts with both - container and Node

- starts the pod with a container inside

Processes

Worker machine in K8s cluster

Node 1

DB

Pod

My app

Pod

Container runtime

Processes

Usually, there are multiple Nodes

Node 2

DB

Pod

My app

Pod

Container runtime

Processes

?

So, how to interact with a cluster?

How to:

  • schedule Pod
  • monitor
  • re-schedule/re-start Pod
  • join a new Node

And the answer is

all managing processes are done by Master Node

Master node (4 processes)

Node 1

Pod

Processes

Master Node

Pod

Node 2

Pod

Processes

Pod

Api Server

Client (kubelet, k8s API)

  • cluster gateway
  • acts as a gatekeeper for authentication

Some request

Api Server

validates request

..other processes..

Master node (4 processes)

Node 1

Pod

Processes

Master Node

Pod

Node 2

Pod

Processes

Pod

Api Server

Schedule new Pod

Api Server

Scheduler

Where to put the Pod?

Scheduler

60% used

30% used

Kubelet

Master node (4 processes)

Node 1

Pod

Processes

Master Node

Pod

Node 2

Pod

Processes

Pod

Api Server

Controller Manager

Scheduler

Scheduler

Kubelet

Controller Manager

detect cluster state changes

60% used

30% used

Master node (4 processes)

Node 1

Pod

Processes

Master Node

Pod

Node 2

Pod

Processes

Pod

Api Server

Scheduler

Controller Manager

60% used

30% used

etcd

Key Value Store

  • etcd is the cluster "brain"
  • Cluster changes get stored in the key value store
  • What resources are available?
  • Dod the cluster state change?e store

Cluster example

Minikube and kubectl

Production Cluster setup

Node

Pod

Processes

Master

Pod

Api Server

Scheduler

Controller Manager

etcd

Master

Api Server

Scheduler

Controller Manager

etcd

Node

Pod

Processes

Pod

Node

Pod

Processes

Pod

  • Multiple Master and Worker nodes
  • Separate virtual or physical machines

Test/Local Cluster setup: Minikube

Node

Pod

Processes

Pod

Master processes

Master and Node processes run on ONE machine

  • creates a Virtual Box (or Hyper-V) on your laptop
  • Node runs in that Virtual Box
  • 1 Node K8s Cluster
  • for testing purposes

Minikube:

Test/Local Cluster setup: kubectl

Node

Pod

Processes

Pod

Service

Secret

ConfigMap

Command-line tool for K8s cluster

Master processes - API Server enables interaction with the cluster 

Api Server

Scheduler

Controller Manager

etcd

UI

API

CLI (kubectl)

Kubectl

Kubectl controls the Kubernetes cluster manager

kubectl create deployment nginx --image=nginx # Create NGINX deployment with 1 Pod (1 Container)

kubectl scale --replicas=3 deployment/nginx # Scale current NGINX servers to 3 replicas 

kubectl delete deployment/nginx # delete everything

Installation

Main kubectl commands

 kubectl Cheat Sheet

K8s YAML configuration file

YAML

Instead of writing commands every time from scratch we can save them to a YAML file, and commit to the GitHub

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: default
  name: client-app
  labels:
    app: client-app

spec:
  replicas: 1
  selector:
    matchLabels:
      app: client-app
  template:
    metadata:
      labels:
        app: client-app
    spec:
      containers:
        - name: client-app
          image: iivashchuk/jsprocamp-client-app
          env:
            - name: API_HOST
              value: "chat-service" 
            - name: API_PORT
              value: "3001" 
          ports:
            - name: web
              containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: client-app

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: client-app
  type: LoadBalancer
  

Helm is a tool for managing Charts. Charts are packages of pre-configured Kubernetes resources.

Use Helm to:

  • Find and use popular software packaged as Helm Charts to run in Kubernetes
  • Share your own applications as Helm Charts
  • Create reproducible builds of your Kubernetes applications
  • Intelligently manage your Kubernetes manifest files
  • Manage releases of Helm packages

Helm usages:

$ helm repo add bitnami https://charts.bitnami.com/bitnami

$ helm install my-release bitnami/mongodb

$ helm install my-redis --set cluster.slaveCount=0 bitnami/redis

Demo: starting the Kubernetes cluster

Useful Tool

Q & A

Distributed Node #7

By Inna Ivashchuk

Distributed Node #7

k8s

  • 546