Kubernetes

Fırat KÜÇÜK

Agenda

  • Containers Recap
  • What is Kubernetes?
  • Installing a Kubernetes
  • Pods
  • Services
  • Deployment
  • Ecosystem
  • What's Next?

Containers Recap

Containers Recap

Creating a node app

var http = require('http');

// Create a server object:
http.createServer(function (req, res) {
  res.write('<body>Hello World!</body>'); // Write a response to the client
  res.end(); // End the response
}).listen(80); // Server listens on port 80

console.log('Server started');

Containers Recap

Dockerfile

FROM node:10

ADD server.js server.js

EXPOSE 8080

CMD [ "node", "server.js" ]

Containers Recap

Building image

docker build -t firatkucuk/node-server:1.0 .
docker image ls

Containers Recap

Creating a container

docker run -d --name my-node-server -p 8181:80 firatkucuk/node-server:1.0

Containers Recap

pushing to docker hub

docker login
docker push firatkucuk/node-server:1.0

What is Kubernetes?

Greek: Helmsman / Captain

What is Kubernetes?

What is Kubernetes?

container orchestration

Cloud Native

What is Kubernetes?

What is Kubernetes?

Kubernetes

K8s

What is Kubernetes?

Installing Kubernetes

kubectl usage

Pods

Pods

Pods

apiVersion: v1
kind: Pod
metadata:
  name: my-node-server-pod
spec:
  containers:
    - name: my-node-server-container
      image: firatkucuk/node-server:1.0
      ports:
        - name: http
          containerPort: 80
          protocol: TCP
kubectl apply -f 1-node-server-pod.yml
kubectl describe pods/my-node-server-pod
curl http://podip

Services

Services

apiVersion: v1
kind: Pod
metadata:
  name: my-node-server-pod-with-label
  labels:
    app: my-node-server
spec:
  containers:
    - name: my-node-server-container
      image: firatkucuk/node-server:1.0
      ports:
        - name: http
          containerPort: 80
          protocol: TCP

Pod with labels

kubectl apply -f 1-node-server-pod-with-label.yml

Services

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
spec:
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Service proxies requests

kubectl apply -f 2-node-server-service.yml

Deployment

Declares the desired states of pods

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-node-server-deployment
  labels:
    app: my-node-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-node-server
  template:
    metadata:
      labels:
        app: my-node-server
    spec:
      containers:
      - name: my-node-server-container
        image: nginx:1.14.2
        ports:
        - containerPort: 80
kubectl apply -f 1-node-server-deploy.yml
# tmux
kubectl delete pod pod-name
# watch the state

Deployment

kubectl scale --replicas=10 deploy/my-node-server-deployment

Imperative scaling vs declarative scaling

Basic Load Balancing

Basic Load Balancing

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-node-server-deployment
  labels:
    app: my-node-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-node-server
  template:
    metadata:
      labels:
        app: my-node-server
    spec:
      containers:
      - name: my-node-server-container
        image: firatkucuk/node-server:1.0
        ports:
        - containerPort: 80
kubectl apply -f 1-node-server-deploy.yml

Basic Load Balancing

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
spec:
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
kubectl apply -f 2-node-server-service.yml

Exposing NodePort

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
spec:
  type: NodePort
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30007
kubectl apply -f 2-node-server-service.yml

Managed Kubernetes

  • Amazon EKS
  • Google GKE
  • Azure AKS
  • Digital Ocean
  • Linode
  • ...

Let's create a managed cluster on DO

Load Balancer Service

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
spec:
  type: LoadBalancer
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
kubectl apply -f 2-node-server-service.yml

Ingress

Ingress

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
spec:
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
kubectl apply -f 2-node-server-service.yml

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: "mydomain.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: my-node-server-service
            port:
              number: 80
kubectl apply -f 3-ingress-definition.yml

Namespaces

kubectl get namespaces
kubectl create namespace my-project

Namespaces

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-node-server-deployment
  namespace: my-project
  labels:
    app: my-node-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-node-server
  template:
    metadata:
      labels:
        app: my-node-server
    spec:
      containers:
      - name: my-node-server-container
        image: firatkucuk/node-server:1.0
        ports:
        - containerPort: 80
kubectl apply -f 1-node-server-deploy.yml

Namespaces

apiVersion: v1
kind: Service
metadata:
  name: my-node-server-service
  namespace: my-project
spec:
  selector:
    app: my-node-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
kubectl apply -f 2-node-server-service.yml

What's next?

  • Stateful container management and volumes
  • Rolling update / zero downtime deployments
  • Rollback the deployments
  • Kubernetes Cronjobs
  • Kubernetes Secrets
  • Istio and Service Mesh

Thank you
Dankuwel

Danke schön

Teşekkürler

@fplusplus

firat.io

firatkucuk@gmail.com

Code

By Fırat KÜÇÜK

Code

  • 127