►
From YouTube: Tanka Community Call 2020-10-06
Description
We lost the first 15 minutes or so from this call which is why it's starting in the middle. Sorry for that.
A
Like
the
service
monitor
mechanism
and
all
of
that,
but
for
monitoring
our
own
infra,
which
includes
cortex
loki
on
the
clusters,
we
want
to
deploy
all
the
entire
stack
additionally
via
tonka,
instead
of
via
the
coreos,
permeate
his
operator.
So
many
of
the
charts
that
we're
installing
today
have
either
service
monitors
or
other
endpoints
that
need
to
be
scraped.
So
it
seems
like
I
need
to
learn
a
lot
more
here,
but
but
this
is
a
bit
of
a
game
changer
for
us
in
a
good
way.
B
Fantastic
to
hear
we
can
say
he
was
actually
chart
manager
that
assert
manager.
Rather,
that
was
the
one
that
led
us
into
this
is
such
a
complex
chart.
A
C
I've
I've
just
been
working
on
deploying
a
lot
of
our
internal
clusters
with
flux
and
the
way
we're
doing
it
is
not
with
the
the
transform
functionality
that's
going
away.
We
actually
we
check
in
all
of
our
tonka
environments,
to
to
our
main
repository.
We
have
a
ci
job
that
runs
essentially
tk
export
in
parallel
and
spits
them
out
into
another
repository.
C
A
Have
to
that's
what
we're
doing
with
cortex
today,
but
we
didn't
have
time
or
energy
to
learn:
jstaunite
and
tonko
when
we
had
they
put
flux
in
production
last
quarter,
so
we
emitted
that
once
checked
it
in
and
we
have
a
whole
bunch
of
customize.
On
top
of
that
to
add
in
annotations
and
things
like
that,
and
in
the
last
two
or
three
days
I've
been
backfilling
that
and
and
converting
that
all
to
tonka.
So
I
don't
have
a
nasty
three-way
merge
every
time.
C
C
A
lot
of
the
logistics
of
okay,
we,
our
main
workflow,
is
you
export
it
and
flux
takes
care
of
it.
But
then
how
do
you
also
have
like
a
tk
diff
workflow
for
development,
and
can
you
do
tk
apply
on
an
emergency
with
without
flux
overriding
it
so
still
kind
of
working
through
a
lot
of
this,
probably
a
few
blog
posts
to
come
out
of
this
once
we
figure
out
how
it
all
works.
A
D
B
B
B
So
first
thing
to
say:
this
is
not
not
intended
as
an
introduction
to
jsonnet.
It's
assumes
you
know
jase
on
it
and
have
have
some
experience
of
actually
you
felt
some
of
the
pain
already.
B
So
what's
the
problem,
so
it's
a
very
flexible
language.
You
know
perhaps
too
too
much
so
so
it
allows
to
create
unstructured
code.
So
how
do
we?
What
do
we
do
about
this?
Well
then,
it's
matt
saying
he's
three
days
in.
Hopefully
this
will
really
help
so
so
the
way
we
solve
that
is
by
adopting
some
conventions.
B
So
you
know,
for
example,
in
golang
we
could
just
write
our
entire
program
in
one
large
main
method
or
one
large
main.go
file,
but
we
don't
so
in
any
language.
We
can
adopt
bad
practices,
but
we
don't
because
no
one
ever
does
we
copy
what
everyone
else
does
so
in
a
way
this
is
presenting
some
conventions,
so
we're
not
going
to
cover
the
journey
here.
I
forgot
to
remove
that
word.
Let's
get
let's
get
going
and
have
a
look
at
it.
B
So,
first
of
all
syntax,
so
let's
just
have
a
look
at
a
few
things
to
do
with
syntax.
That
will
be
useful
to
know.
Here's
a
stupid
one
that
tom
told
me
a
while
ago,
colon
we
might
think
colon
means
public
it
doesn't.
It
means
inherit.
The
default
is
public.
So
when
you
use
colon
you're
you're
picking
the
default
value
of
public,
so
colon
colon
means
hidden.
B
So
if
we
say
this,
which
is
hidden
plus
this,
which
we
assume
means
public,
we
get
this
which
might
be
somewhat
different
to
what
we
think
we
would
get
and
that's
one.
We
could
easily
find
ourselves
bashing
our
head
against
that
for
for
hours.
It's
a
very
simple
solution,
use
the
triple
colon
and
suddenly
you're
saying
take
the
hidden
thing.
Make
it
visible.
B
Kablam
you've
got
your
nicely
merged
chase
on
it.
Okay,
that's
the
first
one,
second
one!
If
you're
debugging!
Well,
you
can
use
mine
the
the
tk
eval
minus
e,
but
sometimes
it's
nice
to
do.
You
know
you
add,
as
you're
writing
golang,
you
might
add
format.println
etc
into
your
code.
But
how
do
you
do
that
in
jsonnet?
B
Well,
one
way
you
can
do
it
is
emitting
trace
messages,
so
all
this
will
do
is
print
some
message
and
then
it
returns
the
value
so
effectively.
This
whole
thing
here
is
equivalent
functionally
to
that
chunk
there.
So
you
could
include
in
the
some
message.
B
You
know
a
json
manifested
version
of
your
data
as
well
yeah,
but
it
can
also
be
used
for
deprecation
messages,
as
seen
in
this
example.
Here
commas
and
pluses,
I'm
not
sure
whether
plus
is
as
a
two
s's
or
one,
but
I
think
you'll
get
the
point.
So
if
we
look
at
this
code,
what
we're
doing
is
we're
taking
my
lib.
B
Dot
new
creates
me
a
new
version
of
my
lib.
Then
we
add
on
to
it.
We
call
them
the
my
lib,
with
with
a
function
called
my
with
something
app
which
gives
us
a
patch
to
the
original,
and
then
we
do
another
one
that
adds
something
else
on.
So
this
is
all
perfectly
reasonable,
except
when
we
comment
out
one
of
them.
B
B
B
But
the
idea,
at
least
of
having
the
pluses
at
the
beginning
makes
life
so
much
easier,
extensible
library
so
creating
how
to
create
extensible
libraries.
B
So
a
few
things
so
I'll
say
these
briefly,
but
this
course
being
recorded
so
and-
and
I
will
be
making
a-
I
believe
I'm
gonna
aim
to
make
a
blog
post
of
these
points.
At
some
point,
so,
first
of
all
document,
you
there's
a
tool
that
tom's
created
called
docs
on
it,
which
you
can
use
for
documenting
your
libraries
provide
a
clear
config.
B
So
how
do
you
configure
your
library
and
how
do
you
make
it
easy
to
extend
so
so
I
think
what
I
should
say
for
this
audience
particularly,
is
what
is
a
library
so
exact,
for
example,
a
library
could
simply
be.
You
know
I
want
to
install
mysql,
so
I'm
going
to
have
a
library
which
could
either
be
in
my
slash,
lib
directory
or
vended
in
from
github
in
my
slash
vendor
directory
and
it's
a
an
encapsulation
of
some
functionality.
B
B
B
Picking
apart,
so
if
you
see
we've
got
an
element
here
in
quotes
with
a
key
in
quotes,
beginning
with
a
hash
and
it
calls
d,
which
is
the
docs
on
it
library.
It
says
the
thing
that
comes
next
is
an
object
and
here's
a
description
of
it.
So
the
next
thing
is
an
object.
It's
called
my
obj.
Oh
here
is
my
obj
and
the
same
thing
here.
The
thing
that
comes
after
me
isn't
my
funk.
B
Oh
look,
there's
my
funk
and
we
say:
look
it's
a
function
and
here's
a
description,
and
here
are
the
arguments.
Yeah
and
the
arguments
is
just
so.
The
first
argument
is
a
who
and
we're
telling
it's
a
string
so
suddenly
json
it
becomes
typed
yeah,
and
you
can
see
an
example
here
of
archaic,
alpha
library
that
uses
this
extensively.
B
Here's
a
simpler
version
using
comments.
I
don't
know
thomas
this-
is
this
app
public
yet
or
is
this
still
in
development.
B
So
how
do
we
pass
in
so
a
present?
You
know
this.
This
is
a
common
practice,
is
to
use
a
global
route
dollar,
add
everything
together
and
then
reach
it
from
a
library.
You
just
reference
dollar
and
you
go,
get
go,
get
a
value
from
the
root
and
that's
just
a
that's
just
a
mess.
It
creates
really
complex
code.
So
what
we
do
is
we
make
sure
we
encapsulate
the
library
with
clear
means
of
invocation
and
passing
everything
to
the
libraries
rather
than
referencing
the
dollar,
but
bear
in
mind.
Dollar
means.
B
The
root
of
this
particular
tree
is
not
the
root
of
the
whole
tree,
so
we
may
still
use
dollar
and
that's
referring
to
the
root
of
the
library,
especially
the
library,
is
within
a
local,
so
dollar
doesn't
that
dollar
isn't
always
evil,
although
it
can
be
sometimes
so.
Let's
look
at
our
library
here,
we've
got
so
I
should
just
say
that
dollar
here
I
can,
if
you
see
here,
dollar,
is
referring
to
the
root
of
the
current
tree.
B
So
here
we
have
dollar
dot,
underscore
config,
it's
referring
to
dollar,
dot,
underscore
config
and
then
dot
replicas
goes
and
gets
this
value.
So
here
we're
configuring
a
grafana.
You
know
this
is
very
much
pseudo
code,
but
and
it
has
one
value,
grafana
replicas
and
that
value
comes
from
a
hidden
config.
B
Then
we
have
a
function
called
image
which
is
hidden
that
has
that
returns
a
single
element
with
a
key
of
element,
every
image
and
a
value
of
whatever
we
passed
in.
So
that's
how
we.
This
is
how
it's
typically
done.
We
create
a
local,
but
we
add
local
to
the
root.
There's
an
implicit
plus
here.
So
we've
got
this
block
plus
the
grafana
is
all
smudged
into
the
the
root,
and
this
is
what
we're
suggesting
we
don't
do
so.
The
if
you
see
here
we've
got
plus
we've
got
grafana
plus
we've
got.
B
B
B
B
Instead
of
putting
it
adding
it
to
the
root,
we
create
an
element
called
grafana
and
we
call
we
import
the
function
in
here
and
then
the
implicit
plus
means
this
plus
this.
So
we
add
another
config
element.
This
plus
means
don't
overwrite.
The
element
merge
this
config
into
whatever
was
there
before.
So
we
can
just
override
specific
config
elements.
So
here
I'm
setting
replicas
to
two.
B
So
instead
of
having
replicas
one,
we
should
have
replicas
two
instead
and
then
we
add
on
to
that
grafana
dot
with
image,
and
we
get
this
you'll
notice
in
the
tree.
There's
two
is
grafana
grafana,
but
that
doesn't
matter
to
tanker
because
tanker
strips
out
all
of
this,
it
only
looks
for
the
kubernetes
objects
anyway
yep,
so
the
json
might
be
slightly
different,
but
that's
really
of
no
consequence.
B
So,
moving
on
to
patching
so
now
what
we've
done
is
we've
consumed.
We've
executed,
invoked
library,
we've
handed
it
configuration
and
we've
invoked
it
now.
We've
got
some
some
json
back
and
we
want
to
do
something
with
it.
B
B
So
patching
json
objects
is
easy.
You
just
do
plus
patching
lists
is
hard,
so
it
requires
you
to
iterate
over
the
whole
list,
which
is
really
annoying
and
messy.
So
there's
three
solutions.
I'll
I'll
show
you
through
them,
rather
than
read
them
here.
B
So
here
is
a
library,
so
this
library
simply
lists
products.
Some
products
that
we
have,
as
you
can
see
tanker,
is
currently
more
popular
than
grizzly,
but
I'm
doing
everything
I
can
to
to
sort
that
as
you
can
see.
So
the
problem
we
have
is
someone
else
has
just
clicked
on
on
us
to
like
the
project.
B
So
we
need
to
patch
this
to
show
to
represent
this.
Okay,
so
how
do
we
do
that?
Well,
at
the
moment,
this
is
what
we
have
to
do.
We
say
we
load
in
our
grafana
labs
library.
We
say
our
grafana
element
plus
grafanalabs.
It
said
grafana
labs,
whatever
comes
out
of
that
library
plus
this
patch
and
this
patch
says
products,
and
then
this
array,
and
then
it
says
for
everything
in
super
dot
products.
Super
is
the
thing
the
previous
block
to
me.
B
So
go
through
everything
in
this
here
all
the
products
in
here
and
then,
if
the
name
is
grizzly
then
increase
the
stars,
otherwise
just
return
to
e.
That
does
in
fact
work,
but
you
try
reading
that
code
and
debugging
your
way
through
it
yeah.
It
gets
really
quite
hairy,
whereas
if
we
so
it
requires
iteration
replaces
all
elements
it's
complex
and
fragile.
So
that's
the
problem
with
it
have
a
look
at
this.
What
we've
done
is
we've
named.
B
We've
created
two
hidden
elements:
tanker
colon,
colon
lamp,
grizzly,
colon
colon
and
we've
created
an
a
list
from
that.
So
I'll
say
more
about
this
later
but,
like
I
call
this
late
binding,
you
create
the
list
that
you
create.
The
data
that
the
result
that
you
actually
need
late
and
you
give
yourself
points
that
you
can
interact
with
it
internally.
B
Okay,
I
think
yours,
your
degree,
that
that
is
a
lot
cleaner
than
that
one
yeah.
So
really
it's
a
question
of
using
some
form
of
internal
data
structure,
so
this
really
works
well,
when
the
number
of
items
small,
when
the
number
of
items
gets
bigger,
we
have
to
do
something
else.
So
what
we've
got
here
is
we've
got
a
product
map
and
this
can
have
as
many
items
in
it
as
you
want,
and
here,
instead
of
just
adding
specific
elements,
what
we
do
is
we
do
another
loop
for
t
in.
B
I
think
this
is
in
the
wrong
order.
It's
got
in
the
wrong
order,
so
let's
say
what
we
want
here
is,
I
think,
grizzlies
more
important
than
tanker.
I
would
so,
therefore,
it
needs
to
be
first.
How
do
we
do
that,
because,
because
maps
aren't
ordered
in
jsonnet,
so
stolen
from
stanislav
one
of
the
maintainers
of
jsonnet,
what
you
can
do
is
you
can
maintain
a
product
order,
a
separate
list
which
restores
the
order.
Then
what
we
do
is
we
iterate
over
the
that
list
and
then
return
the
items
and
you
get
that.
B
So,
and
we
can
still
using
this,
yes,
the
are
in
got
in
the
wrong
order.
We
can
now
patch
it
in
pretty
much
the
same
way
as
we
did
before.
B
Just
to
say,
I
did
say
that
this
was
not
an
introductory
chase
on
it
presentation
it's
pretty
full-on,
but
it's
really
useful
things
if
you're
going
to
be
spending
time
making
lots
of
libraries.
So
this
works.
When
the
orders
of
items
matters,
we
might,
what
might
most
likely
want
to
create
a
little
library
so
that,
when
you
add
an
element
to
it,
it
actually
adds
the
the
library
will
add
it
both
to
the
map
and
to
the
order.
B
So
rendering
late
or
late
binding,
so
I've
said
this
here.
So
this
is
the
thing
we
really
want,
but
what
we're
doing
is
giving
ourselves
these,
but
this
thing
is
really
hard
to
patch,
because
it's
a
list-
and
it's
just
messy-
and
maybe
it's
a
kubernetes
object-
and
it's
like
15
layers,
deep
and
so
you're
going
to
have
to
do
this.
Stop
this
stuff
or
yet
it's
horrible
tree.
What
we
can
do
is
we
can
expose.
B
For
example,
there's
a
common
use
of
this
is
in
containers
in
kubernetes
is
put
the
container
so
mysql
underscore
container
colon
colon
as
a
hidden
element
and
then
in
your
deployment,
dot,
new
square
bracket
and
you
list
dollar
dot,
mysql
container
and
suddenly
you've
now
got
an
entry
point
where
you
can
say:
oh
add
this
environment
variable
to
this
container,
etc,
etc.
Suddenly,
you're,
rather
than
embedding
it
into
the
deployment.new,
it
becomes
patchable.
B
You
know
here's
a
rough
example
of
you
know
an
example
of
how
that
could
work.
You
know
we're
iterating
over
the
same
thing.
This
is
not
valid
code,
but
you
get
the
idea.
We
we
can
iterate
over
all
of
these
and
and
create
our
config.
B
Maps
so
moving
on
to
the
next
thing,
mix-ins
for
extensions.
So
if
you
let's
say,
for
example,
we
have
a
I've
seen
this
number
of
times
when
people
say
they
want
to
extend
a
library,
so
we
have
prometheus
case
on
it
and
they
say
something
like
if
conf
config
is
h
a
then
do
this.
Otherwise
do
that
in
jsonnet.
What
you
end
up
very
quickly,
is
you
end
up
rewriting
helm
charts,
which
is
just
this
smudge
of?
B
So
this
is
not
a
valid
resource
in
itself.
All
it
knows
is
how
to
convert
this
into
something
that
does
prometheus
h
a
so.
This
will
install
a
single
prometheus.
This
will
install
a
prometheus
h,
a
pair,
and
this
way
you
can
have
mixing
after
mixing
after
mixing
enough
to
mix
in,
and
they
can
at
least
in
theory.
If
you
construct
your
initial
library
right,
they
can
all
just
merge
into
one
happy
family.
B
So
what
this
also
does
is
this
keeps
the
knowledge
about
how
to
adapt
your
library
in
the
library.
So
what
it's
common
to
do
as
well
is
you
you
have
this
library,
which
makes
you
a
thing
and
then
over
in
your
main.json.
It
you
add
this
huge
jsonic
patch,
which
is
not
actually
consumable
by
anyone.
It's
like
you
can't
make
sense
of
it.
B
So
take
that
put
it
as
close
as
you
can
to
your
library,
and
then
you
call
that
as
a
mix
in
so
you
just
say,
mysql
plus
mysql,
with
some
super
feature,
enabled
and
then
then
your
I'll
say
more
about
that
in
a
minute
avoid
this
pattern,
which
you
may
have
seen
on:
kubernetes
libraries,
dot
new
dot,
with
new
dot
with
something
else
etc,
because
not
because
it's
inherently
bad,
but
it
just
breaks
the
jsonnet
interpreter
and
makes
your
code
much
slower.
B
So
a
couple
of
last
points,
some
of
which
I've
made
already
try
and
make
your
main.js
on
it
as
clean
as
possible.
Put
your
push
your
logic
as
much
as
you
can
close
to
your
libraries
you're
in
invite
consider
your
environment
to
be
your
specification.
Your
environment
says
this
is
what
this
particular
environment
should
be
doing,
but
you
don't
really
want
code
in
that.
B
B
So,
let's
keep
going
so
first
of
all
push
logic
close
to
the
library.
So
here
we
have
grafana
plus
grafana,
with
some
feature
really
clear
what
you're
doing
yeah
I
have
a
grafana
and
I
have
a
graffana.
I've
enabled
a
specific
feature
and
it's
easy
to
see
how
you
can
disable
that
feature
now,
and
you
don't
have
this
situation
where
you've
got
a
huge
blob
and
you
don't
really
know
what
it's
doing
or
we
could,
let's
say
we're
doing
a
lot
of
things
in
a
main.json.
B
This
is
a
rule
of
thumb
for
me.
If,
if
you
can
avoid
importing
k.lipsonit
into
your
main.json,
I
would
say,
you've
done
really
really
well,
because
the
fact
that
we're
deploying
all
of
this
to
kubernetes
should
not
be
relevant
to
your
main.jsonnet.
It's
a
specification
of
what
you're
doing
the
fact
that
you're
using
kubernetes
or
kdot
lips
on
it
is
really
something
that's
more
relevant
to
your
actual
library
than
it
is
to
your
main.
B
Abstract
environment,
something
that
tom
named
most
libraries
didn't
create
an
application,
such
as
say
mysql,
but
what
if
you've
got
a
website?
And
you
want
to
have
a
staging
website
and
a
production
website-
that's
hosted
on
wordpress.
Actually,
you
can
create
a
lib,
but
it's
an
abstract
environment.
So
it's
a
website
and
what
that
does
is
imports
the
mysql
lib
and
imports.
The
the
wordpress
lib
and
you're
done.
B
And
that
would
be
an
abstract
environment
that
can
be
configured
to
do
different
things
in
different
environments.
So
congratulations.
You
made
it
to
the
end
any
questions,
but
I
suggest
we
stop
there
and
open
up
not
just
questions
about
this
particular
presentation,
but
everything
that
we've
been
shown
here.
D
A
Yeah,
like
literally
last
night,
I
was
plumbing
out
again
we're
deploying
loki
and
we've
already
got
cortex
running
and,
for
example,
when
we
run
promtal,
we
have
a
default
service
account
that
we
don't
use.
So
we
make
service
accounts
for
everything,
because
the
default
pod
security
policy,
which
we
named
zzz.whatever
because
kubernetes
is
weird
and
alphabetically
that
one
will
be
last,
has
no
rights
at
all.
So
if
somebody
doesn't
specify
a
service
account,
you
get
a
pod
security
policy.
That
says
deny
everything
right.
So
I
was
looking.
A
A
So
some
of
the
things
you
presented
really
framed
it
for
me
again,
I'm
super
new,
so
most
of
my
questions
are
newbie
newbie
grade
on
aubrey.
D
D
I
guess
there
are
no
best
practices
for
extorts
in
general,
because
these
are
considered
an
anti-pattern
by
the
jasmine
project
itself.
So
these
were
added
several
years
ago
and
I
have
supposed
to
be
challenging
because
when
they
are
used
for
a
project
and
set
on
may
not
be
set,
it
might
become
challenging
to
understand
where
they
are
used
and
what
effect
they
have
on
the
outcome
of
the
configuration.
D
B
E
Integration
system
has
basically
all
the
information
about
the
environments
and
is
basically
the
target
cluster
configuration
and
we're
using,
and
this
is
to
stay
compatible
with
some
other
patterns
that
we
have
we're
using
on
these
external
vars
to
switch
on
and
off
on
various
features,
doing
testing
and
before
things
kind
of
go
out
right
now,
I
have
basically
imports
doing.
If
then,
I
was
just
wondering
if
there's
a
slightly
better
way
to
control
imports
and
make
sense.
D
If
it's
like
more
or
less
stable
what
you
would
turn
over
turn
on
for
certain
environments,
it
might
make
sense
to
actually
have
these
as
environments.
So,
for
example,
we
have
multiple
layers
of
environments.
We
have
a
first
layer
which
is
application,
and
then
we
have
a
second
layer
subdirectories
in
the
application
environments
which
are
regions.
D
D
So,
just
on
that
again,
the
difference
between
extras
and
top-level
arguments
is
that
extras
are
accessible
from
everywhere
in
the
code
which
makes
it
challenging
because,
for
example,
a
downstream
level
you
didn't
even
offer
might
react
to
an
extra
being
set
without
you.
Actually
realizing
and
code
might
break
if
you
set
it
or
not,
set
it
while
top
level.
Arguments
are
only
permitted
in
main.jsonet
and
happen
at
the
very
in
a
very
defined
way.
So,
instead
of
having
an
object
at
the
top
level
of
main.jsonet,
you
just
need
to
add
a
function
there.
D
B
But
it
is
worth
noting
that
it
is
difficult
to
do
imports
dynamic
imports.
Jsonnet
deliberately
leads
leads
you
away
from
dynamic
imports.
A
A
notion
of
nesting
with
libraries
that
I
should
be
aware
of,
like
you
know
I
could,
I
could
take
everything
that
I'm
doing.
That's
like
one
of
my
clusters,
which
you
know
for
for
for
you
know,
is
really
a
bunch
of
scrape
configs,
grafana
prometheus,
just
a
whole
bunch
of
junk
plus
some
stuff
that
we're
layering
and
that
are
patches
on
those
things.
So
I'm
already
like
importing
libraries,
but
if
I
wrap
all
of
my
stuff,
that's
a
cluster
into
a
library
and
then
reference
that,
from
my
dozen
main
json,
that's
one
per
experiment.
A
B
Blah
that's
the
power
of
it
is.
Is
it
it's?
What
it
does
better
than
helm?
Is
it
adds
sort
of
semi,
infinite,
recursion
and
and
abstraction?
B
So
you
can.
You
can
build
large
data
setups.
So
you
can.
You
can
have
a
a
very
small
main
that
just
says
these
are
the
key
features
that
are
switched
on
or
off
and
then
in
your
abstract
environment.
You
have
you
describe
that
whole
environment
that
whole
name
space
and
everything
that
goes
into
it,
and
by
doing
that,
you
ref
you
reference
the
libraries
which
give
you
your
individual
applications.
D
Right,
abstract
environments
are
probably
the
key
thing
here
so
to
differentiate
these
from
libraries.
A
library
would
be
something
very
focused,
for
example,
a
library
for
mysql
or
a
library
for
nginx.
So
these
deploy
a
single
piece
of
software
and
optionally
set
some
default
values,
but
not
go
much
beyond
that,
while
an
abstract
like
an
abstract
environment,
it's
technically
different
from
a
library,
but
logically
you
define
how
an
environment
looks
like
without
actually
having
all
of
the
environment
specific
data
in
there.
So,
for
example,
say
we
wanted
to
deploy
loki
to
four
different
regions.
D
We
could
have
an
abstract
loki
environment
which
holds
all
of
the
setup
all
of
these
four
region
environments
should
be
comprised
of,
and
then
in
the
main.jsons
of
the
respective
real
environments.
We
would
only
feed
in
very
environment
specific
information
such
as
secrets
or
ip
configurations
and
stuff
like
these.
B
B
Right,
you
know,
and
another
trick
that
tom's
been
doing
as
well
is
or
showing
me
is,
is
you
can
create
an
environment,
and
then
you
can
actually
create
another
environment
that
consumes
that
environment.
So
it
may
be
that
you,
for
example,
what
taras
was
saying
about
wanting
to
switch
something
on
and
off.
You
could
actually
have
a
direct.
A
So
this
is
what
we're
doing
with
customize.
Now
I
mean
the
same
metaphor,
so
we're
running
grafina
enterprise,
for
example.
Everything
we
do
is
staging
and
prod.
So
I
have
overlays
for
staging
that
just
bump
an
image
tag
or
something
like
that.
So
that's
great
well.
D
This
is
probably
a
cool
thing
for
just
getting
done
something
quickly.
I
would
generally
say
that
if
you
want
to
build
something
sustainable,
you
should
not
have.
One
environment
depend
on
the
other,
but
instead
do
this
to
the
thinking
to
properly
abstract
out
the
things
that
apply
to
both
on
a
higher
level
and
then
both
have
to
have
them
consume
the
higher
level
thing.
So
these
are
both
first
class
citizens.
D
A
B
Probably
look
at
the
when
this
cool
recording's
shown
have
a
look
another
look
at
the
slides
I
put
up
because
it's
all
in
there.
A
I
had
one
last
question:
I
spent
some
time
last
night
debugging
the
old
hepty
ovs
code
plugin
for
jsonnet
and
found
the
many
ways
it
breaks.
One
of
them
is
rendering
webpages
and
the
other
is
it
blows
up
at
stack,
attempting
to
grok
kubernetes
alpha?
Are
there
dev
tools
that
I
haven't
found
yet
to
either
just
make
editing
and
or
authoring
json
easier.
B
D
D
A
C
A
Right
now,
I
just
do
a
tk
export
and
a
tk
eval,
and
I
dump
them
to
files
and
the
manifest.
So
whenever
we
change
json
it
like
the
manifests
also
are
in
that
same
commit,
so
you
can
kind
of
see
the
station
changed
and
it
had
these
outputs
and
then
flux
picks
up
the
raw
stuff.
But
my
debugger
has
just
been
running
a
script
that
does
that
and
then
uses
git
to
just
see
what
the
changes
are.
It's
a
little.
It
works,
but
right
sounds
totally
valid.
D
D
A
D
No
problems
with
metis
that
this
will
ever
be
a
thing,
but
there
is
something
in
development
not
from
us,
but
from
some
probably
very
clever
people
called
qlang
which
aims
at
revolutionizing
config
management
using
lessons
learned
at
google.
So
maybe
in
one
year's
time
this
might
be
a
cool
thing,
definitely
worth
keeping
an
eye
on.
A
A
C
A
Yeah,
I
I
think
our
biggest
challenge
still
is
unifying
service
monitors
and
the
prometheus
operator.
I
know
it's
not
really
a
tonka
thing,
but
I
was
kind
of
hoping
that
you
know
right
now
we're
using
that
for
everything.
But,
as
I
said,
we
want
to
cleave
that
and
just
let
other
teams
use
it,
so
they
can
self-declare.
C
I
would
kind
of
throw
in
the
caveat
that
we
made
the
helm
integration
as
more
of
a
compatibility
shim,
so
we
could
use
helm
charts
rather
than
like.
We
think
you
should
do
helm
workflows
with
this
tool
like
I,
I
would
definitely
advise
against
having
new
teams.
Writing
helm,
charts
for
use
in
jsonnet.
A
A
D
I'd
say
the
helm:
integration
of
tonka
is
working
far
better
than
we
originally
expected,
so
it's
definitely
valid
to
use
that
as
a
migration
path,
even
though
to
use
the
full
power
of
tanka,
you
should
definitely
start
writing
as
much
as
you
can
in
json
at
some
point.
But
for
the
time
being,
it's
probably
a
very
valid
thing
to
use
what
you
already
got
and
onboard
it
onto
tonka.