Full Code of kahkhang/kube-linode for AI

master 812ac407badd cached
51 files
340.7 KB
76.7k tokens
1 requests
Download .txt
Showing preview only (360K chars total). Download the full file or copy to clipboard to get everything.
Repository: kahkhang/kube-linode
Branch: master
Commit: 812ac407badd
Files: 51
Total size: 340.7 KB

Directory structure:
gitextract_psepesfk/

├── .gitignore
├── LICENSE
├── README.md
├── display.sh
├── install-coreos.sh
├── kube-linode.sh
├── linode-utilities.sh
└── manifests/
    ├── alertmanager/
    │   ├── alertmanager-config.yaml
    │   ├── alertmanager-service.yaml
    │   └── alertmanager.yaml
    ├── container-linux/
    │   ├── master-config.yaml
    │   └── worker-config.yaml
    ├── grafana/
    │   ├── grafana-dashboards.yaml
    │   ├── grafana-deployment.yaml
    │   └── grafana-service.yaml
    ├── heapster.yaml
    ├── kube-dashboard.yaml
    ├── kube-state-metrics/
    │   ├── kube-state-metrics-cluster-role-binding.yaml
    │   ├── kube-state-metrics-cluster-role.yaml
    │   ├── kube-state-metrics-deployment.yaml
    │   ├── kube-state-metrics-service-account.yaml
    │   └── kube-state-metrics-service.yaml
    ├── node-exporter/
    │   ├── node-exporter-daemonset.yaml
    │   └── node-exporter-service.yaml
    ├── prometheus/
    │   ├── prometheus-k8s-ingress.yaml
    │   ├── prometheus-k8s-role-bindings.yaml
    │   ├── prometheus-k8s-roles.yaml
    │   ├── prometheus-k8s-rules.yaml
    │   ├── prometheus-k8s-service-account.yaml
    │   ├── prometheus-k8s-service-monitor-alertmanager.yaml
    │   ├── prometheus-k8s-service-monitor-apiserver.yaml
    │   ├── prometheus-k8s-service-monitor-kube-controller-manager.yaml
    │   ├── prometheus-k8s-service-monitor-kube-scheduler.yaml
    │   ├── prometheus-k8s-service-monitor-kube-state-metrics.yaml
    │   ├── prometheus-k8s-service-monitor-kubelet.yaml
    │   ├── prometheus-k8s-service-monitor-node-exporter.yaml
    │   ├── prometheus-k8s-service-monitor-prometheus-operator.yaml
    │   ├── prometheus-k8s-service-monitor-prometheus.yaml
    │   ├── prometheus-k8s-service-monitor-rook.yaml
    │   ├── prometheus-k8s-service-monitor-traefik.yaml
    │   ├── prometheus-k8s-service.yaml
    │   └── prometheus-k8s.yaml
    ├── prometheus-operator/
    │   ├── prometheus-operator-cluster-role-binding.yaml
    │   ├── prometheus-operator-cluster-role.yaml
    │   ├── prometheus-operator-service-account.yaml
    │   ├── prometheus-operator-service.yaml
    │   └── prometheus-operator.yaml
    ├── rook/
    │   ├── rook-cluster.yaml
    │   ├── rook-operator.yaml
    │   └── rook-storageclass.yaml
    └── traefik.yaml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
