WEBVTT

00:00:00.000 --> 00:00:06.320
Ready? Let's take flight. Too many charts, too many files, templated traps for a thousand miles,

00:00:06.320 --> 00:00:10.720
curly braces, values gone wild, Kubernetes with a loaded smile, then Yoke walks in with a

00:00:10.720 --> 00:00:15.335
cleaner plan. Write real code, let the package stand. Wasm kicks in the cluster lights. Flights

00:00:15.335 --> 00:00:19.815
go up on a Friday night, Copilot test it, ship it clean. Less mystery in the

00:00:19.815 --> 00:00:41.355
machine, no more guessing what broke this time. David's got it on the line. Flight,

00:00:41.355 --> 00:00:47.515
no turning back. Wasm on the runway? Thunder on the track from Helmborn

00:00:47.515 --> 00:00:53.835
goes to a cleaner road. David's here and we're talking Yoke. Sign

00:00:53.835 --> 00:01:26.140
the module, jig the hash. Don't let the wild scripts Hello,

00:01:26.140 --> 00:01:30.940
and welcome back to the Rawkode Academy. This is yet another episode of Rawkode Live, the

00:01:30.940 --> 00:01:34.940
show where we take a look at the latest and greatest open source projects powering our

00:01:34.940 --> 00:01:40.295
cloud native architectures and making our Kubernetes lives a little bit easier. And today is no

00:01:40.295 --> 00:01:46.055
exception. We're taking a look at a project called Yoke. And I am joined by David

00:01:46.055 --> 00:01:50.455
from a nice sunny location. Hey, man. How is it? How's it going? It's going well.

00:01:50.455 --> 00:01:55.190
It's going well. Glad to be here. I I had to, you know, the aviation themed

00:01:55.190 --> 00:02:00.230
project had to have a sky in the background. So Exactly. We need to put an

00:02:00.230 --> 00:02:03.510
Easter egg where people can count any planes going by, and we'll give them some, I

00:02:03.510 --> 00:02:09.945
don't know, a mug. A mug. That's a good price. Alright. Back on it's

00:02:09.945 --> 00:02:12.745
lovely to meet you. Thank you for taking time out of your day to join me

00:02:12.745 --> 00:02:16.585
and to share your your project with us all. So before we get into what Yoke

00:02:16.585 --> 00:02:19.865
is, could you just take a few minutes to tell us a little bit more about

00:02:19.865 --> 00:02:25.920
you? Sure. Sure. Feels like a job interview. Yeah. No. So I am

00:02:26.800 --> 00:02:33.120
my name is David, and I am the original author and lead maintainer of the Yoke

00:02:33.120 --> 00:02:39.415
Project. I I like to say I've been doing software for just a

00:02:39.415 --> 00:02:44.855
little bit more than ten years now, and my background has always been, as a back

00:02:44.855 --> 00:02:50.750
end software developer. And I went through, you know, the the the the early days of

00:02:50.750 --> 00:02:56.750
my career was all about, you know, mean stack, JavaScript, kind of, go with the flow,

00:02:56.750 --> 00:03:00.990
no types, don't you know, just do everything as quickly as possible, and we'll figure it

00:03:00.990 --> 00:03:05.275
out later. And as my career grew, I was always like, oh, like, we we really

00:03:05.275 --> 00:03:09.275
do need these things, and it's really awesome, you know, building software when you have the

00:03:09.275 --> 00:03:13.995
right tools. And then a couple years back, I switched into platform engineering, and it was

00:03:13.995 --> 00:03:20.060
like I jumped back into 2015. And so yeah. And

00:03:20.060 --> 00:03:25.020
so I'm just making my little effort at at, you know, changing that a little bit.

00:03:25.020 --> 00:03:31.340
And so here we are today. So what what what powered what drove the switch

00:03:31.215 --> 00:03:37.455
from your main stack onto platform engineering then? Oh, I I ended

00:03:37.455 --> 00:03:42.175
up doing I I worked at CircleCI for a couple years, so I moved closer to

00:03:42.895 --> 00:03:48.390
to just working on CI systems. I was doing, like, security engineering and CI related systems,

00:03:48.390 --> 00:03:52.710
and then and then I just wanted a change. So I jumped I had, one of

00:03:52.710 --> 00:03:58.310
my friends who became a, a platform engineer here in Canada, who was, like, director of

00:03:58.310 --> 00:04:04.395
DevOps a company. And I'd worked with them multiple times before, and I just thought, yeah,

00:04:04.395 --> 00:04:10.155
I could do a different challenge, and, it's been interesting. So you jumped over to the

00:04:10.155 --> 00:04:14.090
platform engineer and save. You felt like you went back in time. Everything was on fire

00:04:14.090 --> 00:04:20.090
and looking like shit, and you thought, You know? Yeah. Yeah. Well, I thought I thought,

00:04:20.090 --> 00:04:24.330
like, I've seen this problem before, right, which is I mean, I I hadn't seen it

00:04:24.330 --> 00:04:29.685
exactly in this in this way, but, you know, it just felt like we're plugging things

00:04:29.685 --> 00:04:34.885
together. We're hacking things. You know, we're we're bashing script together, and then we're we're templating

00:04:34.885 --> 00:04:40.645
variables in, and everything's producing YAML, but YAML is just JSON. And so whenever I hear

00:04:40.645 --> 00:04:45.720
somebody say that they're a YAML engineer, in my mind, I just translate that to I'm

00:04:45.720 --> 00:04:51.560
a JavaScript object notation engineer, which is just like a weaker form of JavaScript engineer. Anyways,

00:04:51.560 --> 00:04:56.235
no no shade. No shade at anyone. We all do, you know, the best we can

00:04:56.235 --> 00:05:01.675
and the god the lord's work. But but, yeah, I just felt like if if things

00:05:01.675 --> 00:05:05.835
could be typed, we could just build so much more resilience into our systems and make

00:05:05.835 --> 00:05:10.690
them so much more fun to work with. I mean, I I I could agree more.

00:05:10.850 --> 00:05:14.610
So with that, why don't you tell us a little bit about Yoke and the project

00:05:14.610 --> 00:05:19.090
we're gonna show people today? I'm sorry. Can you just repeat the question? You cut off

00:05:19.090 --> 00:05:24.505
just a little bit. Sorry. Hopefully, that's not my connection. But yeah. It's a cross Atlantic

00:05:24.505 --> 00:05:29.785
call. You know? Yeah. I was just asking, you know, with everything you've just shared then,

00:05:29.785 --> 00:05:32.265
you're gonna show us an amazing project, or we're gonna take a look at an amazing

00:05:32.265 --> 00:05:35.225
project called Yoke. Can you tell us a little bit about it, the problem I was

00:05:35.225 --> 00:05:38.505
trying to solve, and and why you even had this idea and started it in the

00:05:38.505 --> 00:05:44.780
first place? Yeah. Yeah. So the the the

00:05:44.780 --> 00:05:48.380
project in the platform engineering space that I've I've had to work with even before I

00:05:48.380 --> 00:05:54.435
was a platform engineer and that always gave me, you know, nightmares was was Helm.

00:05:54.595 --> 00:06:00.675
And writing Go templates and just, like, trying to figure out the indentation that

00:06:00.675 --> 00:06:05.910
you need for a specific block, especially when you're not e now today, that's changed myself

00:06:05.910 --> 00:06:09.750
at least. Like, back then I wasn't super familiar with all the Kubernetes objects and just

00:06:09.750 --> 00:06:13.750
having to template things that you don't even know what they're supposed to look like was

00:06:13.750 --> 00:06:18.390
was just terrible. And nowadays it's it's a bit better and I'm more familiar and familiarity,

00:06:18.390 --> 00:06:24.645
you know, breeds, you know, the illusion of comfort. But the but

00:06:24.645 --> 00:06:30.165
I just always felt like we're, you know, paddling up river when using Helm. And my

00:06:30.165 --> 00:06:35.960
idea was always would just wish I could just write a program that could just produce

00:06:35.960 --> 00:06:41.320
the Kubernetes resources that I want, and and I didn't understand why I couldn't just do

00:06:41.320 --> 00:06:47.395
that instead of templating the root the resources. And so at some point, just thought,

00:06:47.395 --> 00:06:51.395
yeah, we have to we have to do this. And the eureka moment came when I

00:06:51.395 --> 00:06:56.435
was like, well, running code is hard and porting code is hard and doing all this

00:06:56.435 --> 00:07:00.500
kind of stuff and securing code is hard. But when I realized I could just do

00:07:00.500 --> 00:07:04.660
it with WebAssembly, then that was just kind of like the light and, and I ran

00:07:04.660 --> 00:07:09.540
with that idea and then eventually Yoke was born. Awesome. I mean, you're saying all the

00:07:09.540 --> 00:07:14.485
right words for me. I like types, I like WebAssembly, and I like Kubernetes. I do

00:07:14.485 --> 00:07:18.885
not like Helm, and I do not like YAML. So all the favorite words coming out

00:07:18.885 --> 00:07:24.645
at once. What I would say is necessity always powers innovation. Right? I'm sure there's like

00:07:24.645 --> 00:07:27.605
a proper way to say that. That's the famous quote, but that's just the way I

00:07:27.605 --> 00:07:34.640
remember it. And I think say spite powers innovation. I mean,

00:07:34.640 --> 00:07:39.200
yeah. Definitely. Right? We we see these things that frustrate us and, you know, I've been

00:07:39.200 --> 00:07:42.640
in the Kubernetes space for a long time, so have a lot of my viewers. And

00:07:42.640 --> 00:07:48.215
I don't think anyone likes Helm. We're just in a position where it has it it

00:07:48.215 --> 00:07:52.375
it's solved a problem at the time and now we seem to be stuck with this

00:07:52.375 --> 00:07:58.910
thing because everybody has a Helm chart for their application. But Yeah. These things are just

00:07:58.910 --> 00:08:03.710
big balls of mud as far as I'm concerned. Everything, a line of YAML gets templated,

00:08:03.870 --> 00:08:09.550
everything becomes an option and, you know, we're not even gonna talk about Helm hooks. Right?

00:08:09.550 --> 00:08:14.935
And let's even not mention Helm Tiller. Right? There's been a lot of mistaken paths that

00:08:14.935 --> 00:08:18.295
have gotten us to where we are today, but I do generally feel that we need

00:08:18.295 --> 00:08:24.295
something better moving forward and the community hasn't really got that option yet. And

00:08:24.295 --> 00:08:30.640
I guess the question to you would be, how do you see overcoming this hurdle of

00:08:30.640 --> 00:08:35.680
the status quo within Kubernetes and pushing people or encouraging people to adopt what is essentially

00:08:35.680 --> 00:08:42.005
a better tool? Yeah. And I I think what's interesting is that there there are already

00:08:42.005 --> 00:08:48.005
a lot of better tools. Right? So, I mean, one of the the the

00:08:48.005 --> 00:08:54.165
closest would be Timoni. Right? The the CUE-based package manager. We

00:08:54.165 --> 00:08:59.070
already have a better helm in in in that one. Right? So it is it is

00:08:59.070 --> 00:09:05.390
hard. I just think that where Yoke is slightly

00:09:05.390 --> 00:09:10.510
different than the other tools is that it's not it it it changes the viewpoint on

00:09:10.510 --> 00:09:16.805
on and how we interact with Kubernetes. Right? It's no longer a configuration issue. Right?

00:09:16.805 --> 00:09:22.165
It's not about, like, how do we configure our resources or what configuration language should I

00:09:22.165 --> 00:09:26.850
be using or what configuration format should I be using. Instead, it shifts it more to

