Using Jsonnet mixins for configurations
A data templating language for app and tool developers.
A simple extension of JSON.
helm
apiVersion: apps/v1beta1kind: Deploymentmetadata: name: {{ template "nginx.fullname" . }} labels: app: {{ template "nginx.name" . }}spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ template "nginx.name" . }} template: metadata: labels: app: {{ template "nginx.name" . }} spec: containers: - name: {{ template "nginx.name" . }} image: {{ Values.Image }} ports: - containerPort: 80
jsonnet
nginx-base.jsonnet
local deploy = import "kube-deployment.libsonnet";deploy + { name: "my-nginx", container: { image: "nginx:1.12", },}
$kubectl apply -hApply a configuration to a resource by filename or stdin. The resource name must be specified. This resource will becreated if it doesn't exist yet. To use 'apply', always create the resource initially with either 'apply' or 'create--save-config'.JSON and YAML formats are accepted.
jsonnet
kube-deployment.libsonnet
{ name:: error "name is required", container:: error "container is required", apiVersion: "apps/v1beta1", kind: "Deployment", metadata: { name: $.name, labels: { app: $.name }, }, spec: { selector: { matchLabels: $.metadata.labels }, template: { metadata: { labels: $.metadata.labels }, spec: { containers: [ $.container { name: $.name }, ], }, }, },}
$
refers to the outer-most object.['foo']
looks up a field..f
can be used if the field name is an identifier.kubecfg
: https://github.com/bitnami/kubecfg# View all available commandsks --help# Create an app directory (and reference your cluster with $KUBECONFIG)KUBECONFIG="${KUBECONFIG:-$HOME/.kube/config}"ks init ks-example # Add '--api-spec=version:v1.8.0' to this command if you're running Kubernetes 1.8!cd ks-example# Autogenerate a basic manifestks generate deployed-service guestbook-ui \ --image gcr.io/heptio-images/ks-guestbook-demo:0.1 \ --type ClusterIP# Deploy the manifest to your cluster, and view resultsks apply defaultkubectl get svc guestbook-ui# Teardown (Don't worry, this only removes resources defined in your ksonnet app,# and should not affect any other resources in your 'default' namespace)ks delete default
mixin.libsonnet
{_config+:: {...},grafanaDashboards+:: { “dashboard-name.json”: {...},},prometheusAlerts+:: [...],prometheusRules+:: [...],}
_config
dictionary has various parameters for substitution jsonnet-bundler
: A jsonnet package manager.jb install https://github.com/anguslees/kustomize-libsonnetjb install https://github.com/coreos/prometheus-operator/jsonnet/prometheus-operator
mixin.libsonnet
local kubernetes = import "kubernetes-mixin/mixin.libsonnet";kubernetes { _config+:: { kubeStateMetricsSelector: 'job="kube-state-metrics"', cadvisorSelector: 'job="kubernetes-cadvisor"', nodeExporterSelector: 'job="kubernetes-node-exporter"', kubeletSelector: 'job="kubernetes-kubelet"', grafanaK8s+:: { dashboardNamePrefix: 'Mixin / ', dashboardTags: ['kubernetes', 'infrastucture'], }, },}
$ jb init$ jb install github.com/kubernetes-monitoring/kubernetes-mixin
$ jsonnet -J vendor -m dashboards -e '(import "config.libsonnet").grafanaDashboards'dashboards/kube-apiserver.jsondashboards/kube-controller-manager.jsondashboards/kube-proxy.jsondashboards/kube-scheduler.jsondashboards/kubelet.json
$ jsonnet -J vendor -S -e 'std.manifestYamlDoc((import "mixin.libsonnet").prometheusAlerts)' > alerts.ymlalerts.yml$ jsonnet -J vendor -S -e 'std.manifestYamlDoc((import "mixin.libsonnet").prometheusRules)' >files/rules.ymlrules.yml
Next: Adding Dashboards to Grafana & Prometheus
Prometheus mixin
Node exporter mixin
$ mkdir my-kube-prometheus; cd my-kube-prometheus$ jb init # Creates the initial/empty jsonnetfile.json# Install the kube-prometheus dependency$ jb install github.com/coreos/kube-prometheus/jsonnet/kube-prometheus@release-0.1 # Creates vendor/ & jsonnetfile.lock.json, and fills in jsonnetfile.json
minxin.jsonnet
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +{ _config+:: { namespace: 'monitoring', },};{ ['00prometheus-operator-' + name + '.json']: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) }{ ['0prometheus-' + name + '.json']: kp.prometheus[name] for name in std.objectFields(kp.prometheus) }
$kubecfg update -J vendor/ mixin.jsonnet
$kubecfg update -J vendor/ mixin.jsonnet$kubecfg show -o yaml -J vendor/ mixin.jsonnet$jsonnet -J vendor -m manifests/ minxin.jsonnet
├── jsonnetfile.json├── jsonnetfile.lock.json├── manifests├── mixin.jsonnet└── vendor ├── etcd-mixin ├── grafana ├── grafana-builder ├── grafonnet ├── ksonnet ├── kube-prometheus ├── kubernetes-mixin ├── prometheus └── prometheus-operator
local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet';{ serviceAccount: local serviceAccount = k.core.v1.serviceAccount; serviceAccount.new('prometheus-' + $._config.prometheus.name) + serviceAccount.mixin.metadata.withNamespace($._config.namespace),}
"I have created a PR to add ksonnet.beta.4 to ksonnet-lib that is based on Kubernetes 1.14 and we (as in maintainers of kube-prometheus, Promethues Operator and kubernetes-mixin) have no plans to abandon ksonnet any time soon."
https://github.com/ksonnet/ksonnet-lib
local k = import "ksonnet.beta.2/k.libsonnet";// Specify the import objects that we needlocal container = k.extensions.v1beta1.deployment.mixin.spec.template.spec.containersType;local containerPort = container.portsType;local deployment = k.extensions.v1beta1.deployment;local targetPort = 80;local podLabels = {app: "nginx"};local nginxContainer = container.new("nginx", "nginx:1.7.9") + container.ports(containerPort.containerPort(targetPort));local nginxDeployment = deployment.new("nginx-deployment", 2, nginxContainer, podLabels);k.core.v1.list.new(nginxDeployment)
local grafana = import 'grafonnet/grafana.libsonnet';local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + { grafanaDashboards+:: { 'my-dashboard.json': dashboard.new('My Dashboard v2') .addTemplate(template.datasource( 'datasource', 'prometheus', 'Prometheus', )) .addRow( row.new().addPanel( graphPanel.new('My Panel', span=6, datasource='$datasource') .addTarget(prometheus.target('vector(1)')) ), ), }}
$kubecfg -J vendor/ update mixin.jsonnetINFO Creating configmaps monitoring.grafana-dashboard-apiserverINFO Creating configmaps monitoring.grafana-dashboard-controller-managerINFO Creating configmaps monitoring.grafana-dashboard-k8s-resources-clusterINFO Creating configmaps monitoring.grafana-dashboard-k8s-resources-namespaceINFO Creating configmaps monitoring.grafana-dashboard-k8s-resources-podINFO Creating configmaps monitoring.grafana-dashboard-k8s-resources-workloadINFO Creating configmaps monitoring.grafana-dashboard-k8s-resources-workloads-namespaceINFO Creating configmaps monitoring.grafana-dashboard-kubeletINFO Creating configmaps monitoring.grafana-dashboard-my-dashboardINFO Creating configmaps monitoring.grafana-dashboard-persistentvolumesusageINFO Creating configmaps monitoring.grafana-dashboard-podsINFO Creating configmaps monitoring.grafana-dashboard-prometheusINFO Creating configmaps monitoring.grafana-dashboard-prometheus-remote-writeINFO Creating configmaps monitoring.grafana-dashboard-proxyINFO Creating configmaps monitoring.grafana-dashboard-schedulerINFO Creating configmaps monitoring.grafana-dashboard-statefulsetINFO Creating configmaps monitoring.grafana-dashboards
$k get cmNAME DATA AGEgrafana-dashboard-apiserver 1 26mgrafana-dashboard-controller-manager 1 26mgrafana-dashboard-k8s-resources-cluster 1 26mgrafana-dashboard-k8s-resources-namespace 1 26mgrafana-dashboard-k8s-resources-pod 1 26mgrafana-dashboard-k8s-resources-workload 1 26mgrafana-dashboard-k8s-resources-workloads-namespace 1 26mgrafana-dashboard-kubelet 1 26mgrafana-dashboard-my-dashboard 1 26mgrafana-dashboard-persistentvolumesusage 1 26mgrafana-dashboard-pods 1 26mgrafana-dashboard-prometheus 1 26mgrafana-dashboard-prometheus-remote-write 1 26mgrafana-dashboard-proxy 1 26mgrafana-dashboard-scheduler 1 26mgrafana-dashboard-statefulset 1 26mgrafana-dashboards 1 26m
A data templating language for app and tool developers.
A simple extension of JSON.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |