Skip to content

Moving to Declarative YAML

kubectl apply

  • Remember the three management approaches?
  • Let's skip to full Declarative objects
  • kubectl apply -f filename.yml
  • Why skip kubectl create, kubectl replace, kubectl edit?
  • What I recommend is not equal to all thats possible

Using kubectl apply

  • Create/update resources in a file

    • kubectl apply -f myfile.yaml
  • Create/update a whole directory of yaml

    • kubectl apply -f myyaml/
  • Create/update from a URL

    • kubectl apply -f https://bret.run/pod.yml
  • Be careful, lets look at it first (browser or curl)

    • curl -L https://bret.run/pod

Kubernetes Configuration YAML

  • Kubernetes config file (YAML or JSON)
  • Each file contains one or more manifests
  • Each manifest describes an API object (deployment, job, secret)
  • Each manifest needs four parts (root key:values in the file)

    • apiVersion
    • kind
    • metadata
    • spec

Building your YAML Files

  • kind: We can get a list of resources the cluster supports

    • kubectl api-resources
  • Notice some resoucres have multiple APIs (old vs new)
  • apiVersion We can get the API versions the cluster supports

    • kubectl api-versions
  • metadata: only name is required
  • spec: Where all the action is at!

Buildng your YAML Spec

  • We can get all the keys each kind supports

    • kubectl explain services --recursive
    • kubectl explain services.spec
  • We can walk through the spec this way

    • kubectl explain services.spec.type
  • spec: can have sub spect: of other resources

    • kubectl explain deployment.spec.template.spec.volumes.nfs.server
  • We can also use docs

    • kubernetes.io/docs/reference/#api-reference

Dry Runs and Diffs

  • dry-run a create (client side only)

    • kubectl apply -f app.yml --dry-run
  • dry-run a create/update on server

    • kubectl apply -f app.yml --server-dry-run
  • see a diff visually

    • kubectl diff -f app.yml

Labels and Annotations

  • Labels goes under metadata: in your YAML
  • Simple list of key: value for identifying your resource later by selecting, grouping, or filtering for it
  • Common examples include tier: frontend, app: api, env: prod, customer: acme.co
  • Not meant to hold complex, large, or non-identifying info, which is what annotations are for
  • filter a get command

    • kubectl get pods -l app=nginx
  • apply only matching labels

    • kubectl apply -f myfile.yaml -l app=nginx

Label Selectors

  • The "glue" telling Services and Deployments which pods are theirs
  • Many resources use Label Selectors to "link" resource dependancies
  • You'll see these match up in the Service and Deployment YAML
  • Use Labels and Selectors to control which pods go to which nodes
  • Taints and Tolerations also control node placement