00:09:26.850 --> 00:09:33.010
like a a an programmatic space. And so it's a it's a logic problem. And that's

00:09:33.010 --> 00:09:38.050
why Helm is is is is so difficult. Right? It's because you're writing YAML essentially, but

00:09:38.050 --> 00:09:40.995
then you're templating parts of it out, which is saying, like, I'm gonna put a conditional

00:09:40.995 --> 00:09:44.675
in or I'm gonna put a loop here or I'm gonna do a loop and a

00:09:44.675 --> 00:09:47.635
conditional or actually I need to build some variables and I need to to YAML them

00:09:47.635 --> 00:09:53.210
and from YAML them or do whatever kind of anyways, I'm I'm going off. The the

00:09:53.210 --> 00:09:59.370
point is is that the that it's actually a logic issue, right, that that we wanna

00:09:59.370 --> 00:10:04.730
solve. What we wanna do is express logic, and that's where Helms break down breaks down.

00:10:04.730 --> 00:10:11.355
Because as a viewing engine, that's fine, I guess, if you're into that. But and

00:10:11.355 --> 00:10:17.595
where Yoke is different than than Q or different than JSONets or different than, you

00:10:17.595 --> 00:10:22.360
know, all these other ones is that we're not trying to invent a new language. I'm

00:10:22.360 --> 00:10:26.840
just trying to make a path forward. So say, hey, you can express this with code

00:10:26.840 --> 00:10:32.840
and you can have all the advantages and disadvantages that come with that approach,

00:10:32.840 --> 00:10:39.625
but you're free to choose it. And I just other than maybe, KCD, the

00:10:39.625 --> 00:10:43.065
the this would be, like, the only option, I think, in the ecosystem that allows you

00:10:43.065 --> 00:10:49.290
to do the code first approach. So pushing that forward. Oh, and for adoption. Yeah.

00:10:49.290 --> 00:10:53.690
I don't know. I hope I hope that we can. There there there are ideas within

00:10:53.690 --> 00:10:58.010
Yoke that we can explore later. One of the things being that it is code, so

00:10:58.410 --> 00:11:04.505
we can run Helm charts with Yoke. There's a bridge. It's a Go specific

00:11:04.505 --> 00:11:11.225
bridge, but there is a bridge, and maybe we can see that later. Alright. Awesome. Yeah.

00:11:11.225 --> 00:11:14.900
I think we'll we'll get hands on now. But I I just touch on on one

00:11:14.900 --> 00:11:20.100
more thing as part of that conversation is that, you know,Timoni is a great project. I

00:11:20.100 --> 00:11:24.900
think people struggle with Q. It's very academic. It's difficult for them to learn. I am

00:11:24.900 --> 00:11:29.905
definitely I I love Q. I use Q. I write loads of Q projects. But every

00:11:29.905 --> 00:11:34.065
time I get one of those projects to someone else, they're like like, that's too hard.

00:11:34.065 --> 00:11:38.865
I'm not doing it. Go is certainly something that people are very familiar with within the

00:11:38.865 --> 00:11:43.105
Kubernetes community. So I can see the appeal of a tool like Yoke for enabling them

00:11:43.105 --> 00:11:48.220
just to use the tool chain that they already have. Right? And and be instantly on

00:11:48.220 --> 00:11:52.140
ramp and good at what they have to do, which is fantastic. And what I like

00:11:52.140 --> 00:11:55.500
about it is that it's one of my arguments when I make this pitch is that

00:11:55.500 --> 00:11:59.605
it's also a more translatable skill. So if you don't know q and you don't know

00:11:59.605 --> 00:12:03.845
go, I mean, they're both great things to learn. The more things you learn, more power

00:12:03.845 --> 00:12:07.845
to you. But if you learn a little bit of go and able to to be

00:12:07.845 --> 00:12:11.620
able to write your packages, well, now, you know, a little bit more Go and you

00:12:11.620 --> 00:12:15.700
can do a little bit more things even outside of writing, you know, Yoke packages. You

00:12:15.700 --> 00:12:19.780
could Yeah. Maybe hook into writing a server or doing something else, you know. So it's

00:12:19.780 --> 00:12:23.540
just a skill that is is good to have, right, if you're if you're interested in

00:12:23.540 --> 00:12:29.805
programming. Yeah. Alright. One one last thing, because it's kinda slightly pertinent.

00:12:30.205 --> 00:12:35.565
As regards to like alternatives to Helm, customize is one that I always like to kinda

00:12:35.565 --> 00:12:40.125
bring up as a thought experiment because it's baked right in to cube control. And yet,

00:12:40.125 --> 00:12:44.470
I still never see any adoption of it in the wild. I'm curious of whether you've

00:12:44.470 --> 00:12:48.470
played with customize and why do you think people aren't picking that up even though it's

00:12:48.470 --> 00:12:54.735
right there? Well, for me, it just doesn't scratch oh, I bet the

00:12:54.735 --> 00:12:57.375
reason I'm not picking it up, it won't be the same reason that other people aren't

00:12:57.375 --> 00:13:02.575
picking it up. For me, it just doesn't scratch that type safety itch. Right? Mhmm. The

00:13:02.575 --> 00:13:07.770
idea that I wanna express my things logically and then, like, build upon them. If you

00:13:07.770 --> 00:13:13.130
know your your paths and how you wanna patch things, then then then that's good. And

00:13:13.130 --> 00:13:17.450
I guess that's a that's a system of overlays a bit similar to, I guess, how

00:13:17.450 --> 00:13:22.365
Helm does its merges. But at the end of the day, I think that it doesn't

00:13:22.365 --> 00:13:28.765
help me I, like, break out of what I would call YAML soup. You know? And

00:13:28.765 --> 00:13:34.830
so I think it might customize is probably, like, a great the biggest advantage that it

00:13:34.830 --> 00:13:39.310
has in my mind is that it's more flexible in some ways when dealing with, like,

00:13:39.310 --> 00:13:42.510
resources because you can just be like, know exactly what I wanna patch, and I can

00:13:42.510 --> 00:13:46.910
I can go there? And if the Helm charts or even the Yoke flight doesn't expose the

00:13:46.910 --> 00:13:53.195
the knobs for you to do that, then it's hard to to to to

00:13:53.195 --> 00:13:57.915
to target those things. And I think Customize does great there. I just wish that Customize

00:13:57.915 --> 00:14:02.235
was more adaptable to more things or more pluggable into other systems instead of trying to

00:14:02.235 --> 00:14:08.700
be its own thing when it doesn't yeah. I don't have as much experience to

00:14:08.700 --> 00:14:12.780
talk about with customized to speak on it as much as I am. So I'll speak

00:14:12.780 --> 00:14:18.875
before. Alright. Awesome. Let's just get my screen share.

00:14:18.875 --> 00:14:25.355
Let's do this. So as accustomed, we're pretty much all Rawkode Live.

00:14:25.435 --> 00:14:33.160
I have an empty directory with absolutely nothing going on at the moment. What

00:14:33.160 --> 00:14:39.640
we're gonna do is we could go install, but there is a homebrew. Right?

00:14:39.800 --> 00:14:45.880
Yep. So I can brew install Yoke. Well, let's get the Yoke CLI available and then

00:14:45.880 --> 00:14:53.365
we'll kick things off from there. Yeah.

00:14:53.365 --> 00:14:59.445
My connection is not too bad today. That's good. Alright. There are a lot of

00:14:59.605 --> 00:15:06.120
aeronautical rarefaces. I've I've had some people on Reddit make

00:15:06.120 --> 00:15:09.720
a bit of fun of me because of the of the aeronautical theme. But do you

00:15:09.720 --> 00:15:16.760
do you understand the the the analogy to to helm? To

00:15:16.760 --> 00:15:22.245
helm? Well, Helm is Helm is a is a Yoke is a a plane. Right? Yeah.

00:15:22.245 --> 00:15:27.045
Yeah. Yoke is just a steering tray, a stick of a plane. Yeah. And I just

00:15:27.125 --> 00:15:29.685
I when I started writing the project is I don't I don't feel I don't like

00:15:29.685 --> 00:15:33.740
flights. I'm a bit anxious. I'm an anxious flyer. And I just needed to take my

00:15:33.740 --> 00:15:37.100
mind off. And I knew I had this, like, idea to play with Wasm and Kubernetes

00:15:37.100 --> 00:15:41.660
package management, and I just did it on the plane without Wi Fi and nothing. Just

00:15:41.660 --> 00:15:47.475
just grilled through it, and and then that kinda became the theme. Hey, you can vlog

00:15:47.475 --> 00:15:50.515
that source as long as you want. I'm here for it. I am happy with Takeoff,

00:15:50.515 --> 00:15:55.955
Descent, Mayday, Black Box, Turbulence, Soul, etcetera. Like, I think it's fun. Right? And if we

00:15:55.955 --> 00:16:02.240
don't enjoy what we're doing, then why are we even doing it? So alright. So why

00:16:02.240 --> 00:16:06.640
don't you give me the the Gedi tour. Right? I have a Yoke CLI. I'm gonna

00:16:06.640 --> 00:16:10.960
assume in fact, I'm not gonna assume. I know if I run Yoke takeoff, we're we're

00:16:10.960 --> 00:16:14.240
gonna have a problem. So it tells me I need a release. Let's just call this

00:16:14.240 --> 00:16:19.975
rocket. We don't have a flight path. Again, more of these aeronautical terms. So Yeah. I'm

00:16:19.975 --> 00:16:26.455
assuming we need to write ourselves a little bit of code. Yeah. So the

00:16:26.615 --> 00:16:32.220
what's interesting is on a really really abstract level, what we need is a Wasm module.

00:16:32.220 --> 00:16:36.380
That's what we need. Right? So what however you wanna produce a Wasm module, I mean,

00:16:36.380 --> 00:16:39.020
best way is to write some code obviously. And I and I think that if you

00:16:39.020 --> 00:16:42.415
wanna write it in Go, if you wanna write it in Rust, if you wanna if

00:16:42.415 --> 00:16:46.655
you wanna write it in WAT and then use a WASM compiler, it doesn't really matter.

00:16:47.775 --> 00:16:51.455
You As long as we produce a WASM module. So for me, the best approach is

00:16:51.455 --> 00:16:56.660
to write a Go program and compile it to WASM then we can just import the

00:16:56.660 --> 00:17:02.820
types that we want directly from the Kubernetes project. That's how we What

00:17:02.820 --> 00:17:08.715
I will do is just take the there are documentation to everything here. Right? You don't

00:17:08.715 --> 00:17:11.595
need to do it as a hard rate to the people watching. So please feel free

00:17:11.595 --> 00:17:17.595
to go check out the the docs on the website. And let's talk about

00:17:17.595 --> 00:17:23.720
your adoption of of of WASM. You could have just done this and go. Right? And

00:17:24.760 --> 00:17:28.360
Well, that that would work fine. Right? Like, why why did you feel the need to

00:17:28.360 --> 00:17:33.785
kinda push it to be this multi language control plane for for Kubernetes? Well, I mean,

00:17:33.785 --> 00:17:39.705
if you do it in Go, then how does that work? Right? In the sense that

00:17:41.145 --> 00:17:44.985
the problem is is that if if I wanna make a program that can run packages,

00:17:44.985 --> 00:17:48.940
say that I'm home, let's say I'm home, well, I still need to run a package

00:17:48.940 --> 00:17:55.100
and a package is in this term it's a zip of of Go templates. Right? If

00:17:55.100 --> 00:18:01.325
I'm a a code based package manager like Yoke is, then I wanna run some

