►
From YouTube: TGI Kubernetes 145: Duck Typing in Kubernetes
Description
Come hang out with Scott Nichols (@n3wscott) as we explore the wild world of duck typing in Kubernetes! We will look around the ecosystem to find duck type examples and learn how to leverage duck typing to do novel control plane tricks!
Show notes available at https://github.com/vmware-tanzu/tgik/blob/master/episodes/145/README.md
A
A
Boy:
okay:
okay,
are
we
ready
to
start
actually
week
in
review
right.
B
A
Well
in
core
kubernetes,
we
got
an
announcement
that
v1
beta
1
for
crds
and
admission
web
hook.
Configurations
are
heading
out.
Well,
I
won't
miss
you
a
v1
beta
1,
but
if
you
happen
to
still
be
using
those
you're
going
to
be
real
sad
in
in
0
22.,
so
you've
got
some
you've
got
some
time,
but
you
know
get
on
that
video!
Better!
You
better
update!
A
I
see
kind.
Zero
10
is
out
that
that's
from
two
weeks
ago.
That's
that's
good
news,
good
news,
I'm
still
running
kind!
Nine
because
you
know,
but
maybe
I
should
update
it,
but
not
right
now
and
heads
up
if
you're
thinking
about
writing
a
cap
and
it's
not
already
in
the
system.
The
freeze
is
the
ninth,
which
is
in
a
few
days.
So
you
know
you
have
the
weekend
to
go.
Write
your.
A
Yes,
we're
talking
about
api
removal
in
121,
not
deprecation.
It's
already
been
deprecated
for
a
while
in
I
think,
maybe
a
release
or
two
ago.
So
they
are,
they
are
ready
to
be
hoisted
out.
Kenny
asks.
Am
I
nervous
yeah,
you
know
what
it's
a
weird
thing
actually
to
to
be
broadcasting
to
the
internet
and
talking
to
yourself,
so
you
know
it's
something
to
get
used
to.
A
Okay,
actually
let
me
tell
you
a
funny
story
side
note
here,
while
you
watch
me
struggle
reading
the
news
here
for
about
three
weeks,
I
was
a
radio
dj
at
in
college,
and
it
really
it
didn't
go
well
because
I
I
couldn't
read
the
cards
and
not,
and
I
was
just
too
nervous
to
read
the
advertising
cards
and
you
had
to
read
like
I
don't
know,
five
every
15
minutes-
and
I
just
I
couldn't
do
that
job
at
that
time,
and
I
was
I
so
I
I
said,
I'm
sorry.
A
B
A
A
A
Okay,
back
to
the
back
to
the
news
focus,
so
our
our
good
friend
tiffany
is
going
to
be
occasional,
tgi
host
she's
written
up
a
blog
about
valero.
If
you
want
to
back
up
your
cluster,
take
a
look
here:
it'll
get
you
going
just
in
case
you
you
know,
want
some
persistence.
A
I
don't
know
what
this
is.
I
didn't
click
this
yet
some
toys.
That's
neat!
Batteries
included
authentication
system;
okay,
I'm
I'm
in
I'm
in
okay.
So
I'm
not
sure
what
that
is,
but
it
sounds
interesting
at
first
pass.
Maybe
it's
oauth
for
apps
in
kubernetes.
A
And
if
that's
the
case,
that's
cool,
because
there's
not
really
a
great
solution
for
that
scottsdale.
A
Nice
we
got
mark
in
the
chat
yeah.
I
I
got
the
amazing
opportunity
to
to
make
these
hoodies.
This
is
actually
embroidered.
How
fancy
is
that.
A
Okay,
good
news,
contour
112,
is
out
it's
pretty
good,
also
some
nice
q
native
integration.
If
you
go
to
net
contour,
that's
what
I
use
not
to
toot
my
own
horn,
but
you
know
what
it
just
kind
of
works.
A
This
is
an
interesting
read
if,
if
you
have
a
minute
to
go
over
it-
and
I
I
kind
of
agree
with
what
they're
talking
about,
I
think
the
basic
premise
is
that
well
helm
is.
Is
this
ball
of
opinions?
And
if
you
want
to
make
a
change,
that's
not
already
baked
into
that
template.
You
really
have
to
fork
the
chart.
A
Okay,
which
kind
of
also
feels
backwards
to
me
if
we're
talking
about
temporalization
of
stuff,
so
I
I'm
not
a
big
helm
user
I'll
I'll
touch
it.
If
I
need
to,
but
not
not
not
a
big
thing
for
me.
A
Some
in
and
some
interesting
news
you
know
so
docker's
having
some,
maybe
some
mid-life
drama
right,
so
they're
looking
for
ways
to
keep
keep
all
this
core
tech
going,
because
you
know
honestly,
a
lot
of
people
depend
on
what
docker
has
provided
and
they
have
gone
and
donated
the
docker
distribution
to
the
cncf,
which
is
interesting.
So
maybe
we
would
get
some
more
registries
out
there.
That'd
be
nice.
A
Anybody
anybody
in
the
the
rambly,
so
you
can
speak
trash,
talk
and
kibbits
me.
B
A
Better:
hey,
it's
old
scott!
What's
up
buddy
thanks
for
tuning
in
so
I
don't
know
if
you,
my
my
nickname,
is
new
scott
super
hack,
a
tastic
with
the
w
or
an
e
it's
because
of
scott
stout.
Here,
it's
not
one
of
my
friends
long-term
friend.
He
was
the
first
scott,
so
we
we
call
him
scott
classic
and
I
am
new
scott
and
that's
so,
if
you've
ever
wondered.
Why?
My
name
is
that
it's
it's
right
there,
okay,
all
right
back
to
this!
A
A
So
I
think
it's
a
good,
succinct,
long-form,
post
of
operators
and
kubernetes
worth
the
read
if
you're.
If
you
have
questions,
then
maybe
use
it
as
a
jumping
off
point
to
go
and
look
at
other
things
or
read,
documentation
or
read
a
couple
of
books.
A
Speaking
of
books,
we'll
jump
one,
so
canadian
action
is
hitting
the
presses
right
now.
So
that's
you.
If
you
want
a
physical
copy
of
the
k
native
in
action
book,
which
I'll
show
you
a
little
picture,
you
could
get
yours
today,
for
you
know,
50
bucks,
what
a
deal.
A
A
A
I
am
a
huge,
huge
co-fan.
Basically
well,
I
have
the
luxury
of
staying
in
the
go.
Land
go
world,
and
so
I
basically
just
use
co
all
the
time
all
day.
A
A
I
guess
there's
a
there's:
a
new
kpac
release
that
that
just
showed
up
that's
cool,
okay,
okay,
okay,
so
we're
here
to
talk
about
ducks
and
let's
see
if
I
can
see
a
see,
a
raise
of
hand
of
who
understands
what
in
the
world
we're
talking
about.
When
we
talk
about
duct
types
in
kubernetes,
we
could
start
with
what
is
a
duct
type.
A
The
name
gets
it's
it's,
okay,
so
in
in
programming
languages
right
like
in
java,
you
would
say
something
like
foo
class
implements
and
then
it
would
list
all
of
the
interfaces
that
it
has
opted
into
right,
and
that's
that's
a
very
explicit.
I
am
this
thing.
A
duct
type
is
more
like
something
in
python.
It
was
made
popular,
but
go.
A
A
A
So
I
have.
I
have
set
up
a
semi-contrived
thing
that
we
can
walk
through
and
then
add
to
it
as
a
as
a
duct
type.
A
Yes,
javascript
also
does
duck
typing.
If
you
want
I've
mostly
used
it
inside
of
python,
go
so
okay.
Here's
the
scenario.
Let
me
switch
to
this
one.
A
Oh,
the
hack,
I
o
link
is
k
native
or
no
tgik
dot,
io,
slash
notes.
B
A
Thank
you,
okay.
Okay,
here
we
go
so
what
do
we
got?
So
I
built
this
thing.
Actually,
sorry
we're
gonna
we're
just
gonna
jump
in
and
then
I'm
gonna
hopefully
answer
some
questions
and
then
we're
gonna
jump
into
some
actual
live
coding,
stuffs
and
and
see
where
we
end
up
so
first
off
what
we're
gonna
do
is
I'm
gonna
copy
and
paste
this
little
kind,
cluster
creation
thing.
Basically,
I'm
going
to
set
up
a
kind
cluster
with
some
extra
things
so
that
it
lets
me
build
images
and
push
to
it.
A
How
is
duct
typing
implemented
under
the
hood
in
the
compiler?
You
know
what
I'm
not
I'm,
not
totally
sure.
I
have
some
guesses,
but
I
just
use
it
if
only
there
were
some
compiler
nerds
in
the
audience.
A
A
So
you
know
if
you
have
an
opportunity,
add
an
emoji
or
some
like
scrolly
thing
or
whatever,
because
it
makes
me
feel
good
and
we're
just
gonna
make
sure
that
so
I'm
going
to
export
the
kind
cluster
name.
I
called
this
one
tgik
and
then
I'm
going
to
point
my
local
co
instance
to
to
push
to
the
local
registry
there.
So
I
do
have
docker
running
and
installed,
but
I
don't
actually
like
writing
doc
files.
So
I
I
didn't
there's
no
docker
file
here
we
can.
A
A
A
See
so
let's
get
the
namespaces
and
I
can
show
you
cool
so
there's
this
new
math
namespace
in
this
new
cluster.
A
And
in
there
is,
you
know
it's
a
bunch
of
stuff.
The
important
parts
are
the
controller
and
the
web
hook.
This
this
project
has
oh,
actually,
I
can
show
you
this.
So
I've
made
up
two
crds
and
I
didn't
put
the
schema
in
here,
because
this
is
a
silly
silly
silly
demo,
please
don't
do
anything
like
this
and
for
reals
it's
a
contrived
thing
that
I'm
trying
to
show.
What's.
C
A
A
A
Right
so
what
the
spec
says
here
is
you
know
it's
a
kind
ad
add
a
few.
The
bottom
of
the
screen,
oh.
C
A
Thanks
for
the
tip,
okay,
so
we're
going
to
make
another
one.
And
if
you
read
this,
you
know
it's
going
to
say,
add
up
these
values,
one
two
three
four
and
and
we'll
take
a
look
and
in
fact
my
silly
silly
silly
reconciler
has
gone
and
looked
and
said:
yep,
I'm
gonna.
I
developed
this
expression
that
represents
this
crd
and
the
result
is
this,
so
we
can
edit
that
it's
an
add,
object
and
view.
A
So
here's
where
the
duct
typing
comes
in
in
the
status
of
these
resources,
I've
defined
expression,
so
status.expression
is
a
string.
That
represents
something
right
like
whatever
the
the
equation:
that's
required
to
produce
the
result
in
spec
or
the
in
the
status,
and
so
the
duct
type
doesn't
actually
know
what
is
in
the
spec
or
what
this.
What
any
of
the
pieces
mean?
All
it
understands
is
status.expression
and
status.result
mean
these
certain
things.
So
now
we
can
kind
of
look
at
other
objects
in
the
cluster
and
figure
something
out
about
them.
A
So
we've
added
edited
add
a
few
look
at
the
math
again
cool,
so
we
can
see
that
expression
has
updated,
but
we
can
do
fancier
things
in
the
implementation
detail
of
the
ad
resource.
A
Demo,
okay,
so
what's
happened.
This
is
interesting,
so
I've
here's
the
schema
up
here
for
the
ad
refs
and
in
its
spec.
I
I
give
a
static
value
and
then
I
give
two
object.
References
to
the
two
things
that
we
just
created
and
what's
happened
is
the
controller.
A
B
A
A
Does
the
math
crd
recurse
it
it
will
recurse
it
will
recurse
it
will
not
detect
loops
because
I
wrote
this
in
a
couple
hours
yesterday
you
get
what
you
pay
for
all
right,
okay,
so
we're
going
to
we're
going
to
pause
for
a
second
and
we're
going
to
take
a
little
look
at
the
controller
here
to
see
what's
going
on,
so
I
have
two
reconcilers
there's
an
add
and
the
subtract
so
we'll
take
a
look
at
add.
C
A
The
reconciler
function
method
and
let's
make
this
a
little
bigger,
it's
kind
of
what
you
would
expect.
So
we
have
some
magic
in
k
native
that
helps
us
generate
a
bunch
of
all
of
the
preamble
pieces
for
reconciliation
and
the
end
result
is.
I
just
have
to
implement
this
reconcile
kind
in
the
next
demo.
We're
going
to
try
to
do
it
in
not
k
native
land.
It's
because
duct
typing
isn't
dependent
on
k
native,
but
I
implemented
this
quickly
yesterday
by
using
our
frameworks.
A
A
A
A
Popcorn,
so,
okay,
so
that's
what
the
ad
looks
like
and
then
the
reconciler
again
is:
I'm
I'm
just
looping
through
them,
because
it's
a
very
simple
example
to
kind
of
describe
duct
types.
I
I
just
checked
to
see
if
you
know
like
length
at
night,
so
here's
where
the
recursion
happens
right.
I
don't
actually
look
at
what's
down.
I
rely
on
the
reconciliation
of
the
object
below
like
that.
I'm
pointing
to
to
come
up
with
a
result,
so
it
will
recurse,
but
it
doesn't
actually
like
traverse
the
recurse.
A
So
the
magic,
though
I
glaze
over
this
right,
what
I'm
doing
here
is
I'm
going
to
get
a
result,
get
results
that
says
if
the
reference
that
I'm
pointing
to
is
not
null
go
and
get
the
results
and
right.
This
is
a
big
hand.
Wavy
thing
I
I
made
this
thing
called
a
results
type,
that's
part
of
the
duck
package.
It's
in
this
project
we
can.
We
can
take
a
look
there
and
it's
kind
of
what
you'd
expect
too.
A
It
uses
client
gen,
but
I
don't
actually
generate
a
client
because
there's
no
api
endpoint
that
you
could
actually
go
in
and
fetch
this
thing
it's
gonna,
it's
gonna
sit
in
front
of
well,
it's
just
a
definition
of
an
object
that
you
could
cast
any
other
runtime
object
into
and
interact
with
it.
Remember:
okay,
yeah!
So
so
it
looks
like
a
normal
type
right.
It
has
a
type
meta,
it
has
object
meta,
it
doesn't
have
a
spec,
because
I
don't
care
right,
I'm
only
interested
in
the
results
in
this
duct
type.
A
A
It's
expression
and
result
just
the
same
exact
thing
that
I
showed
in
inside
the
the
add
resource
the
duct
type
matches
the
shape,
because
results
is
the
partial
schema
of
the
spec
of
the
duct
type
that
I'm
interested
in
a
bunch
of
tooling
note.
This
fancy
gen
duck
thing.
The
tooling
expects
some
of
the
other
object
meta
to
help
me
deal
with
dynamic
clients,
so
I
don't
have
to
so
there's
a
bunch
of
tooling
and
wrappers
that.
A
So
the
the
get
results
thing
we're
using
some
tooling
that
comes
out
of
a
k
native
given
a
gvk
and
a
name
and
a
namespace
go
and
fetch
an
object
tracker
or
we're
going
to
track
that
object,
which
means
that
we
get
updates
for
for
changes
for
these
things
that
occur,
and
so
we
can
get
re-enqueued
and
re-reconcile
as
our
object,
refs
update,
which
is
interesting,
because
I
can
watch
things.
I
don't
actually
know
about
ahead
of
time,
which.
A
A
Okay,
okay,
all
right!
So
basically
there's
the
there's
a.
I
can
ask
the
informer
factory
for
a
lister
given
a
gvr,
so
you
know
under
the
hood
here,
there's
like
a
bunch
of
dynamic
clients
and
some
other
stuff
and
some
caches
that's
based
on
a
gvr.
I
can
give
it
the
the
lister
interface,
which
is
exactly
what
you
would
expect
for
typed
clients,
so
like
a
typed
lister
and
then
I
can
go
and
list
that
object.
A
Oh
come
on
mark.
I
have
an
id
I'm
going
to
pop
it
out
in
one
second,
so
we
cast
and
cast
that
thing
to
a
results
type
if
it's,
if
it
is
and
then
we
return
it
so
up
here
get
results,
returns
back
an
object,
that's
known
by
the
gvk,
that's
defined
by
the
object,
ref
and
reminder
that
object
graph
looks
like
this.
A
So
in
this
case,
as
the
ad
reconciler
is
running,
it
finds
a
ref.
That's
not
null.
It
says:
okay
cool,
I
guess,
you're
a
subtract
whatever.
That
is
from
the
same
api
version,
which
is
maybe
cheating.
If
you
you
want
to
be
a
purist
and
then
it
goes
and
basically
converts
that
to
the
duck
type
and
then
I
can
operate
them.
I
can.
I
can
operate
on
the
duct
types
as
if
I
know
what
they
are,
but
I
don't
actually
know
what
they
are.
They
don't
really
need
to
care.
A
Carlos
asks
do
I
want
the
expression
or
the
result
out
of
the
ref.
I
actually
want
both,
because
I
don't
want
to
calculate
the
here's.
Here's
my
micro
optimization
for
the
demo,
and
this
is
stupid,
details
in
it.
This
is
why
I
didn't
actually
pick
a
real
thing.
I'm
just
concatenating
concatenating
the
expressions
wrapped
up
in
parentheses
right.
A
So
if,
if
the
result
type,
you
know
I
so
I
grab
the
status
of
the
expression
or
sorry
the
result,
status,
expression
and
I
just
concatenate
that
inside
of
parentheses
and
the
reconciler
adds
in
a
plus
and
then
whatever
the
whatever
the
result
is.
I
add
it
in
and
so
subtract
actually
looks
very
identical.
I
think
I
changed
a
couple
things.
It
turns
out
that
you
can't
assume
you
can
subtract
0
like
0.
A
Plus
a
number
is
a
positive
number,
but
0
minus
a
number
is
not
what
you
expect
so
subtract
subtract
had
to
understand
some
more
state.
So
I
I
stuck
that
in
there
and
then,
aside
from
that
change,
the
only
real
code
change
between
the
two
reconcilers
is
the
minus
sign
there
there,
okay,
okay,
here
we
go
so
chime
check,
okay,
130.,
so
here
is
where
we
get
real
nervous,
we're
going
to
try
to
add
the
square
crt,
okay,
but
we're
gonna
use
controller
runtime.
C
A
Oh
multiply:
well
we're
gonna
we're
gonna,
make
it
square
okay.
So
we
have
a
a
good
start
of
the
project
here
we
gotta
read
me
in
a
license,
so
I've
already
installed
controller
runtime
and
I
hope
it's
still
all
connected
and
I'm
going
to
follow
along
in
the
quick
start
guide
with
some
modifications.
A
A
And
now
now
here's
the
interesting
part.
I
I
honestly
haven't
used
controller
runtime
in
over
in
over.
I
don't
know
a
couple:
it's
been
a
year,
it's
it's
been
at
least
a.
A
A
A
A
A
Okay,
now
I
don't
I
don't
so
like
I
said
I
don't
really
like
make
files,
and
I
also
don't
really
like
docker
files,
so
we're
gonna
make
a
couple
modifications
to
the
base
installation
here
and
I
just
need
to
okay
right
reviewing,
okay,
so
in
the
config
inside
of
the
web
hook.
What
is
this
thing.
A
A
A
A
And
then
I
can
okay.
So
now
I
can
go
back
to
this
one.
A
A
B
A
So
it's
going
to
do
the
build
it's
going
to
well,
it's
so,
okay!
So
here's
the
quick
version
of
what
co
is
doing.
It's
looking
for
that,
basically
the
same
thing
that
has
the
main
function
in
this
case:
it's
at
the
root
of
the
project
and
it's
compiling
it
and
putting
it
into
a
container
that
we
know
works
well
with
go,
which
is
distroless
because
you
don't
need
anything
else.
A
A
And
we
look
at
the
container
the
container
that
is
mine.
It's
this,
so
co
has
done
a
build.
It's
replaced
the
outbound,
yaml
and
and
taken
that
new
yaml
and
pushed
it
to
coop
cuddle
apply
right.
So
now
I
don't
have
to
think
about
doing.
Docker
builds
or
anything
like
that.
I
can
just
push
it
through
co,
co,
containerizes
it
and
there's
a
bunch
of
optimizations
there
that
work
really
well
for
go
workloads
which
a
lot
of
controllers
and
kubernetes
are
built
and
go.
So
it's
a
great
great
flow
okay.
B
A
A
B
A
All
right,
yolo,
well
we're
gonna
call
it
bass,
wait!
Don't
edit
this,
oh
edit,
this
file,
that's
a
really
scary
warning:
how
do
people,
okay,
scaffolding,
for
you,
okay,
got
it
okay,
I
I
owned
it.
I
changed
it,
I'm
a
little
nervous
that
there's
no
status,
though
in
that
object
up
there.
Aha,
because
there's
nothing
in
this.
A
I
heard
coup
builder
doesn't
have
to
you:
don't
have
to
generate
stuff
anymore,
so
I'm
curious
what
that's
like?
Okay,
oh
hey!
I
found
the
square
controller
so
in
here
what
I
want
to
do.
Oh
look
at
that.
Oh
I
have
to.
C
A
A
All
right,
how
do
I
get
the
object?
Next
steps,
cron
job
tutorial,
that
looks
like
a
good
plan.
Oh
my
goodness,.
B
B
C
A
A
A
A
C
A
Okay,
here
we
go.
I
found
one.
A
A
A
A
I
don't
know
why
you
do
that,
maybe
to
remind
people,
you
know
what
I
bet
they're
doing
is
making
sure
that
the
imports
pull
in
context
so
that
when
I
typed
contact
step
background,
everything
was.
A
A
A
A
A
Ben
asks:
what
kind
of
magic
controllers
have
I
been
using,
so
in
k
native
we've
been
building
a
thin
wrapper
that
sits
on
top
of
the
the
reconcile
key
idea.
We
started
with
what's
what's
inside,
of
api
machinery,
as
example
api
and
we
built
from
there,
and
so
we
I
showed
you
that
actually,
okay,
tangent,
this
is
fun.
This
is
the
this
reconcile
kind
function
is
the
the
what
gets
invoked
from
a
bunch
of
generated
code,
so
we
do
generated
code
because
there's
no
there's.
No.
A
We
want
strongly
typed
right,
like
it's
kind
of
a
bad
experience.
If
you
pass
in
like
a
a
runtime
object
here
that
it
happens
to
be
a
type,
but
we
don't
know
it
because
we
can't
tell
you
so
there's
I'm
actually
importing
the
right.
The
client
injection,
reconciler,
math,
subtraction
reconciler,
and
that's
the
thing
that
does
all
of
the
common
tasks
that
you
need
to
do
to
do.
A
Reconciliation
like
update
the
status
or
hydrate
the
thing
or
make
sure
you
don't
mutate,
the
spec
or
update
conditions,
and
that
that
kind
of
stuff
right,
like
retries,
on
apply
because
sometimes,
if
you
mutate
the
status
and
you
want
to
go
push
it
back,
but
it's
mutated,
because
the
spec
changed
or
whatever.
But
you
still
want
to
store
that
status.
A
We
can
do
retries
where
you
you
bump
up
the
resource
number,
and
things
like
that.
So
maybe
like
do
a
merge
of
things
that
don't
matter
all
that
stuff
is
handled
by
this
generated
layer
above
this
layer.
All
I'm
responsible
for
is
taking
this
object.
Note
that
I
don't
have
to
do
any
deep
copies
or
anything
which
might
get
me
in
trouble
in
the
other
side
in
the
controller
one-time
code.
A
A
B
There
I
don't
know
how
about
five.
B
A
A
B
A
A
A
B
A
B
A
A
A
Not
formatted,
we
need
to
enable
the
status
of
resource
that
could
be,
I
think,
there's
an
annotation
for
that
for
coup
builder,
so
I
should
switch
to
chrome.
B
A
B
A
B
B
A
A
A
A
A
I
don't
know
if
you
don't
know
this
trick,
you
just
add.
If
you
want
to
get
a
something
to
re-reconcile
or
re-reconcile,
you,
just
maybe
like
add
an
annotation,
and
that
should
poke
the
reconciler
to
to
do
something,
but
it
didn't
so
maybe
there's
some
extra
stuff
that
needs
to
get
built.
A
A
B
A
B
A
So,
okay,
we're
going
to
customize
one
more
time
to
get
back
to
our
release
and
then
we
can
co-apply.
I
know
I
don't
have
to
build
a
container,
but
it's
just
the
process
goes
really
fast.
If
that's
like
your
loop
right
all
right,
so
we're
back
and
let's
run
a
watch
on
the
object,
and
hopefully
this
thing
gets
the
status
as
soon
as
it
gets
reconciled.
A
A
C
A
B
A
B
B
A
A
A
Is
not
what
I
would
expect
and
it's
not
typed,
so
it's
not
helped
me
a
lot
keys
and
values.
B
C
B
A
Do
I
need
a
namespace,
oh
you're,
thinking.
B
A
A
B
A
What
is
what's
inside,
the
multi
multiply,
namespace
can
do
it
get.
A
B
A
A
B
A
A
B
B
B
A
B
A
A
So
over
here
in
the
maths
department,
the
controller
can
only
do
what
it
can
do,
because
it
has.
This
results,
viewer,
cluster
role,
and
so
what
this
is
is
a
cluster
role
that
goes
and
collects
all
other
cluster
roles
with
duck.tableflip.div
results,
okay
and
then
down
here,
because
this
particular
controller
implements
the
maths
resource
and
it
adds
add
and
subtract.
A
B
A
That's
going
to
let
the
the
cluster
role
that
has
been
defined
in
the
maths
project
actually
use
the
role,
and
then
this
stuff
is
wrong
right
and
I
think,
let's
see,
make
sure
we
get
this
right
for
whatever
reason
it
added
at
tgik.tgik,
and
maybe
I
messed
that
up.
I
doubt
that
I'm
supposed
to
just
say:
dot
io,
but
okay,
that's
cool
the
resource
right.
It's
it's
they're
squares,
but
with
a
little.
B
A
A
So
now,
what's
supposed
to
have
happened,
is
the
controller
of
of
the
maths
department
has
picked
that
thing
up
and
reapplied
now
it
has
the
rights
to
go
and
read
the
the
new
types
that
we've
installed.
So
let
let's
go
up
here
and
we
can
make
a
new
make
a
new
example
of
a
mixture.
Actually
we
could
maybe
probably
edit
this
thing.
A
So,
let's
add
another
ref
and
I'm
really
sorry
about
how
slow
it
it
was
to
get
the
controller
runtime
bit
going
because
I
just
haven't
touched
it.
C
C
A
A
A
B
A
A
A
A
A
A
Yeah,
okay,
all
right,
you
know
what
okay,
let's,
let's
just,
let's
be
real
for
a
minute.
A
B
A
A
A
B
B
A
B
A
Look
at
that,
okay,
so
I
didn't
have
to
kill
the
pod
it
just
I
had
a
small
typo
when
I
was
copying
pasting
the
cluster
roles,
so
I
I
defined
the
aggregate
cluster
role
and
then
I
accidentally
didn't
rename
the
the
local
cluster
role
that
gets
aggregated.
So
it
worked
in
the
demo
because
you
know
it,
it
has
the
right
rights,
but
it
didn't
have
that
aggregate
role.
So
we
added
we
switched
out
use
the
same
name
as
the
role
binding
uses,
which
is
here
the
cluster
roll
binding.
A
So
this
is
where
it's
collecting
the
results
viewer,
that's
how
it
knows
the
other
duct
types
we
had
a
typo
there
we
fixed
it.
We
we
also
have
the
correct
cluster
role
here
in
for
our
multi-viewer,
which
is
this
multiply
class
and
the
result
go
back
here.
Is
we
get
our
our
cute
little
text
inside
of
the
ad?
So
now
we
have
this.
This
full
thing
where
we
we
provide
a
the
add
resource
gets
a
fixed
value.
It
gets
a
subtraction,
an
addition,
and
now
this.
A
B
A
So,
let's
go:
let's
talk
about
duct
typing
a
little
bit
so
like
what
would
you
do
with
this
stuff?
What
I'm
trying
to
show
is
the
what
I've
done
is
made
this
ecosystem
of
things
that
you
could
come
participate
in
right
like
if
you
would
like
to
be
a
a
resource
that
produced
a
result
by
providing
an
equation,
you
could
participate
by
adding
the
r
back
for
your
resource
and
having
the
right
shape
so
that
my
controllers
can
go
and
without
understanding
anything
about
you.
B
A
A
A
I
you
know
what
so
the
issue
is
that
I
think
that
there's,
but
I
just
I
just
killed
all
the
pots,
so
it
really
should
just.
A
A
B
B
A
A
B
A
B
A
A
So
we
have
to
wait
the
the
lease
expiration
time.
A
B
A
I
wonder
I
wonder
if
I
got
helped.
B
A
Oh,
it's
because
I'm
in
a
new
terminal
and
it
doesn't
have
the
kind
config.
Let's
just
try
this
one.
Last.
A
A
A
When
I
set
up
the
instance
of
the
reconciler,
I'm
I
set
up
all
this
watches
on
the
re.
Basically
remember
I
was
doing
tracking
for
objects.
The
tracker
has
a
delegate,
the
delegate
re-enqueues
the
the
thing
that
I
would
like
to
reconcile.
A
So
when
I,
when
I'm
doing
the
real
reconciliation-
and
I
I
ask
the
tracker
for
the
reference
it
registers-
the
I'm
interested
in
this
thing,
every
time
it
changes-
please
re-enqueue
me
and
so
without
changing
anything
or
even
being
aware
of
the
real
kind,
the
when
we're
reconciling
ads-
and
this
thing
points
to
an
object
reference
of
something
like
a
square,
it
changed.
So,
oh,
oh,
oh
sorry,.
A
So
let
me
go
back
so
there's
there's
this.
The
delegate
is
watching
on
the
factory
for
the,
so
the
tracker
calls
the
delegate
and
says
like
yeah,
something
I
attract
got
updated
and
then
it
re,
so
it
recalls
reconcile
kind,
yeah
yeah.
It's
also
delayed
it's
the
problem,
so,
okay,
so
magic,
that's
magic.
A
If
I
think
that
there's
kind
of
two
people
that
are
thinking
about
providing
like
you
can
either
provide
duct
types
to
play
in
an
ecosystem,
so
that
others
can
come
in
and
add
their
whatever
thing
and
so
like.
How
would
you
use
this
in
the
real
world
in
k
native?
We
use
it
to
figure
out
the
address
of
some
object.
That
represents
something
that
has
an
internet
address.
A
A
The
we
also
do
this
by
we
make
crds
that
represent
protocol
choices
for
channels,
they're
strongly
typed
crds
with
all
all
sorts
of
stuff,
and
then
there's
there's
a
duck
type
contract
that
actually
lets
us
mutate
them
generically.
So
I
can
operate
on
these
like
channelable
objects,
and
I
can
inject
subscribers
into
their
specs
and
they
can
reconcile
it
in
whatever
way
they
need
to
and
we
never
have
to.
A
But
we
can
provide
that
same
well,
I'm
going
to
do
a
single
job
and
I'm
going
to
inject
the
subscribers
into
your
spec
for
you
as
a
specific
role,
so
that
lets
us
have
a
very
extendable
system
in
this
duct
type
ecosystem.
So
the
you
know
we
could
also
do.
I
don't
know
if,
if
your
resource
has
a
backup,
maybe
there's
like
a
you-
can
add
something
to
the
spec.
That
says
like
do
a
backup
and
then
that
valero
stuff
can,
you
know,
do
its
thing
so.
A
The
what
I
want
to
shout
out
to
here
is,
I
am
asking
inside
of
the
api
machinery
to
come
and.
A
It
would
be
really
cool
if
we
could
upstream
a
lot
of
this
work
right
now.
There
there's
several
so
the
list
of
right.
So
there's
this
giant
list
of
current
implementers
of
duct
type
concepts.
Some
things
call
it
duct
types.
Some
like
example,
like
cross
playing
totally
understands
they're
producing
duct
types.
A
A
In
their
case,
you
want
to
have
you
know,
an
object
that
represents
configuration
on
some
remote
cluster
and
then
they
want
to
be
able
to
have
you
provide
instances
of
those
cluster
objects
and,
and
then
it
their
controllers
can
operate
on
some
generic
pieces
or
view
the
status
in
some
generic
way
based
on
duct
types
right
so
based
on
some
partial
schema
that
we've
we
understand,
so
we
are
going
to
meet
and
we're
going
to
talk
it
in
more
detail
and
hopefully
show
a
better
quicker
demo
during
the
meeting
to
talk
about
duct
types
and
where
we
could
get
some
common
tooling
inside
of
upstream
kubernetes,
so
that
everyone
can
pull
from
that
or
build
from
that,
and
I
don't
know
what
the
world
will
look
like
kind
of
in
a
year.
A
A
Doug
types
right
like
if
you
think
of
owner
refable,
every
resource
can
be
owned
by
another
resource
because
of
garbage
collection
and
things
tools
like
octant,
take
advantage
of
this
by
building
up
object,
graphs
and
viewing
what
things
are
and
that
tool
just
works
even
for
crds
that
it
doesn't
know
because
every
resource
has
that
common
shape.
So
the
proposal
is,
you
know
some
common
tooling
for
being
able
to
make
reconcilers
that
can
operate
on
a
duct
type
and.
A
A
Check
the
twitters-
I
I
don't
know
with
that-
I
think
I'm
gonna
wrap
it
up.
I
think
we're
kind
of
over
time.
Thanks
for
sticking
with
me.
I
hope
it
was
interesting,
I'm
so
sorry
for
fumbling
with
the
controller
runtime
it.
Maybe
I
should
have
tried
a
little
harder
but
yeah,
that's
that's
the
show.
I
think
what
do
you
think
any
questions?
I'm
yeah
I've
been
answering
stuff
as
we
go,
but
maybe
there's
some
more
direct
questions
that
I
could
try.
A
Okay,
awesome
well
I'll,
see
you
on
the
internet.
This
is
super
fun,
see
you
next.