 All right, and we are live. We are live. Cool. So, um, welcome everyone to get off the guide to the galaxy. I will be your captain in this journey. Christian Hernandez, technical marketing here at Red Hat. Um, again, co-captain is you this time. Um, we're back from an extended break and not only are we back from an extended break, we, um, we came out a little, a little, um, an hour earlier. We, um, uh, to make room for in the clouds, um, in the clouds, had a, um, a special guest, right? And so we just, uh, we, we moved the show for an hour. But next time we'll be back at our usual time. So, uh, Fred, not, um, again, apologize for technical issues. Um, we have a big topic today. Um, we're talking about, um, originally, um, when, when I decided to do this, um, uh, this, this stream, uh, this topic, I was thinking about doing it in terms of Argo CD and how to, um, do your directory structure for Argo CD in a way that's get ops compliant. And I figured, you know what, how about I just show you instead of just talking about it, right? And so that's why I kind of just, you know, um, uh, re, rename this show or kind of rethought this topic and say, I'm gonna, I'm gonna do a directory structure from scratch. So, um, I'm gonna get right to it. Um, I do have a hard stop, uh, today, unfortunately. So this will be a shorter show if I'm going too fast. Um, that, that is why, um, if I don't get to your questions, that's, that, that's why, but, um, and again, forward apologizing, I'm gonna go really, really fast. So for those of you who are new to not only to the show, but also to get ops, this is gonna, this might go over your head a little bit. So just kind of fair warning. It's going to be a lot. Don't worry. I do have resources that you guys can take a look at afterwards. So let me start here by sharing my screen. Um, share my screen, which one, this guy here. Um, oops. I never know which one to share one second. Uh, yes, this one. Okay. There's only three of them. I don't know why I ever get confused. So one second here, I'm going to share my screen. Um, all right, perfect. So, um, right before I, I jump in a little, little things I, I want you guys to realize that a one get ops con is coming. We're doing it again. We loved it so much. We're doing get ops con a second time. Um, again, in person, this will be a, uh, in person event, uh, in a co-located with cube con, uh, in Valencia, Spain. So, um, uh, get ops con is happening in 17 weeks. Look, looks like there's a, there's a, there's a countdown here saying, you know, um, it's, it's 17 weeks, uh, away, which just seems crazy. We better start planning. Um, and also the, uh, CFP is open as well. Right. And so the CFP link should be on the areas right here. Uh, CFP is open. We are having two tracks this time. So, um, feel free to, um, uh, submit as much as you want, right? We're actually going to have more room. Uh, we had to make difficult decisions last time for get ops con about what we will accept, what we won't accept. But this time we're casting a wider net because CNCF gave us two rooms. That's how popular it was here in North America. So we hopefully will, um, um, re, uh, uh, we recapture that, right? Hopefully we'll make it even bigger. We, we hope it'll be bigger because we got two rooms. So, uh, get ops con, uh, there's the link. I dropped it in the chat. Um, their, uh, CFP is open. So feel free, um, to submit as much as you want. On top of that, another event we're having in February. So February 9th, we are having red hat is sponsoring OpenShift Commons. So for those of you who don't know, OpenShift Commons is, um, where, uh, the, the community of users of OpenShift and OKD, uh, get together, um, uh, it's kind of an upstream, um, community that is sponsored by red hat. We are having a get ops day, right? So get ops Commons gathering on, um, uh, OpenShift Commons gathering on get ops. So, um, and there you can see, uh, we're going to have, you know, our friends Cornelia and Dan, right from Amazon and CodeFresh. They've been on the show before. Um, they're, they're coming back, um, members of the, uh, OpenShift get ops, sorry, of the open get ops community will be there as well. Uh, it's gonna be a, um, uh, on February 9th. So it's, it's open virtual, right? So it's virtual. Gotta say that, right? Unlike get ops con. Um, the, this gathering is virtual. So for wherever you are, um, it's, it's free to attend. It's, uh, free online, um, get to know the community. I'll be there, right? I'll be, I'll be, uh, um, kind of doing a sub, um, an expansion of what I'm doing today is right. How to get started with get ops. So be sure to check that out. So moving right along at a 10,000 miles per hour pace. Um, so the idea here is I get a lot of questions and not only do I get a lot of questions, but also our, uh, here at red hat, our solutions, architects and consultants. And even in the upstream, right? Even in the open ship get up, sorry, open ship get ups. There's too many words with open, um, open get ups community, right? The openings get up working group. We get this question a lot is, um, the question is, okay, um, I'm, I'm buying into get ups. You know, I played around with Argo city. I put it on flux. I played around with ACM. How do I, how should I structure my repo? Right. And so, um, you know, there's, there's a lot of opinions out there. There's a lot of kind of best practices. And I figured that I would do a show on and like, how do I create a repo when, um, you know, when, when doing get ups, right? And so the idea is here is let me drop down to my CLI here. If I do an OC get notes, right? I have a Kubernetes cluster in this case, open shipped, right? I just installed this day one, right? So if I do OC get pods, a, uh, Argo, there's no Argo, um, or any, any get ups controller on there. Um, so the idea being that, um, you know, I have a clean cluster. How does, how does Christian get, get started? And I figure that I will, um, kind of give my best practices slash how do I do things here in, in a way that is repeatable, right? So at any time I do something, I like, you know, you as your dev ops practitioners, you as get ups folk, you want to do things that's repeatable, right? And so that's kind of like the idea I have. Also, I want to do the idea of, um, that is agnostic to the get ups controller, right? So here, here at red hat, we, um, we were all in our Argo CD, you know, push of get ops is based on Argo CD. Um, but, um, people like using flux. There's, um, uh, tons of flux users out there. Um, flux is a certified operator on open ship. So I want to, um, you know, I don't want to like box myself into, uh, any particular get ups controller. So, um, this is how I get started. This is specific to Argo CD, open ship get ups, but it's essentially you can do it, modify this to use it for flux as well. A lot of this is based on the work that, um, um, you know, some of the, um, internal architects, um, you guys mentioned me, heard me mentioned before Gerald, right? One of the great Canadians that I worked with. A lot of it's, uh, based on that, a lot of it's based on, um, the, the stuff I've done with, uh, work I've done with flux, the work I've done with Argo autopilot and I kind of just mash it all together to make it work for me specifically. Um, one, one caveat is this, this, this design is specific to one cluster, meaning that this is a one to one relationship. I have one repo that's pointing to one cluster, right? One repo is managing one cluster. The design changes as you get into like to say mono repo where you're doing one repo for many clusters or if you're doing like poly repo sort of design where it's many repos to many clusters and you're mixing matching. So I decided to start simple, a one to one. I have one cluster. How do I do my get ops directory structure here? So first things first, as always, create a new repository, right? Um, create a new repo. We're doing this from scratch, right? So with, with warts and everything, with mistakes and all, this is how I do it, right? And so here we'll call this, um, um, see here, something fun. Let's have, um, let's call this, uh, well, what's, what's, um, uh, let's call this a Loki repo, right? Whatever. Marvel shows I like. So for those who watch Marvel, uh, get ops, a repo example or Twitch, um, streaming, uh, parts and all, right? Let's make, uh, I like to add a read me, right? It's just, so I have this repo brand, brand new. You get, uh, you don't get any newer than this and I just clone it locally. So let's do this. So I, you know, I have no directory here. Uh, get clone. So let's go to, um, right? There's their Loki repo. Andrew's watching. He'd probably just laugh that I just did the dirt command. Uh, what, one of the, one of the things that, um, that I also do at red hat is that I'm, I'm also, I'm not only the get ops TMM, but I'm also the, um, Windows containers, TMM, two of the weirdest things unrelated, but you know, so that's why you saw me do dirt because I just spent some time on a Windows, uh, server. So, um, right? It's just the read me where it's square one. Um, great things, right? So, um, when, where or how to get started is, uh, or how to initiate something onto a cluster, how to get something onto the cluster is what something has commonly, um, referred to as a bootstrap, right? So bootstrapping. So this is, um, which is why I always create a directory, um, called, um, um, bootstrap, right? So I have a directory called bootstrap, um, and that's kind of like, um, where I'll put all my things where I, um, how I bootstrap a cluster or how I'm going to bootstrap this cluster is that this is where the, all the artifacts go in there. So, um, in the bootstrap directory, I use customize. So for those of you who haven't, um, aren't familiar with customize or this is your first time, um, I'll put a link here in the chat. If I can find it, there we go. Um, so if you've missed past episodes, feel free to check that out. I talk about customize a lot. Um, and the reason I use customize is I do, um, I use the dry method. Don't repeat yourself. Chris short, which who I, who was an original, um, uh, host here for get ops guy to the galaxy, uh, who's since left bread hat, uh, we, he actually joked he, um, cause we, we still keep in touch. He actually joked it, you know, don't repeat yourself as is don't repeat YAML. Either way, the, the acronym works, the three letter acronym works is don't repeat yourself. So I have, um, somebody who's customized for that. So, um, customize. So I'm going to have a base directory here and I'm going to have, uh, overlays as well. So back up here. Let's do a tree. Oh, warts and all. I messed up. Um, I actually like to create a directory above this directory. So let's do, um, let's do that. So what I like to do is I like to create a directory. Um, and I, and I, and I named this directory the same as the cluster name. So for example, um, if I do an OC get, um, machine sets, right? Uh, this is the cluster name of this cluster that I'm, that I'm doing. So, uh, in order to get that, I just grab that cluster name, which is that guy here. And I create a directory there. And then I move bootstrap into cluster one. Okay. So recap, uh, tree. Let's do, so I have the cluster name, which is the cluster I'm going to deploy to. And then if I do a tree, I have inside this directory, I have bootstrap, a base and overlay. All right. So far, so good. All right. Let that sink in a little bit. So I have this directory here. And then what I do is that inside of bootstrap, um, so let's create a file. Let me do touch, even though I can just vi it, um, base. Here I do, um, inside of the bootstrap base directory, I do everything that I put all the YAMLs that it takes to install the GitOps controller. In this case, it's going to be OpenShift GitOps. But this doesn't have to be OpenShift GitOps. It can be, you know, Argo CD, it can be Flux, whatever. But in, um, in, in our, in this specific case, this is where I put in, um, how to install the, the, the GitOps controller. And in this case, we're using OLM, right? So we're using the operator. So, um, in, in our case, that means that we just have to subscribe, right? You have to add a subscription. Um, so here out of this, once I do a tree again, right? So in base, I have this file. So let's, uh, let's modify this file, right? And then if I want to go fast, I have this, uh, I have this here off to the side, but, um, right, I just put in, you know, and you can find this in, um, in the official OpenShift, um, documentation. So this is how I get the operator installed, right? OpenShift GitOps operator installed. So again, I'm going to do this a lot. Tree, right? So here, um, I got my base, um, in there. And this is how, this is the installation manifest for, um, for OpenShift GitOps. This can have as many files as needed, right? Um, for a Fargo CD, it can be, you know, a few dozen files, or you can have one file with all your YAMLs in them, right? Um, but since I'm using customize, um, I have to create a customization file. So that gonna go over, um, under Bootstrap overlays. Actually, um, I have to create a directory there first, and I'll tell you why in a second. Overlays default, right? Quick recap, right? Overlays, um, is basically where you start your deployment from, and it reads from base, and you'll see how this works in a little bit. Um, if, if you're not used to customize, don't worry, this will make sense as, as you go along. So Bootstrap overlays a default, and then here you have to have a customization file. Uh, first you have to have a customization file and base, sorry, Bootstrap base, uh, customization, right? And here you need to a list any files you want to include. In our cases, OpenShift GitOps subscription. Again, Tree. In Bootstrap base, we have how to install it, which is a subscription installation YAML. Could be one or many YAMLs. And in the customization file, so if I, oops, that I basically am listing everything, right? If I had multiple YAMLs, I would have to list those YAMLs individually. Um, so that's the base. That's how I install the operator. Inside of overlays, right? Inside of overlays. So let's go over here. Uh, yeah. So inside of overlays, um, let me do a tree and I'll talk to the tree. Talking to trees, we're talking the nature here. So, um, inside overlays, inside the default is specific configuration for the GitOps controller for this cluster. So, um, while this is like a generic Bootstrap, the cluster itself, it's specific configurations for the GitOps controller will go into default. So this, um, takes, um, two things. So one, um, I do the, let me touch the installation file. It touch, uh, cluster Bootstrap overlays default. I'm touching the, uh, OpenShift GitOps Argos CD instance. So do a tree. That's how that looks like. So here, this is actual, um, instantiation of Argos CD or, um, the Argos CD controller. So here, um, again, it's easier if I just copy, paste what I have here, my magic off-screen thing. Um, don't worry about too much what's in here. It's just, just know that this is, uh, an instance of Argos CD. Right. So, um, clear tree. It's clear that tree again. So here, uh, 3CAP base has, um, the subscription and overlays has OpenShift GitOps, um, Argos CD instantiated. Um, another thing that's needed, um, at least for me, the way I do it, you don't have to do it this way. Uh, but I do it this way. So, um, you can change this if you'd like. Also, um, I need to set some Rbacks. Um, I always set, um, some people disagree with me. Um, and I disagree with that disagreement, but I always, I'll give cluster admin to Argos CD. Because if I'm doing GitOps, everything is driven via Git workflows. So it doesn't matter if this controller has, um, cluster admin, it needs, like, how can you deploy something onto a cluster if it doesn't have access to deploy? So, um, disagree, that's cool. Put in the chat if you disagree. I'm happy to, uh, disagree with you live. So, um, cool. So we have base that installs the operator and we have the default which has, um, specific, um, configuration for this particular cluster. Um, again, just like, um, just like the base, you need to have, um, a customization, uh, customization file. So let's touch, uh, overlays default. I always misspell customization. I don't know if it's like one K or two. It looks like it's just one K. Okay. Um, and then here, uh, a few things, right? So first let's put the header, the GVK, because that's always important. Then, uh, resources. So the resources, um, let's just go back. Resources is basically the, the name of the files, right? These two files that I want to include, um, which I do have, uh, copied over here. It's just an array, right? So here you can see an example. It's like, hey, load this, load this. Um, but this won't work without, um, if I go back here saying, hey, in the overlay, say, hey, I need you to, uh, you know, read that in. So I need to do that as a base. And then, um, there we go. So here is actually, this is, I would say if you, um, don't leave, if you, with anything else except for this, um, this is actually pretty good starting point. This is actually viable and you can probably just start here. Um, so if I do a, a customize, a build, a cluster, um, bootstrap overlays default, this will, um, basically apply everything that we created. So we created the subscription, which you see is down here, which is there. Uh, we created, uh, the RBAC policy, which is here and then the Argo city instance, which is there. And so, um, this is actually enough to get started. Um, um, but I like to add a few things on top of this, right? And this is kind of like where the genesis of like, okay, cool. This is cool to get started, but like we're, you know, how do, how do the, uh, how do the experts do it, right? And so let's do it quick tree. Um, the next thing, so this is actually done in terms of bootstrapping. So bootstrap is done, um, so, oops, I do this here, right? So it's just, it's just cluster, oops, in the wrong screen. There you're right. It's just, right now I just have bootstrap on the top, on the top level directory. Um, so I'm going to create something else in, in a Gerald if you're watching this here, you'll, you'll recognize it, you'll recognize this, um, create directory, cluster, and I'm going to create a directory called, uh, components, right? And so in the components directory, if I can find my notes here, yeah. So in components, um, components means different things to different people, right? And to it probably, uh, to Gerald, it probably means, um, um, something different to him than, than, than to me, to me, components are, um, things that you need in order for the GitOps controller to work or things that you do in order for the GitOps controller to, uh, to function the way you want it to function, right? So let's, let's go for me. I like using application sets. So where do I store my application sets? Uh, I store them in components, uh, cluster, oops, cluster components. And then here, uh, let's do, I believe I called this app sets or application sets. Good question. Components, uh, application, application sets. Um, I do, other things that could go in here are things like, um, Argo CD projects, right? So as you know, Argo CD app projects are independent of OpenShift projects there. So that, the way that looks like, it's like this here. Um, so, um, that's where those individual components, uh, go. And so, um, for instance here, let's, let's have an example of, um, let's, oops, let's touch, um, cluster, components, um, create that directory. Oh, uh, components, Argo CD project. Okay. So let's touch components, Argo CD project. And here I'm gonna, I'm gonna list, um, you know, I'll do test project, right? So here, uh, so here, um, I put like a configuration like, you know, I'm gonna create a project inside of Argo CD, for instance. Um, I'll have that there. So the way that looks is, right? And just, just like everything else, remember we're using customize. What does that require? This was a, this is a workshop in, in, or, um, or training or a class or something. I would, I would, this is where everyone out loud says customization.yml file, right? So this is, you need a customization.yml file, um, because we're using customize all the way through, um, in an episode I called, um, customization files, uh, rat droppings because, um, because that's kind of how it is in your repo. You're just gonna see this all over your repo, get used to it. It's, uh, it's fun. Um, it actually, it makes you, even though it's, it feels like more yaml, it actually makes you write less yaml. Um, cool. So let's tree this. You have this, right? Um, so how do you load the components into, um, your, uh, bootstrap directory, right? You remember, we have the bootstrap directory. That's the point of entry. How does that get loaded, right? So if I, if I clear this and I do, uh, build, um, you're gonna have, uh, you notice how the Argo CD project, is it included here? So, um, essentially the answer to that question is, um, you're gonna have to update this customization file. So if I do cluster, bootstrap, overlays, default, customization, and here you're gonna have to add the Argo CD projects as, um, as a base. And so now when you do a build, it'll, um, include the Argo CD project as part of that build, right? And so, um, let's take a look at this here. So as you can see, the more and more we go through, the more and more you're gonna see that a lot of these steps are repetitive, right? And so because it's, it's essentially you're gonna create a directory with all the manifests and you're gonna just reference it from something else. And then for instance, for something else, right, it's gonna chain together. Uh, there will be a point of entry where you make changes, um, and everything else basically chains off of that. And so, um, that's kind of how you have, um, the, um, customized, how to use customize in order, um, to one, write less YAML and two, how to reference things to other, uh, other components. And so here, um, I'm kind of wondering here, um, I do have, I wonder what would be the best way to, like, just do the application sets and then show you why or do the other directories and then go back to the application set. So let's, uh, let's do, um, let's do the ladder, right? So let's do, so the next directory, so we're gonna come back to components application sets. We're gonna, um, right. So here we have bootstrap and components. The next directory I like to create is, um, something that I've kind of went back and forth of what to call this, is what I, I actually call this core. Um, and, uh, oops, the reason I call this core is because, um, this is where all the core components for, um, for this cluster to run, right? So like all the core components, all the cluster configurations, all the, um, you know, all this, you know, sort of, um, um, thing like, um, L, um, IDP configurations, right? LDAP configurations, right? Things for like admin-y stuff. I put it in core and, um, this, I'm not actually not 100% married to this name, uh, but it's basically there almost as a placeholder, um, for, um, for in case someone else gets, um, it's a better idea, right? Or I find something better. So, um, yeah. So, um, Gerald, right? Thanks for joining us. He says, do you always use the actual cluster name in the repo name? Um, do I always know? So if I want something that's like completely repeatable, maybe something that's completely agnostic to the cluster, I just call it cluster. Um, and, um, and so, and, and the reason for that is, yeah. So, um, um, the reason for that is for what you said, um, in case the cluster gets redeployed, I can just, you know, I don't have to do any weird renaming. Um, if, um, so, yeah, you don't absolutely have to, right? I just, I just did it for, for this demo, but sometimes I'll just call it cluster, right? If it's like so generic that, you know, it gets, you know, deployed multiple times, I just call it cluster. So, um, oh, and, and Gerald says he uses config instead of core, but, um, yeah, he's not a hundred percent on it either. I'm not either. So, um, so here inside of core, I'll create a directory, um, per thing. And I don't know what else to call it. Maybe someone else will, will figure it out. It'll make sense once I do it. I do here. I do a get ops, uh, controller. The reason I do it get ops controller is because again, I wanted to make this as agnostic as possible. Um, because whether you're doing Argo CD, open your get ops, or flux is the same design. So why name it something specific? You can change it to Argo CD. You can change it over to get ops. I just use, uh, get ops controller. So here I do, uh, get ops controller inside of this, um, is that of this directory. And in here, this is a very, very simple. There's only one file in here. Um, and it's, um, let me touch it. And it's, you guessed it, a customization file. And so, um, in here it's, it's, it's a very simple file. It actually, um, it's actually just one line or, you know, a few, one config actually is basically saying, hey, load everything in, um, from default. So the reason why this is here, it's going to seem, you're going to think this seems kind of redundant Christian. Um, and it is a few reasons, right? Um, one is that this, this is, the application set is going to deploy. It's going to point to this directory and I'll show you in a bit how that works. And that's one. And two, um, the, um, this is how Argos or the get ops controller in our case, Argo CD is going to manage itself, right? So you want not only Argo CD to deploy, but you want Argo CD to manage itself as well. Um, and so this conforms to the, the get ops principles, right? You don't want your application or application sets, um, uh, definitions to be independent of outside of the get ops workflow. So, um, and so you can test this by doing customize, uh, you know, build, um, cluster core, yeah, cluster core, get ops controller, right? And you see that it'll, it'll build just fine, right? Because it's just again, uh, let me clear the screen. And it's just pointing up to the bootstrap directory, right? And so, um, this seems, I, you know, 100% agree. This seems like overkill, right? For one repo. Um, and the reason I'm doing it this way is, uh, just plain and simply instill good habits. Because if I'm doing something like a mono repo, right? Where I have one repo and many clusters, um, I'll actually move bootstrap and overlays, um, outside of cluster, right? And so it'll actually live one directory up. Um, and if we have time, doesn't seem like we will, but if we have time, I'll show you, I'll show you how that looks like. But, um, in this oops, so here you'll see cluster and then you'll see bootstrap living outside of cluster. So, and then that way you'll have, you know, those individual configurations. So, um, so again, running out of time. So I'm going to go super, super fast. So how do I load core, um, into the cluster, right? So this goes back to the application sets. So in the application set, um, I have an application set, like, let's see if I can touch this file real quick, uh, touch cluster components, uh, components, uh, application sets, and then core components. Right here, I have an application set, um, and this application set points to, if you're not familiar with application sets, we did a show about application sets. Remember, watch, um, if you haven't seen it. So application set is, um, this configuration, the important thing to, um, realize here is that one, um, this, this configuration here, line 12 is basically saying, hey, um, every directory you find in core, deploy that as an application. And so, uh, a few changes need to be made here. So first of all, uh, the Loki repo, right? Loki repo, we can change that. And then, uh, we need to change the name, which I can see now Gerald. This is where Gerald's point comes, uh, comes across. Um, its name is cluster one, right? If I had those placeholders there, it's just said cluster, I didn't have to change that. So, um, uh, but you remember, again, your mileage may vary. So cool. So now we have those, uh, we have that application set set just like every other directory that we have on here. Um, what do we need? Class, what do we need? We need customization file. I can paste it correctly. So um, and then we, the easiest thing is that we have core components on, um, in this repo. So that's one thing. Cool. Um, so now just like, uh, let's, let's do a tree to see where we are. So there we got, um, a core. We got application sets, right? That had, um, that has the core components listed in the customization file. We need to tell the overlay just like before, just like we did, uh, with, with this guy with the Argo CD projects, we need to tell the overlay where, how to load those in. So that would be under cluster bootstrap, um, uh, overlays default customization. You have application sets here. And this is just as simple as telling it to load, right? So let's clear that. Let's do a tree. So here, uh, if you can see here, uh, the overlays default customization points to both application sets and Argo CD project. So if I do a build now, not only do I have Argo CD project, but it also sets up application set. So if I make a change to this application set for whatever reason, right? Maybe I want to turn off, um, self heal. Argo CD would automatically load that in, um, when I make that change in this repo. So the next component, final component, um, is, uh, something that, uh, Gerald got me into, right? So this is another Gerald special, um, let's cluster, right? I have core components. The next top level one will be something called Gerald. Can you guess it? You guess it before tenants, right? So tenants, what's the difference between tenants and core? Um, core is the core functionality of the cluster. Tenants are your workloads, right? You can call this app, you can call this workloads, you can call us whatever you want. I call them tenants because I have a cluster in an app running, an app running on my cluster could be short live, long live. So it's like a tenant, right? You can think of it as a, kind of an apartment, right? So the comp apartment complex is the core, right? Cluster and the tenants are just your tenants. Um, a hundred percent, a hundred percent, um, I'm not a fastest enough typer is what Gerald says. Um, a hundred percent, same functionality as, um, as core, meaning that, um, uh, let's, let's give a, let's give a good example. So if I go, um, I have here, I have an example here. Let's go to get a, uh, uh, example. Uh, I have something called my app, right? So I have my app, which is, you know, bunch of YAML for my application, right? Uh, nothing funny there. So that's, um, let's copy that to, uh, right. So I have my app there, and this is just, uh, you know, um, just a dumb welcome, hello world app. Um, so in order to load tenants, I do basically do the same thing as I did with core is I create an application set for it. So if I do, um, cluster, uh, uh, components, patient set, and this application said, I think I called it tenants. Yes, I did. Where's my notes? And then it's app set. Beautiful. This app set looks exactly the same as core. So, um, and you need to make the same changes here. So let's do a local report. And then what did we call this cluster? No cluster, blah, blah, blah. And then so same thing anytime, um, anytime I add a directory, uh, to this here, it'll create an application because of the application set. So, um, since I'm already loading in the application set, uh, oh wait, the one thing I need to do, I'm pointing at the screen as if you know what I'm pointing at. Um, one thing I do need to do is I need to add, uh, the tenant app set to the customization, right? Just because nothing happens without customization. All right. So let's do a build. Uh, I don't want to do a build of that. I want to do, oh, actually that would work. Um, but here, not only do I get an application set, um, for the core configuration, which is somewhere here, uh, yeah, for the core configuration, I also get it for tenants as well. Right. And so that is in a nutshell, we're essentially done here. Let's go, uh, just do a tree. Uh, we're essentially done here. And so, um, this is like the good base here of, um, of how to do it. So how moment of truth, right? As you guys were all thinking moment of truth is, uh, how do you apply this? Uh, first I have to commit it. Um, add, add everything, uh, get commit. I want to sign it. Uh, Gerald, Gerald is cool. Right. Uh, oops. Come on. There we go. I'll get push. This is, it's committed, right? It's in this repo. So if you reload this repo, um, it's here, right? And then you can see the tree, um, outlined here. Um, is this, there's no, um, expand all right here for, I don't know if you guys use, uh, um, uh, octo tree. Anyways, um, so yeah. So Gerald's cool. Initial commit. We're all there. Um, and the way you apply this is basically, uh, as, as some of us say that, uh, Shell is the, um, uh, make sure to let my kid know I'm cool. Yeah. Um, this is kind of a shell as the new language of, of get ops, right? And so you're going to do an until loop. So until, um, OC apply, uh, dash K, and you want to do the cluster bootstrap, um, overlays default. So until that happens, what are you going to do until that happens? Um, oops, sleep. Uh, I forgot to do, but is there until I should do, uh, carriage returns, right? Until OC apply. This guy do sleep three done. Right. Um, so the reason you have to do an until, an, uh, an until loop is because you get errors like this where the operator needs to install the CRDs, right? The custom resource definitions first in order for the CRs to work, right? And this will take a little bit, um, because OLM takes a while. Like if you're doing like straight flux or straight Argo CD, it might go a little faster because we don't have to wait for OLM. Um, but this basically can be done with shell, right? The bootstrapping process can be done with shell. It can be done, um, uh, with like Terraform, Ansible, right? What picture favorite tool personally I like using helm, um, for bootstrapping because, um, you can make it pretty agnostic and it's just, I just, it's just one of the, uh, one of the better tools for bootstrapping, I would say, right? Because that's what it's used for. So, um, cool. So we're all here. Um, so that was applied. So if I do OC get pods, uh, open shift, get ops, right? You see that, um, we're running. So if I do an OC get apps, uh, you see that there's two apps running, appsets, right? And so let's go to, let's look at the, where is the, the route, get the route. I don't know what my password was. Hold on. Uh, cool. We like self sign certificates. As you can see, it's a brand new cluster. Like I've even say, brave, right? Uh, I probably do this out of, um, I have the password somewhere here, if I can find it. Um, I owned it. Clear this. I'll bring it back. All right, we're back. And the password is in there. So, um, one last thing before, um, you know, before I close it out, I'm actually kind of late for my other meeting, but I just kind of want to do one more thing. Uh, so here, tree. So this is enough to get started, right? Um, so, um, your, your next question is, okay, so how do I add workloads? So the, so let's say I'm an admin and I want to add something in core, right? I wanted to add something in, um, uh, I want to add the, uh, yeah, there we go. The container security operator, right? Because we all, that's a good example because it's an easy thing. Um, all you, we need to do in order to add workloads here, let's say I'm an admin and I want to add the container security operator, right? Um, so if I do, um, KDIR core and then, uh, container security operator, right there, I will just touch the, um, the file of the YAML I want to load in. Um, actually this is probably enough for it to work. Um, but as, as you all know, we're being good citizens. Um, uh, we need to actually add one more thing. And as you guessed it, this would be the common theme, um, customization file is what we need. And then here it's just as simple as just loading in that file, right? This actually doesn't, technically speaking, you don't actually need this file, um, because application sets will just, just work the way it is, but I like to, um, uh, I like to be consistent. And so here, so all I did here was I added a directory and I added two files, right? So if I do a git diff, uh, we get status, right? So I added this directory, um, and I added, uh, uh, that file in the customization file. So git add, now can I do a git diff, a git commit, it's probably a way to do it. Um, here, uh, adding CSO, right? Container security operator, git push. So all I did was I added a directory here. Um, it's going to take a while. It might take a minute to, I may kick it a little bit, but, um, because the reconciliation loop is three minutes. Um, so hopefully we either caught it right before the three minutes. If you caught it right after, we have to wait a whole three minutes. Um, but the idea here is that I just commit my application and the reconciliation loop will then, the application set will then pick up that directory and deploy the application. Um, I may hard reset this app here. Um, there it is. So, um, it created the container security operator, um, application, right? Just by adding. So like if I wanted to add a workload, right, I would just put it in tenants. So for example, um, let's do, uh, something simple. Um, and then let's do that into cluster one, uh, tenants, right? I added, in tenants, I added another directory and in tenants, right, um, specific for this right here. Uh, you can do whatever, um, notice that there's a customization file. Uh, in this customization file, um, I'm actually loading in another repo. Um, um, so this kind of shows you, so you can still have your directory, but can still host the repo in, in other, in other repos. Um, so anything's possible because this is, uh, uh, it's customized, right? So you can get push, wait, and we wait. Yeah. So, um, and then it just adds, right? So essentially what the application sets gives you is that, um, it'll just, um, deploy over and over and over again. So someone asked, very good question. Um, so does this folder structure in YAML files work with any Kubernetes distro? The answer is yes. Kubernetes because customize is built into Kubernetes. And so, um, since customized is built into Kubernetes, you'll have, um, um, this essentially will work with any cluster, right? You can just do customize build and it'll just deploy. Um, someone says they have a rancher cluster should work with rancher. I don't know what ranchers automation is, but if you're using Argo CD, if you're using flux on it, it should just work, right? It essentially should work with any Kubernetes cluster. Um, I do have examples right here. This example is going to go away, uh, because this is just kind of my, my scratch disk. Let's go to, yeah, let's go here. Let's go to my repositories. I'm just going to paste these in. I have an example for OpenShift GitOps, uh, Argo and flux, right? So if you're going to use OpenShift, there's a repo to get you started. You're going to use just Kubernetes and Argo. There's another one. And just to show you, because I've done a lot of work with flux lately, this one flux, you'll notice, although I have like three separate repos, they're all the same structure. Um, and so, um, the idea is it's just a basically a good way to start. So this is how to start. Uh, you can change this however you want. So anyway, running late for my next meeting. Um, and so, um, what I'm going to do is, um, uh, I'll follow this up probably with a blog post. Um, we'll keep talking about this. Maybe I'll have Chris short back on, um, uh, as, as a guest, ironically, right? Instead of, uh, instead of the, um, instead of the host, because we've done a lot of work in this Git repo. Um, so anyways, thank you all for joining. Um, I appreciate you. Next, next time we're going to, um, start at our usual time. So, um, again, thank you for all your patience. We're going to start at the same time as our usual time, right? 3pm Eastern. And I'm going to have Hashicorp come on and talk about vault. It's actually going to be a first of a series of episodes, right? So it's, we're not, we're not going to have Hashicorp on once. We're going to have a multiple times to talk about, um, vault. So anyways, uh, stay safe, uh, stay safe out there, everyone. Uh, thank you very much. And we'll see you next time. Bye, everyone.