00:18:01.325 --> 00:18:05.885
code. And so I get into all these issues where it becomes like, okay, well Yoke

00:18:05.885 --> 00:18:11.565
actually, I run version, I'm bundled with like the Go tool chain one dot something or

00:18:11.565 --> 00:18:15.200
I use your Go tool chain and so now I need to go to be installed

00:18:15.200 --> 00:18:18.880
on your machine and my machine and I'm doing a bunch of exec ing. I don't

00:18:18.880 --> 00:18:24.640
know. And then also, if you're running code, code is super dangerous. Right? Like I could,

00:18:24.640 --> 00:18:29.075
you know, read all of your dot AWS credentials and send them to a backdoor that

00:18:29.075 --> 00:18:31.875
could be the program that I write, you know. I could do a ton of things

00:18:31.875 --> 00:18:38.115
like to read your environment variables. So running code is especially arbitrary code

00:18:38.115 --> 00:18:41.315
that like maybe somebody's sharing a package with you and you wanna deploy, you know, their

00:18:41.315 --> 00:18:48.090
Redis package that you wanna install. Running arbitrary code is is is scary. And

00:18:48.090 --> 00:18:53.130
so, when you use Wasm, you're kind of sidestepping all of that. You're just saying like,

00:18:53.130 --> 00:18:57.130
here's a binary. That by the way, you don't need to make sure matches your architecture

00:18:57.130 --> 00:19:00.955
or anything like that, whether on ARM or AMD or or whatnot. You just say this

00:19:00.955 --> 00:19:05.995
is WebAssembly. And when you run WebAssembly, runs in a sandbox. So it doesn't have access

00:19:05.995 --> 00:19:11.160
to your file system, doesn't have access to the network, doesn't have access to your environment

00:19:11.160 --> 00:19:17.640
variables. It's just a little computer, right, that you're running embedded inside of Yoke. And

00:19:17.640 --> 00:19:22.440
so you get to build and run logic, but you don't actually have access to to

00:19:22.440 --> 00:19:28.195
most dangerous things. Portable and universal and and tons of languages can target it. So for

00:19:28.195 --> 00:19:32.595
me, other than a lot of people aren't familiar with WebAssembly, it was just like a

00:19:32.755 --> 00:19:38.920
no brainer. Sweet. Alright. Let's try some gold

00:19:38.920 --> 00:19:45.240
then. So what

00:19:45.320 --> 00:19:49.240
I mean, I could do this well, we'll do let's just look at YAML strings. Right?

00:19:49.240 --> 00:19:55.925
This is the first example from the the Yoke documentation. So we could just import

00:19:55.925 --> 00:20:01.205
format and then all we need is a main function. I don't write a lot of

00:20:01.205 --> 00:20:07.900
Go. Yeah. It's funk main. Yeah. Funk. Well, was writing n main. I'm

00:20:07.900 --> 00:20:12.860
a Rust developer these days. I know enough goes probably still to be dangerous and that

00:20:12.860 --> 00:20:17.020
is about it. So You you could you could write this in Rust if you're more

00:20:17.020 --> 00:20:20.780
comfortable. I would be less comfortable, but you could be more comfortable and that could be

00:20:20.780 --> 00:20:23.995
the magic of it. But let's let's keep going if you want. Well, let let's let's

00:20:23.995 --> 00:20:28.635
do the gold one first. Alright? And then we'll switch to to Rust. Yeah. I mean,

00:20:28.635 --> 00:20:32.075
we could do this multiple way. This is even Rust native languages now, which I always

00:20:32.075 --> 00:20:38.080
think is really interesting concept as well. So WebAssembly, sorry, native languages.

00:20:38.160 --> 00:20:43.120
So I used to do a lot of stuff. It was like the Fermion spin project.

00:20:43.200 --> 00:20:48.985
And just seeing that whole WebAssembly thing coming along was always very cool. But I I

00:20:48.985 --> 00:20:56.585
will try and remember how to write. Go. So let's just do let's

00:20:56.585 --> 00:21:04.480
see. We could see our deployment. Yeah. Well, while

00:21:04.480 --> 00:21:08.960
you're typing a little bit of context for for anyone listening. If you wanna define what

00:21:08.960 --> 00:21:14.945
a package is, it's just a program that maybe reads inputs on standard in or from

00:21:14.945 --> 00:21:21.185
flags and then outputs resources as JSON or YAML or

00:21:21.185 --> 00:21:27.220
arrays of JSON and YAML and that's it. There we go. So yeah, here you go.

00:21:27.220 --> 00:21:31.700
You have you wrote a deployment in in straight YAML, and you're printing it. Yeah. I

00:21:31.700 --> 00:21:34.980
just told you this from your documentation instead of me trying to butcher my way through

00:21:34.980 --> 00:21:41.140
right in a Go program. Sure. I love it. Alright. So I

00:21:41.140 --> 00:21:47.195
could do Go run. I mean, they called it Mendelco. Right? Yeah. It's just best

00:21:47.195 --> 00:21:53.915
out. Yeah. I'm on. Right. So this is what? This is a a Yoke flight? Yeah.

00:21:53.915 --> 00:21:59.610
It's a program that complies with the rules. It outputs resources, so it's a valid program

00:21:59.610 --> 00:22:05.770
for Yoke. Mhmm. So would this work with Yoke,

00:22:06.090 --> 00:22:11.835
takeoff,Rawkode I have to compile it to WASM binary first. Right? You're not gonna Yes. I

00:22:11.835 --> 00:22:15.035
I don't I can't I don't have a Yoke doesn't have a Go tool chain, so

00:22:15.035 --> 00:22:20.715
it doesn't have any tool chain other than it embeds Wazero. Shout out to the folks

00:22:20.715 --> 00:22:26.810
who made Wazero, a zero dependency runtime for Wazim in Go. But, yeah.

00:22:26.810 --> 00:22:32.250
So if you write Go as Wazi preview one, go arch Wazim, you can build out

00:22:32.250 --> 00:22:37.435
your example dot Wazim and you can compile your main dot go. Okay. I'm gonna call

00:22:37.435 --> 00:22:43.275
this go just in case we end up with multiple wasms. Yeah. Alright. I have a

00:22:43.275 --> 00:22:49.275
go wasm. Yeah. So if you do Yoke, takeoff, you can give it a

00:22:49.275 --> 00:22:55.460
name like foo or whatever whatever you'd like. There are a lot of flags. Yeah.

00:22:55.460 --> 00:22:58.500
I'll just take a look at some of the examples. So we just give the release

00:22:58.500 --> 00:23:02.580
a name, not too dissimilar from the way that Helm operates, and then we can point

00:23:02.580 --> 00:23:08.755
that to the to WASM artifact, which you also support gzipped WASM artifact. Sure.

00:23:09.315 --> 00:23:15.315
Remote flights. Do you support WASM wrapped in OCI? Yes. I do. Sweet. That's pretty

00:23:15.315 --> 00:23:19.475
cool. Yep. Yeah. So you can and but you have to use the Yoke CLI to

00:23:19.475 --> 00:23:25.900
push them. It compiles like, turns it into a single image static layer g zipped with

00:23:25.900 --> 00:23:30.300
like an image package and you can push that to OCI registries and and Absolutely, we

00:23:30.300 --> 00:23:36.380
do. Very nice. Alright. What about this one here? This

00:23:36.380 --> 00:23:42.055
this is general resources script as an actually Wasm. Right? I I love this because you

00:23:42.055 --> 00:23:47.095
can see there's a a typo in the in the name over there, my release. Anyways,

00:23:47.095 --> 00:23:51.415
yeah. So there's there's there's a there's a there's a bit of a lie that I

00:23:51.415 --> 00:23:56.580
also that I don't say at first when trying to like hammer in the initial principles

00:23:56.580 --> 00:24:02.340
of Yoke because Yoke wants to deploy packages and packages generally are made from an asset

00:24:02.340 --> 00:24:08.755
like a a WASM module. But, you know, a lot of languages

00:24:08.755 --> 00:24:15.155
don't necessarily support, you know, WASM or easily support WASM. And

00:24:15.155 --> 00:24:21.310
a lot of things are also shared as like straight YAML documents. Right? And so I

00:24:21.310 --> 00:24:27.310
sometimes still want to manage external sources of of YAML, whether it's from an arbitrary program

00:24:27.310 --> 00:24:32.535
or from a file, and package it and and treat it as a release. And so

00:24:32.535 --> 00:24:38.055
what you're seeing right there is that if you don't give the second argument, if you

00:24:38.055 --> 00:24:43.495
don't give the Wasm module and you pipe in data, if you pipe in standard in,

00:24:43.495 --> 00:24:47.550
then it'll just say, okay, I'll use this as the computed source. And so here, if

00:24:47.550 --> 00:24:53.310
you say generate resources dot s h, suppose that it, you know, creates a a YAML

00:24:53.310 --> 00:24:57.390
document or a JSON document and you pipe that in with a release name, then Yoke

00:24:57.390 --> 00:25:03.935
will deploy that for you. So you could actually, in your example, do your go run

00:25:04.095 --> 00:25:10.175
and then pipe that into Yoke takeoff with a release name and it'll it'll

00:25:10.255 --> 00:25:14.740
deploy that without you having to go through the Wasm step. The only difference is that

00:25:14.740 --> 00:25:19.860
now you're you're running an arbitrary program on your machine instead of running a Wasm module

00:25:19.860 --> 00:25:25.220
that's sandboxed and shareable and all this kind of stuff. Alright. I'm going rogue already, but

00:25:25.220 --> 00:25:29.835
I just wanna explore a few different things here. So I firstly, I just I stuck

00:25:29.835 --> 00:25:33.275
at the deployment and try deployment dot yaml so that I could do a queue import.

00:25:33.275 --> 00:25:38.075
So now we actually have a queue file for a Kubernetes deployment. So in theory, I

00:25:38.075 --> 00:25:42.315
could run a queue export and put this through Yoke takeoff, which we'll do shortly. Let's

00:25:42.315 --> 00:25:46.650
focus at least do it in the first demo without me going too crazy on you.

00:25:46.730 --> 00:25:51.610
Sure. And let's do the takeoff and we'll call this go because this is the go

00:25:51.610 --> 00:25:56.570
example and then this just takes the go dot wasm like so. So when there is

00:25:56.570 --> 00:26:03.045
that second parameter, which is your your flight flight path, this is going to execute wasn

00:26:03.045 --> 00:26:09.125
workloads. However, we could skip that use standard input and then we'll see an example of

00:26:09.125 --> 00:26:15.260
that shortly. So Sure. Okay. I successfully took

00:26:15.260 --> 00:26:21.260
off Go. What does that mean? So we created a revision. So if you

00:26:21.260 --> 00:26:28.135
say Yoke black box or its alias is Yoke inspect. So

00:26:28.135 --> 00:26:33.975
you've created a release called go in the default namespace and it has one revision. If

00:26:33.975 --> 00:26:39.440
you say revision one oh, yeah, go. You did you did the right thing. So now

00:26:39.440 --> 00:26:45.600
you see that we have one revision. And, yeah, the revision one is basically this resource

00:26:45.600 --> 00:26:50.720
that we created. Well, that that was a test, by the way. Like, I I always

00:26:50.720 --> 00:26:55.205
feel like the best developer experience is when I can be successful with intuition rather than

00:26:55.205 --> 00:27:01.205
informed decisions. Intuitively, I just kinda worked my way through to getting what was actually

00:27:01.205 --> 00:27:05.445
deployed to this cluster. So I think you're you're getting a tech on that DX path