certs/
cluster/
acme.json
auth
settings.env
testing.sh
package.sh
*.zip
demo.mov
resolv.conf
bootkube
manifests/grafana/grafana-credentials.yaml
install.exp
manifests/container-linux/master-config.yaml.bak


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2017 Andrew Low

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
## :whale: Provision a Kubernetes / CoreOS Cluster on Linode
[![Bash](https://img.shields.io/badge/language-Bash-green.svg)](https://github.com/kahkhang/kube-linode)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/kahkhang/kube-linode/master/LICENSE)
[![Gitter](https://img.shields.io/gitter/room/kube-linode/support.svg)](https://gitter.im/kube-linode/support)

Automatically provision a scalable CoreOS/Kubernetes cluster on Linode with zero configuration.

![Demo](demo.gif)

The cluster will comprise of a single Kubernetes master host with a custom number of worker nodes.

### What's included
* [Kubernetes 1.11.0](https://kubernetes.io/) with [Bootkube](https://github.com/kubernetes-incubator/bootkube)
* Load Balancer and automatic SSL/TLS renewal using [Traefik](https://github.com/containous/traefik)
* Distributed block storage with [Rook](https://github.com/rook/rook)
* Pre-configured [Grafana](https://github.com/grafana/grafana) dashboard using [Kube-Prometheus](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus) with Rook and Traefik monitoring
* Basic auth protected subdomains (assuming you are using example.com):
  * https://kube.example.com ([Kubernetes Dashboard](https://github.com/kubernetes/dashboard))
  * https://grafana.example.com ([Grafana](https://github.com/grafana/grafana))
  * https://alertmanager.example.com ([Alert Manager](https://github.com/prometheus/alertmanager))
  * https://prometheus.example.com ([Prometheus Web UI](https://github.com/prometheus/prometheus))
  * https://traefik.example.com ([Traefik Web UI](https://github.com/containous/traefik#web-ui))
### Usage
```sh
git clone https://github.com/kahkhang/kube-linode
cd kube-linode
chmod +x kube-linode.sh
```  
Just run `./kube-linode.sh create` into your console, key in your configuration, then sit back and have a :coffee:!  
Settings are stored in `settings.env`, or you can pass them in as key-value flags as such:  
```sh
./kube-linode.sh --no_of_workers=3 --api_key=12345
```  
To increase the number of workers, modify `NO_OF_WORKERS` in `settings.env` as desired and run `./kube-linode.sh` again.  
Use `kubectl` to control the cluster (e.g. `kubectl get nodes`)  
<hr>

If you want to destroy the cluster created by kube-linode, you can run the following command:
```sh
./kube-linode.sh destroy
```  
A prompt will be given listing all the nodes which will be destroyed upon confirmation  .

### Dependencies
You should have a Linode account, which you can get [here](https://www.linode.com/?r=0affaec6ca42ca06f5f2c2d3d8d1ceb354e222c1).
You should also have an API Key with a valid domain that uses [Linode's DNS servers](https://www.linode.com/docs/networking/dns/dns-manager-overview#set-domain-names-to-use-linodes-name-servers).

OSX: ``` brew install jq openssl curl kubectl ```

Arch Linux: Follow the instructions [here](https://github.com/kahkhang/kube-linode/issues/4#issuecomment-311601422)

### Acknowledgements
This script uses [Bootkube](https://github.com/kubernetes-incubator/bootkube) to bootstrap the initial cluster using [Linode's API](https://www.linode.com/api).


================================================
FILE: display.sh
================================================
#!/bin/bash

_SPINNER_POS=0
spinner() {
    IFS=$'\n'
    local delay=0.05
    local list=( $(echo -e '\xe2\xa0\x8b')
                 $(echo -e '\xe2\xa0\x99')
                 $(echo -e '\xe2\xa0\xb9')
                 $(echo -e '\xe2\xa0\xb8')
                 $(echo -e '\xe2\xa0\xbc')
                 $(echo -e '\xe2\xa0\xb4')
                 $(echo -e '\xe2\xa0\xa6')
                 $(echo -e '\xe2\xa0\xa7')
                 $(echo -e '\xe2\xa0\x87')
                 $(echo -e '\xe2\xa0\x8f'))
    local i=$_SPINNER_POS
    local tempfile
    tempfile=$(mktemp)

    eval $2 >> $tempfile 2>/dev/null &
    local pid=$!

    tput sc
    printf "%s %s" "${list[i]}" "$1"
    tput el
    tput rc

    i=$(($i+1))
    i=$(($i%10))

    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        printf "%s" "${list[i]}"
        i=$(($i+1))
        i=$(($i%10))
        sleep $delay
        printf "\b\b\b"
    done
    _SPINNER_POS=$i

    if [ -z $3 ]; then :; else
      eval $3=\'"$(cat $tempfile)"\'
    fi
    rm $tempfile
}

arrow="$(echo -e '\xe2\x9d\xaf')"
checked="$(echo -e '\xe2\x97\x89')"
unchecked="$(echo -e '\xe2\x97\xaf')"

black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
bold="$(tput bold)"
normal="$(tput sgr0)"
dim=$'\e[2m'

print() {
  echo "$1"
  tput el
}

join() {
  local IFS=$'\n'
  local _join_list
  eval _join_list=( '"${'${1}'[@]}"' )
  local first=true
  for item in ${_join_list[@]}; do
    if [ "$first" = true ]; then
      printf "%s" "$item"
      first=false
    else
      printf "${2-, }%s" "$item"
    fi
  done
}

function gen_env_from_options() {
  local IFS=$'\n'
  local _indices
  local _env_names
  local _checkbox_selected
  eval _indices=( '"${'${1}'[@]}"' )
  eval _env_names=( '"${'${2}'[@]}"' )

  for i in $(gen_index ${#_env_names[@]}); do
    _checkbox_selected[$i]=false
  done

  for i in ${_indices[@]}; do
    _checkbox_selected[$i]=true
  done

  for i in $(gen_index ${#_env_names[@]}); do
    printf "%s=%s\n" "${_env_names[$i]}" "${_checkbox_selected[$i]}"
  done
}

on_default() {
  true;
}

on_keypress() {
  local OLD_IFS
  local IFS
  local key
  OLD_IFS=$IFS
  local on_up=${1:-on_default}
  local on_down=${2:-on_default}
  local on_space=${3:-on_default}
  local on_enter=${4:-on_default}
  local on_left=${5:-on_default}
  local on_right=${6:-on_default}
  local on_ascii=${7:-on_default}
  local on_backspace=${8:-on_default}
  _break_keypress=false
  while IFS="" read -rsn1 key; do
      case "$key" in
      $'\x1b')
          read -rsn1 key
          if [[ "$key" == "[" ]]; then
              read -rsn1 key
              case "$key" in
              'A') eval $on_up;;
              'B') eval $on_down;;
              'D') eval $on_left;;
              'C') eval $on_right;;
              esac
          fi
          ;;
      ' ') eval $on_space ' ';;
      [a-z0-9A-Z\!\#\$\&\+\,\-\.\/\;\=\?\@\[\]\^\_\{\}\~]) eval $on_ascii $key;;
      $'\x7f') eval $on_backspace $key;;
      '') eval $on_enter $key;;
      esac
      if [ $_break_keypress = true ]; then
        break
      fi
  done
  IFS=$OLD_IFS
}

gen_index() {
  local k=$1
  local l=0
  if [ $k -gt 0 ]; then
    for l in $(seq $k)
    do
       echo "$l-1" | bc
    done
  fi
}

control_c() {
  tput cub "$(tput cols)"
  tput el
  stty sane
  tput cnorm
  stty echo
  exit $?
}

select_indices() {
  local _select_list
  local _select_indices
  local _select_selected=()
  eval _select_list=( '"${'${1}'[@]}"' )
  eval _select_indices=( '"${'${2}'[@]}"' )
  local _select_var_name=$3
  eval $_select_var_name\=\(\)
  for i in $(gen_index ${#_select_indices[@]}); do
    eval $_select_var_name\+\=\(\""${_select_list[${_select_indices[$i]}]}"\"\)
  done
}
#!/bin/bash
set -e



on_checkbox_input_up() {
  remove_checkbox_instructions
  tput cub "$(tput cols)"

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
  tput el

  if [ $_current_index = 0 ]; then
    _current_index=$((${#_checkbox_list[@]}-1))
    tput cud $((${#_checkbox_list[@]}-1))
    tput cub "$(tput cols)"
  else
    _current_index=$((_current_index-1))

    tput cuu1
    tput cub "$(tput cols)"
    tput el
  fi

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
}

on_checkbox_input_down() {
  remove_checkbox_instructions
  tput cub "$(tput cols)"

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi

  tput el

  if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
    _current_index=0
    tput cuu $((${#_checkbox_list[@]}-1))
    tput cub "$(tput cols)"
  else
    _current_index=$((_current_index+1))
    tput cud1
    tput cub "$(tput cols)"
    tput el
  fi

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
}

on_checkbox_input_enter() {
  local OLD_IFS
  OLD_IFS=$IFS
  _checkbox_selected_indices=()
  _checkbox_selected_options=()
  IFS=$'\n'

  for i in $(gen_index ${#_checkbox_list[@]}); do
    if [ "${_checkbox_selected[$i]}" = true ]; then
      _checkbox_selected_indices+=($i)
      _checkbox_selected_options+=("${_checkbox_list[$i]}")
    fi
  done

  tput cud $((${#_checkbox_list[@]}-${_current_index}))
  tput cub "$(tput cols)"

  for i in $(seq $((${#_checkbox_list[@]}+1))); do
    tput el1
    tput el
    tput cuu1
  done
  tput cub "$(tput cols)"

  tput cuf $((${#prompt}+3))
  printf "${cyan}$(join _checkbox_selected_options)${normal}"
  tput el

  tput cud1
  tput cub "$(tput cols)"
  tput el

  _break_keypress=true
  IFS=$OLD_IFS
}

on_checkbox_input_space() {
  remove_checkbox_instructions
  tput cub "$(tput cols)"
  tput el
  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    _checkbox_selected[$_current_index]=false
  else
    _checkbox_selected[$_current_index]=true
  fi

  if [ "${_checkbox_selected[$_current_index]}" = true ]; then
    printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
  else
    printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
  fi
}

remove_checkbox_instructions() {
  if [ $_first_keystroke = true ]; then
    tput cuu $((${_current_index}+1))
    tput cub "$(tput cols)"
    tput cuf $((${#prompt}+3))
    tput el
    tput cud $((${_current_index}+1))
    _first_keystroke=false
  fi
}

_checkbox_input() {
  local i
  local j
  prompt=$1
  eval _checkbox_list=( '"${'${2}'[@]}"' )
  _current_index=0
  _first_keystroke=true

  trap control_c SIGINT EXIT

  stty -echo
  tput civis

  print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Press <space> to select, <enter> to finalize)${normal}"

  for i in $(gen_index ${#_checkbox_list[@]}); do
    _checkbox_selected[$i]=false
  done

  if [ -n "$3" ]; then
    eval _selected_indices=( '"${'${3}'[@]}"' )
    for i in ${_selected_indices[@]}; do
      _checkbox_selected[$i]=true
    done
  fi

  for i in $(gen_index ${#_checkbox_list[@]}); do
    tput cub "$(tput cols)"
    if [ $i = 0 ]; then
      if [ "${_checkbox_selected[$i]}" = true ]; then
        print "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$i]} ${normal}"
      else
        print "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$i]} ${normal}"
      fi
    else
      if [ "${_checkbox_selected[$i]}" = true ]; then
        print " ${green}${checked}${normal} ${_checkbox_list[$i]} ${normal}"
      else
        print " ${unchecked} ${_checkbox_list[$i]} ${normal}"
      fi
    fi
    tput el
  done

  for j in $(gen_index ${#_checkbox_list[@]}); do
    tput cuu1
  done

  on_keypress on_checkbox_input_up on_checkbox_input_down on_checkbox_input_space on_checkbox_input_enter
}

checkbox_input() {
  _checkbox_input "$1" "$2"
  _checkbox_input_output_var_name=$3
  select_indices _checkbox_list _checkbox_selected_indices $_checkbox_input_output_var_name
  unset _checkbox_list
  unset _break_keypress
  unset _first_keystroke
  unset _current_index
  unset _checkbox_input_output_var_name
  unset _checkbox_selected_indices
  unset _checkbox_selected_options
}

checkbox_input_indices() {
  _checkbox_input "$1" "$2" "$3"
  _checkbox_input_output_var_name=$3

  eval $_checkbox_input_output_var_name\=\(\)
  for i in $(gen_index ${#_checkbox_selected_indices[@]}); do
    eval $_checkbox_input_output_var_name\+\=\(${_checkbox_selected_indices[$i]}\)
  done

  unset _checkbox_list
  unset _break_keypress
  unset _first_keystroke
  unset _current_index
  unset _checkbox_input_output_var_name
  unset _checkbox_selected_indices
  unset _checkbox_selected_options
}
#!/bin/bash
set -e



on_list_input_up() {
  remove_list_instructions
  tput cub "$(tput cols)"

  printf "  ${_list_options[$_list_selected_index]}"
  tput el

  if [ $_list_selected_index = 0 ]; then
    _list_selected_index=$((${#_list_options[@]}-1))
    tput cud $((${#_list_options[@]}-1))
    tput cub "$(tput cols)"
  else
    _list_selected_index=$((_list_selected_index-1))

    tput cuu1
    tput cub "$(tput cols)"
    tput el
  fi

  printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}

on_list_input_down() {
  remove_list_instructions
  tput cub "$(tput cols)"

  printf "  ${_list_options[$_list_selected_index]}"
  tput el

  if [ $_list_selected_index = $((${#_list_options[@]}-1)) ]; then
    _list_selected_index=0
    tput cuu $((${#_list_options[@]}-1))
    tput cub "$(tput cols)"
  else
    _list_selected_index=$((_list_selected_index+1))
    tput cud1
    tput cub "$(tput cols)"
    tput el
  fi
  printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}

on_list_input_enter_space() {
  local OLD_IFS
  OLD_IFS=$IFS
  IFS=$'\n'

  tput cud $((${#_list_options[@]}-${_list_selected_index}))
  tput cub "$(tput cols)"

  for i in $(seq $((${#_list_options[@]}+1))); do
    tput el1
    tput el
    tput cuu1
  done
  tput cub "$(tput cols)"

  tput cuf $((${#prompt}+3))
  printf "${cyan}${_list_options[$_list_selected_index]}${normal}"
  tput el

  tput cud1
  tput cub "$(tput cols)"
  tput el

  _break_keypress=true
  IFS=$OLD_IFS
}

remove_list_instructions() {
  if [ $_first_keystroke = true ]; then
    tput cuu $((${_list_selected_index}+1))
    tput cub "$(tput cols)"
    tput cuf $((${#prompt}+3))
    tput el
    tput cud $((${_list_selected_index}+1))
    _first_keystroke=false
  fi
}

_list_input() {
  local i
  local j
  prompt=$1
  eval _list_options=( '"${'${2}'[@]}"' )

  _list_selected_index=0
  _first_keystroke=true

  trap control_c SIGINT EXIT

  stty -echo
  tput civis

  print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Use arrow keys)${normal}"

  for i in $(gen_index ${#_list_options[@]}); do
    tput cub "$(tput cols)"
    if [ $i = 0 ]; then
      print "${cyan}${arrow} ${_list_options[$i]} ${normal}"
    else
      print "  ${_list_options[$i]}"
    fi
    tput el
  done

  for j in $(gen_index ${#_list_options[@]}); do
    tput cuu1
  done

  on_keypress on_list_input_up on_list_input_down on_list_input_enter_space on_list_input_enter_space

}


list_input() {
  _list_input "$1" "$2"
  local var_name=$3
  eval $var_name=\'"${_list_options[$_list_selected_index]}"\'
  unset _list_selected_index
  unset _list_options
  unset _break_keypress
  unset _first_keystroke
}

list_input_index() {
  _list_input "$1" "$2"
  local var_name=$3
  eval $var_name=\'"$_list_selected_index"\'
  unset _list_selected_index
  unset _list_options
  unset _break_keypress
  unset _first_keystroke
}
#!/bin/bash
set -e



on_text_input_left() {
  remove_regex_failed
  if [ $_current_pos -gt 0 ]; then
    tput cub1
    _current_pos=$(($_current_pos-1))
  fi
}

on_text_input_right() {
  remove_regex_failed
  if [ $_current_pos -lt ${#_text_input} ]; then
    tput cuf1
    _current_pos=$(($_current_pos+1))
  fi
}

on_text_input_enter() {
  remove_regex_failed

  if [[ "$_text_input" =~ $_text_input_regex && "$(eval $_text_input_validator "$_text_input")" = true ]]; then
    tput cub "$(tput cols)"
    tput cuf $((${#_read_prompt}-19))
    printf "${cyan}${_text_input}${normal}"
    tput el
    tput cud1
    tput cub "$(tput cols)"
    tput el
    eval $var_name=\'"${_text_input}"\'
    _break_keypress=true
  else
    _text_input_regex_failed=true
    tput civis
    tput cud1
    tput cub "$(tput cols)"
    tput el
    printf "${red}>>${normal} $_text_input_regex_failed_msg"
    tput cuu1
    tput cub "$(tput cols)"
    tput cuf $((${#_read_prompt}-19))
    tput el
    _text_input=""
    _current_pos=0
    tput cnorm
  fi
}

on_text_input_ascii() {
  remove_regex_failed
  local c=$1

  if [ "$c" = '' ]; then
    c=' '
  fi

  local rest="${_text_input:$_current_pos}"
  _text_input="${_text_input:0:$_current_pos}$c$rest"
  _current_pos=$(($_current_pos+1))

  tput civis
  printf "$c$rest"
  tput el
  if [ ${#rest} -gt 0 ]; then
    tput cub ${#rest}
  fi
  tput cnorm
}

on_text_input_backspace() {
  remove_regex_failed
  if [ $_current_pos -gt 0 ]; then
    local start="${_text_input:0:$(($_current_pos-1))}"
    local rest="${_text_input:$_current_pos}"
    _current_pos=$(($_current_pos-1))
    tput cub 1
    tput el
    tput sc
    printf "$rest"
    tput rc
    _text_input="$start$rest"
  fi
}

remove_regex_failed() {
  if [ $_text_input_regex_failed = true ]; then
    _text_input_regex_failed=false
    tput sc
    tput cud1
    tput el1
    tput el
    tput rc
  fi
}

text_input_default_validator() {
  echo true;
}

text_input() {
  local prompt=$1
  local var_name=$2
  local _text_input_regex="${3:-"\.+"}"
  local _text_input_regex_failed_msg=${4:-"Input validation failed"}
  local _text_input_validator=${5:-text_input_default_validator}
  local _read_prompt_start=$'\e[32m?\e[39m\e[1m'
  local _read_prompt_end=$'\e[22m'
  local _read_prompt="$( echo "$_read_prompt_start ${prompt} $_read_prompt_end")"
  local _current_pos=0
  local _text_input_regex_failed=false
  local _text_input=""
  printf "$_read_prompt"


  trap control_c SIGINT EXIT

  stty -echo
  tput cnorm

  on_keypress on_default on_default on_text_input_ascii on_text_input_enter on_text_input_left on_text_input_right on_text_input_ascii on_text_input_backspace
  eval $var_name=\'"${_text_input}"\'
}


================================================
FILE: install-coreos.sh
================================================
#!/bin/bash
set -euo pipefail
[[ -n "$REBOOT_STRATEGY" ]] || die "Need a reboot strategy. Run with eg. '\$REBOOT_STRATEGY=off ./install-coreos.sh'"

PUBLIC_IP=$(ip addr show eth0 | grep "inet\b" | grep "/24" | awk '{print $2}' | cut -d/ -f1)
PRIVATE_IP=$(ip addr show eth0 | grep "inet\b" | grep "/17" | awk '{print $2}' | cut -d/ -f1)

wget --quiet --no-check-certificate https://github.com/coreos/container-linux-config-transpiler/releases/download/v0.5.0/ct-v0.5.0-x86_64-unknown-linux-gnu -O ct
chmod +x ct
apt-get -y install gawk
wget --quiet https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install
chmod u+x coreos-install

cat container-linux-config.yaml \
  | sed "s/#SSH_KEY#/$(cat ~/.ssh/authorized_keys | grep '^ssh-rsa' | sed -n 1p | sed 's/\//\\\//g')/g" \
  | sed "s/#COREOS_PUBLIC_IPV4#/$PUBLIC_IP/g" \
  | sed "s/#COREOS_PRIVATE_IPV4#/$PRIVATE_IP/g" \
  | sed "s/#HOSTNAME#/$(echo $PUBLIC_IP | sed "s/\./-/g")/g" \
  | sed "s/#GATEWAY#/${PUBLIC_IP%.*}.1/g" \
  | sed "s/#DNS#/$(cat /etc/resolv.conf | awk '/^nameserver /{ print $0 }' | sed 's/nameserver //g' | tr '\n' ' ')/g" \
  | sed "s/#REBOOT_STRATEGY#/${REBOOT_STRATEGY}/g" \
  | ./ct > container-linux-config.json
./coreos-install -d /dev/sda -i container-linux-config.json


================================================
FILE: kube-linode.sh
================================================
#!/bin/bash
set +e
base64_args=""
$(base64 --wrap=0 <(echo "test") >/dev/null 2>&1)
if [ $? -eq 0 ]; then
    base64_args="--wrap=0"
fi
set -e

source display.sh
source linode-utilities.sh

check_dep jq
check_dep openssl
check_dep curl
check_dep htpasswd
check_dep kubectl
check_dep ssh
check_dep base64
check_dep bc
check_dep ssh-keygen
check_dep openssl
check_dep awk
check_dep sed
check_dep cat
check_dep tr

if [[ "$1" != "create" && "$1" != "destroy" ]]; then
  echo "${bold}${red}Not a valid action!${normal}"
  echo "Type ${green}./kube-linode.sh create${normal} to create a cluster"
  echo "Type ${green}./kube-linode.sh destroy${normal} to destroy created cluster"
  exit 1
fi

unset DATACENTER_ID
unset MASTER_PLAN
unset WORKER_PLAN
unset DOMAIN
unset EMAIL
unset MASTER_ID
unset API_KEY
unset USERNAME
unset NO_OF_WORKERS
unset REBOOT_STRATEGY
unset WORKER_IDS

stty -echo
tput civis

if [ -f settings.env ] ; then
    . settings.env
else
    touch settings.env
fi

# -- command line argument overrides --
options=$@

for argument in $options
  do
    case $argument in
      --datacenter_id=*)           DATACENTER_ID=${argument/*=/""} ;;
      --master_plan=*)             MASTER_PLAN=${argument/*=/""} ;;
      --worker_plan=*)             WORKER_PLAN=${argument/*=/""} ;;
      --no_of_workers=*)           NO_OF_WORKERS=${argument/*=/""} ;;
      --domain=*)                  DOMAIN=${argument/*=/""} ;;
      --email=*)                   EMAIL=${argument/*=/""} ;;
      --master_id=*)               MASTER_ID=${argument/*=/""} ;;
      --api_key=*)                 API_KEY=${argument/*=/""} ;;
      --username=*)                USERNAME=${argument/*=/""} ;;
      --install_k8s_dashboard=*)   INSTALL_K8S_DASHBOARD=${argument/*=/""} ;;
      --install_traefik=*)         INSTALL_TRAEFIK=${argument/*=/""} ;;
      --install_rook=*)            INSTALL_ROOK=${argument/*=/""} ;;
      --install_prometheus=*)      INSTALL_PROMETHEUS=${argument/*=/""} ;;
      --reboot_strategy=*)         REBOOT_STRATEGY=${argument/*=/""} ;;
    esac
  done

read_api_key
read_datacenter
read_master_plan
read_worker_plan
read_domain
read_email
read_no_of_workers
read_username
read_install_options
read_reboot_strategy

if [[ ! ( -f ~/.ssh/id_rsa && -f ~/.ssh/id_rsa.pub ) ]]; then
    spinner "Generating new SSH key" "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N \"\""
else
    eval `ssh-agent -s` >/dev/null 2>&1
    ssh-add -l | grep -q "$(ssh-keygen -lf ~/.ssh/id_rsa  | awk '{print $2}')" || ssh-add ~/.ssh/id_rsa >/dev/null 2>&1
fi

if [[ -f auth && -f manifests/grafana/grafana-credentials.yaml ]]  ; then : ; else
    read -s -p "${green}?${normal}${bold} Enter your dashboard password: ${normal}" PASSWORD
    tput cub "$(tput cols)"
    tput el
    [ -e auth ] && rm auth
    htpasswd -b -c auth $USERNAME $PASSWORD >/dev/null 2>&1
    [ -e manifests/grafana/grafana-credentials.yaml ] && rm manifests/grafana/grafana-credentials.yaml
cat > manifests/grafana/grafana-credentials.yaml <<-EOF
apiVersion: v1
kind: Secret
metadata:
  name: grafana-credentials
data:
  user: $( echo -n $USERNAME | base64 $base64_args )
  password: $( echo -n $PASSWORD | base64 $base64_args )
EOF
fi

if [ "$1" == "destroy" ]; then
  spinner "Retrieving master linode (if any)" get_master_id MASTER_ID
  if ! [[ $MASTER_ID =~ ^[0-9]+$ ]] 2>/dev/null; then
    tput el
    echo "${red}No master node found! Cluster is likely to have been deleted.${normal}"
  else
    spinner "Retrieving worker linodes (if any)" list_worker_ids WORKER_IDS
    tput el
    echo "${bold}${red}The following nodes will be deleted:${normal}"
    echo "  ${cyan}${arrow}${normal} master_$MASTER_ID [https://manager.linode.com/linodes/dashboard/master_$MASTER_ID]"
    for WORKER_ID in $WORKER_IDS; do
      echo "  ${cyan}${arrow}${normal} worker_$WORKER_ID [https://manager.linode.com/linodes/dashboard/worker_$WORKER_ID]"
    done
    text_input "Are you sure you want to delete the cluster? [y/n] " \
      response "^[yn]$" "Please enter either 'y' or 'n'"
    tput civis

    if [[ "$response" =~ ^y$ ]]; then
      for WORKER_ID in $WORKER_IDS; do
        spinner "${CYAN}[$WORKER_ID]${NORMAL} Deleting worker node" "delete_linode $WORKER_ID"
      done
      spinner "${CYAN}[$MASTER_ID]${NORMAL} Deleting master node" "delete_linode $MASTER_ID"
    fi
  fi
  spinner "Retrieving DNS record for $DOMAIN" "get_domains \"$DOMAIN\"" DOMAIN_ID
  if [[ $DOMAIN_ID =~ ^[0-9]+$ ]] 2>/dev/null; then
    text_input "Do you want to delete the DNS record for $DOMAIN? [y/n] " \
      response "^[yn]$" "Please enter either 'y' or 'n'"
    tput civis
    if [[ "$response" =~ ^y$ ]]; then
      spinner "Deleting DNS record for $DOMAIN" delete_domain
    fi
  fi

  text_input "Do you want to delete the current cluster configuration (including ~/.kube/config)? [y/n] " \
    response "^[yn]$" "Please enter either 'y' or 'n'"
  tput civis
  if [[ "$response" =~ ^y$ ]]; then
    [ -e manifests/grafana/grafana-credentials.yaml ] && rm manifests/grafana/grafana-credentials.yaml
    [ -e cluster ] && rm -rf cluster
    [ -e ~/.kube/config ] && rm ~/.kube/config
    [ -e auth ] && rm auth
    [ -e settings.env ] && rm settings.env
    touch settings.env
    echo "API_KEY=$API_KEY" >> settings.env
  fi
elif [ "$1" == "create" ]; then
  spinner "Retrieving master linode (if any)" get_master_id MASTER_ID

  if ! [[ $MASTER_ID =~ ^[0-9]+$ ]] 2>/dev/null; then
     spinner "Retrieving list of workers" list_worker_ids WORKER_IDS
     for WORKER_ID in $WORKER_IDS; do
        spinner "${CYAN}[$WORKER_ID]${NORMAL} Deleting worker (since certs are now invalid)"\
                    "linode_api linode.delete LinodeID=$WORKER_ID skipChecks=true"
     done

     spinner "Creating master linode" "create_linode $DATACENTER_ID $MASTER_PLAN" MASTER_ID
     spinner "Adding private IP" "add_private_ip $MASTER_ID"

     spinner "${CYAN}[$MASTER_ID]${NORMAL} Initializing labels" \
             "linode_api linode.update LinodeID=$MASTER_ID Label=\"master_${MASTER_ID}\" lpm_displayGroup=\"$DOMAIN (Unprovisioned)\""
  fi

  spinner "${CYAN}[$MASTER_ID]${NORMAL} Getting public IP" "get_public_ip $MASTER_ID" MASTER_IP
  declare "PUBLIC_$MASTER_ID=$MASTER_IP"

  spinner "${CYAN}[$MASTER_IP]${NORMAL} Getting private IP" "get_private_ip $MASTER_ID" PRIVATE_IP
  declare "PRIVATE_$MASTER_ID=$PRIVATE_IP"

  spinner "${CYAN}[$MASTER_IP]${NORMAL} Retrieving provision status" "is_provisioned $MASTER_ID" IS_PROVISIONED

  if [ $IS_PROVISIONED = false ] ; then
    update_dns $MASTER_ID
    install master $MASTER_ID
  fi

  tput el
  echo "${CYAN}[$MASTER_IP]${NORMAL} Master provisioned"

  spinner "${CYAN}[$MASTER_IP]${NORMAL} Retrieving current number of workers" get_no_of_workers CURRENT_NO_OF_WORKERS
  NO_OF_NEW_WORKERS=$( echo "$NO_OF_WORKERS - $CURRENT_NO_OF_WORKERS" | bc )

  if [[ $NO_OF_NEW_WORKERS -gt 0 ]]; then
      for WORKER in $( seq $NO_OF_NEW_WORKERS ); do
          spinner "Creating worker linode" "create_linode $DATACENTER_ID $WORKER_PLAN" WORKER_ID
          spinner "Adding private IP" "add_private_ip $WORKER_ID"
          spinner "Initializing labels" "change_to_unprovisioned $WORKER_ID worker"
      done
  fi

  spinner "Retrieving list of workers" list_worker_ids WORKER_IDS

  for WORKER_ID in $WORKER_IDS; do
     spinner "${CYAN}[$WORKER_ID]${NORMAL} Getting public IP" "get_public_ip $WORKER_ID" PUBLIC_IP
     declare "PUBLIC_$WORKER_ID=$PUBLIC_IP"

     spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Getting private IP" "get_private_ip $WORKER_ID" PRIVATE_IP
     declare "PRIVATE_$WORKER_ID=$PRIVATE_IP"

     if [ "$( is_provisioned $WORKER_ID )" = false ] ; then
       install worker $WORKER_ID
     fi
     tput el
     echo "${CYAN}[$PUBLIC_IP]${NORMAL} Worker provisioned"
  done
fi

wait

tput cnorm
stty echo


================================================
FILE: linode-utilities.sh
================================================
#!/bin/bash
if [ -z "${KUBECONFIG}" ]; then
    export KUBECONFIG=~/.kube/config
fi

control_c() {
  tput cub "$(tput cols)"
  tput el
  stty sane
  tput cnorm
  stty echo
  exit $?
}

trap control_c SIGINT

CYAN=$(tput setaf 6)
NORMAL=$(tput sgr0)
BOLD=$(tput bold)

check_dep() {
    command -v $1 >/dev/null 2>&1 || { echo "Please install \`${BOLD}$1${NORMAL}\` before running this script." >&2; exit 1; }
}

linode_api() {
    args=(-F "api_action=$1") ; shift
    for arg in "$@" ; do
        args+=(-F "$arg")
    done
    curl -s -X POST "https://api.linode.com/"  -H 'cache-control: no-cache' \
         -F "api_key=$API_KEY" "${args[@]}"
}

wait_jobs() {
    LINODE_ID=$1
    while true ; do
        if ( linode_api linode.job.list LinodeID=$LINODE_ID pendingOnly=1 | jq -Mje '.DATA == []' >/dev/null ) ; then
            break
        fi
        sleep 3
    done
}

wait_boot() {
    LINODE_ID=$1
    while true ; do
        if [[ $(linode_api linode.job.list LinodeID=$LINODE_ID | jq ".DATA" | \
        	        jq -c "[ .[] | select(.LABEL == \"Lassie initiated boot: CoreOS\") | select(.HOST_SUCCESS == 1)]" | \
        	        jq ".[] | .JOBID") =~ ^[0-9]+ ]]; then
        		break
        fi
        sleep 3
    done
    sleep 10
}

get_status() {
  linode_api linode.list LinodeID=$1 | jq ".DATA" | jq -c ".[] | .STATUS" | sed -n 1p
}

list_worker_ids() {
  linode_api linode.list | jq ".DATA" | jq -c "[ .[] | select(.LPM_DISPLAYGROUP | contains (\"$DOMAIN\")) ]" | jq -c ".[] | select(.LABEL | startswith(\"worker_\")) | .LINODEID"
}

get_master_id() {
  linode_api linode.list | jq ".DATA" | jq -c "[ .[] | select(.LPM_DISPLAYGROUP | contains (\"$DOMAIN\")) ]" | jq -c ".[] | select(.LABEL | startswith(\"master_\")) | .LINODEID" | sed -n 1p
}

is_provisioned() {
  local IS_PROVISIONED=false
  if [ $( linode_api linode.list LinodeID=$1 | jq ".DATA" | jq -c ".[] | .LPM_DISPLAYGROUP == \"$DOMAIN\"") = true ] ; then
    IS_PROVISIONED=true
  fi
  echo $IS_PROVISIONED
}

shutdown() {
  local LINODE_ID=$1
  linode_api linode.shutdown LinodeID=$LINODE_ID >/dev/null
  wait_jobs $LINODE_ID
}

get_disk_ids() {
  local LINODE_ID=$1
  linode_api linode.disk.list LinodeID=$LINODE_ID | jq ".DATA" | jq -c ".[] | .DISKID"
}

get_config_ids() {
  local LINODE_ID=$1
  linode_api linode.config.list LinodeID=$LINODE_ID | jq ".DATA" | jq -c ".[] | .ConfigID"
}

reset_linode() {
    local LINODE_ID=$1
    local DISK_IDS
    local CONFIG_IDS
    local STATUS
    PUBLIC_IP=$(get_public_ip $LINODE_ID)

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Getting status" "get_status $LINODE_ID" STATUS

    if [ "$STATUS" = "1" ]; then
      spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Shutting down linode" "shutdown $LINODE_ID"
    fi

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Retrieving disk list" "get_disk_ids $LINODE_ID" DISK_IDS

    for DISK_ID in $DISK_IDS; do
        spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Deleting disk $DISK_ID" "linode_api linode.disk.delete LinodeID=$LINODE_ID DiskID=$DISK_ID"
    done

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Retrieving config list" "get_config_ids $LINODE_ID" CONFIG_IDS

    for CONFIG_ID in $CONFIG_IDS; do
        spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Deleting config $CONFIG_ID" "linode_api linode.config.delete LinodeID=$LINODE_ID ConfigID=$CONFIG_ID"
    done

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Waiting for all jobs to complete" "wait_jobs $LINODE_ID"
}

get_public_ip() {
  local LINODE_ID=$1
  local IP
  eval IP=\$PUBLIC_$LINODE_ID
  if ! [[ $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] 2>/dev/null; then
      IP="$( linode_api linode.ip.list LinodeID=$LINODE_ID | jq -Mje '.DATA[] | select(.ISPUBLIC==1) | .IPADDRESS' | sed -n 1p )"
  fi
  echo $IP
}

get_private_ip() {
  local LINODE_ID=$1
  local IP
  eval IP=\$PRIVATE_$LINODE_ID
  if ! [[ $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] 2>/dev/null; then
      IP="$( linode_api linode.ip.list LinodeID=$LINODE_ID | jq -Mje '.DATA[] | select(.ISPUBLIC==0) | .IPADDRESS' | sed -n 1p )"
  fi
  echo $IP
}

get_plan_id() {
  local LINODE_ID=$1
  linode_api linode.list LinodeID=$LINODE_ID | jq ".DATA[0].PLANID"
}

get_max_disk_size() {
  local PLAN=$1
  echo "$( linode_api avail.linodeplans PlanID=$PLAN | jq ".DATA[0].DISK" )" "*1024" | bc
}

create_raw_disk() {
  local LINODE_ID=$1
  local DISK_SIZE=$2
  local LABEL=$3
  linode_api linode.disk.create LinodeID=$LINODE_ID Label="$LABEL" Type=raw Size=$DISK_SIZE | jq '.DATA.DiskID'
}

create_ext4_disk() {
  local LINODE_ID=$1
  local DISK_SIZE=$2
  local LABEL=$3
  linode_api linode.disk.create LinodeID=$LINODE_ID Label="$LABEL" Type=ext4 Size=$DISK_SIZE | jq '.DATA.DiskID'
}

create_install_disk() {
  linode_api linode.disk.createFromDistribution LinodeID=$LINODE_ID \
      DistributionID=140 Label=Installer Size=$INSTALL_DISK_SIZE \
      rootPass="$ROOT_PASSWORD" rootSSHKey="$( cat ~/.ssh/id_rsa.pub )" | jq ".DATA.DiskID"
}

create_boot_configuration() {
  linode_api linode.config.create LinodeID=$LINODE_ID KernelID=138 Label="Installer" \
      DiskList=$DISK_ID,$INSTALL_DISK_ID RootDeviceNum=2 helper_network=true | jq ".DATA.ConfigID"
}

boot_linode() {
  local LINODE_ID=$1
  local CONFIG_ID=$2
  linode_api linode.boot LinodeID=$LINODE_ID ConfigID=$CONFIG_ID >/dev/null
  wait_jobs $LINODE_ID
}

update_coreos_config() {
  linode_api linode.config.update LinodeID=$LINODE_ID ConfigID=$CONFIG_ID Label="CoreOS" \
      DiskList=$DISK_ID,$STORAGE_DISK_ID KernelID=213 RootDeviceNum=1 helper_network=false
}

transfer_acme() {
  IP=$1
  ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" \
  "sudo truncate -s 0 /etc/traefik/acme/acme.json; echo '$( base64 $base64_args < acme.json )' \
   | base64 --decode | sudo tee --append /etc/traefik/acme/acme.json" 2>/dev/null >/dev/null
  ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" \
  "sudo chmod 600 /etc/traefik/acme/acme.json" 2>/dev/null >/dev/null
}

change_to_provisioned() {
  local LINODE_ID=$1
  local NODE_TYPE=$2
  linode_api linode.update LinodeID=$LINODE_ID Label="${NODE_TYPE}_${LINODE_ID}" lpm_displayGroup="$DOMAIN"
}

change_to_unprovisioned() {
  local LINODE_ID=$1
  local NODE_TYPE=$2
  linode_api linode.update LinodeID=$LINODE_ID Label="${NODE_TYPE}_${LINODE_ID}" lpm_displayGroup="$DOMAIN (Unprovisioned)"
}

install_coreos() {
  LINODE_ID=$1
  NODE_TYPE=$2
  PUBLIC_IP=$(get_public_ip $LINODE_ID)

  set +e
  while true; do scp -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
    -r install-coreos.sh root@${PUBLIC_IP}:~/install-coreos.sh && break || sleep 5; done
  while true; do scp -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no \
    -r manifests/container-linux/${NODE_TYPE}-config.yaml root@${PUBLIC_IP}:~/container-linux-config.yaml && break || sleep 5; done
  while true; do ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@${PUBLIC_IP} \
    "chmod +x ./install-coreos.sh" && break || sleep 5; done
  while true; do ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@${PUBLIC_IP} \
    "REBOOT_STRATEGY=${REBOOT_STRATEGY} ./install-coreos.sh" && break || sleep 5; done
  set -e
}

install() {
    local NODE_TYPE
    local LINODE_ID
    local PLAN
    local ROOT_PASSWORD
    NODE_TYPE=$1
    LINODE_ID=$2
    PUBLIC_IP=$(get_public_ip $LINODE_ID)
    reset_linode $LINODE_ID
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Generating root password" "openssl rand -base64 32" ROOT_PASSWORD
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Retrieving current plan" "get_plan_id $LINODE_ID" PLAN
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Retrieving maximum available disk size" "get_max_disk_size $PLAN" TOTAL_DISK_SIZE

    INSTALL_DISK_SIZE=2000
    COREOS_DISK_SIZE=10240
    STORAGE_DISK_SIZE=$((${TOTAL_DISK_SIZE}-${COREOS_DISK_SIZE}))

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Creating ${COREOS_DISK_SIZE}mb CoreOS disk" "create_raw_disk $LINODE_ID $COREOS_DISK_SIZE CoreOS" DISK_ID

    # Create the install OS disk from script
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Creating ${INSTALL_DISK_SIZE}mb install disk" create_install_disk INSTALL_DISK_ID

    # Configure the installer to boot
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Creating boot configuration" create_boot_configuration CONFIG_ID
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Booting installer" "boot_linode $LINODE_ID $CONFIG_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Installing CoreOS (might take a while)" "install_coreos $LINODE_ID $NODE_TYPE"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Shutting down CoreOS" "linode_api linode.shutdown LinodeID=$LINODE_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Deleting install disk $INSTALL_DISK_ID" "linode_api linode.disk.delete LinodeID=$LINODE_ID DiskID=$INSTALL_DISK_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Waiting for existing jobs to complete" "wait_jobs $LINODE_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Creating ${STORAGE_DISK_SIZE}mb storage disk" "create_raw_disk $LINODE_ID $STORAGE_DISK_SIZE Storage" STORAGE_DISK_ID
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Updating CoreOS config" update_coreos_config
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Waiting for existing jobs to complete" "wait_jobs $LINODE_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Booting CoreOS" "linode_api linode.boot LinodeID=$LINODE_ID ConfigID=$CONFIG_ID"
    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Waiting for CoreOS to be ready" "wait_jobs $LINODE_ID; sleep 20"

    if [ "$NODE_TYPE" = "master" ] ; then
        if [ -e acme.json ] ; then
            spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Transferring acme.json" "transfer_acme $PUBLIC_IP"
        fi
    fi

    spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Provisioning $NODE_TYPE node (might take a while)" "provision_$NODE_TYPE $PUBLIC_IP" PROVISION_LOGS

    if [ "$( echo "${PROVISION_LOGS}" | tail -n1 )" = "provisioned $NODE_TYPE" ]; then
      spinner "${CYAN}[$PUBLIC_IP]${NORMAL} Changing status to provisioned" "change_to_provisioned $LINODE_ID $NODE_TYPE"
    else
      install $NODE_TYPE $LINODE_ID
    fi
}

provision_master() {
  IP=$1
  while true; do ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" \
    "sudo systemctl start bootkube" && break || sleep 5; done
  [ -e cluster ] && rm -rf cluster
  mkdir cluster
  ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no core@${IP} "sudo chown -R core:core /opt/bootkube/assets"
  scp -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -r core@${IP}:/opt/bootkube/assets/* cluster
  mkdir -p ~/.kube
  [ -e ~/.kube/config.bak ] && rm ~/.kube/config.bak
  [ -e ~/.kube/config ] && mv ~/.kube/config ~/.kube/config.bak
  cp cluster/auth/kubeconfig ~/.kube/config
  while true; do kubectl --namespace=kube-system create secret generic kubesecret --from-file auth --request-timeout 0 && break || sleep 5; done
  cat <<EOF | kubectl apply --request-timeout 0 -f -
apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: v1
kind: Namespace
metadata:
  name: rook
EOF
  while true; do kubectl --namespace=monitoring create secret generic kubesecret --from-file auth --request-timeout 0 && break || sleep 5; done
  while true; do kubectl apply -f manifests/heapster.yaml --request-timeout 0 && break || sleep 5; done
  if [ $INSTALL_K8S_DASHBOARD = true ]; then
    while true; do cat manifests/kube-dashboard.yaml | sed "s/\${DOMAIN}/${DOMAIN}/g" | kubectl apply --request-timeout 0 --validate=false -f - && break || sleep 5; done
  fi
  if [ $INSTALL_TRAEFIK = true ]; then
    while true; do cat manifests/traefik.yaml | sed "s/\${DOMAIN}/${DOMAIN}/g" | sed "s/\$EMAIL/${EMAIL}/g" | kubectl apply --request-timeout 0 --validate=false -f - && break || sleep 5; done
  fi
  echo "provisioned master"
}

provision_worker() {
  IP=$1
  while true; do ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" \
    "echo started" && break || sleep 5; done
  scp -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no cluster/auth/kubeconfig core@${IP}:/home/core/kubeconfig 2>/dev/null >/dev/null
  ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" "sudo ./bootstrap.sh" 2>/dev/null >/dev/null
  ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -tt "core@$IP" "rm -rf /home/core/kubeconfig && rm -rf /home/core/bootstrap.sh" 2>/dev/null >/dev/null
  set +e
  until kubectl get nodes > /dev/null 2>&1; do sleep 1; done

  if [ $INSTALL_ROOK = true ]; then
    if ! kubectl --namespace rook get pods --request-timeout 0 2>/dev/null | grep -q "^rook-api"; then
      while true; do kubectl apply -f manifests/rook/rook-operator.yaml --request-timeout 0 && break || sleep 5; done
      while true; do kubectl apply -f manifests/rook/rook-cluster.yaml --request-timeout 0 && break || sleep 5; done
      while true; do kubectl apply -f manifests/rook/rook-storageclass.yaml --request-timeout 0 && break || sleep 5; done
    fi
  fi

  if [ $INSTALL_PROMETHEUS = true ]; then
    until kubectl get nodes > /dev/null 2>&1; do sleep 1; done
    if ! kubectl --namespace monitoring get ingress --request-timeout 0 2>/dev/null | grep -q "^prometheus-ingress"; then
      while true; do kubectl --namespace monitoring apply -f manifests/prometheus-operator --request-timeout 0 && break || sleep 5; done
      printf "Waiting for Operator to register third party objects..."
      until kubectl --namespace monitoring get servicemonitor > /dev/null 2>&1; do sleep 1; printf "."; done
      until kubectl --namespace monitoring get prometheus > /dev/null 2>&1; do sleep 1; printf "."; done
      until kubectl --namespace monitoring get alertmanager > /dev/null 2>&1; do sleep 1; printf "."; done
      while true; do kubectl --namespace monitoring apply -f manifests/node-exporter --request-timeout 0 && break || sleep 5; done
      while true; do kubectl --namespace monitoring apply -f manifests/kube-state-metrics --request-timeout 0 && break || sleep 5; done
      while true; do kubectl --namespace monitoring apply -f manifests/grafana/grafana-credentials.yaml --request-timeout 0 && break || sleep 5; done
      while true; do kubectl --namespace monitoring apply -f manifests/grafana --request-timeout 0 && break || sleep 5; done
      while true; do find manifests/prometheus -type f ! -name prometheus-k8s-roles.yaml ! -name prometheus-k8s-role-bindings.yaml ! -name prometheus-k8s-ingress.yaml -exec kubectl --request-timeout 0 --namespace "monitoring" apply -f {} \; && break || sleep 5; done
      while true; do kubectl apply -f manifests/prometheus/prometheus-k8s-roles.yaml --request-timeout 0 && break || sleep 5; done
      while true; do kubectl apply -f manifests/prometheus/prometheus-k8s-role-bindings.yaml --request-timeout 0 && break || sleep 5; done
      while true; do kubectl --namespace monitoring apply -f manifests/alertmanager/ --request-timeout 0 && break || sleep 5; done
      while true; do cat manifests/prometheus/prometheus-k8s-ingress.yaml | sed "s/\${DOMAIN}/${DOMAIN}/g" | kubectl apply --request-timeout 0 --validate=false -f - && break || sleep 5; done
    fi
  fi

  set -e
  echo "provisioned worker"
}

read_api_key() {
  local result=false
  if ! [[ $API_KEY =~ ^[0-9a-zA-Z]+$ ]] 2>/dev/null; then
      while ! [[ $API_KEY =~ ^-?[0-9a-zA-Z]+$ ]] 2>/dev/null; do
         text_input "Enter Linode API Key (https://manager.linode.com/profile/api) : " API_KEY
         tput civis
      done
      while true ; do
         spinner "Verifying API Key" check_api_key result
         if [ $result = true ] ; then
           break
         fi
         text_input "Enter Linode API Key (https://manager.linode.com/profile/api) : " API_KEY
         tput civis
      done
  else
      while true ; do
         spinner "Verifying API Key" check_api_key result
         if [ $result = true ] ; then
           break
         fi
         text_input "Enter Linode API Key (https://manager.linode.com/profile/api) : " API_KEY
         tput civis
      done
  fi
   sed -i.bak '/^API_KEY/d' settings.env
   echo "API_KEY=$API_KEY" >> settings.env
   rm settings.env.bak
}

check_api_key() {
  if linode_api test.echo | jq -e ".ERRORARRAY == []" >/dev/null; then
    echo true
  else
    echo false
  fi
}

get_plans() {
  linode_api avail.linodeplans | jq ".DATA | sort_by(.PRICE)"
}

read_install_options() {
  if [[ -z $INSTALL_K8S_DASHBOARD || -z $INSTALL_TRAEFIK || -z $INSTALL_ROOK || -z $INSTALL_PROMETHEUS ]]; then
    options=('K8S Dashboard' 'Traefik (Load Balancer)' 'Rook (Distributed Storage)' 'Prometheus (Monitoring)')
    env_names=('INSTALL_K8S_DASHBOARD' 'INSTALL_TRAEFIK' 'INSTALL_ROOK' 'INSTALL_PROMETHEUS')
    selected_indices=(0 1 2 3)
    checkbox_input_indices "What should be included in your cluster?" options selected_indices
    eval "$(gen_env_from_options selected_indices env_names)"
    sed -i.bak '/^INSTALL_K8S_DASHBOARD/d' settings.env
    sed -i.bak '/^INSTALL_TRAEFIK/d' settings.env
    sed -i.bak '/^INSTALL_ROOK/d' settings.env
    sed -i.bak '/^INSTALL_PROMETHEUS/d' settings.env
    echo "$(gen_env_from_options selected_indices env_names)" >> settings.env
    rm settings.env.bak
  fi
}

read_master_plan() {
  if ! [[ $MASTER_PLAN =~ ^[0-9]+$ ]] 2>/dev/null; then
      while ! [[ $MASTER_PLAN =~ ^-?[0-9]+$ ]] 2>/dev/null; do
         IFS=$'\n'
         spinner "Retrieving plans" get_plans plan_data
         local plan_ids=($(echo $plan_data | jq -r '.[] | select(.RAM >= 2048) | .PLANID'))
         local plan_list=($(echo $plan_data | jq -r '.[] | select(.RAM >= 2048) | [.RAM, .PRICE] | @csv' | \
           awk -v FS="," '{ram=$1/1024; printf "%3sGB (\$%s/mo)%s",ram,$2,ORS}' 2>/dev/null))
         list_input_index "Select a master plan (https://www.linode.com/pricing)" plan_list selected_disk_id

         MASTER_PLAN=${plan_ids[$selected_disk_id]}
      done
      echo "MASTER_PLAN=$MASTER_PLAN" >> settings.env
  fi
}

read_worker_plan() {
  if ! [[ $WORKER_PLAN =~ ^[0-9]+$ ]] 2>/dev/null; then
      while ! [[ $WORKER_PLAN =~ ^-?[0-9]+$ ]] 2>/dev/null; do
         IFS=$'\n'
         spinner "Retrieving plans" get_plans plan_data
         tput el
         local plan_ids=($(echo $plan_data | jq -r '.[] | select(.RAM >= 2048) | .PLANID'))
         local plan_list=($(echo $plan_data | jq -r '.[] | select(.RAM >= 2048) | [.RAM, .PRICE] | @csv' | \
           awk -v FS="," '{ram=$1/1024; printf "%3sGB (\$%s/mo)%s",ram,$2,ORS}' 2>/dev/null))
         list_input_index "Select a worker plan (https://www.linode.com/pricing)" plan_list selected_disk_id

         WORKER_PLAN=${plan_ids[$selected_disk_id]}
      done
      echo "WORKER_PLAN=$WORKER_PLAN" >> settings.env
  fi

}

get_datacenters() {
  linode_api avail.datacenters | jq ".DATA | sort_by(.LOCATION)"
}

read_datacenter() {
  if ! [[ $DATACENTER_ID =~ ^[0-9]+$ ]] 2>/dev/null; then
      while ! [[ $DATACENTER_ID =~ ^-?[0-9]+$ ]] 2>/dev/null; do
         IFS=$'\n'
         spinner "Retrieving datacenters" get_datacenters datacenters_data
         tput el
         datacenters_ids=($(echo $datacenters_data | jq -r '.[] | .DATACENTERID'))
         datacenters_list=($(echo $datacenters_data | jq -r '.[] | .LOCATION'))
         list_input_index "Select a datacenter" datacenters_list selected_data_center_index
         DATACENTER_ID=${datacenters_ids[$selected_data_center_index]}
      done
      echo "DATACENTER_ID=$DATACENTER_ID" >> settings.env
  fi
}

read_domain() {
  domain_regex="^([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$"
  if ! [[ $DOMAIN =~ $domain_regex ]] 2>/dev/null; then
      while ! [[ $DOMAIN =~ $domain_regex ]] 2>/dev/null; do
         text_input "Enter Domain Name: " DOMAIN "$domain_regex" "Please enter a valid domain name"
      done
      echo "DOMAIN=$DOMAIN" >> settings.env
  fi
  tput civis
}

read_email() {
  email_regex="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
  if ! [[ $EMAIL =~ $email_regex ]] 2>/dev/null; then
      while ! [[ $EMAIL =~ $email_regex ]] 2>/dev/null; do
         text_input "Enter Email (for ACME registration): " EMAIL "^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$" "Please enter a valid email"
      done
      echo "EMAIL=$EMAIL" >> settings.env
  fi
  tput civis
}

read_username() {
  if [ -z "$USERNAME" ]; then
    [ -e auth ] && rm auth
    [ -e manifests/grafana/grafana-credentials.yaml ] && rm manifests/grafana/grafana-credentials.yaml
    text_input "Enter dashboard username: " USERNAME
    echo "USERNAME=$USERNAME" >> settings.env
  fi
  tput civis
}

read_reboot_strategy() {
  if [ -z "$REBOOT_STRATEGY" ]; then
    strategies=("off" "etcd-lock" "reboot")
    list_input_index "Select a update strategy (see https://coreos.com/os/docs/latest/update-strategies.html)" strategies strategy
    REBOOT_STRATEGY=${strategies[$strategy]}
    echo "REBOOT_STRATEGY=$REBOOT_STRATEGY" >> settings.env
  fi
}

get_domains() {
  local DOMAIN=$1
  linode_api domain.list | jq ".DATA" | jq -c ".[] | select(.DOMAIN == \"$DOMAIN\") | .DOMAINID"
}

get_resources() {
  local DOMAIN_ID=$1
  linode_api domain.resource.list DomainID=$DOMAIN_ID | jq ".DATA"
}

create_A_domain() {
  linode_api domain.resource.create DomainID=$DOMAIN_ID \
             TARGET="$IP" TTL_SEC=0 PORT=80 PROTOCOL='' PRIORITY=10 WEIGHT=5 TYPE='A' NAME='' >/dev/null
}

create_CNAME_domain() {
  linode_api domain.resource.create DomainID=$DOMAIN_ID \
             TARGET="$DOMAIN" TTL_SEC=0 PORT=80 PROTOCOL="" PRIORITY=10 WEIGHT=5 TYPE="CNAME" NAME="*" >/dev/null
}

get_ip_address_id() {
  linode_api linode.ip.list | jq ".DATA" | jq -c ".[] | select(.IPADDRESS == \"$IP\") | .IPADDRESSID" | sed -n 1p
}

update_domain() {
  linode_api domain.update DomainID=$DOMAIN_ID Domain="$DOMAIN" TTL_sec=300 axfr_ips="none" Expire_sec=604800 \
                           SOA_Email="$EMAIL" Retry_sec=300 status=1 Refresh_sec=300 Type=master >/dev/null
}

create_domain() {
  linode_api domain.create Domain="$DOMAIN" TTL_sec=300 axfr_ips="none" Expire_sec=604800 \
                           SOA_Email="$EMAIL" Retry_sec=300 status=1 Refresh_sec=300 Type=master >/dev/null
}

delete_domain() {
  linode_api domain.delete DomainID="$DOMAIN_ID" Domain="$DOMAIN" >/dev/null
}

update_dns() {
  local LINODE_ID=$1
  local DOMAIN_ID
  local IP
  local RESOURCE_IDS
  eval IP=\$PUBLIC_$LINODE_ID
  spinner "${CYAN}[$IP]${NORMAL} Retrieving DNS record for $DOMAIN" "get_domains \"$DOMAIN\"" DOMAIN_ID
  if ! [[ $DOMAIN_ID =~ ^[0-9]+$ ]] 2>/dev/null; then
    spinner "${CYAN}[$IP]${NORMAL} Creating DNS record for $DOMAIN" create_domain
  fi
  spinner "${CYAN}[$IP]${NORMAL} Retrieving DNS record for $DOMAIN" "get_domains \"$DOMAIN\"" DOMAIN_ID
  spinner "${CYAN}[$IP]${NORMAL} Updating DNS record for $DOMAIN" update_domain

  spinner "${CYAN}[$IP]${NORMAL} Retrieving list of resources for $DOMAIN" "get_resources $DOMAIN_ID" RESOURCE_LIST

  IFS=$'\n'
  if ! [[ $(echo $RESOURCE_LIST | jq -c ".[] | select(.TYPE == \"A\" and .TARGET == \"$IP\") | .RESOURCEID" | sed -n 1p) =~ ^[0-9]+$ ]] 2>/dev/null; then
      RESOURCE_IDS=$(echo $RESOURCE_LIST | jq -c ".[] | select(.TYPE == \"A\" and .NAME == \"\") | .RESOURCEID")
      for RESOURCE_ID in $RESOURCE_IDS; do
          spinner "${CYAN}[$IP]${NORMAL} Deleting 'A' DNS record $RESOURCE_ID" "linode_api domain.resource.delete DomainID=$DOMAIN_ID ResourceID=$RESOURCE_ID"
      done
      spinner "${CYAN}[$IP]${NORMAL} Adding 'A' DNS record to $DOMAIN with target $IP" create_A_domain
  fi

  if ! [[ $(echo $RESOURCE_LIST | jq -c ".[] | select(.TYPE == \"CNAME\" and .TARGET == \"$DOMAIN\") | .RESOURCEID") =~ ^[0-9]+$ ]] 2>/dev/null; then
      spinner "${CYAN}[$IP]${NORMAL} Adding wildcard 'CNAME' record with target $DOMAIN" create_CNAME_domain
  fi
}

read_no_of_workers() {
  if ! [[ $NO_OF_WORKERS =~ ^[0-9]+$ ]] 2>/dev/null; then
      while ! [[ $NO_OF_WORKERS =~ ^[0-9]+$ ]] 2>/dev/null; do
         text_input "Enter number of workers: " NO_OF_WORKERS "^[0-9]+$" "Please enter a number"
      done
      echo "NO_OF_WORKERS=$NO_OF_WORKERS" >> settings.env
  fi
  tput civis
}

create_linode() {
  DATACENTER_ID=$1
  PLAN_ID=$2
  linode_api linode.create DatacenterID=$DATACENTER_ID PlanID=$PLAN_ID | jq ".DATA.LinodeID"
}

delete_linode() {
  local LINODE_ID="$1"
  linode_api linode.delete LinodeID=$LINODE_ID skipChecks=true >/dev/null
}

add_private_ip() {
  local LINODE_ID=$1
  linode_api linode.ip.addprivate LinodeID=$LINODE_ID
}

get_no_of_workers() {
  echo "$( list_worker_ids | wc -l ) + 0" | bc
}


================================================
FILE: manifests/alertmanager/alertmanager-config.yaml
================================================
apiVersion: v1
kind: Secret
metadata:
  name: alertmanager-main
data:
  alertmanager.yaml: Z2xvYmFsOgogIHJlc29sdmVfdGltZW91dDogNW0Kcm91dGU6CiAgZ3JvdXBfYnk6IFsnam9iJ10KICBncm91cF93YWl0OiAzMHMKICBncm91cF9pbnRlcnZhbDogNW0KICByZXBlYXRfaW50ZXJ2YWw6IDEyaAogIHJlY2VpdmVyOiAnbnVsbCcKICByb3V0ZXM6CiAgLSBtYXRjaDoKICAgICAgYWxlcnRuYW1lOiBEZWFkTWFuc1N3aXRjaAogICAgcmVjZWl2ZXI6ICdudWxsJwpyZWNlaXZlcnM6Ci0gbmFtZTogJ251bGwnCg==


================================================
FILE: manifests/alertmanager/alertmanager-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  labels:
    alertmanager: main
  name: alertmanager-main
spec:
  ports:
  - name: web
    port: 9093
    protocol: TCP
  selector:
    alertmanager: main


================================================
FILE: manifests/alertmanager/alertmanager.yaml
================================================
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
  name: main
  labels:
    alertmanager: main
spec:
  replicas: 1
  version: v0.14.0


================================================
FILE: manifests/container-linux/master-config.yaml
================================================
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - "#SSH_KEY#"
storage:
  files:
    - path: /etc/hostname
      filesystem: root
      mode: 0420
      contents:
        inline: |
          #HOSTNAME#
    - path: /etc/traefik/acme/acme.json
      filesystem: root
      contents:
        inline: |
      mode: 0600
    - path: /etc/environment
      filesystem: root
      contents:
        inline: |
          COREOS_PUBLIC_IPV4=#COREOS_PUBLIC_IPV4#
          COREOS_PRIVATE_IPV4=#COREOS_PRIVATE_IPV4#
    - path: /etc/kubernetes/kubelet.env
      filesystem: root
      mode: 0644
      contents:
        inline: |
          KUBELET_IMAGE_URL=docker://gcr.io/google_containers/hyperkube
          KUBELET_IMAGE_TAG=v1.11.0
    - path: /etc/sysctl.d/max-user-watches.conf
      filesystem: root
      contents:
        inline: |
          fs.inotify.max_user_watches=16184
    - path: /opt/bootkube/bootkube-start
      filesystem: root
      mode: 0544
      user:
        id: 500
      group:
        id: 500
      contents:
        inline: |
          #!/bin/bash
          # Wrapper for bootkube start
          set -e
          # Move experimental manifests
          [ -n "$(ls /opt/bootkube/assets/manifests-*/* 2>/dev/null)" ] && \
            mv /opt/bootkube/assets/manifests-*/* /opt/bootkube/assets/manifests && \
            rm -rf /opt/bootkube/assets/manifests-*

          BOOTKUBE_ACI="${BOOTKUBE_ACI:-quay.io/coreos/bootkube}"
          BOOTKUBE_VERSION="${BOOTKUBE_VERSION:-v0.13.0}"
          BOOTKUBE_ASSETS="${BOOTKUBE_ASSETS:-/opt/bootkube/assets}"

          # ======== START OF RESOURCE RENDERING ===========
          sudo mkdir -p /opt/bootkube /etc/kubernetes
          [ -e /opt/bootkube/assets ] && sudo rm -rf /opt/bootkube/assets

          sudo /usr/bin/rkt run \
            --trust-keys-from-https \
            --volume assets,kind=host,source=/opt/bootkube \
            --mount volume=assets,target=/opt/bootkube \
            --volume bootstrap,kind=host,source=/etc/kubernetes \
            --mount volume=bootstrap,target=/etc/kubernetes \
            ${RKT_OPTS} \
            ${BOOTKUBE_ACI}:${BOOTKUBE_VERSION} \
            --net=host \
            --dns=host \
            --exec=/bootkube -- render --asset-dir=/opt/bootkube/assets \
            --etcd-servers=https://#COREOS_PRIVATE_IPV4#:2379 \
            --network-provider=flannel \
            --api-servers=https://#COREOS_PUBLIC_IPV4#:6443,https://#COREOS_PRIVATE_IPV4#:6443

          sudo mkdir -p /etc/kubernetes
          sudo cp ${BOOTKUBE_ASSETS}/auth/kubeconfig /etc/kubernetes/
          sudo cp ${BOOTKUBE_ASSETS}/tls/ca.crt /etc/kubernetes/ca.crt

          sudo mkdir -p /etc/etcd/tls
          sudo cp ${BOOTKUBE_ASSETS}/tls/etcd-* /etc/etcd/tls
          sudo mkdir -p /etc/etcd/tls/etcd
          sudo cp ${BOOTKUBE_ASSETS}/tls/etcd/* /etc/etcd/tls/etcd
          sudo chown -R etcd:etcd /etc/etcd
          sudo chmod -R u=rX,g=,o= /etc/etcd

          sudo systemctl enable kubelet; sudo systemctl start kubelet
          # ======= END OF RESOURCE RENDERING ========

          exec /usr/bin/rkt run \
            --trust-keys-from-https \
            --volume assets,kind=host,source=${BOOTKUBE_ASSETS} \
            --mount volume=assets,target=/assets \
            --volume bootstrap,kind=host,source=/etc/kubernetes \
            --mount volume=bootstrap,target=/etc/kubernetes \
            ${RKT_OPTS} \
            ${BOOTKUBE_ACI}:${BOOTKUBE_VERSION} \
            --net=host \
            --dns=host \
            --exec=/bootkube -- start --asset-dir=/assets "$@"
networkd:
  units:
    - name: 00-eth0.network
      contents: |
        [Match]
        Name=eth0

        [Network]
        DHCP=no
        DNS=#DNS#
        Domains=members.linode.com
        IPv6PrivacyExtensions=false
        Gateway=#GATEWAY#
        Address=#COREOS_PUBLIC_IPV4#/24
        Address=#COREOS_PRIVATE_IPV4#/17
systemd:
  units:
    - name: etcd-member.service
      enable: true
      dropins:
        - name: 40-etcd-cluster.conf
          contents: |
            [Service]
            Environment="ETCD_IMAGE_TAG=v3.2.13"
            Environment="ETCD_NAME=controller"
            Environment="ETCD_INITIAL_CLUSTER=controller=https://#COREOS_PRIVATE_IPV4#:2380"
            Environment="ETCD_INITIAL_ADVERTISE_PEER_URLS=https://#COREOS_PRIVATE_IPV4#:2380"
            Environment="ETCD_ADVERTISE_CLIENT_URLS=https://#COREOS_PRIVATE_IPV4#:2379"
            Environment="ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379"
            Environment="ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380"
            Environment="ETCD_SSL_DIR=/etc/etcd/tls"
            Environment="ETCD_TRUSTED_CA_FILE=/etc/ssl/certs/etcd/server-ca.crt"
            Environment="ETCD_CERT_FILE=/etc/ssl/certs/etcd/server.crt"
            Environment="ETCD_KEY_FILE=/etc/ssl/certs/etcd/server.key"
            Environment="ETCD_CLIENT_CERT_AUTH=true"
            Environment="ETCD_PEER_TRUSTED_CA_FILE=/etc/ssl/certs/etcd/peer-ca.crt"
            Environment="ETCD_PEER_CERT_FILE=/etc/ssl/certs/etcd/peer.crt"
            Environment="ETCD_PEER_KEY_FILE=/etc/ssl/certs/etcd/peer.key"
    - name: docker.service
      enable: true
    - name: kubelet.path
      enable: true
      contents: |
        [Unit]
        Description=Watch for kubeconfig
        [Path]
        PathExists=/etc/kubernetes/kubeconfig
        [Install]
        WantedBy=multi-user.target
    - name: wait-for-dns.service
      enable: true
      contents: |
        [Unit]
        Description=Wait for DNS entries
        Wants=systemd-resolved.service
        Before=kubelet.service
        [Service]
        Type=oneshot
        RemainAfterExit=true
        ExecStart=/bin/sh -c 'while ! /usr/bin/grep '^[^#[:space:]]' /etc/resolv.conf > /dev/null; do sleep 1; done'
        [Install]
        RequiredBy=kubelet.service
    - name: bootkube.service
      contents: |
        [Unit]
        Description=Bootstrap a Kubernetes cluster
        ConditionPathExists=!/opt/bootkube/init_bootkube.done
        [Service]
        Type=oneshot
        RemainAfterExit=true
        EnvironmentFile=/etc/environment
        WorkingDirectory=/opt/bootkube
        ExecStart=/opt/bootkube/bootkube-start
        ExecStartPost=/bin/touch /opt/bootkube/init_bootkube.done
        [Install]
        WantedBy=multi-user.target
    - name: kubelet.service
      contents: |
        [Unit]
        Description=Kubelet via Hyperkube ACI
        Wants=rpc-statd.service
        [Service]
        EnvironmentFile=/etc/kubernetes/kubelet.env
        EnvironmentFile=/etc/environment
        Environment="RKT_RUN_ARGS=--uuid-file-save=/var/cache/kubelet-pod.uuid \
          --volume=resolv,kind=host,source=/etc/resolv.conf \
          --mount volume=resolv,target=/etc/resolv.conf \
          --volume var-lib-cni,kind=host,source=/var/lib/cni \
          --mount volume=var-lib-cni,target=/var/lib/cni \
          --volume opt-cni-bin,kind=host,source=/opt/cni/bin \
          --mount volume=opt-cni-bin,target=/opt/cni/bin \
          --volume var-log,kind=host,source=/var/log \
          --mount volume=var-log,target=/var/log \
          --insecure-options=image"
        ExecStartPre=/bin/mkdir -p /opt/cni/bin
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/manifests
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/cni/net.d
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/checkpoint-secrets
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/inactive-manifests
        ExecStartPre=/bin/mkdir -p /var/lib/cni
        ExecStartPre=/bin/mkdir -p /var/lib/kubelet/volumeplugins
        ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/cache/kubelet-pod.uuid
        ExecStart=/usr/lib/coreos/kubelet-wrapper \
          --allow-privileged \
          --anonymous-auth=false \
          --client-ca-file=/etc/kubernetes/ca.crt \
          --cloud-provider= \
          --cluster_dns=10.3.0.10 \
          --cluster_domain=cluster.local \
          --cni-conf-dir=/etc/kubernetes/cni/net.d \
          --exit-on-lock-contention \
          --hostname-override=#COREOS_PUBLIC_IPV4# \
          --kubeconfig=/etc/kubernetes/kubeconfig \
          --lock-file=/var/run/lock/kubelet.lock \
          --network-plugin=cni \
          --node-labels=node-role.kubernetes.io/master \
          --pod-manifest-path=/etc/kubernetes/manifests \
          --register-with-taints=node-role.kubernetes.io/master=:NoSchedule \
          --volume-plugin-dir=/var/lib/kubelet/volumeplugins
        ExecStop=-/usr/bin/rkt stop --uuid-file=/var/cache/kubelet-pod.uuid
        Restart=always
        RestartSec=10
        [Install]
        WantedBy=multi-user.target
locksmith:
  reboot_strategy: #REBOOT_STRATEGY#


================================================
FILE: manifests/container-linux/worker-config.yaml
================================================
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - "#SSH_KEY#"
storage:
  files:
    - path: /etc/hostname
      filesystem: root
      mode: 0420
      contents:
        inline: |
          #HOSTNAME#
    - path: /etc/kubernetes/kubelet.env
      filesystem: root
      mode: 0644
      contents:
        inline: |
          KUBELET_IMAGE_URL=docker://gcr.io/google_containers/hyperkube
          KUBELET_IMAGE_TAG=v1.11.0
    - path: /etc/sysctl.d/max-user-watches.conf
      filesystem: root
      contents:
        inline: |
          fs.inotify.max_user_watches=16184
    - path: /etc/kubernetes/delete-node
      filesystem: root
      mode: 0744
      contents:
        inline: |
          #!/bin/bash
          set -e
          exec /usr/bin/rkt run \
            --trust-keys-from-https \
            --volume config,kind=host,source=/etc/kubernetes \
            --mount volume=config,target=/etc/kubernetes \
            --insecure-options=image \
            docker://gcr.io/google_containers/hyperkube:v1.9.3 \
            --net=host \
            --dns=host \
            --exec=/kubectl -- --kubeconfig=/etc/kubernetes/kubeconfig delete node #COREOS_PUBLIC_IPV4#
    - path: /etc/environment
      filesystem: root
      contents:
        inline: |
          COREOS_PUBLIC_IPV4=#COREOS_PUBLIC_IPV4#
          COREOS_PRIVATE_IPV4=#COREOS_PRIVATE_IPV4#
      mode: 0644
    - path: /home/core/bootstrap.sh
      filesystem: root
      contents:
        inline: |
          #!/usr/bin/env bash
          set -euo pipefail

          # Setup kubeconfig
          mkdir -p /etc/kubernetes
          cp /home/core/kubeconfig /etc/kubernetes/kubeconfig
          # Pulled out of the kubeconfig. Other installations should place the root
          # CA here manually.
          grep 'certificate-authority-data' /home/core/kubeconfig | awk '{print $2}' | base64 -d > /etc/kubernetes/ca.crt

          # Start services
          systemctl daemon-reload
          systemctl stop update-engine
          systemctl mask update-engine
          systemctl enable kubelet
          sudo systemctl start kubelet
      mode: 0700
networkd:
  units:
    - name: 00-eth0.network
      contents: |
        [Match]
        Name=eth0

        [Network]
        DHCP=no
        DNS=#DNS#
        Domains=members.linode.com
        IPv6PrivacyExtensions=false
        Gateway=#GATEWAY#
        Address=#COREOS_PUBLIC_IPV4#/24
        Address=#COREOS_PRIVATE_IPV4#/17
systemd:
  units:
    - name: docker.service
      enable: true
    - name: kubelet.path
      enable: true
      contents: |
        [Unit]
        Description=Watch for kubeconfig
        [Path]
        PathExists=/etc/kubernetes/kubeconfig
        [Install]
        WantedBy=multi-user.target
    - name: wait-for-dns.service
      enable: true
      contents: |
        [Unit]
        Description=Wait for DNS entries
        Wants=systemd-resolved.service
        Before=kubelet.service
        [Service]
        Type=oneshot
        RemainAfterExit=true
        ExecStart=/bin/sh -c 'while ! /usr/bin/grep '^[^#[:space:]]' /etc/resolv.conf > /dev/null; do sleep 1; done'
        [Install]
        RequiredBy=kubelet.service
    - name: delete-node.service
      enable: true
      contents: |
        [Unit]
        Description=Waiting to delete Kubernetes node on shutdown
        [Service]
        Type=oneshot
        RemainAfterExit=true
        ExecStart=/bin/true
        ExecStop=/etc/kubernetes/delete-node
        [Install]
        WantedBy=multi-user.target
    - name: kubelet.service
      contents: |
        [Unit]
        Description=Kubelet via Hyperkube ACI
        Wants=rpc-statd.service
        [Service]
        EnvironmentFile=/etc/kubernetes/kubelet.env
        EnvironmentFile=/etc/environment
        Environment="RKT_RUN_ARGS=--uuid-file-save=/var/cache/kubelet-pod.uuid \
          --volume=resolv,kind=host,source=/etc/resolv.conf \
          --mount volume=resolv,target=/etc/resolv.conf \
          --volume var-lib-cni,kind=host,source=/var/lib/cni \
          --mount volume=var-lib-cni,target=/var/lib/cni \
          --volume opt-cni-bin,kind=host,source=/opt/cni/bin \
          --mount volume=opt-cni-bin,target=/opt/cni/bin \
          --volume var-log,kind=host,source=/var/log \
          --mount volume=var-log,target=/var/log \
          --insecure-options=image"
        ExecStartPre=/bin/mkdir -p /opt/cni/bin
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/manifests
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/cni/net.d
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/checkpoint-secrets
        ExecStartPre=/bin/mkdir -p /etc/kubernetes/inactive-manifests
        ExecStartPre=/bin/mkdir -p /var/lib/cni
        ExecStartPre=/bin/mkdir -p /var/lib/kubelet/volumeplugins
        ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/cache/kubelet-pod.uuid
        ExecStart=/usr/lib/coreos/kubelet-wrapper \
          --allow-privileged \
          --anonymous-auth=false \
          --client-ca-file=/etc/kubernetes/ca.crt \
          --cloud-provider= \
          --cluster_dns=10.3.0.10 \
          --cluster_domain=cluster.local \
          --cni-conf-dir=/etc/kubernetes/cni/net.d \
          --exit-on-lock-contention \
          --hostname-override=#COREOS_PUBLIC_IPV4# \
          --kubeconfig=/etc/kubernetes/kubeconfig \
          --lock-file=/var/run/lock/kubelet.lock \
          --network-plugin=cni \
          --node-labels=node-role.kubernetes.io/node \
          --pod-manifest-path=/etc/kubernetes/manifests \
          --volume-plugin-dir=/var/lib/kubelet/volumeplugins
        ExecStop=-/usr/bin/rkt stop --uuid-file=/var/cache/kubelet-pod.uuid
        Restart=always
        RestartSec=10
        [Install]
        WantedBy=multi-user.target
locksmith:
  reboot_strategy: #REBOOT_STRATEGY#


================================================
FILE: manifests/grafana/grafana-dashboards.yaml
================================================
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-dashboards
data:
  all-nodes-dashboard.json: |+
    {
      "dashboard":
    {
        "__inputs": [
            {
                "description": "",
                "label": "prometheus",
                "name": "DS_PROMETHEUS",
                "pluginId": "prometheus",
                "pluginName": "Prometheus",
                "type": "datasource"
            }
        ],
        "__requires": [
            {
                "id": "grafana",
                "name": "Grafana",
                "type": "grafana",
                "version": "4.1.1"
            },
            {
                "id": "graph",
                "name": "Graph",
                "type": "panel",
                "version": ""
            },
            {
                "id": "prometheus",
                "name": "Prometheus",
                "type": "datasource",
                "version": "1.0.0"
            },
            {
                "id": "singlestat",
                "name": "Singlestat",
                "type": "panel",
                "version": ""
            }
        ],
        "annotations": {
            "list": []
        },
        "description": "Dashboard to get an overview of one server",
        "editable": true,
        "gnetId": 22,
        "graphTooltip": 0,
        "hideControls": false,
        "id": null,
        "links": [],
        "refresh": false,
        "rows": [
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 3,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(rate(node_cpu{mode=\"idle\"}[2m])) * 100",
                                "hide": false,
                                "intervalFactor": 10,
                                "legendFormat": "",
                                "refId": "A",
                                "step": 50
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Idle cpu",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "percent",
                                "label": "cpu usage",
                                "logBase": 1,
                                "max": null,
                                "min": 0,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 9,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(node_load1)",
                                "intervalFactor": 4,
                                "legendFormat": "load 1m",
                                "refId": "A",
                                "step": 20,
                                "target": ""
                            },
                            {
                                "expr": "sum(node_load5)",
                                "intervalFactor": 4,
                                "legendFormat": "load 5m",
                                "refId": "B",
                                "step": 20,
                                "target": ""
                            },
                            {
                                "expr": "sum(node_load15)",
                                "intervalFactor": 4,
                                "legendFormat": "load 15m",
                                "refId": "C",
                                "step": 20,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "System load",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "percentunit",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 4,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "node_memory_SwapFree{instance=\"172.17.0.1:9100\",job=\"prometheus\"}",
                                "yaxis": 2
                            }
                        ],
                        "span": 9,
                        "stack": true,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)",
                                "intervalFactor": 2,
                                "legendFormat": "memory usage",
                                "metric": "memo",
                                "refId": "A",
                                "step": 4,
                                "target": ""
                            },
                            {
                                "expr": "sum(node_memory_Buffers)",
                                "interval": "",
                                "intervalFactor": 2,
                                "legendFormat": "memory buffers",
                                "metric": "memo",
                                "refId": "B",
                                "step": 4,
                                "target": ""
                            },
                            {
                                "expr": "sum(node_memory_Cached)",
                                "interval": "",
                                "intervalFactor": 2,
                                "legendFormat": "memory cached",
                                "metric": "memo",
                                "refId": "C",
                                "step": 4,
                                "target": ""
                            },
                            {
                                "expr": "sum(node_memory_MemFree)",
                                "interval": "",
                                "intervalFactor": 2,
                                "legendFormat": "memory free",
                                "metric": "memo",
                                "refId": "D",
                                "step": 4,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Memory usage",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "individual"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": "0",
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(50, 172, 45, 0.97)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(245, 54, 54, 0.9)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "percent",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": true,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 5,
                        "interval": null,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "((sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)) / sum(node_memory_MemTotal)) * 100",
                                "intervalFactor": 2,
                                "metric": "",
                                "refId": "A",
                                "step": 60,
                                "target": ""
                            }
                        ],
                        "thresholds": "80, 90",
                        "title": "Memory usage",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 6,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "read",
                                "yaxis": 1
                            },
                            {
                                "alias": "{instance=\"172.17.0.1:9100\"}",
                                "yaxis": 2
                            },
                            {
                                "alias": "io time",
                                "yaxis": 2
                            }
                        ],
                        "span": 9,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(rate(node_disk_bytes_read[5m]))",
                                "hide": false,
                                "intervalFactor": 4,
                                "legendFormat": "read",
                                "refId": "A",
                                "step": 8,
                                "target": ""
                            },
                            {
                                "expr": "sum(rate(node_disk_bytes_written[5m]))",
                                "intervalFactor": 4,
                                "legendFormat": "written",
                                "refId": "B",
                                "step": 8
                            },
                            {
                                "expr": "sum(rate(node_disk_io_time_ms[5m]))",
                                "intervalFactor": 4,
                                "legendFormat": "io time",
                                "refId": "C",
                                "step": 8
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Disk I/O",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "ms",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(50, 172, 45, 0.97)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(245, 54, 54, 0.9)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "percentunit",
                        "gauge": {
                            "maxValue": 1,
                            "minValue": 0,
                            "show": true,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 7,
                        "interval": null,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "(sum(node_filesystem_size{device!=\"rootfs\"}) - sum(node_filesystem_free{device!=\"rootfs\"})) / sum(node_filesystem_size{device!=\"rootfs\"})",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 60,
                                "target": ""
                            }
                        ],
                        "thresholds": "0.75, 0.9",
                        "title": "Disk space usage",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "current"
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 8,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "transmitted ",
                                "yaxis": 2
                            }
                        ],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(rate(node_network_receive_bytes{device!~\"lo\"}[5m]))",
                                "hide": false,
                                "intervalFactor": 2,
                                "legendFormat": "",
                                "refId": "A",
                                "step": 10,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Network received",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 10,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "transmitted ",
                                "yaxis": 2
                            }
                        ],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum(rate(node_network_transmit_bytes{device!~\"lo\"}[5m]))",
                                "hide": false,
                                "intervalFactor": 2,
                                "legendFormat": "",
                                "refId": "B",
                                "step": 10,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Network transmitted",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            }
        ],
        "schemaVersion": 14,
        "style": "dark",
        "tags": [
            "prometheus"
        ],
        "templating": {
            "list": []
        },
        "time": {
            "from": "now-1h",
            "to": "now"
        },
        "timepicker": {
            "refresh_intervals": [
                "5s",
                "10s",
                "30s",
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "2h",
                "1d"
            ],
            "time_options": [
                "5m",
                "15m",
                "1h",
                "6h",
                "12h",
                "24h",
                "2d",
                "7d",
                "30d"
            ]
        },
        "timezone": "browser",
        "title": "All Nodes",
        "version": 1
    }
    ,
      "inputs": [
        {
          "name": "DS_PROMETHEUS",
          "pluginId": "prometheus",
          "type": "datasource",
          "value": "prometheus"
        }
      ],
      "overwrite": true
    }
  deployment-dashboard.json: |+
    {
      "dashboard":
    {
        "__inputs": [
            {
                "description": "",
                "label": "prometheus",
                "name": "DS_PROMETHEUS",
                "pluginId": "prometheus",
                "pluginName": "Prometheus",
                "type": "datasource"
            }
        ],
        "__requires": [
            {
                "id": "singlestat",
                "name": "Singlestat",
                "type": "panel",
                "version": ""
            },
            {
                "id": "graph",
                "name": "Graph",
                "type": "panel",
                "version": ""
            },
            {
                "id": "grafana",
                "name": "Grafana",
                "type": "grafana",
                "version": "3.1.1"
            },
            {
                "id": "prometheus",
                "name": "Prometheus",
                "type": "datasource",
                "version": "1.0.0"
            }
        ],
        "annotations": {
            "list": []
        },
        "editable": true,
        "gnetId": null,
        "hideControls": false,
        "id": null,
        "links": [],
        "rows": [
            {
                "collapse": false,
                "editable": true,
                "height": "200px",
                "panels": [
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 8,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "cores",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 4,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": true
                        },
                        "targets": [
                            {
                                "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$deployment_namespace\",pod_name=~\"$deployment_name.*\"}[3m])) ",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "CPU",
                        "type": "singlestat",
                        "valueFontSize": "110%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 9,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "GB",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "80%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 4,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": true
                        },
                        "targets": [
                            {
                                "expr": "sum(container_memory_usage_bytes{namespace=\"$deployment_namespace\",pod_name=~\"$deployment_name.*\"}) / 1024^3",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Memory",
                        "type": "singlestat",
                        "valueFontSize": "110%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "Bps",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": false
                        },
                        "id": 7,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 4,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": true
                        },
                        "targets": [
                            {
                                "expr": "sum(rate(container_network_transmit_bytes_total{namespace=\"$deployment_namespace\",pod_name=~\"$deployment_name.*\"}[3m])) + sum(rate(container_network_receive_bytes_total{namespace=\"$deployment_namespace\",pod_name=~\"$deployment_name.*\"}[3m])) ",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Network",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    }
                ],
                "showTitle": false,
                "title": "Row"
            },
            {
                "collapse": false,
                "editable": true,
                "height": "100px",
                "panels": [
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "decimals": null,
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": false
                        },
                        "id": 5,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "max(kube_deployment_spec_replicas{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "metric": "kube_deployment_spec_replicas",
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Desired Replicas",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 6,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "min(kube_deployment_status_replicas_available{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Available Replicas",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 3,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "max(kube_deployment_status_observed_generation{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "",
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Observed Generation",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(245, 54, 54, 0.9)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(50, 172, 45, 0.97)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "none",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": false,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 2,
                        "interval": null,
                        "isNew": true,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "max(kube_deployment_metadata_generation{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "",
                                "refId": "A",
                                "step": 600
                            }
                        ],
                        "thresholds": "",
                        "title": "Metadata Generation",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    }
                ],
                "title": "New row"
            },
            {
                "collapse": false,
                "editable": true,
                "height": "350px",
                "panels": [
                    {
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {
                            "threshold1": null,
                            "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            "threshold2": null,
                            "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        },
                        "id": 1,
                        "isNew": true,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "hideZero": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 12,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "max(kube_deployment_status_replicas{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "current replicas",
                                "refId": "A",
                                "step": 30
                            },
                            {
                                "expr": "min(kube_deployment_status_replicas_available{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "available",
                                "refId": "B",
                                "step": 30
                            },
                            {
                                "expr": "max(kube_deployment_status_replicas_unavailable{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "unavailable",
                                "refId": "C",
                                "step": 30
                            },
                            {
                                "expr": "min(kube_deployment_status_replicas_updated{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "updated",
                                "refId": "D",
                                "step": 30
                            },
                            {
                                "expr": "max(kube_deployment_spec_replicas{deployment=\"$deployment_name\",namespace=\"$deployment_namespace\"}) without (instance, pod)",
                                "intervalFactor": 2,
                                "legendFormat": "desired",
                                "refId": "E",
                                "step": 30
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Replicas",
                        "tooltip": {
                            "msResolution": true,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "transparent": false,
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "none",
                                "label": "",
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": false
                            }
                        ]
                    }
                ],
                "showTitle": false,
                "title": "New row"
            }
        ],
        "schemaVersion": 12,
        "sharedCrosshair": true,
        "style": "dark",
        "tags": [],
        "templating": {
            "list": [
                {
                    "allValue": ".*",
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": false,
                    "label": "Namespace",
                    "multi": false,
                    "name": "deployment_namespace",
                    "options": [],
                    "query": "label_values(kube_deployment_metadata_generation, namespace)",
                    "refresh": 1,
                    "regex": "",
                    "sort": 0,
                    "tagValuesQuery": null,
                    "tagsQuery": "",
                    "type": "query",
                    "useTags": false
                },
                {
                    "allValue": null,
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": false,
                    "label": "Deployment",
                    "multi": false,
                    "name": "deployment_name",
                    "options": [],
                    "query": "label_values(kube_deployment_metadata_generation{namespace=\"$deployment_namespace\"}, deployment)",
                    "refresh": 1,
                    "regex": "",
                    "sort": 0,
                    "tagValuesQuery": "",
                    "tagsQuery": "deployment",
                    "type": "query",
                    "useTags": false
                }
            ]
        },
        "time": {
            "from": "now-6h",
            "to": "now"
        },
        "timepicker": {
            "refresh_intervals": [
                "5s",
                "10s",
                "30s",
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "2h",
                "1d"
            ],
            "time_options": [
                "5m",
                "15m",
                "1h",
                "6h",
                "12h",
                "24h",
                "2d",
                "7d",
                "30d"
            ]
        },
        "timezone": "browser",
        "title": "Deployment",
        "version": 2
    }
    ,
      "inputs": [
        {
          "name": "DS_PROMETHEUS",
          "pluginId": "prometheus",
          "type": "datasource",
          "value": "prometheus"
        }
      ],
      "overwrite": true
    }
  kubernetes-pods-dashboard.json: |+
    {
      "dashboard":
    {
        "__inputs": [
            {
                "description": "",
                "label": "prometheus",
                "name": "DS_PROMETHEUS",
                "pluginId": "prometheus",
                "pluginName": "Prometheus",
                "type": "datasource"
            }
        ],
        "__requires": [
            {
                "id": "graph",
                "name": "Graph",
                "type": "panel",
                "version": ""
            },
            {
                "id": "grafana",
                "name": "Grafana",
                "type": "grafana",
                "version": "3.1.1"
            },
            {
                "id": "prometheus",
                "name": "Prometheus",
                "type": "datasource",
                "version": "1.0.0"
            }
        ],
        "annotations": {
            "list": []
        },
        "editable": true,
        "gnetId": null,
        "hideControls": false,
        "id": null,
        "links": [],
        "rows": [
            {
                "collapse": false,
                "editable": true,
                "height": "250px",
                "panels": [
                    {
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {
                            "threshold1": null,
                            "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            "threshold2": null,
                            "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        },
                        "id": 1,
                        "isNew": true,
                        "legend": {
                            "alignAsTable": true,
                            "avg": true,
                            "current": true,
                            "max": false,
                            "min": false,
                            "rightSide": true,
                            "show": true,
                            "total": false,
                            "values": true
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 12,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum by(container_name) (container_memory_usage_bytes{pod_name=\"$pod\", container_name=~\"$container\", container_name!=\"POD\"})",
                                "interval": "10s",
                                "intervalFactor": 1,
                                "legendFormat": "Current: {{ container_name }}",
                                "metric": "container_memory_usage_bytes",
                                "refId": "A",
                                "step": 10
                            },
                            {
                                "expr": "kube_pod_container_resource_requests_memory_bytes{pod=\"$pod\", container=~\"$container\"}",
                                "interval": "10s",
                                "intervalFactor": 2,
                                "legendFormat": "Requested: {{ container }}",
                                "metric": "kube_pod_container_resource_requests_memory_bytes",
                                "refId": "B",
                                "step": 20
                            }
                        ],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Memory Usage",
                        "tooltip": {
                            "msResolution": true,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "show": true
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "title": "Row"
            },
            {
                "collapse": false,
                "editable": true,
                "height": "250px",
                "panels": [
                    {
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {
                            "threshold1": null,
                            "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            "threshold2": null,
                            "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        },
                        "id": 2,
                        "isNew": true,
                        "legend": {
                            "alignAsTable": true,
                            "avg": true,
                            "current": true,
                            "max": false,
                            "min": false,
                            "rightSide": true,
                            "show": true,
                            "total": false,
                            "values": true
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 12,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum by (container_name)( rate(container_cpu_usage_seconds_total{image!=\"\",container_name!=\"POD\",pod_name=\"$pod\"}[1m] ) )",
                                "intervalFactor": 2,
                                "legendFormat": "{{ container_name }}",
                                "refId": "A",
                                "step": 30
                            }
                        ],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "CPU Usage",
                        "tooltip": {
                            "msResolution": true,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "show": true
                        },
                        "yaxes": [
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "title": "New row"
            },
            {
                "collapse": false,
                "editable": true,
                "height": "250px",
                "panels": [
                    {
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {
                            "threshold1": null,
                            "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            "threshold2": null,
                            "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        },
                        "id": 3,
                        "isNew": true,
                        "legend": {
                            "alignAsTable": true,
                            "avg": true,
                            "current": true,
                            "max": false,
                            "min": false,
                            "rightSide": true,
                            "show": true,
                            "total": false,
                            "values": true
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 12,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sort_desc(sum by (pod_name) (rate (container_network_receive_bytes_total{pod_name=\"$pod\"}[1m]) ))",
                                "intervalFactor": 2,
                                "legendFormat": "{{ pod_name }}",
                                "refId": "A",
                                "step": 30
                            }
                        ],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Network I/O",
                        "tooltip": {
                            "msResolution": true,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "show": true
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "title": "New row"
            }
        ],
        "schemaVersion": 12,
        "sharedCrosshair": true,
        "style": "dark",
        "tags": [],
        "templating": {
            "list": [
                {
                    "allValue": ".*",
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": true,
                    "label": "Namespace",
                    "multi": false,
                    "name": "namespace",
                    "options": [],
                    "query": "label_values(kube_pod_info, namespace)",
                    "refresh": 1,
                    "regex": "",
                    "type": "query"
                },
                {
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": false,
                    "label": "Pod",
                    "multi": false,
                    "name": "pod",
                    "options": [],
                    "query": "label_values(kube_pod_info{namespace=~\"$namespace\"}, pod)",
                    "refresh": 1,
                    "regex": "",
                    "type": "query"
                },
                {
                    "allValue": ".*",
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": true,
                    "label": "Container",
                    "multi": false,
                    "name": "container",
                    "options": [],
                    "query": "label_values(kube_pod_container_info{namespace=\"$namespace\", pod=\"$pod\"}, container)",
                    "refresh": 1,
                    "regex": "",
                    "type": "query"
                }
            ]
        },
        "time": {
            "from": "now-6h",
            "to": "now"
        },
        "timepicker": {
            "refresh_intervals": [
                "5s",
                "10s",
                "30s",
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "2h",
                "1d"
            ],
            "time_options": [
                "5m",
                "15m",
                "1h",
                "6h",
                "12h",
                "24h",
                "2d",
                "7d",
                "30d"
            ]
        },
        "timezone": "browser",
        "title": "Pods",
        "version": 26
    }
    ,
      "inputs": [
        {
          "name": "DS_PROMETHEUS",
          "pluginId": "prometheus",
          "type": "datasource",
          "value": "prometheus"
        }
      ],
      "overwrite": true
    }
  node-dashboard.json: |+
    {
      "dashboard":
    {
        "__inputs": [
            {
                "description": "",
                "label": "prometheus",
                "name": "DS_PROMETHEUS",
                "pluginId": "prometheus",
                "pluginName": "Prometheus",
                "type": "datasource"
            }
        ],
        "__requires": [
            {
                "id": "grafana",
                "name": "Grafana",
                "type": "grafana",
                "version": "4.1.1"
            },
            {
                "id": "graph",
                "name": "Graph",
                "type": "panel",
                "version": ""
            },
            {
                "id": "prometheus",
                "name": "Prometheus",
                "type": "datasource",
                "version": "1.0.0"
            },
            {
                "id": "singlestat",
                "name": "Singlestat",
                "type": "panel",
                "version": ""
            }
        ],
        "annotations": {
            "list": []
        },
        "description": "Dashboard to get an overview of one server",
        "editable": true,
        "gnetId": 22,
        "graphTooltip": 0,
        "hideControls": false,
        "id": null,
        "links": [],
        "refresh": false,
        "rows": [
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 3,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "100 - (avg by (cpu) (irate(node_cpu{mode=\"idle\", instance=\"$server\"}[5m])) * 100)",
                                "hide": false,
                                "intervalFactor": 10,
                                "legendFormat": "{{cpu}}",
                                "refId": "A",
                                "step": 50
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Idle cpu",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "percent",
                                "label": "cpu usage",
                                "logBase": 1,
                                "max": 100,
                                "min": 0,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 9,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "node_load1{instance=\"$server\"}",
                                "intervalFactor": 4,
                                "legendFormat": "load 1m",
                                "refId": "A",
                                "step": 20,
                                "target": ""
                            },
                            {
                                "expr": "node_load5{instance=\"$server\"}",
                                "intervalFactor": 4,
                                "legendFormat": "load 5m",
                                "refId": "B",
                                "step": 20,
                                "target": ""
                            },
                            {
                                "expr": "node_load15{instance=\"$server\"}",
                                "intervalFactor": 4,
                                "legendFormat": "load 15m",
                                "refId": "C",
                                "step": 20,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "System load",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "percentunit",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 4,
                        "legend": {
                            "alignAsTable": false,
                            "avg": false,
                            "current": false,
                            "hideEmpty": false,
                            "hideZero": false,
                            "max": false,
                            "min": false,
                            "rightSide": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "node_memory_SwapFree{instance=\"172.17.0.1:9100\",job=\"prometheus\"}",
                                "yaxis": 2
                            }
                        ],
                        "span": 9,
                        "stack": true,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "node_memory_MemTotal{instance=\"$server\"} - node_memory_MemFree{instance=\"$server\"} - node_memory_Buffers{instance=\"$server\"} - node_memory_Cached{instance=\"$server\"}",
                                "hide": false,
                                "interval": "",
                                "intervalFactor": 2,
                                "legendFormat": "memory used",
                                "metric": "",
                                "refId": "C",
                                "step": 4
                            },
                            {
                                "expr": "node_memory_Buffers{instance=\"$server\"}",
                                "interval": "",
                                "intervalFactor": 2,
                                "legendFormat": "memory buffers",
                                "metric": "",
                                "refId": "E",
                                "step": 4
                            },
                            {
                                "expr": "node_memory_Cached{instance=\"$server\"}",
                                "intervalFactor": 2,
                                "legendFormat": "memory cached",
                                "metric": "",
                                "refId": "F",
                                "step": 4
                            },
                            {
                                "expr": "node_memory_MemFree{instance=\"$server\"}",
                                "intervalFactor": 2,
                                "legendFormat": "memory free",
                                "metric": "",
                                "refId": "D",
                                "step": 4
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Memory usage",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "individual"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": "0",
                                "show": true
                            },
                            {
                                "format": "short",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(50, 172, 45, 0.97)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(245, 54, 54, 0.9)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "percent",
                        "gauge": {
                            "maxValue": 100,
                            "minValue": 0,
                            "show": true,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 5,
                        "interval": null,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "((node_memory_MemTotal{instance=\"$server\"} - node_memory_MemFree{instance=\"$server\"}  - node_memory_Buffers{instance=\"$server\"} - node_memory_Cached{instance=\"$server\"}) / node_memory_MemTotal{instance=\"$server\"}) * 100",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 60,
                                "target": ""
                            }
                        ],
                        "thresholds": "80, 90",
                        "title": "Memory usage",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "avg"
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 6,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "read",
                                "yaxis": 1
                            },
                            {
                                "alias": "{instance=\"172.17.0.1:9100\"}",
                                "yaxis": 2
                            },
                            {
                                "alias": "io time",
                                "yaxis": 2
                            }
                        ],
                        "span": 9,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "sum by (instance) (rate(node_disk_bytes_read{instance=\"$server\"}[2m]))",
                                "hide": false,
                                "intervalFactor": 4,
                                "legendFormat": "read",
                                "refId": "A",
                                "step": 8,
                                "target": ""
                            },
                            {
                                "expr": "sum by (instance) (rate(node_disk_bytes_written{instance=\"$server\"}[2m]))",
                                "intervalFactor": 4,
                                "legendFormat": "written",
                                "refId": "B",
                                "step": 8
                            },
                            {
                                "expr": "sum by (instance) (rate(node_disk_io_time_ms{instance=\"$server\"}[2m]))",
                                "intervalFactor": 4,
                                "legendFormat": "io time",
                                "refId": "C",
                                "step": 8
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Disk I/O",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "ms",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "cacheTimeout": null,
                        "colorBackground": false,
                        "colorValue": false,
                        "colors": [
                            "rgba(50, 172, 45, 0.97)",
                            "rgba(237, 129, 40, 0.89)",
                            "rgba(245, 54, 54, 0.9)"
                        ],
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "format": "percentunit",
                        "gauge": {
                            "maxValue": 1,
                            "minValue": 0,
                            "show": true,
                            "thresholdLabels": false,
                            "thresholdMarkers": true
                        },
                        "id": 7,
                        "interval": null,
                        "links": [],
                        "mappingType": 1,
                        "mappingTypes": [
                            {
                                "name": "value to text",
                                "value": 1
                            },
                            {
                                "name": "range to text",
                                "value": 2
                            }
                        ],
                        "maxDataPoints": 100,
                        "nullPointMode": "connected",
                        "nullText": null,
                        "postfix": "",
                        "postfixFontSize": "50%",
                        "prefix": "",
                        "prefixFontSize": "50%",
                        "rangeMaps": [
                            {
                                "from": "null",
                                "text": "N/A",
                                "to": "null"
                            }
                        ],
                        "span": 3,
                        "sparkline": {
                            "fillColor": "rgba(31, 118, 189, 0.18)",
                            "full": false,
                            "lineColor": "rgb(31, 120, 193)",
                            "show": false
                        },
                        "targets": [
                            {
                                "expr": "(sum(node_filesystem_size{device!=\"rootfs\",instance=\"$server\"}) - sum(node_filesystem_free{device!=\"rootfs\",instance=\"$server\"})) / sum(node_filesystem_size{device!=\"rootfs\",instance=\"$server\"})",
                                "intervalFactor": 2,
                                "refId": "A",
                                "step": 60,
                                "target": ""
                            }
                        ],
                        "thresholds": "0.75, 0.9",
                        "title": "Disk space usage",
                        "type": "singlestat",
                        "valueFontSize": "80%",
                        "valueMaps": [
                            {
                                "op": "=",
                                "text": "N/A",
                                "value": "null"
                            }
                        ],
                        "valueName": "current"
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            },
            {
                "collapse": false,
                "height": "250px",
                "panels": [
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 8,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "transmitted ",
                                "yaxis": 2
                            }
                        ],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "rate(node_network_receive_bytes{instance=\"$server\",device!~\"lo\"}[5m])",
                                "hide": false,
                                "intervalFactor": 2,
                                "legendFormat": "{{device}}",
                                "refId": "A",
                                "step": 10,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Network received",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    },
                    {
                        "alerting": {},
                        "aliasColors": {},
                        "bars": false,
                        "datasource": "${DS_PROMETHEUS}",
                        "editable": true,
                        "error": false,
                        "fill": 1,
                        "grid": {},
                        "id": 10,
                        "legend": {
                            "avg": false,
                            "current": false,
                            "max": false,
                            "min": false,
                            "show": true,
                            "total": false,
                            "values": false
                        },
                        "lines": true,
                        "linewidth": 2,
                        "links": [],
                        "nullPointMode": "connected",
                        "percentage": false,
                        "pointradius": 5,
                        "points": false,
                        "renderer": "flot",
                        "seriesOverrides": [
                            {
                                "alias": "transmitted ",
                                "yaxis": 2
                            }
                        ],
                        "span": 6,
                        "stack": false,
                        "steppedLine": false,
                        "targets": [
                            {
                                "expr": "rate(node_network_transmit_bytes{instance=\"$server\",device!~\"lo\"}[5m])",
                                "hide": false,
                                "intervalFactor": 2,
                                "legendFormat": "{{device}}",
                                "refId": "B",
                                "step": 10,
                                "target": ""
                            }
                        ],
                        "thresholds": [],
                        "timeFrom": null,
                        "timeShift": null,
                        "title": "Network transmitted",
                        "tooltip": {
                            "msResolution": false,
                            "shared": true,
                            "sort": 0,
                            "value_type": "cumulative"
                        },
                        "type": "graph",
                        "xaxis": {
                            "mode": "time",
                            "name": null,
                            "show": true,
                            "values": []
                        },
                        "yaxes": [
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            },
                            {
                                "format": "bytes",
                                "label": null,
                                "logBase": 1,
                                "max": null,
                                "min": null,
                                "show": true
                            }
                        ]
                    }
                ],
                "repeat": null,
                "repeatIteration": null,
                "repeatRowId": null,
                "showTitle": false,
                "title": "New row",
                "titleSize": "h6"
            }
        ],
        "schemaVersion": 14,
        "style": "dark",
        "tags": [
            "prometheus"
        ],
        "templating": {
            "list": [
                {
                    "allValue": null,
                    "current": {},
                    "datasource": "${DS_PROMETHEUS}",
                    "hide": 0,
                    "includeAll": false,
                    "label": null,
                    "multi": false,
                    "name": "server",
                    "options": [],
                    "query": "label_values(node_boot_time, instance)",
                    "refresh": 1,
                    "regex": "",
                    "sort": 0,
                    "tagValuesQuery": "",
                    "tags": [],
                    "tagsQuery": "",
                    "type": "query",
                    "useTags": false
                }
            ]
        },
        "time": {
            "from": "now-1h",
            "to": "now"
        },
        "timepicker": {
            "refresh_intervals": [
                "5s",
                "10s",
                "30s",
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "2h",
                "1d"
            ],
            "time_options": [
                "5m",
                "15m",
                "1h",
                "6h",
                "12h",
                "24h",
                "2d",
                "7d",
                "30d"
            ]
        },
        "timezone": "browser",
        "title": "Nodes",
        "version": 1
    }
    ,
      "inputs": [
        {
          "name": "DS_PROMETHEUS",
          "pluginId": "prometheus",
          "type": "datasource",
          "value": "prometheus"
        }
      ],
      "overwrite": true
    }
  traefik-dashboard.json: |+
    {
      "dashboard": {
        "__inputs": [
          {
            "description": "",
            "label": "prometheus",
            "name": "DS_PROMETHEUS",
            "pluginId": "prometheus",
            "pluginName": "Prometheus",
            "type": "datasource"
          }
        ],
        "__requires": [
          {
            "id": "grafana",
            "name": "Grafana",
            "type": "grafana",
            "version": "4.1.1"
          },
          {
            "id": "graph",
            "name": "Graph",
            "type": "panel",
            "version": ""
          },
          {
            "id": "prometheus",
            "name": "Prometheus",
            "type": "datasource",
            "version": "1.0.0"
          },
          {
            "id": "singlestat",
            "name": "Singlestat",
            "type": "panel",
            "version": ""
          }
        ],
        "annotations": {
          "list": []
        },
        "description": "Visualize Traefik Health Metrics",
        "editable": true,
        "gnetId": 2240,
        "graphTooltip": 0,
        "hideControls": false,
        "id": null,
        "links": [],
        "refresh": "30s",
        "rows": [
          {
            "collapse": false,
            "height": 288,
            "panels": [
              {
                "cacheTimeout": null,
                "colorBackground": false,
                "colorValue": false,
                "colors": [
                  "rgba(245, 54, 54, 0.9)",
                  "rgba(237, 129, 40, 0.89)",
                  "rgba(50, 172, 45, 0.97)"
                ],
                "datasource": "${DS_PROMETHEUS}",
                "decimals": 0,
                "format": "s",
                "gauge": {
                  "maxValue": 100,
                  "minValue": 0,
                  "show": false,
                  "thresholdLabels": false,
                  "thresholdMarkers": true
                },
                "id": 3,
                "interval": null,
                "links": [],
                "mappingType": 1,
                "mappingTypes": [
                  {
                    "name": "value to text",
                    "value": 1
                  },
                  {
                    "name": "range to text",
                    "value": 2
                  }
                ],
                "maxDataPoints": 100,
                "nullPointMode": "connected",
                "nullText": null,
                "postfix": "",
                "postfixFontSize": "50%",
                "prefix": "",
                "prefixFontSize": "50%",
                "rangeMaps": [
                  {
                    "from": "null",
                    "text": "N/A",
                    "to": "null"
                  }
                ],
                "span": 1,
                "sparkline": {
                  "fillColor": "rgba(31, 118, 189, 0.18)",
                  "full": false,
                  "lineColor": "rgb(31, 120, 193)",
                  "show": false
                },
                "tableColumn": "",
                "targets": [
                  {
                    "expr": "time() - process_start_time_seconds{job=\"load-balancer\"}",
                    "intervalFactor": 2,
                    "refId": "A",
                    "step": 1800
                  }
                ],
                "thresholds": "",
                "title": "Uptime",
                "type": "singlestat",
                "valueFontSize": "80%",
                "valueMaps": [
                  {
                    "op": "=",
                    "text": "N/A",
                    "value": "null"
                  }
                ],
                "valueName": "current"
              },
              {
                "aliasColors": {},
                "bars": false,
                "dashLength": 10,
                "dashes": false,
                "datasource": "${DS_PROMETHEUS}",
                "fill": 1,
                "id": 1,
                "legend": {
                  "avg": false,
                  "current": false,
                  "max": false,
                  "min": false,
                  "show": true,
                  "total": false,
                  "values": false
                },
                "lines": true,
                "linewidth": 1,
                "links": [],
                "nullPointMode": "null",
                "percentage": false,
                "pointradius": 5,
                "points": false,
                "renderer": "flot",
                "seriesOverrides": [],
                "spaceLength": 10,
                "span": 3,
                "stack": false,
                "steppedLine": false,
                "targets": [
                  {
                    "expr": "sum(traefik_requests_total{service=\"http\"})",
                    "interval": "",
                    "intervalFactor": 2,
                    "legendFormat": "{{http}}",
                    "metric": "",
                    "refId": "A",
                    "step": 240
                  },
                  {
                    "expr": "sum(traefik_requests_total{service=\"https\"})",
                    "interval": "",
                    "intervalFactor": 2,
                    "legendFormat": "{{https}}",
                    "refId": "B",
                    "step": 240
                  }
                ],
                "thresholds": [],
                "timeFrom": null,
                "timeShift": null,
                "title": "Total requests",
                "tooltip": {
                  "shared": true,
                  "sort": 0,
                  "value_type": "individual"
                },
                "type": "graph",
                "xaxis": {
                  "buckets": null,
                  "mode": "time",
                  "name": null,
                  "show": true,
                  "values": []
                },
                "yaxes": [
                  {
                    "format": "none",
                    "label": "Count",
                    "logBase": 1,
                    "max": null,
                    "min": null,
                    "show": true
                  },
                  {
                    "format": "short",
                    "label": null,
                    "logBase": 1,
                    "max": null,
                    "min": null,
                    "show": false
                  }
                ]
              },
              {
                "aliasColors": {},
                "bars": false,
                "dashLength": 10,
                "dashes": false,
                "datasource": "${DS_PROMETHEUS}",
                "fill": 1,
                "id": 2,
                "legend": {
                  "avg": false,
                  "current": false,
                  "max": false,
                  "min": false,
                  "show": true,
                  "total": false,
                  "values": false
                },
                "lines": true,
                "linewidth": 1,
                "links": [],
                "nullPointMode": "null",
                "percentage": false,
                "pointradius": 5,
                "points": false,
                "renderer": "flot",
                "seriesOverrides": [],
                "spaceLength": 10,
                "span": 3,
                "stack": false,
                "steppedLine": false,
                "targets": [
                  {
                    "expr": "sum(traefik_request_duration_seconds_sum) / sum(traefik_requests_total) * 1000",
                    "intervalFactor": 2,
                    "legendFormat": "Average response time (ms)",
                    "refId": "A",
                    "step": 240
                  }
                ],
                "thresholds": [],
                "timeFrom": null,
                "timeShift": null,
                "title": "Average response time",
                "tooltip": {
                  "shared": true,
                  "sort": 0,
                  "value_type": "individual"
                },
                "type": "graph",
                "xaxis": {
                  "buckets": null,
                  "mode": "time",
                  "name": null,
                  "show": true,
                  "values": []
                },
                "yaxes": [
                  {
                    "format": "ms",
                    "label": null,
                    "logBase": 1,
                    "max": null,
                    "min": null,
                    "show": true
                  },
                  {
                    "format": "short",
                    "label": null,
                    "logBase": 1,
                    "max": null,
                    "min": null,
                    "show": true
                  }
                ]
              },
              {
                "aliasColors": {},
                "bars": false,
                "dashLength": 10,
                "dashes": false,
                "datasource": "${DS_PROMETHEUS}",
                "fill": 1,
                "id": 6,
                "legend": {
                  "avg": false,
                  "current": false,
                  "max": false,
                  "min": false,
                  "show": true,
                  "total": false,
                  "values": false
                },
                "lines": true,
                "linewidth": 1,
                "links": [],
                "nullPointMode": "null",
                "percentage": false,
                "pointradius": 5,
                "points": false,
                "renderer": "flot",
                "seriesOverrides": [],
                "spaceLength": 10,
                "span": 5,
                "stack": false,
                "steppedLine": false,
                "targets": [
                  {
                    "expr": "sum(rate(traefik_requests_total[5m]))",
                    "interval": "",
                    "intervalFactor": 2,
                    "legendFormat": "{{requests}}",
                    "refId": "A",
                    "step": 240
                  }
                ],
                "thresholds": [],
                "timeFrom": null,
                "timeShift": null,
                "title": "Requests in last 5 minutes",
                "tooltip": {
                  "shared": true,
                  "sort": 0,
                  "value_type": "individual"
                },
                "type": "graph",
                "xaxis": {
                  "buckets": null,
                  "mode": "time",
                  "name": null,
                  "show": true,
                  "values": []
                },
                "yaxes": [
                  {
                    "format": "short",
                    "label": null,
              
Download .txt
gitextract_psepesfk/

├── .gitignore
├── LICENSE
├── README.md
├── display.sh
├── install-coreos.sh
├── kube-linode.sh
├── linode-utilities.sh
└── manifests/
    ├── alertmanager/
    │   ├── alertmanager-config.yaml
    │   ├── alertmanager-service.yaml
    │   └── alertmanager.yaml
    ├── container-linux/
    │   ├── master-config.yaml
    │   └── worker-config.yaml
    ├── grafana/
    │   ├── grafana-dashboards.yaml
    │   ├── grafana-deployment.yaml
    │   └── grafana-service.yaml
    ├── heapster.yaml
    ├── kube-dashboard.yaml
    ├── kube-state-metrics/
    │   ├── kube-state-metrics-cluster-role-binding.yaml
    │   ├── kube-state-metrics-cluster-role.yaml
    │   ├── kube-state-metrics-deployment.yaml
    │   ├── kube-state-metrics-service-account.yaml
    │   └── kube-state-metrics-service.yaml
    ├── node-exporter/
    │   ├── node-exporter-daemonset.yaml
    │   └── node-exporter-service.yaml
    ├── prometheus/
    │   ├── prometheus-k8s-ingress.yaml
    │   ├── prometheus-k8s-role-bindings.yaml
    │   ├── prometheus-k8s-roles.yaml
    │   ├── prometheus-k8s-rules.yaml
    │   ├── prometheus-k8s-service-account.yaml
    │   ├── prometheus-k8s-service-monitor-alertmanager.yaml
    │   ├── prometheus-k8s-service-monitor-apiserver.yaml
    │   ├── prometheus-k8s-service-monitor-kube-controller-manager.yaml
    │   ├── prometheus-k8s-service-monitor-kube-scheduler.yaml
    │   ├── prometheus-k8s-service-monitor-kube-state-metrics.yaml
    │   ├── prometheus-k8s-service-monitor-kubelet.yaml
    │   ├── prometheus-k8s-service-monitor-node-exporter.yaml
    │   ├── prometheus-k8s-service-monitor-prometheus-operator.yaml
    │   ├── prometheus-k8s-service-monitor-prometheus.yaml
    │   ├── prometheus-k8s-service-monitor-rook.yaml
    │   ├── prometheus-k8s-service-monitor-traefik.yaml
    │   ├── prometheus-k8s-service.yaml
    │   └── prometheus-k8s.yaml
    ├── prometheus-operator/
    │   ├── prometheus-operator-cluster-role-binding.yaml
    │   ├── prometheus-operator-cluster-role.yaml
    │   ├── prometheus-operator-service-account.yaml
    │   ├── prometheus-operator-service.yaml
    │   └── prometheus-operator.yaml
    ├── rook/
    │   ├── rook-cluster.yaml
    │   ├── rook-operator.yaml
    │   └── rook-storageclass.yaml
    └── traefik.yaml
Condensed preview — 51 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (378K chars).
[
  {
    "path": ".gitignore",
    "chars": 206,
    "preview": "certs/\ncluster/\nacme.json\nauth\nsettings.env\ntesting.sh\npackage.sh\n*.zip\ndemo.mov\nresolv.conf\nbootkube\nmanifests/grafana/"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2017 Andrew Low\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "README.md",
    "chars": 3188,
    "preview": "## :whale: Provision a Kubernetes / CoreOS Cluster on Linode\n[![Bash](https://img.shields.io/badge/language-Bash-green.s"
  },
  {
    "path": "display.sh",
    "chars": 15029,
    "preview": "#!/bin/bash\n\n_SPINNER_POS=0\nspinner() {\n    IFS=$'\\n'\n    local delay=0.05\n    local list=( $(echo -e '\\xe2\\xa0\\x8b')\n  "
  },
  {
    "path": "install-coreos.sh",
    "chars": 1263,
    "preview": "#!/bin/bash\nset -euo pipefail\n[[ -n \"$REBOOT_STRATEGY\" ]] || die \"Need a reboot strategy. Run with eg. '\\$REBOOT_STRATEG"
  },
  {
    "path": "kube-linode.sh",
    "chars": 7814,
    "preview": "#!/bin/bash\nset +e\nbase64_args=\"\"\n$(base64 --wrap=0 <(echo \"test\") >/dev/null 2>&1)\nif [ $? -eq 0 ]; then\n    base64_arg"
  },
  {
    "path": "linode-utilities.sh",
    "chars": 24896,
    "preview": "#!/bin/bash\nif [ -z \"${KUBECONFIG}\" ]; then\n    export KUBECONFIG=~/.kube/config\nfi\n\ncontrol_c() {\n  tput cub \"$(tput co"
  },
  {
    "path": "manifests/alertmanager/alertmanager-config.yaml",
    "chars": 412,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: alertmanager-main\ndata:\n  alertmanager.yaml: Z2xvYmFsOgogIHJlc29sdmVfdGltZ"
  },
  {
    "path": "manifests/alertmanager/alertmanager-service.yaml",
    "chars": 195,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    alertmanager: main\n  name: alertmanager-main\nspec:\n  ports:\n  - nam"
  },
  {
    "path": "manifests/alertmanager/alertmanager.yaml",
    "chars": 151,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: Alertmanager\nmetadata:\n  name: main\n  labels:\n    alertmanager: main\nspec:\n  "
  },
  {
    "path": "manifests/container-linux/master-config.yaml",
    "chars": 8762,
    "preview": "passwd:\n  users:\n    - name: core\n      ssh_authorized_keys:\n        - \"#SSH_KEY#\"\nstorage:\n  files:\n    - path: /etc/ho"
  },
  {
    "path": "manifests/container-linux/worker-config.yaml",
    "chars": 5846,
    "preview": "passwd:\n  users:\n    - name: core\n      ssh_authorized_keys:\n        - \"#SSH_KEY#\"\nstorage:\n  files:\n    - path: /etc/ho"
  },
  {
    "path": "manifests/grafana/grafana-dashboards.yaml",
    "chars": 226247,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: grafana-dashboards\ndata:\n  all-nodes-dashboard.json: |+\n    {\n      \"da"
  },
  {
    "path": "manifests/grafana/grafana-deployment.yaml",
    "chars": 1916,
    "preview": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: grafana\nspec:\n  replicas: 1\n  template:\n    metadata:\n"
  },
  {
    "path": "manifests/grafana/grafana-service.yaml",
    "chars": 173,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  labels:\n    app: grafana\nspec:\n  ports:\n  - name: web\n    port:"
  },
  {
    "path": "manifests/heapster.yaml",
    "chars": 1371,
    "preview": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: heapster\n  namespace: kube-system\n  labels:\n    k8s-ap"
  },
  {
    "path": "manifests/kube-dashboard.yaml",
    "chars": 2983,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  labels:\n    k8s-app: kubernetes-dashboard\n  name: kubernetes-dashboard-certs\n  n"
  },
  {
    "path": "manifests/kube-state-metrics/kube-state-metrics-cluster-role-binding.yaml",
    "chars": 286,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: kube-state-metrics\nroleRef:\n  a"
  },
  {
    "path": "manifests/kube-state-metrics/kube-state-metrics-cluster-role.yaml",
    "chars": 375,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: kube-state-metrics\nrules:\n- apiGroups:"
  },
  {
    "path": "manifests/kube-state-metrics/kube-state-metrics-deployment.yaml",
    "chars": 562,
    "preview": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: kube-state-metrics\nspec:\n  replicas: 1\n  template:\n   "
  },
  {
    "path": "manifests/kube-state-metrics/kube-state-metrics-service-account.yaml",
    "chars": 73,
    "preview": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: kube-state-metrics\n"
  },
  {
    "path": "manifests/kube-state-metrics/kube-state-metrics-service.yaml",
    "chars": 272,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: kube-state-metrics\n    k8s-app: kube-state-metrics\n  name: kub"
  },
  {
    "path": "manifests/node-exporter/node-exporter-daemonset.yaml",
    "chars": 982,
    "preview": "apiVersion: extensions/v1beta1\nkind: DaemonSet\nmetadata:\n  name: node-exporter\nspec:\n  template:\n    metadata:\n      lab"
  },
  {
    "path": "manifests/node-exporter/node-exporter-service.yaml",
    "chars": 264,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    app: node-exporter\n    k8s-app: node-exporter\n  name: node-exporter"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-ingress.yaml",
    "chars": 733,
    "preview": "apiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: prometheus-ingress\n  namespace: monitoring\n  annotations:"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-role-bindings.yaml",
    "chars": 1418,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: RoleBinding\nmetadata:\n  name: prometheus-k8s\n  namespace: monitoring"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-roles.yaml",
    "chars": 1195,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: Role\nmetadata:\n  name: prometheus-k8s\n  namespace: monitoring\nrules:"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-rules.yaml",
    "chars": 21884,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: prometheus-k8s-rules\n  labels:\n    role: prometheus-rulefiles\n    prome"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-account.yaml",
    "chars": 69,
    "preview": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: prometheus-k8s\n"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-alertmanager.yaml",
    "chars": 284,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: alertmanager\n  labels:\n    k8s-app: alertman"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-apiserver.yaml",
    "chars": 535,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: kube-apiserver\n  labels:\n    k8s-app: apiser"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-kube-controller-manager.yaml",
    "chars": 350,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: kube-controller-manager\n  labels:\n    k8s-ap"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-kube-scheduler.yaml",
    "chars": 323,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: kube-scheduler\n  labels:\n    k8s-app: kube-s"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-kube-state-metrics.yaml",
    "chars": 356,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: kube-state-metrics\n  labels:\n    k8s-app: ku"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-kubelet.yaml",
    "chars": 361,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: kubelet\n  labels:\n    k8s-app: kubelet\nspec:"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-node-exporter.yaml",
    "chars": 319,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: node-exporter\n  labels:\n    k8s-app: node-ex"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-prometheus-operator.yaml",
    "chars": 237,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: prometheus-operator\n  labels:\n    k8s-app: p"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-prometheus.yaml",
    "chars": 277,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: prometheus\n  labels:\n    k8s-app: prometheus"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-rook.yaml",
    "chars": 333,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: rook-api\n  labels:\n    k8s-app: rook\nspec:\n "
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service-monitor-traefik.yaml",
    "chars": 289,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n  name: traefik\n  labels:\n    k8s-app: traefik\nspec:"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s-service.yaml",
    "chars": 186,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    prometheus: k8s\n  name: prometheus-k8s\nspec:\n  ports:\n  - name: web"
  },
  {
    "path": "manifests/prometheus/prometheus-k8s.yaml",
    "chars": 751,
    "preview": "apiVersion: monitoring.coreos.com/v1\nkind: Prometheus\nmetadata:\n  name: k8s\n  labels:\n    prometheus: k8s\nspec:\n  replic"
  },
  {
    "path": "manifests/prometheus-operator/prometheus-operator-cluster-role-binding.yaml",
    "chars": 289,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: prometheus-operator\nroleRef:\n  "
  },
  {
    "path": "manifests/prometheus-operator/prometheus-operator-cluster-role.yaml",
    "chars": 848,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: prometheus-operator\nrules:\n- apiGroups"
  },
  {
    "path": "manifests/prometheus-operator/prometheus-operator-service-account.yaml",
    "chars": 74,
    "preview": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: prometheus-operator\n"
  },
  {
    "path": "manifests/prometheus-operator/prometheus-operator-service.yaml",
    "chars": 257,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus-operator\n  labels:\n    k8s-app: prometheus-operator\nspec:\n  ty"
  },
  {
    "path": "manifests/prometheus-operator/prometheus-operator.yaml",
    "chars": 745,
    "preview": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  labels:\n    k8s-app: prometheus-operator\n  name: prometheus-"
  },
  {
    "path": "manifests/rook/rook-cluster.yaml",
    "chars": 2842,
    "preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n  name: rook\n---\napiVersion: rook.io/v1alpha1\nkind: Cluster\nmetadata:\n  name: r"
  },
  {
    "path": "manifests/rook/rook-operator.yaml",
    "chars": 4572,
    "preview": "---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: clusters.rook.io\nspec:\n  g"
  },
  {
    "path": "manifests/rook/rook-storageclass.yaml",
    "chars": 894,
    "preview": "apiVersion: rook.io/v1alpha1\nkind: Pool\nmetadata:\n  name: replicapool\n  namespace: rook\nspec:\n  replicated:\n    size: 1\n"
  },
  {
    "path": "manifests/traefik.yaml",
    "chars": 4170,
    "preview": "---\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n  name: traefik-ingress-controller\nrules:\n"
  }
]

About this extraction

This page contains the full source code of the kahkhang/kube-linode GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 51 files (340.7 KB), approximately 76.7k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!