Skip to content

Kubernetes Management Techniques

Run, Expose, and Create Generators

  • These commands use helper templates called "generators"
  • Every resource in kubernetes has a specification or "spec"

    • kubectl create deployment sample --image nginx --dry-run -o yaml
  • You can output those templates with --dry-run -o yaml
  • You can use those YAML defaults as a starting point
  • Generators are "opinionated defaults"

Generator Examples

  • Using dry-run with yaml output we can see the generators

    • kubectl create deployment test --image nginx --dry-run -o yaml
    • kubectl create job test --image nginx --dry-run -o yaml
    • kubectl expose deployment/test --port 80 --dry-run -o yaml

The Future of kubectl run

  • Right now (1.12-1.15) run is in a state of flux
  • The goal is to reduce its features to only create pods

    • Right now its defaults to creating Deployments (with the warning)
    • It has lots of generators but they are all deprecated
    • The idea is to make it easy like docker run for one-off tasks
  • It's not recommended for production
  • Use for simple dev/test or troubleshooting pods

Old Run Confusion

  • The generators activate different Controllers based on options
  • Using dry-run we can see which generators are used

    • kubectl run test --image nginx --dry-run
    • kubectl run test --image nginx --port 80 expose --dry-run
    • kubectl run test --image nginx --restart OnFailure --dry-run
    • kubectl run test --image nginx --restart Never --dry-run
    • kubectl run test --image nginx --schedule "*/1 * * * *" --dry-run

Imperative vs Declaritive

  • Imperative: Focus on how a program operates
  • Declarative: Focus on what a program should accomplish
  • Example: "I'd like a cup of coffee"
  • Imperative: I boil water, scoop out 42 grams of medium-fine grounds, pour over 700 grams of water, etc.
  • Declarative: "Barista, I'd like a cup of coffee (barista is the engine that works through the steps, including retrying to make a cup and is only finished when I have a cup)"

Kubernetes Imperative

  • Examples: kubectl run, kubectl create deployment, kubectl update

    • We start with a state we know (no deployments exist)
    • We ask kubectl run to create a deployment
  • Different commands are required to change that deployment
  • Different commands are required per object
  • Imparitive is easier when you know the state
  • Imparitive is easier to get started
  • Imparative is easier for humans at the CLI
  • Imperative is NOT easy to automate

Kubernetes Declarative

  • Example: kubectl apple -f my-resources.yaml

    • We don't know the current state
    • We only know what we want the end result to be (yaml contents)
  • Same command each time (tiny exception for delete)
  • Resources can be all in a file, or many files (apply a whole dir)
  • Requires understanding the YAML keys and values
  • More work than kubectl run for just starting a pod
  • The easiest way to automate
  • The eventual path to GitOps hapinness

Management Approaches

  • Imperative commands: run, expose, scale, edit, create deployment

    • Best for dev/learning/personal projects
    • Easy to learn, hardest to manage over time
  • Imperative objects: create -f file.yml, replace -f file.yml, delete...

    • Good for prod of small environments, single file per command
    • Store your changes in git-based yaml files
    • Hard to automate
  • Declarative objects: apply -f file or dir, diff

    • Best for prod, easier to automate
    • Harder to understand and predict changes
  • Most important rule

    • DOn't mix the three approaches
    • Learn the Imperative CLI for easy control of local and test setups
    • Move to apply -f file.yml and apply -f directoryfor prod
    • Store yaml in git, git commit each change before
    • THis trains you later doing GitOPs (where git commits are automatically applied to clusters)