00:27:05.445 --> 00:27:10.440
there because that worked the way I expected it to without me consulting the documentation, which

00:27:10.440 --> 00:27:16.520
is good. Nice. So, yeah, just because I cannot interrupt you here.

00:27:16.520 --> 00:27:20.975
Black box inspect shows us all of our releases. We got a namespace here. We can

00:27:20.975 --> 00:27:24.735
then take that further. We can take a look at the actual flight path that was

00:27:24.735 --> 00:27:29.455
deployed or the release that was deployed and we can see SHA. And then, I'm assuming

00:27:29.455 --> 00:27:35.590
if I run kubectl get pods, we can actually see that my application is

00:27:35.750 --> 00:27:41.510
well, in this case, it's just NGINX, but NGINX is deployed to my default namespace. Yeah.

00:27:41.510 --> 00:27:48.755
Nice. That's Alright. So the question then is let's

00:27:48.755 --> 00:27:54.915
change this to replicas one. So, we've made a modification to my goal

00:27:54.915 --> 00:28:01.110
binary. I am gonna do a goal build again. And before

00:28:01.110 --> 00:28:07.110
I do this, if I run this again, we're gonna get the same release of

00:28:07.110 --> 00:28:13.765
Go with revision two and is that automatically gonna apply that to my cluster? Yeah.

00:28:13.765 --> 00:28:18.725
So when you run Yoke takeoff, it it it applies to the cluster. If you wanted,

00:28:18.725 --> 00:28:23.765
you could do dash standard out, which would preview it on standard out without applying it.

00:28:24.725 --> 00:28:29.270
I use the Go standard library flags, so you actually have to it before the positional

00:28:29.270 --> 00:28:33.110
arguments. So you'd have to put dash standard out right after takeoff. It's it's a really

00:28:33.110 --> 00:28:37.190
quirky thing of the of the Go standard library and I kinda just wanted to stick

00:28:37.190 --> 00:28:41.590
to the standard library instead of using Cobra, which is maybe not the best UX for

00:28:41.590 --> 00:28:48.395
my users, but just a a little thing that I I like to see. And

00:28:48.475 --> 00:28:53.515
Mhmm. So now you've got this. You intuitively this is the non intuitive part of the

00:28:53.515 --> 00:28:59.580
CLI. You intuitively did Yoke, Black Box, Go, one before.

00:28:59.820 --> 00:29:06.060
You could do two and then do space one and it'll compare them. Yeah.

00:29:06.780 --> 00:29:13.595
Sweet. Yeah. So you can see what actually changed. Very nice. Yeah.

00:29:13.595 --> 00:29:19.675
Alright. And I'll just assume we now have one replica, which we do. So

00:29:19.675 --> 00:29:26.160
question then. The Shah is the generated Yamo

00:29:26.160 --> 00:29:32.240
artifact rather than anything to do with the Wasm. Correct? So, like, if I decide Opposite.

00:29:32.240 --> 00:29:38.375
It's the it's the Wasm. Oh, really? Yeah. Yeah. It's it's kind of

00:29:38.375 --> 00:29:45.015
the the idea a little bit is to track the

00:29:45.015 --> 00:29:49.815
Wasm module that you're using because the flight name, right, right now you're saying that you're

00:29:49.815 --> 00:29:55.360
using the local file go dot wasm. You built two different go dot wasms. Right? So

00:29:56.880 --> 00:30:00.880
so you it for you, this is just a way for you to visually know that

00:30:00.880 --> 00:30:07.685
this is not the same go.wasm that you used. And this can have this

00:30:07.685 --> 00:30:12.485
can have implications, you know, with like digest pinning and stuff like that. There are concepts

00:30:12.485 --> 00:30:16.565
of if you have right now, you're not you you're not using semantic versioning, but if

00:30:16.565 --> 00:30:22.800
you said like, hey, go v 1.wasm underscore v 1.wasm or whatever, it wouldn't realize that

00:30:22.800 --> 00:30:27.920
if it can detect semantic versioning to an extent. And then if you try and change

00:30:27.920 --> 00:30:32.240
it, it'll say like, hey, like you're you're maybe attacking the cluster. And now on the

00:30:32.240 --> 00:30:35.085
local file system, this doesn't this doesn't make a lot a ton sense, but if you're

00:30:35.085 --> 00:30:41.645
using a WASM module served in a GitHub release or over over or or even OCI,

00:30:41.645 --> 00:30:45.565
if you don't expect it to change because you're using some semantic version, but it does

00:30:45.565 --> 00:30:51.100
change underneath you, it'll it'll complain. So it's a bit of a security feature. I expect

00:30:51.100 --> 00:30:55.260
the YAML to change because or the resources to change because you might be configuring them

00:30:55.260 --> 00:31:01.155
differently, your programs might, you know, take inputs, and so I'm not really tracking the YAML

00:31:01.155 --> 00:31:07.155
per se in terms of SHAZ, I'm tracking the the source. Okay. Yeah. Alright.

00:31:07.155 --> 00:31:13.155
Let's make this more interesting. I have now copied your typed goal approach

00:31:13.640 --> 00:31:18.360
from the documentation, which is doing something very similar. So if we just take, you know,

00:31:18.360 --> 00:31:24.440
thirty seconds to go through this, we have release and namespace. So

00:31:24.440 --> 00:31:30.975
this is you mentioned inputs. I'm assuming these are inputs. I'm going to assume again.

00:31:32.015 --> 00:31:37.135
If I want to, can I make replicas an input as well? Sure. Where I just

00:31:37.135 --> 00:31:43.500
say that this is let's just say we default to to one. Would that be appropriate

00:31:43.500 --> 00:31:48.940
here? Or Sure. It would be just something else? That that would be fine. Yeah. Okay.

00:31:48.940 --> 00:31:52.060
So you can tell me how we turn this into a real input shortly. Right? But

00:31:52.060 --> 00:31:55.020
let's set to And and if you want, just when you said the things you assumed

00:31:55.020 --> 00:31:59.425
those were inputs, there's actually some nice little comments that you pasted in from the from

00:31:59.425 --> 00:32:05.505
the example. So these ones, because they use the flight package, they're kind of special in

00:32:05.505 --> 00:32:10.225
terms of of when you use it. Kind of how in your in in Helm, you'll

00:32:10.225 --> 00:32:15.220
have, like, dot release release dot release namespace and all of that stuff. This is just

00:32:15.300 --> 00:32:18.980
it's just the the arguments. So when you say Yoke takeoff and you give it a

00:32:18.980 --> 00:32:23.620
name, before that would have been Go, so it's the Go release and the namespace is

00:32:23.620 --> 00:32:31.145
the namespace you're deploying to. So anyways, yes. Alright. So

00:32:31.145 --> 00:32:37.145
then we are using create deployment, create services or helpers that you've got for creating

00:32:37.145 --> 00:32:42.110
or scaffolding these Kubernetes resources. We can scroll down and we can see the deployment is

00:32:42.110 --> 00:32:48.270
here, return an attribute on deployment. Nice and simple. Let's see. Replicas is coming from

00:32:48.270 --> 00:32:52.670
config replicas, which I think I hooked up low up, which I think I hooked up

00:32:52.670 --> 00:32:56.425
above. But although as the it's right now, it's hardcore just to one, but we can

00:32:56.425 --> 00:32:59.545
take a look at that in a second. And then we have the server. Overly complicated

00:32:59.545 --> 00:33:04.665
in this example. I could've just dumped those straight into the main. I decided to break

00:33:04.665 --> 00:33:07.560
it out just to make to show people that you could, you know, make your own

00:33:07.560 --> 00:33:11.720
functions. But it doesn't really help readability in this case, but, you know, here you go.

00:33:11.880 --> 00:33:16.120
I know. But when I'm doing things as code, right, I want the conveniences of having

00:33:16.120 --> 00:33:21.105
functions and multiple packages and abstractions Yeah. That me and my platform team decide that this

00:33:21.105 --> 00:33:24.705
is how we're going to do things. Right? So I I I like the fact that

00:33:24.705 --> 00:33:28.545
this is not just a main that is just wrapping, you know, at v one deployment,

00:33:28.545 --> 00:33:33.585
etcetera, and returning whatever. So I'm here for it. What I wanna know now is I'm

00:33:33.585 --> 00:33:38.430
assuming there's some sort of, can I use like flight argument or something? Like, how do

00:33:38.430 --> 00:33:42.430
we or I've they're just standard go at this point. Right? Am I just It's it's

00:33:42.430 --> 00:33:46.430
all just standard go. You could read you could read from standard in or you could

00:33:46.430 --> 00:33:52.255
you could read an argument, like a flag argument. Yeah. Yeah. So that would just be,

00:33:52.255 --> 00:33:57.295
like, using Viper or something or even just Or or flag the flag package. Yeah. Or

00:33:57.295 --> 00:34:01.215
you could even just read in the first argument. Yeah. You could do anything that you

00:34:01.215 --> 00:34:04.730
would do in a normal Go program. Alright. I'm gonna keep it at one right now

00:34:04.730 --> 00:34:09.930
because I wanna I wanna deploy this. So let's pull up that Go build command again.

00:34:09.930 --> 00:34:19.045
And You might need to make this a module. Demo.

00:34:19.765 --> 00:34:25.845
I'm actually gonna pop off for two, three minutes, and I'll let

00:34:25.845 --> 00:34:30.580
you get just play, and when I get back, we'll see where you got. Yeah. I'm

00:34:30.580 --> 00:34:33.700
gonna play with a queue demo as well. So you gotta do what you gotta do,

00:34:33.700 --> 00:34:37.460
and I will work out how to deal with the ghost site. Okay. And I'll I'll

00:34:37.460 --> 00:34:40.660
I'll be excited to see where you get to. I'll be back in five or maybe

00:34:40.660 --> 00:34:47.215
less. Alright. Why can't I not go there we go.

00:34:48.175 --> 00:34:56.015
Go my tidy, then all my dependencies. And

00:34:56.015 --> 00:35:04.830
then we'll do the go build. Alright.

00:35:04.830 --> 00:35:11.495
Cannot use a replica's variable of type int as an enter to do. Fine

00:35:11.495 --> 00:35:17.495
then. Fussy pants. I've seen something at the bottom and no. We're not doing the

00:35:17.495 --> 00:35:33.270
int string, though. You guys see where my goal is gonna let me down. Oh,

00:35:33.270 --> 00:35:41.925
mad heaven. Alright. So let's

00:35:41.925 --> 00:35:47.845
just there was or it was an Insta journal, right, when I copied and pasted it

00:35:47.845 --> 00:35:52.610
from the documentation. Let me just double check that. I don't think I did anything there

00:35:52.610 --> 00:36:01.170
that was different. Yeah. It was an integer, but the difference is the

00:36:01.170 --> 00:36:07.205
integer was defined somewhere else. Because when I changed this, this was just set to two.

00:36:07.525 --> 00:36:14.005
So now it's probably gonna be more than I'm not using replicas. Yep. So

00:36:14.005 --> 00:36:17.045
let's just remove that because I don't care about that right now, and I'd rather just

00:36:17.045 --> 00:36:23.110
get this working. Cool. So with this

00:36:23.110 --> 00:36:29.110
now, we should be able to do Yoke, takeoff. We'll still call this go,

00:36:29.110 --> 00:36:34.805
and we're still running go dot plasm. Only I did see there was another command rig.

00:36:34.805 --> 00:36:41.045
It was Yoke,Diff. I don't know. Was it turbulence? Drift?

00:36:41.125 --> 00:36:49.285
No. There was a death. I thought I seen a death. Drift.

