Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes 101: A gentle introduction

Kubernetes 101: A gentle introduction

An introduction to Kubernetes, as the home for your microservices, presenting the main Kubernetes concepts.

Yorgos Saslis

November 09, 2017
Tweet

More Decks by Yorgos Saslis

Other Decks in Programming

Transcript

  1. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    A HOME FOR YOUR MICROSERVICES:
    K8S

    View Slide

  2. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    BORING
    2

    View Slide

  3. View Slide

  4. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    A HOME FOR YOUR MICROSERVICES:
    K8S
    KATE’S
    Woohoo!! click-bait title!!

    View Slide

  5. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    OUR GOAL FOR TODAY
    5

    View Slide

  6. +

    View Slide

  7. View Slide

  8. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    A HOME FOR YOUR CODE
    8

    View Slide

  9. PODS … NOT !!

    View Slide

  10. PODS

    View Slide

  11. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    WORDPRESS_POD.YAML
    11
    metadata:
    labels:
    app: wordpress
    tier: frontend
    spec:
    containers:
    - image: wordpress:4.8.0-apache
    name: wordpress
    env:
    - name: WORDPRESS_DB_HOST
    value: wordpress-mysql
    - name: WORDPRESS_DB_PASSWORD
    value: a super secure password for my mysql 1
    Labels: for reporting + 

    linking to other components
    Docker image
    env vars

    View Slide

  12. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    12
    A HOME FOR YOUR CONFIG

    View Slide

  13. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    CONFIG MAPS
    13
    kind: ConfigMap
    apiVersion: v1
    metadata:
    name: logstash-config
    namespace: default
    data:
    log4j2_properties: |-
    status = error
    name = LogstashPropertiesConfig
    appender.console.type = Console
    appender.console.name = plain_console
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %m%n
    rootLogger.level = FATAL
    rootLogger.appenderRef.console.ref = ${sys:ls.log.format}_console
    definition
    data

    View Slide

  14. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    SECRETS
    14
    apiVersion: v1
    kind: Secret
    metadata:
    name: wordpress-pass
    type: Opaque
    data:
    password.txt: #base64 encoded
    1. DEFINE
    env:
    - name: WORDPRESS_DB_PASSWORD
    valueFrom:
    secretKeyRef:
    name: wordpress-pass
    key: password.txt
    env:
    - name: WORDPRESS_DB_HOST
    value: wordpress-mysql
    - name: WORDPRESS_DB_PASSWORD
    value: a super secure password…
    2. USE

    View Slide

  15. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    A HOME FOR YOUR NETWORK
    15

    View Slide

  16. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    SERVICES
    16

    View Slide

  17. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    SERVICES
    17
    Provide Internal Load-Balancing
    Distribute traffic to Pods with specific labels
    Port mappings
    Can be bound to external Load Balancer (AWS ELB/
    ALB, Google LB, etc.)

    View Slide

  18. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    PORTS
    18
    spec:
    containers:
    - image: wordpress:4.8.0-apache
    name: wordpress
    ports:
    - containerPort: 80
    name: wordpress
    define ports on container

    View Slide

  19. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    SERVICES
    19
    apiVersion: v1
    kind: Service
    metadata:
    name: wordpress
    labels:
    app: wordpress
    spec:
    ports:
    - port: 80
    selector:
    app: wordpress
    tier: frontend
    type: LoadBalancer
    bind to pods
    ports the service listens on
    ( )

    View Slide

  20. >> Yorgos Saslis | @gsaslis |DevStaff Meetup, Heraklion, Crete
    SERVICES
    20
    http://wordpress:80
    Wordpress
    Pod 1
    Wordpress
    Pod n

    View Slide

  21. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    21
    A HOME FOR YOUR STORAGE

    View Slide

  22. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    VOLUMES
    “Same” as docker volumes
    Same lifecycle as Pod. Persists
    across restarts.
    Not same lifecycle as Container.
    Works fine on “localhost”.
    22
    apiVersion: v1
    kind: Pod
    metadata:
    name: test-pd
    spec:
    containers:
    - image: gcr.io/google_containers/
    test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
    name: cache-volume
    volumes:
    - name: cache-volume
    emptyDir: {}

    View Slide

  23. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    PERSISTENT VOLUMES
    Persist across nodes. Lifecycle outlasts pod.
    23
    spec:
    containers:
    - image: wordpress:4.8.0-apache
    name: wordpress
    volumeMounts:
    - name: wordpress-persistent-storage
    mountPath: /var/www/html
    volumes:
    - name: wordpress-persistent-storage
    persistentVolumeClaim:
    claimName: wp-pv-claim

    View Slide

  24. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    A HOME FOR YOUR WORK(LOAD)
    24

    View Slide

  25. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    JOBS
    A job creates one or more pods and ensures that a
    specified number of them successfully terminate.
    As pods successfully complete, the job tracks the
    successful completions.
    When a specified number of successful completions is
    reached, the job itself is complete.
    Use cases: long-running background jobs (e.g.
    migrations, cleanups, etc.)
    25

    View Slide

  26. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    DEPLOYMENT
    Uses ReplicaSets / ReplicationController
    Ensures a specified number of pod replicas are running
    at any one time.
    Homogeneous pods, always up and available. (if one
    crashes, starts a new one).
    Supports rolling updates.
    Canary updates possible through Deployments.
    26

    View Slide

  27. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    STATEFUL SET
    identical container spec, but unique identity for each pod
    ordinal index
    stable network id
    stable storage
    Deployment guarantees:
    Pods created sequentially, in order, from {0..N-1}.
    Pods are terminated in reverse order, from {N-1..0}.
    Before scaling, all predecessors must be Running and Ready.
    Before termination, all successors must be completely shutdown.
    27

    View Slide

  28. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    DAEMON SET
    Ensures that all (or some) Nodes run a copy of a Pod.
    Some typical uses of a DaemonSet are:
    cluster storage daemon, such as glusterd, ceph, on each node.
    logs collection daemon on every node, such
    as fluentd or logstash.
    node monitoring daemon, such as Prometheus Node
    Exporter, collectd, Datadog agent, New Relic agent, or
    Ganglia gmond.
    28

    View Slide

  29. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    SO, BACK TO
    WORDPRESS…
    29

    View Slide

  30. >> Yorgos Saslis | @gsaslis | DevStaff Meetup, Heraklion, Crete
    30

    View Slide

  31. >> Yorgos Saslis | Software Developer | @gsaslis
    THANK YOU!
    31
    Yorgos Saslis

    @gsaslis

    github.com/gsaslis

    View Slide