· Read in about 2 min · (398 words) ·

Best Practices

Everything is Code


  • Copy paste! Easily take concepts from one project and use them in another
  • Source control. See who changed what why.
  • Rebuilding. If you have everything in source control, it becomes way easier to rebuild in case of a disaster.
  • Editing. You know what computers are really good at? Manipulating text. Take advantage of that by expressing everything as text.

And by everything, I mean EVERYTHING that you possibly can. Jenkins jobs, server configuration, Spinnaker pipelines. All of these things can be expressed in text form.


  • Don’t run JVM processes in a memory constrained environment. You will be met with no end of troubles with OutOfMemoryErrors out the wazoo unless you are very knowledgable and careful. Which most of us are not.
  • The JVM is great if your application is allowed to consume the memory of the entire server. But it does not like to share…


Kubernetes Terms

  • k8s - kubernetes
  • daemon set - each instance in the k8s cluster runs an image
  • deployment - similar to spinnaker cluster
  • jobs - containers that will terminate themselves
  • pods - instances
  • replica sets - similar to spinnaker server group (deployments recommended instead)
  • services - load balancers
  • persistent volume claims - when a persistent volume is attached to a pod
  • stateful sets - like deployments, but each instance has a unique identifier (even though they are all formed from the same image)

Helpful Commands

Docker commands

docker ps - list containers

docker run -d -p 8080:8888 IMAGE_NAME - Run a container, binding local port 8080 to container port 8888

docker run -it IMAGE_NAME /bin/bash - Go to bash shell of a new container

docker exec -it CONTAINER_NAME /bin/bash - Go to bash shell of a running container


Port Forwarding

ssh -L <local_port>:localhost:<remote_port> <remote_host>


Kubernetes config files

Extracting a context

kubectl config use-context $CONTEXTNAME
kubectl config view --flatten --minify > $FILENAME

Merging context files

KUBECONFIG=$FILEPATH1:$FILEPATH2 kubectl config view --flatten > $MERGEDFILENAME

Long-lived pods

apiVersion: v1
kind: Pod
  name: testclient
  namespace: default
  - name: python
    image: python:3.7
      - sh
      - -c
      - "exec tail -f /dev/null"


Disable caching

location / {
    expires 0;
    add_header "Cache-Control" "no-cache, no-store, must-revalidate";


git fixup

This will take any changes to files and wrap them back up into the previous commit

git commit -a --fixup HEAD
git rebase -i --autosquash HEAD~2