00:36:49.320 --> 00:37:01.080
What is drift turbulence? Let's see. Get

00:37:01.080 --> 00:37:08.455
the death between desired state of release foo and the state in the cluster. Interesting.

00:37:08.535 --> 00:37:11.735
So that feels like it should be what I want, but then I'm not it doesn't

00:37:11.735 --> 00:37:16.055
seem to take a second parameter. It just seems to take a release. So if I

00:37:16.055 --> 00:37:22.140
do turbulence go, it says there's no turbulence detected. So this must

00:37:22.140 --> 00:37:26.540
be something to do with takeoff, perhaps having those extra flags on it. So let's take

00:37:26.540 --> 00:37:32.620
a look at that. Because also, one of the other things I did notice is

00:37:32.620 --> 00:37:38.895
when we did black box or inspect is that and we say, oh,

00:37:39.855 --> 00:37:42.975
we say go is that we can have a current. Right? So there seems to be

00:37:42.975 --> 00:37:49.790
this idea of progression, rollout, whatever you wanna call it. So I am curious if

00:37:49.790 --> 00:37:55.870
I can stage my new takeoff where it does register

00:37:55.870 --> 00:38:01.950
it, but we may be yeah. There is a dry. What else

00:38:01.950 --> 00:38:08.855
do we have? Alright.

00:38:08.855 --> 00:38:16.710
Let's see. Would it dry, go and go to Azam? So

00:38:16.710 --> 00:38:22.710
we had a dry run. So if I do black box now on go oh,

00:38:22.710 --> 00:38:25.830
it's not there. So it just did a dry run. It didn't actually stage anything. So

00:38:25.830 --> 00:38:29.485
we need to ask David about that when he comes back. Let's just get the deploy

00:38:29.485 --> 00:38:34.925
going now then, and then I'll understand that whole progression thing when he's available to chat

00:38:34.925 --> 00:38:41.740
to me. So now our Wasm ran. We

00:38:41.740 --> 00:38:45.980
have our version three. Actually, nothing should have changed. So I don't need to run a

00:38:45.980 --> 00:38:52.380
def rate. We just switched from string templates to goal values.

00:38:53.180 --> 00:38:59.215
And I have questions. So let's wait. While we wait

00:38:59.215 --> 00:39:05.295
for David to come back, let's try the q one. So I imported that deployment dot

00:39:05.295 --> 00:39:11.330
yaml to a deployment.q because I like q. And we now know that if we do

00:39:11.330 --> 00:39:17.730
a q we need to add a package,

00:39:19.490 --> 00:39:25.535
and we'll just call this q. There we go.

00:39:25.855 --> 00:39:32.015
Then we get the JSON for this. So I think I can do Yoke

00:39:32.655 --> 00:39:37.640
take off and call this queue. What I want to do is make sure that we're

00:39:37.640 --> 00:39:43.240
not blasting away any existing workloads. Although that would cause turbulence, wouldn't it? Should we start

00:39:43.240 --> 00:39:49.640
just exploding and breaking things? Yeah. I think we shall. Let's

00:39:49.640 --> 00:39:55.845
do one, but this time we're gonna blow this away and have the wrong

00:39:55.845 --> 00:40:02.165
application. In fact, we'll keep it NGINX, but we'll change the version too.

00:40:02.165 --> 00:40:07.910
I don't know. I I don't know why I can do that. I'm back. Oh, thank

00:40:07.910 --> 00:40:12.150
fuck. Okay. I'll I'll fill you in a second of what I'm doing. Right? But I'm

00:40:12.150 --> 00:40:18.630
I'm purposely trying to cause turbulence. So I'm gonna do a takeoff Love it. Here. It's

00:40:18.630 --> 00:40:24.735
a Woo. I'm so glad. Okay. I'm gonna back up now so you can see what

00:40:24.735 --> 00:40:30.735
the hell I've been doing. Deployed in fact, I'll scroll up so

00:40:30.735 --> 00:40:37.880
you can see my thought process. So okay.

00:40:39.400 --> 00:40:43.960
So I knew that it was a def command because I I it flashed me when

00:40:43.960 --> 00:40:48.075
we were running help commands earlier. So I was like, okay, drift is turbulence and that

00:40:48.075 --> 00:40:52.315
shows us when things are are are changing. So I ran turbulence on Go even though

00:40:52.315 --> 00:40:57.675
I'd modified to go wasm binary. I wasn't really sure how to detect the turbulence. So

00:40:57.675 --> 00:41:01.195
I started thinking, okay, well, we need to cause some sort of drift to some degree

00:41:01.195 --> 00:41:06.130
first. So I was wondering then if we can do progressive roll outs. So I ran

00:41:06.130 --> 00:41:09.730
black box, black box go and then obviously we have current. So I was like, okay,

00:41:09.730 --> 00:41:16.055
can I deploy a new takeoff of three but it's not current? So I then started

00:41:16.055 --> 00:41:19.895
looking at the help. Found dry run. It didn't do what I wanted, I said fuck

00:41:19.895 --> 00:41:25.175
it. Yep. Let's just deploy. So yeah. So what would Drift would be, it said that

00:41:25.175 --> 00:41:31.300
you deploy something. Right? You the your whatever version you're at is great. I imagine you're

00:41:31.300 --> 00:41:35.860
you're still just tweaking replicas. Right? Oh, I see you have two resources now. Yeah. Drift

00:41:35.860 --> 00:41:41.860
would be if somebody if a rogue platform engineer went into your cluster

00:41:41.860 --> 00:41:48.195
with kubectl and edited the deployment for you. And they and so it's no longer Drift

00:41:48.195 --> 00:41:54.515
is that it's no longer it's now conflict the the cluster state is now conflicting

00:41:54.915 --> 00:42:01.230
with the desired package state. So if you deployed it with two replicas

00:42:01.390 --> 00:42:07.950
and then I come along into your cluster with my kubectl and my two godly permissions

00:42:07.950 --> 00:42:14.270
and I start editing your deployment, now there's drift because

00:42:12.585 --> 00:42:18.425
cluster state doesn't match the package state. And then you can use a turbulence command to

00:42:18.985 --> 00:42:25.145
bring it back to the the desired state. Yeah. So it's it's kinda controller style Drift.

00:42:25.145 --> 00:42:28.580
Right? As if we were doing some sort of get ops pattern and and things change

00:42:28.580 --> 00:42:34.100
in the cluster, etcetera. Yeah. So I kinda was leaning down that path and then decide,

00:42:34.100 --> 00:42:37.860
okay, well, I'm gonna cause some drift through malicious action. So I took a look at

00:42:37.860 --> 00:42:42.415
my queue export, fixed up package name, and then realized this is the same deployment that

00:42:42.415 --> 00:42:47.055
we used with Go. And I decided, right, well, let's just change the image name. And

00:42:47.055 --> 00:42:51.615
then I take off my queue because what that should now show me is that we

00:42:51.615 --> 00:42:57.830
run Black box queue, black box queue. This one is fine. But now this go one

00:42:57.830 --> 00:43:04.630
should have turbulence because I just blew over its deployment completely. So turbulence

00:43:05.270 --> 00:43:11.345
go. So Oh, I can't spell turbulence. I'm just gonna do Yeah.

00:43:11.425 --> 00:43:16.145
Oh, no. No. I I changed the image. So I'm curious then. So I wonder, just

00:43:16.225 --> 00:43:22.860
do you keep still get pods? So

00:43:22.860 --> 00:43:29.020
they're different. Right? Yoke will not let you have two releases, two different

00:43:29.020 --> 00:43:35.500
releases control the same resources. So if you were to create, you

00:43:35.500 --> 00:43:41.205
know, a deployment called example through your queue release and you were to create an example

00:43:41.205 --> 00:43:47.205
called oh, yeah. The deployment called example through your go release, the second one would conflict

00:43:47.445 --> 00:43:51.600
and it would it would break. It would well, it would do its best to not

00:43:51.600 --> 00:43:57.600
do it. So you're better not using Yoke to try and create your drift.

00:43:58.240 --> 00:44:02.080
It's not impossible. Right? You could have race conditions if you had like two users do

00:44:02.080 --> 00:44:08.815
it at exactly the same time. But technically, it's not easy to do with Yoke. So

00:44:08.815 --> 00:44:13.295
if you wanna create Drift, I would, yeah, I would go into it with k nines

00:44:13.295 --> 00:44:19.510
or cube cuddle, create the Drift that you want, and then ask the the specific release

00:44:19.510 --> 00:44:25.670
name if there's Drift on it. Yeah. So what I hadn't appreciated there

00:44:25.670 --> 00:44:30.630
is when we switched from the string implementation to the go type implementation is that we

00:44:30.630 --> 00:44:36.805
then started to use the release name as part of the the resource. So my

00:44:36.805 --> 00:44:42.725
queue actually overwrote something or actually created a new deployment because we changed the name Exactly.

00:44:42.805 --> 00:44:47.690
Of the thing. Okay. So we can do a queue control at a deployment. It's just

00:44:48.490 --> 00:44:55.050
there's a I can't remember that. Here, go. Okay. Edit,

00:44:55.050 --> 00:45:01.690
deploy, go. Now I'm sweating because I I haven't run this command in in

00:45:01.850 --> 00:45:07.865
at least six months. But there's tests, so I mean, it should work. Yeah.

00:45:07.865 --> 00:45:17.060
We'll see. Yeah. So if we say turbulence, Okay.

00:45:17.060 --> 00:45:21.460
Yeah. That so I modified the end cluster. It popped up in zed because that's what

00:45:21.460 --> 00:45:25.620
I use as my editor. I'm only sharing my terminal because my screen sharing thing has

00:45:25.620 --> 00:45:30.745
been very weird today, but we have Drift. So Mhmm. We could just take off again,

00:45:30.745 --> 00:45:34.825
right, and reconcile that. You know, you can write you I mean, you could, but you

00:45:34.825 --> 00:45:41.640
could do fix the the fix flag on if you do Yoke Drift dash help. Well,

00:45:41.640 --> 00:45:51.960
as I said, fix has to be before. And

00:45:51.960 --> 00:45:58.085
it's fixed. So this is very CLI driven manual. I mean, is there an end cluster

00:45:58.085 --> 00:46:04.245
operator for Yoke to handle this for me? Yes, there is. Sweet. Tell me about that.

00:46:05.205 --> 00:46:11.870
So backing up a little bit before I answer your question directly. Mhmm. In

00:46:11.870 --> 00:46:14.990
the same way that I'm trying to be agnostic as much as possible with regards to,

00:46:14.990 --> 00:46:19.710
like, which language you're using and all those kind of things, I I'm trying to not

00:46:19.710 --> 00:46:26.265
make Yoke a thing that tells you how you'd need to run your clusters. So

00:46:26.265 --> 00:46:30.185
what you're playing with right now is core Yoke, like the core CLI, and that's just

00:46:30.185 --> 00:46:36.000
like the core, you know, Helm style client side package manager. But the project also tries

00:46:36.000 --> 00:46:40.880
to enable as many ways as possible to to to work with code in your clusters.

00:46:41.360 --> 00:46:47.645
So there's an ArgoCD plugin so that ArgoCD can use these packages. And there's

00:46:47.645 --> 00:46:54.045
a server side controller called the air traffic controller, again, with the the the aviation theme.

00:46:54.125 --> 00:46:59.645
And the air traffic controller, what it does is that it lets you deploy them as

00:46:59.645 --> 00:47:03.940
static resources. So you would have a generic flight resource and then you could fill out,

