 Hi, my name is Thomas Maurer. I'm here with Vinicius Aperlinario, a PM in the Windows Container team. We're going to talk about some awesome stuff, how you can actually modernize your existing Windows Server applications using containers and make it super easy using the Windows Admin Center extension. Hey Vinicius, how are you doing? I'm good Thomas. Thanks for having me at the show. Thank you for joining us. We really appreciate you taking the time to talk about some awesome stuff you're doing. For the people who haven't really heard about you, I'm sure a lot of people heard about you in the past, but you recently joined the Windows Container team and you work on some awesome stuff there. Can you explain me a little bit more how long you're at Microsoft and what your current role is? Actually, I've been with Microsoft almost 10 years. This is the year that I have the marks my 10-year anniversary with Microsoft. It seems recently, but I've been with the Windows Container team for two years already. Recently, I started working with how can we make the process for IT pros and ops teams to use containers a little bit easier. You see the result of that in Windows Admin Center today. We have tooling around how you can containerize applications using Windows Admin Center that makes the process completely easy for that specific audience and so on. That's awesome. First of all, congratulations to the 10 years you will have. Thank you. Secondly, sorry for the recent. I always say I'm recently joined Microsoft and I just realized that's also two years ago. It still feels like it just happened. Welcome back to your anniversary. Thank you very much. I think we met exactly when I joined Microsoft. I think that is when we actually had this awesome stuff. You're working on some really cool stuff, especially for IT pros and companies who actually need to modernize their existing work traditions. We actually asked you to join this session. What are we going to learn today from you? Well, today we're going to show the process of containerizing an existing application. We're going to show you some scary stuff like Windows Server 2008 up and running with an ASP.NET application that is up there from whatever customer that is running those types of applications is still on those servers. The problem they have is, how can they get out of Windows Server 2008 and still use the latest and greatest technology that is out there today, like containers for example, and Azure Kubernetes services and so on. So we're going to show that process, but we're going to show that process from the IT Pro perspective. How you take the application, how you extract the application from the running server, how you containerize the application, how you push the application to a container registry, and then from there, how you deploy the application to Azure Kubernetes service. That is awesome. We get these questions a lot from a lot of the IT pros out there. A lot of people are talking about containers and actually how we can use them and what the great benefits are and so on and so on. But it's always good to have like, okay, so now talk about the real stuff and how do I get to use them and so absolutely happy that we have you here. But before we start with that, can you probably share a little bit with us, like just get us a little bit of a recap what containers are and what the benefits of using containers is? Yeah, absolutely. So let's get started with that. The first thing I wanted to talk about is, if you are an IT approach today, you are probably used to seeing a scenario like this, a data center full of racks and servers, and it's great especially with hardware virtualization today. We get better usage of our hardware. We get isolation for the applications on each of the virtual machines. But the problem with that, that we found out over the years is that those virtual machines, they are what we call resource hogs. They still consume a lot of resources for those applications running on those virtual machines, and they are still an entire operating system that you have to manage. Especially with the Cloud, for example, how do we describe how we want to compose the applications and the operating system that we're running today? If you want to use infrastructure as code, for example, how do you adapt with virtual machines? More importantly, how does an application move between testing environment and production environment, which is one of the major problems between Devs and IT pros over the years. Developers go and test the application in the Dev environment when they send it to production, the application doesn't exactly work the same way. Well, there are multiple reasons why that happened, and containers are here to try and solve that problem. That is something I hear a lot. These are some awesome challenges we are facing, and I'm wondering really how you're going to show us how we can fix this. Yeah, absolutely. I think that was actually a good move at the next slide. Also, I know a ton of customers which are obviously still using Windows Server 2008 and 2008 are two, and obviously end of life basically on support is gone. What can they do with these applications, and can containers also help them with that? Yeah. I think the question customers are facing at this point is, if you still have a Windows Server 2008 application, how do I keep my business running without disruption? I need to move away from 2008, but I still need to run the applications. The other question is, if I'm still using 2008, how can I not only move away from 2008, but also modernize that application? I don't want to simply put it in the next operating system, and then just wait for the next end of support, and so on. Containers can help with that. By the way, Windows Server 2008 is already not supported, so if you're still running on 2008, you should be thinking on how to move away from 2008 pretty quickly. Entering the subject of containers itself. Containers, they solve for multiple things, including the things that we've been talking about in the previous slides. The analogy that we make here is with shipping containers itself. The reason why containers are called containers is because they are very similar in nature to containers that we see in shipping containers. The reason is, over the years, the industry needed to figure out how to transport goods from one place to the other, in a way that is standardized for the shipping container or for the ships that are actually moving those goods. Shipping containers are the answer to that. They are a standard way for you to package those goods and then ship it to somewhere else and then open the container, and the goods will be there exactly the way you inserted them into the container. If you want to move those containers around, you can do that. When you think about containerization from a technology perspective, it's the same thing. The only difference is, instead of shipping goods, we are shipping applications from one place to the other. The major benefit of containers is that they run exactly the same way, no matter where you run the container. As long as the service or the container host can run that container, the container will run exactly the same way. That's what we're going to prove today during our demo. So, going back to the analogy, sorry, Thomas, go ahead. No worries, I was just like, this makes this light bulb go on here. This is how we actually get it, the exact same configuration from one place to another, because that is one of the things you just said before, one of the challenges, and that is one of the channels I've seen a lot, is actually getting this application from a development environment into pre-production and then probably in production, that it actually has always done the exact same way, right? And I think that is now makes my light bulb go on here. Yeah, exactly. The reason why an application might not work in production compared to development might be multiple things, configurations on the operating system, requirements for the applications that are not in place on the production environment, and then the list goes on and on and on. With containers, when you package the application along with the container, you describe everything that the application needs in order to run, so that package contains everything, not just the application, right? So major benefit there. So when you move, for example, from your co-workers, DAF machine, to your machine, or to your Canary, or DAF environment, your test environment, and then into production, even the cloud, everything will work exactly the same way, right? Yeah. Major benefit there. So it's not just like, oh, it worked on my machine. Exactly. So looking a bit further on the benefits of using containers, agility is, of course, one of the main ones, because you're not tied to looking into issues when you move from environment to environment. Portability, because you can move from even on-premises to the cloud. So it doesn't matter, like, if your hypervisor is different anymore, it doesn't matter. If your virtual machine can have to be backed up or exported in a way to move to the different environment, the container itself is going to run exactly the same way. Density is another one, because we're going to talk about the architecture in a second. We can package more containers into one host compared to virtual machines. And rapid scale, because of that, because we have better density and better performance, then you have faster scale options with containers. All right, so let's take a look at the architecture itself. So again, this is what you're probably used to as an IT pro, a rack, a lot of servers, networking, storage, and so on and so on. Let's take a look at the hardware and operating system layers here. This is what we are used to, right? You have the hardware layer, and then on top of the hardware layer, you have the operating system. And with the operating system, you have additional layers inside that we don't get to see, but we know how the operating system behaves. You have the kernel layer on which the operating system basically manages how the applications and the services, they are going to access the hardware, plus a bunch of other stuff that the kernel is responsible for. But mainly for the purpose of explaining containers, the kernel is responsible for managing how the applications are going to access the hardware and managing the isolation between those applications itself. However, they are all sharing the same kernel here. So what we did back in the day with virtual machines was, well, let's create an isolation for the kernel so we can have multiple kernels running, and then you have one operating system per application of virtual machine that you deploy, right? The problem with that is that you have an overhead for that kernel, right? You have an entire operating system that you have to package, manage. You have to boot the operating system just like you've built the operating system in a physical machine, right? So with containers, I should have clicked before, but basically you have the kernel space and the user space. That's the nomenclature that we use for those two layers that I was describing. With containers, what we did was, well, we kept the kernel there. So you don't have a different kernel, right? It's the same kernel. But then you have the isolation of the user mode. So each of the application here has its own view of the user mode and the kernel, right? When you package an application in a container, you have the same applications and services running in that container, but that container is sharing the kernel with the host, right? The good news here is, well, if something goes wrong with that container, you don't need an entire operating system to boot it again or this won't affect the other containers that are running in that operating system because in the previous option, if something goes wrong with this application, it will affect the other applications that are sharing that kernel, right? Here we won't anymore. And the other thing is, if you need to boot a new container, you don't need to boot the kernel again. You would skip all the steps to booting the operating system and then from the management perspective, that's not another kernel and operating system that you need to manage. It's just the container itself. It's one operating system with multiple containers running here and they are user mode isolated. Okay, okay, that's pretty... I can already like see a couple of awesome things here. So what you're basically saying is like when we did, we had obviously like in the very early days, we had one physical machine, an operating system on top and usually we put an application on that. And we wanted isolation, right? You don't wanna have like five different applications on the same physical host. So we added like more physical hosts and then they were basically doing nothing over all that time. And then we had this cool thing called virtualization, which then allowed us basically to split up the hardware into different virtual servers or virtual machines, which had a little bit like, which actually was great and that is what we're doing now since years. But the problem with that always was, as you mentioned, we still have all that overhead. Like we have a whole operating system for that, right? And like obviously when you move a virtual machine, it takes some time and all that flexibility and you need to manage it as you said. And now what you're telling me is that I actually can like split up, if you will like use the same kernel and still have isolated applications running on that operating system, right? That's correct. And from a terminology perspective, some people call it operating system virtualization, right? Cause it's really like one layer above hardware virtualization where you are not, you are now sharing the kernel instead of the hardware, right? So I mean, from a resource perspective, management perspective, there are many advantages for using containers here. So there are, I mean, just out of the, just saying this is like, it's probably, they are very like a lot smaller. So if I want to copy move them around, I probably don't need that. And I know that you probably like have some other things talking about layering and stuff like that as well, but that they're definitely smaller. So they are easily movable. They're probably taking less resources so I can put more on one machine to get that density you mentioned. And then also they're probably faster by spinning up. As you said, we don't need to boot the kernel all the time, like if we do a reboot, we can just re-spin it up. I mean, again, I probably show me a ton of other things as well, but yeah, I'm already a huge fan. That's awesome to hear. Well, let's hope that the demo is even better. So let's get you on the slides here. So just to finalize an example, the example for the demo that we are going to use is for a web application. The cool thing here is if you have multiple applications running on IIS, for example, what people usually do is like I have one web server running multiple websites. And then even IIS has isolation methods, like for example, application pools that you can run inside of one instance of IIS for multiple sites. That concept is not even necessary with containers anymore. You can have one container for each website because they are way smaller. You can isolate and quickly boot a new instance of your website like in a matter of seconds. So even concepts like application pools are not exactly applicable for containers anymore. You can have one container for each of the websites that you have and still have a better resource for your application for your container host. Okay, now that's awesome. So again, as I said, huge fan. So how do we now take that advantage of containers? Like I know we run ton of applications. How do we now take advantage of that? Yeah, okay, let's get that app containerized. All right, so let me switch to my, this is going to be scary for some of you. This is a Windows Server 2008 R2. And this is how we use to run things back in the day. But primarily what I wanna show you here is that this is a web server running a ASP.NET web application. I'm gonna show you the application in a second, but primarily what I wanna start with is that this is a regular web server and very common scenario from what, 10 years ago or something like that. I have my application here deployed, as you can see as an application called ViniBeer. I have a default website, default kind of deployment back in the day. This is our application, right? So it's called ViniBeer. It's primarily a process for you. One of the things that I do is I brew beer at home. And during the process of brewing beer, you have to bottle your beer and then let it sit for a while. So it carbonates and generates CO2 and alcohol and all the process and so on. So basically what this tool does is it gives you how much sugar you have to add to your beer when you bottle it. So it ferments and generates CO2. So let's say, what kind of beer you like, Thomas? I'm kind of like, I like ales. Do you have any like an ale or something like that? Let's get a Belgian strong golden ale. I know you're Swiss, but let's get a Belgian strong golden ale. That's fine, like Belgium beer is fine. I'm just like, as a Swiss person, I have difficulties with Belgium chocolate, but. All right, so the temperature here is in Fahrenheit. I use Celsius, I know you too, but Fahrenheit, let's say like 75, oops, Fahrenheit. That's like above 70 is good, below 70 is not good. And usually when we brew beer at home, you're doing like five gallons of beer, which is a lot of beer. So basically what it gives you like type of sugar and then how much you should be adding to your recipe. So pretty cool tool for whoever builds beer at home. The app works. The problem is it's sitting in a Windows Server 2008 and we to move away from that. And in the process, what we wanna do is we want to modernize the application, right? Yeah, so there are multiple ways you can start the controlization process. We are going to use one that is probably the most familiar to IT pros out there, which is I don't have a developer to help me, right? When that process happens, basically what you have is you end up with the server that has the application deployed. So your first step in the containerization process is you need to extract the application from that running server. And for doing that in this case, of course it will depend on the type of application you have, but for web applications, we have a tool called WebDeploy. WebDeploy can be attached to IIS. There's an installation process out there. So let's show you how we do that using Windows Server 2008 exactly the same newer servers as well. So what I'm gonna do is I'm gonna right click my application here. You can see that I have WebDeploy installed. So I have this deploy menu option and I'm gonna click export application. The cool thing about WebDeploy is that it's going to export not just the application itself, like the files for the application, but the configuration of the application inside of IIS. So if you configured application pool, what version of .NET this application has to use, everything goes in the export process. As you can see, I have the configuration here and I also have the file system. So all the assets for my application to work, they are already included in here. The next step I have is if I want to add any parameters for the export process, this is particularly important when you have applications that are talking to a database. If you have a database string that connects the application to the database, here is probably something you wanna take a look. The reason why is you might be containerizing the application and keeping in the same network. So for example, if your application access your database by a DNS name or IP address, it will continue to work if you deploy the application on a container on the same place where the virtual machine was. Now, if you move to the cloud and you are moving the database, let's say for example, for a SQL managed instance, for example, here you wanna change that configuration. For example, if you have a database connection string, here's where you would be changing that configuration to the new connection string for the new database. Okay, awesome. So I would actually go out and let's say, to make this example, I will create the SQL database in Azure, for example. That is already now, I would take that data and put it in there. Yeah, because remember the connection string for the existing server is talking to your, let's say the old connection. You need to change the new one. So here's where you are going to export the configuration. So when you import this configuration in the container, it already knows where to talk to. Okay. We're not gonna do that here. The application doesn't have a database, but just to let you know that this is where you would do that process. The next step is just to specify where the package goes and then you finish the process of exporting the application. So this is step number one, right? The next step is now with the zip file that is generated by this export process, you can start the containerization process itself. So now let's go take a look at our friend, Windows Out in the center. And here I have another VM where I'm running Windows Admin Center. As you can see, I have connection to multiple container hosts. The one I'm going to use to demonstrate the process is this container hosts 0, 1. And as you can see here, I have been extension in Windows containers called containers, right? So before you do this process that I'm gonna show, one of the things you have to do is you have to install this containers extension. If you don't know how to do that, we have plenty of blog posts out there and even our documentation now updated to include Windows Admin Center and how to use the containers extension. But basically after you deploy the containers extension and you target a container host, you can see here that the containers extension will show up and you have multiple options in here. So to quickly describe what we have here, we have container host options. For example, your containers you have running, the images you have running the networks and volumes available for those containers, as well as some Azure configuration, the Azure Container Instance for running one instance of your container and Azure Container Registry to restoring container images, right? Now, the first thing I wanted to cover for a containers is the images portion because in a virtual machine world, what you would do is you would install the virtual, I'm sorry, create the virtual machine and then you would initiate the installation process for the operating system, right? You start the ISO file, you go through the steps of installing and then you configure the operating system, they deploy the application and so on and so on and so on. Yeah. With containers, it's a little bit different. Whenever you restart a container, you have to start from a base image. That base image is the instruction on how the container was created and then all the configuration for the container is already in place. So let's say for example, we have base container images with just the operating system, like for example, the server server, nano server or even the Windows image. This is just the operating system, but we also have some other things like for example, IIS. This one not only has the operating system, but it has IIS already preconfigured in the image. The question is how do we create those images? How do you create those images? The process, the way it works is you write a instructions file called Docker file and that Docker file has the instructions on how Docker can go and create the container image for you. If that's starting to become a little bit scary, don't be because we're going to make that process extremely easy for you. It feels a little bit like if when I use templates for virtual machines and then I created a template which was like a blank Windows server, like let's say 2019 image. And then I created one where I took that template, I created the VM, I installed for example, IIS on it and then I created another template with that and then the next one will be then one where I have the application inside. So if I really hard was in templating, I think that is kind of like how this feels right now. Yeah, the analogy works. The only difference is for VMs, you have to manually run the process, do all the configuration and then you run sysprep at the end, right? Yeah. With containers, you don't do that. You could, but usually the way it works is you write a Docker file with the instructions on how to containerize the container, the application and then you run a command called Docker build and then Docker will run the instructions step by step in order to create your container image. Okay, so let's manual effort and I can just use basically a declarative way of how it should look like. Okay, that makes my life easier. Yeah, it does. The problem is how do I write those instructions and how do I get started with that, right? Yeah. So let's show a few things in here on Windows Admin Center itself. So the first thing I want to show is we have a pull option and the pull option basically says, well, if you have a container image out there already, it's ready to go and you want to use in this container host, just type the repository here, what is the tag that you of the image, the specific image you want to pull and then click pull here. If you don't know which ones to use, we have some pre-populated here. For example, the server core one or the ASP.net one or the IIS one or the nano server one. Oh, nice. And those tags. The other thing is if you are pulling from a registry that requires you to authenticate, here you go. You have the option to provide the URL, the username and password and you can pull the image from a repo that requires you to authenticate. Okay, so that's actually a good point. You just showed me on the left side in the menu that there is like Azure Container Registry. Does this mean I can only use Azure Registries or can I also use others? You can use other. The option here for registry authentication is industry standard for authenticating with whatever registry you wanna pull an image from. Okay, awesome. And as you can see, like for example, for the common image, if I select one for ASP.net, for example, you can see that we fill out the information here for you and the pull option becomes available. Nice, nice. Yeah, I really liked that one. That is new, right? That is new, yes. We released kind of recently. All right, so the next step is if I have base images in place, I can create a new image for my application itself. So let's take a look at how that works. I'm gonna click create new. And as you can see, we have here a Docker file preview, which is the option to give me the ability to add the Docker file if I need to. And then I have questions up here that I can respond and I'm sorry, that I can answer. And then we are going to create the Docker file for you. So remember that I mentioned like all those instructions you'll have to know to create the container for your application. Now you actually don't have to know. We can create that for you. So the images you see here, again, they are created from those instructions, but basically we are going to run those instructions for you. So let's just start with the process here. The first question we have actually is, do you already have a Docker file and you just wanna like rerun the process of creating the application? If that's the case, you mark this option, you provide the path on which your Docker file is located and we are just going to load the Docker file here and you can rerun the process. The next option is what type of application you are trying to containerize. For now, we have IIS web applications. The reason why we have this dropdown menu is because we will be adding other options here in the futures or keep an eye on updates for this extension. But let's say web application and then what is the source of your application, the application source type? What that means is what kind of assets you have to recompile or to rerun your application, right? Let's say you just have a static web application, well, very uncommon today, but still a scenario that some customers still use and all you need for that application is just a folder, right? So in IIS, you go to the configuration of IIS, you point to the folder and then you have an HTML web application run. The other option is let's say you do have help from your developer and they gave you the entire solution for the Visual Studio solution for the application itself. If you have that option, click this option to dropdown menu and give us the path to that solution, right? What Windows Admin Center will do is we are going to load all the projects that we found in that solution and you can go from there. Now, remember that we mentioned like in this case, we don't have the help from the developers, right? Yeah. So we went to the server that the application was running and we exported a zip file for web deploy, okay? So I'm going to mark this option and we are going to browse that server and I'm going to get the ViniBear, the ViniBear web deploy zip file, which is the file that we extracted from the server. Yeah. And with this configuration, Windows Admin Center has pretty much everything it needs to know. The final thing is, do you know which version of that network we use? Because this is important depending on how old your application is. If you're running up to like.net framework two, you can still containerize the application, but you probably need to run in the 3.5 version of that net framework, right? If you have a newer version, you can probably run these two options. My recommendation here is try the options that we have available. If you see an EHR, probably changing the.net framework version is going to fix the issue for you. So in this case, I know I can use the 4.8 because it does support the 3.5 and some of the other options here. So the latest version works for me. The next step is let's say your application, in addition to deploying itself to IIS or whatever it is, still requires you to run some manual steps like creating a folder, creating a registry, and three in the registry, whatever environment variable, although there are some other options here for that, but whatever that application requires you to manually perform, you can still do that. Put it in a PowerShell file and then load this PowerShell file in here. You can run additional steps for installing your application using this option. And finally, just to provide the name, so you can identify this image, I'm going to type VinnyBeer. I'm gonna say this is V1. And then as you can see, the Docker file was created for me in here. Everything that is needed for Docker to go and containerize your application was written here for you. Okay, yeah, that is nice. That is like the things I usually go into the documentation, right? Then I copy the stuff and then I start editing and fiddling around with that Docker file and like figuring out, okay, how do I now copy all the information in? What do I need to do? How do I run the script again and all that? And so this basically now gives me that Docker file, like basically generates that Docker file for me. Now, my question here, this looks like if I now need to add something to the Docker file, can I still do that? Or is it now just locked like this? Yeah, no, I'm sorry, I shouldn't have kept that open. This part over here is totally editable. Like you can come here and type whatever you want. So you can add it right here. And the other thing is whenever you run this process, so as you can see from the image over here, I already ran this process, right? So let's take a look at the folder on which we inform it where the zip file was. Oh, sorry, it's not on this service. It's doing on this service itself. So file sharing, files and file sharing. Let me go to the folder on which we passed on where the zip file was. As you can see, the Docker file is here. So now if you wanna use this for whatever else you might need, you can still do that. This can be open on Visual Studio Code, Visual Studio. This can be opened on a notepad and you can further add it as much as you want for this Docker file. Okay, so it's not just a Microsoft only solution. That is like the wizard gives you this and we don't care like whatever it is, it's just Microsoft. It's really like the normal Docker file standard format which we can take advantage. I can generate that, reuse it, can edit it, whatever. Awesome. That is correct, yes. And once you have the image running, there are two things that are interesting to do here. First one is to run the container, right? So I have the option here to run a container. I can specify or not the container name. We can give the container name for me. The other thing that we didn't touch is hyper-de-isolation. So briefly explains the difference here is remember when we talked about the architecture of containers and we said, we are sharing the kernel. For some environments, sharing the kernel is a security boundary issue. For those customers that don't wanna share the kernel, we have hypervisor isolation. So basically what this does is we still use the container technology, but we create a kernel specifically for that container. Okay, it is not an additional overhead from a management perspective, but you manage as a container, but it is a kernel. So it does add some performance, not exactly penalties, but the performance of a regular container is just faster than hypervisor isolation. There is some performance considerations there, but compared to a virtual machine, it's still faster, smaller, and everything else. Yeah, yeah, awesome. The other thing is because we are using the NAT option, the network address translation in this case, we are going to map a port from the host to the container. Now, this is not the only way to run containers, right? You can use outshell bridge or other options of layering for your network, where the container is going to receive a public IP address, but in this case, we are using network address translation. So I'm gonna map the port 8080 of the container to the 80 of the container host is 8080 and the container is 80. Here we have some options, for example, how much memory and CPU you wanna allocate for this container, keep in mind that this option here is not going to use two gigabytes of memory or one CPU. The container is going to use whatever it needs and it can go up to this configuration that it's running here. Okay, so it's a limit, basically, you said. Okay, nice. The other option we have here is if you are already familiar with Docker and how to run new containers, you know that there are many variables and options for specifying a Docker run command, which run new containers. We didn't want to add all those options in the UI. So what we did was we add this option for add and basically what you can do here is specify what is the parameter and the value for that parameter. So if you need to specify a persistent storage or an environment variable or a different network to use, here's where you're gonna do that. And if you don't know what options there are, you can click here and see the documentation. But basically, with the information that I provided, I can click run and this is going to start the process of running a new container. This should be finalized in a second. There you go. Our container is up and running. So I can click containers. Just to double check that the container is running. Let's see, I have two here actually. This one was created by the image that we just talked about. And one of the nice things about Windows Admin Center is that I have some management capabilities for the container here. So how much CPU, how much memory, network IEO, those kinds of things that you would expect that an IC Pro is looking for in terms of resource utilization. Those kinds of things. I have some options, for example, for even get events from inside of the container. And the cool thing here is that it's very similar to what you are used to in terms of event viewer visualization or application. Yeah, nice. So we've even out like joining somehow some, like we're using a power jewelry voting command or anything like that. We just can easily use Windows Admin Center to get the logs, get some details, how it's like doing. And it's actually a cool tool to troubleshoot also. If you're running a container host and you wanna see what is the container doing, you can actually use that, nice. Yeah, that's correct. But this is like for, still for your validation, right? You created the image and you wanna check if the image is running properly, right? Yeah. Great, let's do that. The next step now is how do we push this container image to a place where all the container hosts can see it and run in those hosts, right? The process here is called push. We're going to push to a container registry. So here what we have is we have the image name and the tag and we can change that we want. And then where do you wanna push this to? For example, you can push to Azure Container Registry and this is going to use your Windows Admin Center Azure account that you configured using Windows Admin Center to bring what are the subscriptions you have. So for example, here are the subscriptions I have in this account. And then what are the registries that are in place that I could push this image to? So I have three registries here. I can select which registry I want to push this information to and then just click push and this is going to start the process of uploading my image from this container host to a centralized location running on Azure, right? So this is now available for other container hosts and other Azure services. For example, Azure Kubernetes Service. Okay, that is awesome. Now, obviously like we have that container we can, as you said, we can reuse it. Now what I wanna see is like, so let's use it. Let's listen for the point in production. Yes. Before I show AKS or Azure Kubernetes Service the final thing I wanna show in Windows Admin Center is that we have Azure Container Instance. And what Azure Container Instance is, is as the name says if you just wanna run one simple instance of your container, you can do that. So let me show you this real quick. If I click Azure Container Registry where my images are I can open up my registries and as you can see I have multiple repositories with different tags. For some that are, this is the same image just a different version. Let me take this, this one and run the option to, I think it went away, it's like this one. Click Run Instance. And this is going to run the container instance just like we ran in this container host but on Azure Container Instance in this case. So you don't have to take care of the host now. You just ask Azure to run the instance and Azure will take care of everything. Oh wow. Okay. What you have to provide is the container name. As you can see the subscription is here. What is the resource group in that subscription? I'm not gonna run the process itself. I'm just showing what we have here. What is the location? These that you would expect that Azure asks for and then how many cores you wanna use and how much memory. If you want the public IP address for this application or not, in our case we need one and then what is the port you wanna expose for users to access your application? Okay. Wow. This is very straightforward here. Yeah, I just wanna say this is like super easy to actually now deploy a container in Azure Container Instance like just directly from Windows Admin Center. So this is awesome. Yeah. And from Azure Container Instance from this view as you can see I already have one container running here. Here I have some basic management options like for example, I can stop this container or I can delete this container. If I need further management I can click to manage it in Azure directly from Windows Admin Center. Awesome. All right, so with that let's take a look at the Azure portal because now what we wanna do is we want to show how to run that container image that we just deployed into Azure Kubernetes service. So let's take a look at the registry itself. So I'm gonna show this ViniBear registry. As you can see here, just to show the process when it's analyzed from the Windows Admin Center site the end result is that you have the image now pushed to the registry. And as you can see here I have the V6 which is the sixth version of my application. I can click here and I even have the command that I can run on new hosts if I'm doing this through the command prompt to pull this image to that host. So this is the full address of my image now running in ACR. All right, so if I'm now sitting here like I sit here on my desk, I've installed, I could basically go out and just like take that command and run your ViniBear application here on my desk. Or you can do it the easier way which is installing Windows Admin Center and just giving the URL which is this portion here until the column. And then V6 is the tag. So by providing this information you can go to Windows Admin Center and pull the image way easier. Awesome, awesome. All right, so let's go back to the dashboard. And what we wanna do here is we wanna create a new AKS cluster or Azure Kubernetes Service cluster. To do that, you're going to run the usual process in Azure, right, so create new resource or you can just click here on the option of Kubernetes Services and then select the option to add a new Kubernetes service, a Kubernetes cluster and then follow the wizard to create a new cluster. I'm going to run this wizard until the end to explain some of the capabilities in here and some of the options but I'm not going to finalize because it takes a while to deploy a cluster and then deploy the application. I have it running already. So let's go to the process of deploying. First, of course, this is Azure so you need to specify what is the subscription you wanna use and what is the resource group. So I'm gonna select the container demo RG. The name of your cluster so I'm gonna call it test cluster. What is the region you wanna deploy this of the ability zone for surviving a disaster? What is the Kubernetes version you wanna use and this dictates how much features or which features will be available for you. I'm gonna use a default one and then one of the concepts in AKS is that you have a pool of servers to support your application and even the configuration of Kubernetes itself. By default, the primary node pool is a Linux node pool because this is configuring and running Kubernetes itself. So what we are going to specify for the primary node pool is just the size of the VMs that are going to run and how many VMs you want in that pool of servers, right? Since our application is Windows, we can keep this standard here. You can even change this configuration if you want but for us we are going to keep this standard. Next, we have the option to create new node pools and we need to do that because as you can see the primary one is Linux. So we need to create a new Windows one. So I'm gonna click the option to add a new one. I'm gonna call it WX for a Windows server pool. I'm gonna say this is a user mode because this is going to run my application is not going to run any configuration for the Kubernetes cluster itself. This is a Windows type, the availability zone I can select which availability zones I wanna use. The size of the nodes are the servers running in this pool and this is the usual VM size that you have in Azure. For the sake of the demonstration here, select this standard one. Node counts from three servers per node. I can say four or five or how many servers I need and how many pods that represent containers I can run per node. So the maximum is 250 pods. I'm gonna add this, as you can see now I have two node pools, one for the system running Linux and one for my applications running Windows. Nice. Next authentication, I'm not gonna go deep into authentication for Kubernetes because there are gazillion options for managing authentication and how the Azure services are going to authenticate against your Kubernetes cluster. The thing I wanted to say is we have two options, the service principle or system assigned managed identity. For service principle, what you wanna do is you want to manually configure what is the service principle that is going to have access? For example, how do your Kubernetes cluster access your container registry where you restored your image? You need to authenticate for that. So if you use service principle, you have to manually do that but you have more granular options. If you use system assigned managed identity, Azure will take care of that for you but then only for the resource group and it's not as granular as service principle. I'm gonna keep this one just for the sake of the demo. Sorry, go ahead. No, that's great. I did something, I just learned something new that we have this new system assigned managed identity and that this works with the resource group so that I was not aware that it was limited to that, okay? That's pretty good. I'm not entirely sure if it's limited. I think you can change later. The default option is for the resource group. Okay, awesome. Again, you have a bunch of other configuration here for our back integration with Active Directory and so on. Let's go to networking. Since we have Windows nodes, we can't use KubeNet which is the default networking configuration for Kubernetes. We have to use the Azure CNI at least for now but basically what this does is this is going to configure an Azure network for the Kubernetes cluster and the application so they can of course communicate and so on and so on. In terms of integrations, here comes the result of the authentication like the container registry. Do you wanna integrate with that? And I do. So I'm gonna select the BiniBee registry that I just showed you because they are in the same resource group. Now I can actually go and have that integration already configured. Next I have tags that helps me manage resources in Azure. I have the review and create and everything looks fine. I can just go ahead and click create. But like I said, this process takes a few minutes to complete. So what I did was I created a cluster previously. So the end result of that creation process is this, is a fully working Kubernetes cluster that now you have and you can manage either through a command prompt or the Azure port itself. If you are familiar with Kubernetes, you know that one of the ways that you can connect to a Kubernetes cluster is using kubectl or kubectl or whatever you pronounce this. So one of the nice things about Azure is that it gives you the instructions on how to connect to this cluster plus a few options for already going and managing AKS from Azure Cloud, I'm sorry, the Cloud Shell or the Azure CLI directly. So let's take a look at a few things in here. So the first thing I wanna show you is the node pools. All the configuration we specify during the wizard are here. So you can see the WS pool, user, this is windows, three nodes. I can go and take a look at the nodes itself or the scaling option for these nodes. All the configuration that you would expect in here for managing a Kubernetes cluster. Now the question is, how do we deploy our application to AKS? Well, AKS follows the same deployment process for any Kubernetes cluster. To deploy an application in Kubernetes, instead of going through a wizard of deploying it, you also have to write a instructions file that tells you how to deploy the, or tells Kubernetes how to deploy the application. And then Kubernetes is going to take that, those parameters and run those instructions to deploy the containers to the nodes. The way you do that is specifying a YAML file. And what I did was I prepared this one for this demo and I put it in my GitHub repo. So you can use this as a basis for your validation and testing. And quickly taking a look at this, as you can see, we have a deployment option here. We have some metadata information that describes my application. And then we have the specification of our deployment. And deployment is using for deploying containers itself. So here I have three replicas for the containers. I have metadata for the application, specifying which application to use and specs for the container. So first we are saying that this is a Windows, this application, so it should run on a Windows node. And then the container itself, I'm giving it a name, I'm passing on what is the image that we are going to use. And then the resources itself. So how much CPU memory in terms of limits as well as requests. So this is how much you can use tops and this is how minimal it's going to use when it's running. What are the ports that needs to be open? And then for a service that is actually the representation of the networking for your application, here we have an option for load balancer because remember we have three replicas. So you need to load balance the load into those three instances. So we are saying that this is using TCP port 80 and the application that this is, they should be deployed is VINIP here. Now, one of the cool features in AKS actually is that yeah, and providing all the commands to go and deploy this. We have an option here called workloads where you can see the workloads and even pass on a new YAML file. As you can see, this is a YAML editor. So all I have to do is copy, sorry, is copy the content from here to here and click add. And then AKS is going to deploy both the containers and the networking to this AKS cluster. Okay, so the YAML file really is like the, like a decorative way of the configuration of the whole application. So if I would have also multiple containers for one application, if I need like a application server and a front end server, I could also specify that all in there, right? That is correct, yes. And I mean, I could separate, for example, one deployment for the deployment of the container, another YAML file just for the service. I'm just using one just for the sake of easier management and so on. One thing to keep in mind is the description on the YAML file calls out that same address that I explained earlier on in the registry, right? So make sure that your image matches what you have in the registry. I'm going to cancel this because I already did this process. The end result of deploying this YAML file is this, right? So the ViniBeer application that you just saw me configure. As you can see, there are other ones. These are all system kind of applications that are running in order for Kubernetes to simply work. But mine is also here. So if I click this application, I have some details here on how the application is actually deployed. So as you can see, I have three desired replicas and there are three available. Everything seems to be running fine. I have the pods here that are exactly the containers that are running. So I can get a lot of details here on how my application is actually running. But the main thing I want to show is that the application is actually running, right? So let's go to the services and ingress because remember my YAML file described the application plus the service. Here you go. You have ViniBeer, the application deployed as load balancer. I have a cluster IP address, which is the IP address used by the cluster to access the service. And I have an external IP address, which is the IP address that is going to be used by my users to open the application. So if I go to this IP and I type in the address of my application itself, my application is open running. It's exactly the same application that we saw back at the beginning of the demo running on a Windows Server 2008 R2, right? So just to prove that the application is still running fine, let's get your strong golden ale, 75 degrees Fahrenheit, five gallons and the application runs just fine. Nice. So now, like you showed so many awesome things. So first of all, like how fast you actually can set up a Kubernetes cluster using AKS, right? This is like, for me, still absolutely awesome. And it kind of like, it is a managed service which lets us run Kubernetes. And then the second thing, which I'm like, this is just a nice side effect. Now this application you just showed me, it actually is now localized. So like you showed me to have these three instances. So now we have this like application. So if one node fails, that's something in the old days, I would actually have that run on a VM and then I would have a virtual localizing appliance or even a physical one to actually do that. And I need to do that all manually. Now you just basically describe that in that YAML file, which for me is absolutely awesome. Exactly. Like if I need more replicas from a host perspective, all I have to do is scale up the number of nodes in my application pool, the node pool that I showed. And if I need more containers, all I have to do is change the YAML file from three to four or whatever number you wanna use and redeploy it, right? Okay, that's pretty cool. I love that. I mean, this is like, makes it obviously like, also like we talked about the advantages of having like the scaling wise and all that. But now with that, like I can see just another other benefit of that. Now, we used obviously Windows admins that made it super easy to generate the Docker file and then generate the container image and then allow us that to push that to the container registry. And from there, we could then create like we had to build our YAML file to actually go out and deploy that to an AKS cluster or a Kubernetes cluster in general, right? Now, wouldn't it be cool if like Windows Admin Center could help us creating that YAML file? Is there something in the pipeline? Yeah, thanks for bringing that up, Thomas. If I can show you the demo flow that I just did because it's a lot, let's just recap what we did. So we had an existing .NET application running. What we did, the first process was to export the application and then use Windows Admin Center to containerize the application. Then we pushed the container to Azure Container Registry and then we started the process with the AKS cluster. Now, all of the things you're seeing here on the left-hand side are supported by Windows Admin Center today. You can use Windows Admin Center to make this process easier. What we don't have yet is this option over here. How do I alter the YAML file plus how do I deploy that YAML file and the services and whatever it is to AKS, right? And this is what we are working next. We are working on a YAML authoring tool inside Windows Admin Center plus the option to deploy to AKS and AKS HCI which is a new release in public preview where you can run AKS on premises. Oh, that is awesome. Yeah, we have a session in this event. So if you wanna know more about it, go to aka.ms slash itobstocks and there you will find the whole session on AKS on Azure Stack HCI. So I guess the whole workflow you just showed me is obviously now using like the Azure Container Registry and our Azure Kubernetes service running in Azure. But if I would go back and say, hey, I could not run for different reasons, right? Network latency or data sovereignty reason, I could not run it actually on AKS in Azure. Now with Azure Stack HCI, I could actually run it in my own data center and still use the same tooling and everything you just showed us. Yep, exactly. So the whole containerization process, it will work for both AKS and AKS HCI. And then it's just a deployment option. At deployment time, you can say, where is the destination you wanna go to? Oh, that's awesome. That is really, really awesome stuff. Like this makes it, like I can't wait. I have a couple of old applications here running. I will definitely try this out and like see if I can containerize them and put them on AKS so I can actually save some power here at home. That's awesome. Okay, with that, I definitely like always wanna learn more now to prepare actually for like exactly for my migration, right? And if others like the viewers of this video, if they wanna learn more, where do they go? Yeah, so I put some links in here. The first one is the aka.ms slash containers. This is the link to our documentation. And just recently, we updated the whole documentation to include Windows Admin Center. So we have new tutorials there explaining how to deploy the containers extension, how to deploy Docker itself and configure the host. If you don't have it pre-configured. So if you just have an installation of Windows Server and you wanna transform that into a container host, you can use Windows Admin Center to actually do that. How to pull images, run images, manage images, create new images, run on Azure with ACI, push it to ACR. Everything is now documented in this link. Oh, awesome. The next one is aka.ms slash containers feedback. This is our GitHub repo. It doesn't have any code, but it does allow people to go and create new issues. Those issues, we triage those. So if you have a bug, if you have a question, if you have a suggestion, go to this link, create a new issue and let us know what's going on. The product team is looking at those issues and working with our community and users and customers to understand what they need, what's working, what's not. And it's a nice channel for communicating with us. This is awesome. I love that. And I just wanna quickly highlight this because when I was not working for Microsoft and was like really like in the back in Windows Server 2003, for example, days and so on, I was like, I was setting up Active Directory for some customers and stuff like that. And I was like, I run into issues and bugs, right? And I was like, I don't even bother telling Microsoft that because why would they listen to me, right? And that is like, since I joined Microsoft from even before that, that is actually like one of the biggest mistakes I made because really the product groups are listening to that feedback. They wanna know what is working, what is not working. So please, please, please take that opportunity, provide feedback, especially if the container teams offers that. So if you try this out now by yourself and you run into issues or you have like something you don't understand, I guess they can also write you if there's like documentation missing, if they have a missing piece or a question, like, and that would also help us obviously fix those things as well to make sure that they have all the resources they need, right? Yeah, yeah, absolutely. Two things, please contact me. I have my Twitter here. You can contact me there. But also the documentation is all open source. If you have feedback on the documentation itself, you can write your feedback directly in the documentation. So you can also try that as well. Awesome, now this is great, great stuff. I'm really happy to have you on this video and in this sessions. I really appreciate your time here. Thank you very much, Vinicius. Great to having you. No, thanks Thomas for having me. And again, great partnership here. Awesome, thank you very much. And for all of you who haven't like watched this session and want to learn more, we have obviously all the links in the description below. So you can find the links to the documentation, to the feedback hub where you can provide your feedback. And if you want to watch more sessions, for example, also on Azure Stack, on AKS, on Azure Stack HCI on other hybrid sessions as well, check out aka.ms-itops-talks. And you will go to our little event website where you can find all the other sessions and what's going on with that event. Thank you very much for viewing that session. Thank you folks.