00:47:03.940 --> 00:47:08.260
you know, my input is this, my WASM module is this, and and it would work

00:47:08.260 --> 00:47:14.100
that way. And the air traffic controller, what it lets you do is also create meta

00:47:14.100 --> 00:47:18.855
types, kind of like how Crow lets you do RGDs, you're familiar with Crow. You can

00:47:18.855 --> 00:47:25.175
create higher level attractions that are kind of like wrappers over CRDs.

00:47:25.335 --> 00:47:31.340
They're called airways because Yoke. So with the air traffic controller, can declare airways and then

00:47:31.340 --> 00:47:35.580
you can build your own custom resource and bind it to a WASM module. And so

00:47:35.580 --> 00:47:41.340
then you can deploy your packages via your own custom APIs instead of a generic flight

00:47:41.340 --> 00:47:46.465
resource. I I don't know if that all made sense. That was a lot of words.

00:47:46.465 --> 00:47:50.785
But, yes, thanks for your question. Yes. There's a server side operator called the air traffic

00:47:50.785 --> 00:47:56.785
controller. And if you wanna install it, there's a OCI package that you

00:47:56.785 --> 00:48:00.240
can use with you. I got I got it here. So I got that again from

00:48:00.240 --> 00:48:05.760
your documentation. There's a page on ATC. So we can actually just do a Yoke takeoff

00:48:06.400 --> 00:48:13.945
with this information here. We can run this. So

00:48:14.265 --> 00:48:18.665
while that does it sing in the background and I'm sure it's gonna pull some images,

00:48:19.225 --> 00:48:23.145
I do wanna play around with my q one because I was quite happy that this

00:48:23.145 --> 00:48:29.250
worked. So Yeah. I could just take arbitrary q code and change my replicas to

00:48:29.250 --> 00:48:35.650
two and then do my queue export again. Yeah. And and

00:48:35.650 --> 00:48:40.050
what's interesting here is you're doing a bunch of stuff in queue. And just because we're

00:48:40.050 --> 00:48:46.425
in the Kubernetes landscape or the Go cinematic universe, because queue

00:48:46.425 --> 00:48:49.785
is also a bunch of Go packages, you could and I I'm not don't do this

00:48:49.785 --> 00:48:54.185
on the livestream. It would be a little bit of bubblegrease. But you could technically write

00:48:54.185 --> 00:48:58.980
a ton of stuff in queue, embed it into a Go program, have the Go program

00:48:58.980 --> 00:49:04.980
just evaluate your queue just by using the queue packages, and that would be a

00:49:04.980 --> 00:49:11.445
valid module. Right? And it would be shipped as WASM and you

00:49:11.445 --> 00:49:17.045
wouldn't need to do this piping stuff and you can make it shareable and exportable to

00:49:17.045 --> 00:49:23.125
other forms of of of Yoke style invocations. But don't do that. It's

00:49:23.125 --> 00:49:26.630
an academic process. I've done that a lot. I I use Q a lot at work

00:49:26.630 --> 00:49:30.390
and we we use it natively through Go and it's definitely something you could do with

00:49:30.390 --> 00:49:38.645
Yoke, just it takes a little bit of elbow grease. I

00:49:38.645 --> 00:50:02.370
don't know if you're speaking. Okay.

00:50:02.370 --> 00:50:07.715
Can you hear me now? Now I can hear you. Yeah. My microphone decided just to

00:50:07.715 --> 00:50:13.795
disconnect from the Mac. So all I was saying was that is very cool.

00:50:13.795 --> 00:50:16.835
I am definitely going to kick the tires up, play with that. But I agree that

00:50:16.835 --> 00:50:19.635
that is not for right now because we don't have a lot of time left and

00:50:19.635 --> 00:50:23.930
I feel like we've just scratched the surface of stuff. However, what we do have now

00:50:23.930 --> 00:50:31.770
is ATC in our cluster. I'm gonna run API resources. We

00:50:31.770 --> 00:50:38.075
can see here we have airways, cluster flights, flights. So, I mean, I can start explaining

00:50:38.075 --> 00:50:41.115
this and try to get an understanding of it, but I have you on a call.

00:50:41.115 --> 00:50:44.875
So can you just break this down for us? How do we interact with airways, cluster

00:50:44.875 --> 00:50:48.715
flights, and flights? So that I could I could probably guess what flights and cluster flights

00:50:48.570 --> 00:50:52.810
are. But, you know. Yeah. Yeah. So flights are just the generic resource. So right now,

00:50:52.810 --> 00:50:57.850
you're deploying you were deploying things through the Yoke CLI. But if you don't want to

00:50:57.850 --> 00:51:01.755
be deploying things through a CLI, which is totally understandable, that's not we work anymore. Maybe

00:51:01.755 --> 00:51:05.675
you wanna use ArgoCD or you wanna use Flux or you just wanna commit some YAML,

00:51:06.795 --> 00:51:11.915
have a high level resource that deploys your your package, you could do that through the

00:51:11.915 --> 00:51:18.680
ATC and by using a flight resource. It's just a generic resource kind to deploy flights.

00:51:18.680 --> 00:51:23.560
It's kind of the analogy to a Flux Helm release, right, or an ArgoCD application that

00:51:23.560 --> 00:51:29.000
uses the Helm source. So that's the and cluster flights is just the same thing except

00:51:29.000 --> 00:51:35.125
for a cluster scoped version of the flight. So and then

00:51:35.125 --> 00:51:41.285
Airways is that more generic resource that basically allows you to

00:51:41.285 --> 00:51:47.380
declare your own custom type. So it's a wrapper over the custom resource definition type.

00:51:47.540 --> 00:51:51.140
And all you do is you bind it to a WASM module, and then you'll be

00:51:51.140 --> 00:51:57.355
able to create your own your own resources. That's a funny Boris is loving

00:51:57.355 --> 00:52:03.835
your aviation theme, so Well, that's worth a star. Right? Yeah. Exactly.

00:52:05.035 --> 00:52:10.990
But yeah. No. So you with the airways, you could create your own custom resource API.

00:52:10.990 --> 00:52:14.030
In the docs, there's a couple of few commands. There's a I don't know if you

00:52:14.030 --> 00:52:18.030
found it. There's a a shell script that allows you to create what we call back

00:52:18.030 --> 00:52:24.030
ends, which are just, you know, deployment service and ingress, but I think in

00:52:24.030 --> 00:52:30.175
this case just deployment service. And you could install that Airway into your cluster and deploy

00:52:30.175 --> 00:52:35.695
back ends that way. Oh, but you're gonna do this one first. That's fine. Yeah. I'm

00:52:35.695 --> 00:52:41.730
I'm exploring the documentation. I'm just I don't wanna keep, like, unsharing my terminal to

00:52:41.730 --> 00:52:44.210
share the docs and stuff like that. So I would just encourage people to go look

00:52:44.210 --> 00:52:49.730
at the docs. Yep. But, yeah, there there's everything is kinda well documented here, even the

00:52:49.810 --> 00:52:54.945
all the go code, etcetera. So I'm just kinda jumping around. I've got an airway here

00:52:54.945 --> 00:52:59.745
too, so let me just paste this in. So these are just two examples from the

00:52:59.745 --> 00:53:06.670
documentation. So the flight, I think we understand. This is hopefully now almost well known concept.

00:53:07.630 --> 00:53:13.310
We pointed to the WASM. It supports OCI. This is just a straight HTTP version. We've

00:53:13.310 --> 00:53:19.275
got the inputs, and then we've got some sort of args here. Again, this is just

00:53:19.275 --> 00:53:25.195
gonna be plasting, I'm assuming, to the Yoke CLI assumption. It yeah. It doesn't it doesn't

00:53:25.195 --> 00:53:31.040
call the Yoke CLI in the sense that Yoke is basically a Go SDK. And so

00:53:31.040 --> 00:53:35.840
the CLI is just a wrapper over the Go SDK, and the Air Traffic Controller is

00:53:35.840 --> 00:53:41.120
also a wrapper over the Yoke SDK. It's just a a nuance, but it's essentially, yes.

00:53:41.120 --> 00:53:45.345
It does the same thing. It calls the same code. It's just not calling the CLI

00:53:45.345 --> 00:53:51.265
directly. It's a very nitpicky definition or nuance, but yes. Yes and no, but mostly yes.

00:53:52.225 --> 00:53:56.625
Okay. So what I don't think I understand so far is how the airway fits in

00:53:56.625 --> 00:54:02.760
then. So is this Okay. Okay. In Airway, if we zoom out, do

00:54:02.760 --> 00:54:08.760
you with analogous projects. Right? Do you know what a helm not a helm. My

00:54:08.760 --> 00:54:15.065
god. A a cross plane composition is? Yeah. Yeah. Yeah. XRD. An XRD,

00:54:15.065 --> 00:54:21.145
it's it's that. Or a crow resource graph definition, it's the same thing. Okay.

00:54:21.145 --> 00:54:25.465
Yeah. Or it serves the same purposes. It's not exactly the same thing, it serves the

00:54:25.465 --> 00:54:32.080
exact same purpose. That is that meta that meta object. Okay.

00:54:32.080 --> 00:54:38.240
So according to the documentation, Airways have three modes, standard, static, dynamic, and then

00:54:38.240 --> 00:54:42.160
it's funnily it says the three modes, but then also less subscription. That's like a fourth

00:54:42.160 --> 00:54:48.355
mode. Oh, yeah. I write my docs, so there's gonna be a mistakes for sure.

00:54:48.835 --> 00:54:54.835
Alright. So how the standard static dynamic subscription, do you wanna give us the TLDR

00:54:54.835 --> 00:54:58.670
on what the what means for the end user? Sorry. That's is that a hard question?

00:54:58.670 --> 00:55:02.830
No. It's not it's not a hard question. I mean, this is just the the this

00:55:02.830 --> 00:55:08.670
is, like, the really cool things that you can do that are a bit more advanced.

00:55:09.630 --> 00:55:12.750
And so I don't know if you've laid the foundations, but I can definitely answer the

00:55:12.645 --> 00:55:16.405
question. So it's just that, right, when you create your airway in the same way that

00:55:16.405 --> 00:55:21.845
if you created your cross plane composition, right, you would your XRD, you would now have

00:55:21.845 --> 00:55:26.085
a new type of resource, right, that you could you could do, right, that you could

00:55:26.085 --> 00:55:31.720
create. So if we created a back ends airway, then we would be able to create

00:55:31.720 --> 00:55:37.080
resources of the type back end, and the ATC would would manage the back ends, and

00:55:37.080 --> 00:55:42.375
it would create the sub resources from that back end, right, depending on the WASM module

00:55:42.375 --> 00:55:47.575
that we give it. And what's cool is that when we are running in the air

00:55:47.575 --> 00:55:53.670
traffic controller, we are now in a reconciliation loop. And basically, if

00:55:53.670 --> 00:55:58.470
you're running in in the normal static or normal standard mode, it just means when you

00:55:58.470 --> 00:56:02.950
create when you update your resource, you would update your back end resource or whatever kind

00:56:02.950 --> 00:56:07.430
that you chose, right, to to build using an Airway. When you would update that resource,

00:56:08.675 --> 00:56:14.355
we recompute the the the the the sub resources that make up your package and apply

00:56:14.355 --> 00:56:19.315
it. And that's all that standard mode does. And if somebody goes in and tries to

00:56:19.315 --> 00:56:25.180
create Drift, then the ATC does nothing. It only watches for changes to the to the

00:56:25.180 --> 00:56:30.300
top level, you know, back end resource in this case. If you go static, then the

00:56:30.300 --> 00:56:36.635
ATC would reject all changes to sub resources because it's also a admission controller. So

00:56:36.635 --> 00:56:39.675
it it can say, hey, no, like, you're trying to create drift here. This is a

00:56:39.675 --> 00:56:45.755
static airway. We're not allowing drift in here. So that's that. And then for dynamic

00:56:45.755 --> 00:56:51.960
mode, it just says if anybody tries to modify one of the resources

00:56:51.960 --> 00:56:57.000
that we own, one of the sub resources, then we just recon we reconcile. Again, we

00:56:57.000 --> 00:57:01.960
just reconcile. So it's kind of like a self heal mode. But it can do something

00:57:01.960 --> 00:57:06.225
really interesting and this is a concept that we talked about at all, is that these

00:57:06.225 --> 00:57:12.625
Wasm modules can actually fetch state from the cluster. And so you can actually

00:57:12.785 --> 00:57:17.345
read other resources and this is all opt in and you can secure it. I'm very

00:57:17.345 --> 00:57:21.600
security minded. None of this is on by default and you can really constrain what you

00:57:21.600 --> 00:57:26.000
can and cannot read from the cluster. But you can read other resources from the cluster

00:57:26.000 --> 00:57:31.565
and you can read resources within the same release really easily. And so what this means

00:57:31.565 --> 00:57:37.965
is in dynamic mode and subscription mode, you can basically listen for events for

00:57:37.965 --> 00:57:43.805
changes to releases in your package or to releases outside of your package if you've enabled

00:57:43.805 --> 00:57:50.400
that. And whenever a change is triggered, you can reconcile. And so and

00:57:50.400 --> 00:57:55.360
so you can actually do orchestration. You could deploy your package and it could run a

00:57:55.360 --> 00:57:59.355
job and you could run you could wait until that job is complete and then dynamic

00:57:59.355 --> 00:58:03.915
or subscription mode when the status becomes complete, you get recomputed and then you could go

00:58:03.915 --> 00:58:08.955
on and create new resources. And so you get to you get to build like reconciliation

00:58:08.955 --> 00:58:14.400
and do all these types of really crazy orchestrations or just do self healing. You can

00:58:14.400 --> 00:58:20.400
just basically do a lot of things. It's basically, I've let you implement a reconciliation or

00:58:20.400 --> 00:58:24.640
your own kind of high level operator just without having to, you know, use cube builder

00:58:24.640 --> 00:58:29.655
or think about anything. You just have to create your airway and build your implementation in

00:58:29.655 --> 00:58:36.535
Wasm or using some language, and and you just deploy it and it works. Any

00:58:36.535 --> 00:58:43.090
questions? Many, but I wanna see this in practice.

00:58:43.090 --> 00:58:49.890
So I think what I wanna do first is let's apply oh,

00:58:49.890 --> 00:58:54.690
what the hell did I call that file now? More dot YAML. Horrible name. Okay. Namespace

00:58:54.690 --> 00:59:02.835
foo. That's my fault. That's default. So

00:59:02.835 --> 00:59:08.595
we've now applied a flight custom resource to the cluster where we can run get flights.

00:59:08.830 --> 00:59:14.910
We can see it there. And if we run kubectl get pods, we now

00:59:14.910 --> 00:59:21.470
see the flight yaml is in container creating. So the ATC controller

00:59:20.685 --> 00:59:25.565
detected the flight custom resource and has now reconciled it and we have that thing. My

00:59:25.565 --> 00:59:31.405
first question is, can I use the Yoke CLI to black box and get a look

00:59:31.405 --> 00:59:38.090
into my cluster? And the answer is yes. I can. Okay. Cool. Yeah. Now

00:59:38.090 --> 00:59:44.090
the next question is this state here, this is all derived

00:59:44.090 --> 00:59:48.170
from the cluster. Right? None of this is is locally on my machine. Okay. No. That's

00:59:48.170 --> 00:59:53.725
not cluster. It's it's So It is it is a secret engine kind of like how

00:59:53.725 --> 00:59:58.765
is. So if you do kubectl get secrets, you'll you'll see you'll see some some some

00:59:58.765 --> 01:00:04.205
note keeping that Yoke does in your cluster. Okay. So now we come on to Airways,

01:00:05.120 --> 01:00:11.920
and I'm just explaining airways.spec to kinda see what we can do here. So I

01:00:11.920 --> 01:00:16.960
just yeah. So I understand the modes based on what you've just shared with me. What

01:00:16.960 --> 01:00:23.415
I what I do understand is okay. The big one is template.

01:00:23.415 --> 01:00:27.975
Yeah. There's a there's a field called template and that's the CRD definition. So this is

01:00:27.975 --> 01:00:33.500
the big one. You define your your CRD and wasm URLs. Those are the two big

01:00:33.500 --> 01:00:39.580
ones. So it's the the the the the last field and the before before last

01:00:39.580 --> 01:00:44.060
field. They're the two big ones and then all the other ones are really customizations that

01:00:44.060 --> 01:00:50.145
you can do to behavior about how you could reconcile it. But the those two

01:00:50.145 --> 01:00:55.745
fields are the big ones that you need to know. Okay. So airways okay. That's just

01:00:55.745 --> 01:01:01.060
for for custom resources then. Okay. Alright. Now that that now answers things. Because when you

01:01:01.060 --> 01:01:05.380
were talking about the whole static concept, was wondering, does that actually prevent drift if I

01:01:05.380 --> 01:01:11.635
were to to, you know, get deploy and then to edit deploy

01:01:11.635 --> 01:01:17.795
flight.yaml. So this was our controller operated one. Right? Yeah. And does not do

01:01:17.795 --> 01:01:23.900
it on on this one. I don't have modes on generic flight resources. That

01:01:23.900 --> 01:01:30.220
is in the backlog. There is a concept of drift interval where

01:01:30.620 --> 01:01:36.315
you could you could specify, like, hey, like a self healing time out and say, please

01:01:36.315 --> 01:01:40.955
reconcile this every, you know, every five minutes or every ten minutes or whatever is your

01:01:40.955 --> 01:01:46.635
thing. And then it will, from time to time, just check it and and reapply it.

01:01:46.795 --> 01:01:50.410
That's the thing that exists in the flight resource. Yep. But it doesn't have the same

01:01:50.410 --> 01:01:56.330
modes as the airways do. Okay. Gotcha. Okay. That fills in a lot of things that

01:01:56.330 --> 01:01:59.450
were popping around my head. So I feel like that I understand that a lot better

01:01:59.450 --> 01:02:05.595
now. So that is that's great. Awesome. Alright. We've

01:02:05.595 --> 01:02:11.675
covered quite a lot so far. We have used Yoke with Go, with strings,

01:02:11.675 --> 01:02:15.675
very simple string example. We got that to the cluster. We then migrated that to using

01:02:15.675 --> 01:02:21.530
Go types and the Kubernetes SDK to then codify all of that, apply that to the

01:02:21.530 --> 01:02:26.970
cluster, understand how the turbulence mode works with Drift to see that and fix it, which

01:02:26.970 --> 01:02:32.655
is all very, very cool. We've deployed ATC. We've taken a look at the flight custom

01:02:32.655 --> 01:02:36.655
resource and how we can do that programmatically as well. I know that can integrate with

01:02:36.655 --> 01:02:42.335
VargoTD. That is all very, very cool. And then we also take a look at just

01:02:42.335 --> 01:02:46.780
using a queue approach, which could be any binary. Right? I just happen to be comfortable

01:02:46.780 --> 01:02:51.340
and familiar with queues, so I use that. But people could use, I guess, you know,

01:02:51.340 --> 01:02:55.980
JSON as they're still living ten years ago. Right? But whatever. Mhmm. If you wanna use

01:02:55.980 --> 01:03:01.795
Perl and spell YAML, feel free to. It doesn't really matter. Okay. Is there anything else

01:03:01.795 --> 01:03:04.755
you want to cover before we move back into big face mode and just have a

01:03:04.755 --> 01:03:11.315
bit of a a conversation again? In terms of of raw features

01:03:11.315 --> 01:03:17.130
of Yoke, what it can do, I mean, we've scratched most of it. You we could,

01:03:17.130 --> 01:03:20.330
you know, if you ever decide in a couple months to invite me back, you could

01:03:20.330 --> 01:03:24.730
look at the air traffic air traffic controller in in in full depth. But, no, it's

01:03:24.730 --> 01:03:30.755
it's it's a good high level overview. Alright. Let's pop let's pop up here. Oh,

01:03:30.755 --> 01:03:35.155
sorry. We're not gonna but the last thing that was like, oh, you could show your

01:03:35.155 --> 01:03:41.235
your your your viewers is that the Helm support is also kind of important for

01:03:41.235 --> 01:03:47.440
people who want to to see that it it is possible. But, you know,

01:03:47.440 --> 01:03:54.560
it's it's it's icing. It's cherry on the on the cake. You know? Alright.

01:03:54.560 --> 01:03:58.880
I mean, I don't really care about home support, but I guess other people are is,

01:03:59.575 --> 01:04:05.095
unfortunately. It's it's a part of Kubernetes. Right? So I'm just taking a look at the

01:04:05.095 --> 01:04:11.975
documentation here. What I see is we could pull a Helm OCI artifact. And

01:04:11.975 --> 01:04:17.700
then what else? Okay. So Yoke has a helm. I should just share my screen. I

01:04:17.700 --> 01:04:22.900
know this is really annoying, but I'm I'm gonna do it anyway because it's I need

01:04:22.900 --> 01:04:32.535
to work out why my computer is being so weird with this. Here.

01:04:35.415 --> 01:04:39.735
Can you see the Yoke docs now? I I could see them for a second, and

01:04:39.735 --> 01:04:43.490
then they they flew out of the oh, now they're back. Yeah. I really need to

01:04:43.490 --> 01:04:48.530
get this fixed. Alright. We're on the Helm capability page. So we have the ability to

01:04:48.530 --> 01:04:53.730
embed a chart as a zip archive, progressive migration, and then generating flights from Helm chart

01:04:53.730 --> 01:04:59.115
repositories. I assume this part here is probably what is gonna be more interesting, but please

01:04:59.115 --> 01:05:03.195
feel free to correct that Well, I mean, it is the most it isn't very interesting

01:05:03.195 --> 01:05:06.715
in that I just built a small tool. It's not like at the same level of

01:05:06.715 --> 01:05:09.755
quality as the neck as the rest of the of the project, but just like a

01:05:09.835 --> 01:05:14.210
it's kind of like a script scripting layer that just basically pulls charts and then generates

01:05:14.210 --> 01:05:18.770
a Go package just to make it, like, convenient. And it uses JSON schema to try

01:05:18.770 --> 01:05:24.875
and build the types because types are seemingly important to the project. But at a

01:05:24.875 --> 01:05:29.115
really high level, if you go up maybe to embedding charts as a zip archive, if

01:05:29.115 --> 01:05:33.755
you just pull a chart onto your machine, right, you do helm pull, you're going to

01:05:33.755 --> 01:05:39.810
have a tar g z file. Right? And you can

01:05:39.970 --> 01:05:45.250
when you build programs, Go programs, and I'm sure other languages and Rusten too, but I

01:05:45.250 --> 01:05:51.330
do most of my support work in Go, you can then embed those assets or

01:05:51.330 --> 01:05:56.745
those files directly into your program. So if you see there's a Go embed directive in

01:05:56.745 --> 01:06:01.705
the code right above the archive, there's the embed package there, and we're using Go embed

01:06:01.945 --> 01:06:09.260
a Go embed of that Redis TGZ. And since we have the Helm tar

01:06:09.260 --> 01:06:14.780
directly embedded in our program and that Helm is also a Go, you know, like I

01:06:14.780 --> 01:06:20.485
said that before, Go cinematic universe, it's part of the Go ecosystem. Yoke just has a

01:06:20.485 --> 01:06:26.645
small convenience wrapper over Helm, and you're able to load those archives, load those charts

01:06:26.645 --> 01:06:31.780
into memory and use them. And so this is you know, when you asked me that

01:06:31.780 --> 01:06:38.500
question earlier about is there any way to to get adoption in

01:06:38.500 --> 01:06:43.140
this world that's, like, so home focused, I don't know if this is gonna be enough,

01:06:43.220 --> 01:06:49.355
obviously, but at least there's a path for people who want to, you know,

01:06:49.355 --> 01:06:55.595
still use the Helm ecosystem, because it exists, but don't want to be using Helm anymore.

01:06:55.595 --> 01:06:59.360
So maybe they wanna use Yoke, but still use the Helm ecosystem. There is a path

01:06:59.360 --> 01:07:04.640
to doing that. And if you have your own charts that you're maintaining internally within your

01:07:04.640 --> 01:07:10.720
own platform team, you can you can definitely still embed them and render them

01:07:10.720 --> 01:07:15.715
in Yoke and start to gradually shift and start writing more and more of your logic

01:07:15.715 --> 01:07:18.995
in code and less of and less of it in templates and kind of do that

01:07:18.995 --> 01:07:24.755
migration path, slowly. So it's kind of like I'm I'm I'm calling back to a really

01:07:24.755 --> 01:07:28.980
old question and I just kinda think that, you know, you you scratch air traffic controller,

01:07:28.980 --> 01:07:35.220
the CLI,ArgoCD, and then I just had to mention that that there is some

01:07:35.220 --> 01:07:41.140
helm compatibility for for those who can't live without it. And and yeah. And I'm excited

01:07:41.140 --> 01:07:45.845
to while you're still scrolling your sheet you're still sharing your screen, there's a little tab

01:07:45.845 --> 01:07:49.045
at the bottom on the left called videos, and this will eventually end up there, I

01:07:49.045 --> 01:07:55.205
hope. So that'll be, that'll be fun. It's a little meta Yeah. Yeah. I think

01:07:55.450 --> 01:08:00.490
that kind of degree of Helm support is really important. Right? Because as much as we're

01:08:00.490 --> 01:08:04.810
not big fans of Helm and I'm sure that is not we're not in the minority

01:08:04.810 --> 01:08:10.915
there, I would say, is that people do distribute Helm packages and charts, sorry,

01:08:11.155 --> 01:08:17.395
for the stuff. Like, if you want to deploy Kafka or Redis or MongoDB or

01:08:17.395 --> 01:08:21.315
any of these things and you're not using an operator, then Helm is the way you're

01:08:21.315 --> 01:08:26.660
doing it because these companies provide Helm charts And being able to just utilize that, like,

01:08:26.660 --> 01:08:30.500
you know, that horrible horrible saying of don't throw the baby out with the bathwater, like,

01:08:30.500 --> 01:08:34.340
that kinda feels like what this is doing right. It's that bridge and to what is

01:08:34.340 --> 01:08:40.565
a don't even know what the word, common deliverable

01:08:40.565 --> 01:08:45.685
format in Kubernetes. Everybody has there's a HelmTrack for everything and, like, why not take advantage

01:08:45.685 --> 01:08:50.965
of that until we have something that is all encompassing and better, but that day is

01:08:50.965 --> 01:08:57.060
not there yet. So very cool support. Alright. Let's pop back over here, and we

01:08:57.060 --> 01:09:02.260
can chat. If anyone watching has any questions, please to the comment section. We'll do our

01:09:02.260 --> 01:09:07.095
best to answer them before we wrap up today. So question that I always like to

01:09:07.095 --> 01:09:10.295
ask when we get to this stage is just like, you've been working on this project

01:09:10.295 --> 01:09:13.655
for a while now. What we've done is dip our toe in, right, show people its

01:09:13.655 --> 01:09:16.855
capabilities, how they can start to take advantage of it. I think there's a a lot

01:09:16.855 --> 01:09:22.130
to love from the As Code approach, you know. I that's again a common sentiment when

01:09:22.130 --> 01:09:26.290
I speak to people at conferences is we want to use our tool chain or languages

01:09:26.290 --> 01:09:29.650
that we are familiar with. And you know what? Even if we're not familiar with them

01:09:29.650 --> 01:09:34.085
now, because let's say that we all have Cloud Code, Codex, Gemini, whatever. It's never been

01:09:34.085 --> 01:09:38.645
easier. Code is now cheap. So adopting it to do things like this is a fantastic

01:09:38.645 --> 01:09:43.445
thing. What is next for the project? Where where do you see your your roadmap leading

01:09:43.445 --> 01:09:50.620
you over the next three, six, and nine months? So the project is still pre

01:09:50.620 --> 01:09:56.860
1.o. I don't think I think it's been stable ish, pretty stable

01:09:56.860 --> 01:10:03.435
for the last eight months, six to eight months. I've been developing this since January 2024,

01:10:03.435 --> 01:10:09.675
so it's been about two years. The first year was developing

01:10:09.675 --> 01:10:15.270
the core CLI and SDK, and then the the second year was really exporting it to

01:10:15.270 --> 01:10:21.750
support ArgoCD and support its own server side operator. I think that

01:10:22.790 --> 01:10:28.845
right now, the shift has been into stabilizing the APIs and eventually

01:10:29.485 --> 01:10:35.085
getting a version one. And right now, I guess I'm also just in this mode where

01:10:35.085 --> 01:10:40.045
I'm doing outreach and doing talks and, you know, trying to get a little bit of

01:10:39.870 --> 01:10:45.150
adoption. And, and there there is there has been some companies that actually do run this

01:10:45.150 --> 01:10:50.030
in production, mostly the ArgoCD plug in. But, yeah, I'm just trying to get the word

01:10:50.030 --> 01:10:55.185
out and stabilize everything and get, you know, as many feature requests as I can. And

01:10:55.185 --> 01:10:59.265
whenever I get new whenever I get new users, I get a bunch of requests, and

01:10:59.265 --> 01:11:05.580
that's when the the project grows the most, and I have, my most fun. Alright.

01:11:05.580 --> 01:11:09.180
And and people are watching this and going, okay. This is a cool tool. I wanna

01:11:09.180 --> 01:11:14.940
contribute. Right? Are you open to contributions? Do you accept AI contributions? Like, it's a very

01:11:14.940 --> 01:11:20.745
topical thing right now. Like, how do you feel about that? So I am open to

01:11:20.745 --> 01:11:25.545
contributions. I feel really bad as you're saying this because I have one person that's trying

01:11:25.545 --> 01:11:30.425
to contribute to contribute for the last month, but I've been giving talks and too tired.

01:11:30.425 --> 01:11:34.020
So I I've I feel like I haven't been doing my my best as a as

01:11:34.020 --> 01:11:38.900
a steward. But, yes, I am open to contributions. I love it when people, you know,

01:11:38.900 --> 01:11:44.900
join the Discord, talk about features, talk about what works, what doesn't work, what

01:11:44.900 --> 01:11:50.985
they would like it to do. And, basically, I my goal is always

01:11:50.985 --> 01:11:55.305
to keep the project as agnostic to how people would want to use it. I want

01:11:55.305 --> 01:11:59.945
it to be just, like, foundational in a way. I don't wanna be too prescriptive, and

01:11:59.945 --> 01:12:03.970
I just wanna just support the the goal of the project is to support code based

01:12:03.970 --> 01:12:10.210
tooling for for for Kubernetes, which whatever is your your Kubernetes workflow that suits you best.

01:12:10.210 --> 01:12:16.205
So, yeah, that would be my first answer. And then as to the AI thing, I

01:12:16.205 --> 01:12:22.445
don't wanna out my personal stances. I'm I'm adjacent to the Zig

01:12:22.445 --> 01:12:29.660
project's stance on AI. I look. If you if if I don't really mind what, you

01:12:29.660 --> 01:12:33.740
know, if the contribution is good. I just want the human to be part of the

01:12:33.740 --> 01:12:38.620
loop. Right? Sure. If if it's a human that, you know, uses AI and they've they

01:12:38.620 --> 01:12:42.485
understand the project and they understand the code and for some reason they they don't wanna

01:12:42.485 --> 01:12:46.565
write it with their hands, then that's fine. But if they're doing a drive by and

01:12:46.565 --> 01:12:51.045
they don't know the project or understand how things fit in or just want to ask

01:12:51.045 --> 01:12:57.260
Claude to ship in a feature for them, then that might not take priority over over

01:12:57.260 --> 01:13:03.660
other work or other contributions. So Yeah. I think that's fair enough. And I think,

01:13:03.820 --> 01:13:09.145
well, AI does make code cheap. Comprehension is not cheap. People still need to read the

01:13:09.145 --> 01:13:13.065
code. Right? You still got to know what you're deploying. You still gotta be accountable. Right?

01:13:13.065 --> 01:13:17.065
Even if AI writes the code, the human that does the push, opens the PR, whatever,

01:13:17.785 --> 01:13:23.330
they still gotta take responsibility for that. So, yeah, completely agree. Anything else you want to

01:13:23.330 --> 01:13:29.330
discuss before we we say goodbye? No. I mean,

01:13:29.330 --> 01:13:35.090
I've been very comfortable letting you drive the show. So I I'm not this specific other

01:13:35.090 --> 01:13:40.165
than just thanking you for, you know, responding to to my, you know, cold outreach and

01:13:40.165 --> 01:13:46.485
making this happen. What I would suggest is definitely let's schedule a follow-up when

01:13:46.485 --> 01:13:50.570
there's more to show. And, you know, if when you have that next release ready to

01:13:50.570 --> 01:13:53.530
go, please just let me know. I'd be happy to jump on and take another look

01:13:53.530 --> 01:13:57.050
at it. I know that over the next kind of weeks and months, I have my

01:13:57.050 --> 01:14:03.130
own production that are unfortunate. But and I do wanna find ways to make

01:14:03.130 --> 01:14:07.275
that more as code approach. So I definitely see myself getting involved and trying to kick

01:14:07.275 --> 01:14:10.475
the tires on this a bit more. And I was encouraged, Emma Watson, to do the

01:14:10.475 --> 01:14:15.995
same, but no drive by AI commits, please. Alright. Well, thank you so much for your

01:14:15.995 --> 01:14:19.640
time, David. It's been an absolute pleasure. Thank you for working on Yoke and bringing that

01:14:19.640 --> 01:14:23.080
to people. I hope they find it as valuable as I did. And, yeah, until the

01:14:23.080 --> 01:14:35.185
follow-up, we'll see you all next time. Cheers. Thanks so much. Have a great day. Thanks

01:14:35.185 --> 01:14:41.345
for hanging out tonight. Brought Code Academy,Live, andSly. You brought the chat, we brought

01:14:41.345 --> 01:14:47.345
the code. Wasn't sparks on the Kubernetes Road. So raise a hand for David too. We're

01:14:47.345 --> 01:14:52.720
walking through what y'all can do. Flights took off, the charts got smoked. We signed the

01:14:52.720 --> 01:14:58.400
hash and ship the joke. We'll see you next time. Same Loud Track. Bring your questions.

01:14:58.400 --> 01:15:04.320
We'll be back from the runway to the cloud. Thanks for joining. You were loud.
