 session of the day. Daniel O is going to be presenting a comprehensive guide for Kubernetes native Java for us today. So with that, I'll turn it over to Daniel and let you go with it. Thank you so much, Mike. Hello, everybody. And then probably I'm on the last session today. And thanks for joining today. I'm super happy to be here and then talk a little bit about Kubernetes native Java stuff. Let me kick it off. I have a few slides today. It's more like I'm going to spend a lot of time, most of my time for like a live demo show today. So my name is Daniel O, and I'm a developer advocate at Red Hat, a specialized cloud network runtime, which is a focus, Spring Boot and JavaScript. And then I'm going to spend a lot of time bringing more Java application into Pacifico use cases, for example, serverless, service mesh, and GitOps, pipeline like Igo City, Tecton, on top of the Kubernetes as well as OpenShift container platform. I'm also a Java champion and a cloud network computing foundation, also known as CNCB Ambassador, which will also give us a lot of opportunity and chances to meet a lot of awesome people, virtually and in person. I'm going to be talking about cloud network architecture and how to redesign your Microsoft application more Kubernetes native way, et cetera. Here is my contact information, Daniel O30 Twitter. You can follow my Twitter. You can just subscribe to the channel. And then here is my Git repo and you can forward and then create the pull request and whatever you want. And then you can steal any kind of opposite demos and tools from my Git repository. Alrighty. So just real quick remind people who sometimes use two terminology interchangeably, like cloud native and Kubernetes native. A lot of people actually use this terminology at the same time or a little bit different time. But let me clarify what the differences between cloud native and Kubernetes native is because my session is pretty much focused more on Kubernetes native Java application. So cloud is literally born in the cloud, like a public cloud provider. We could say hyperscalers or any kind of public cloud provider like Amazon, Google, Microsoft, and Alibaba, and IBM cloud, things like that. Whenever you bring your application, like deploy your application, regardless of Java, download Python, and they're running on cloud, and then you try to consume egressing cloud services, for example, database and the messaging server or some SMS server or email server, something like that, rather than stand up your own, your own prem machines. And then, so some of your non-functional capability, like a service discovery or load balancing, you don't need to implement that the application, for example, like a 12-factor characteristics, you don't need to do that because the cloud provider actually serve that capability as part of the SaaS services. So if you design your application and also functionally to use underpin the cloud technology as many as possible, you could say my application pretty much more like cloud native. What about the Kubernetes native? It's a Kubernetes also cloud, however, you need to use container technology and container orchestration tool, which is Kubernetes and the container runtime like OCI or previously like a more traditional way with Docker. If you joined the previous session, like Apartment, it's all the container tools. So you can actually deploy your application without containers, just like a deploy to application with an artifact like a job file or just JavaScript on the virtual machine, or you could say it's easy to instance rather than packaging container. However, why you need to think about container, which is more given some portability and also immutability and a more high-scalable, pretty much easier to stand up hybrid and multi-cloud architecture and strategies. So cloud is not hard, the Kubernetes is not hard requirement on cloud. However, Kubernetes native is more like a cloud, it's more like a small set of cloud. However, so a lot of companies already move forward to cloud with Kubernetes environment, for example, OpenShift is one of the enterprise-grade application platform based on Kubernetes. So as long as you want to deploy your application Kubernetes platform, you also consider about new design architecture, how to make my application more Kubernetes native style. So there is some kind of journey for specifically developer, how to make my application from zero, which is just normal Microsoft application to Kubernetes native application. Once you arrive with that destination, you can say I'm a superhero of the Kubernetes Java application development. So here's for example, what kind of capability Kubernetes actually provide for developer for specifically inner loop and outer loop processes. So you need to sometimes externalize your configuration from like an external server, for example, Spring Confuse Server or some external metadata databases, rather than store that specific data into your application project, for example, application property or YAML file, which is not a good way specifically Kubernetes environment because your application is going to be packaging as a container and scale out in based on incoming network trapping or resources utilization. You should make it always not tie in some specific configuration file or more like dynamically and flexibly attach and detach some of the configuration rather than store with some static code inside of your applications. Also, you need to also store some sensitive information such as password or session key, something like that, which is also need to store out of your application. So Kubernetes actually provided that feature through ConfigureMed or Secret also provided some of the feature services discovery, service resiliency, and order scaling and the data bunch of stuff previously traditionally developer actually take care of that, develop and implement that non-functional capability inside the application. So you can just delegate that burden to Kubernetes platform and then make your applications more smaller, lighter, and then just focus more on application development, like a business requirement, the realization rather than adding more like a platform features into your application based on Kubernetes features, which is making your application more Kubernetes native with Java stuff. So that's it. I don't want to just give some quick introduction what is the goal of this session and let me just start from scratch to develop new Microsoft's application like a based on Java technology with Quarkus. So stop my sharing, I mean my slide deck. There are several ways to start Quarkus application development. If you have any experience with Quarkus development, with the hands-on experience before, you probably familiar with the Quarkus.io, it's a public web page. You can find the starting coding, it's a project generator, you can actually change whatever you want, group ID and artifact ID and a build to, maybe gradle or gradle with Kotlin. And also you can choose like a Java 11, 17, 21, please don't tell me you're still using Java 8. So we don't support Java 8. So 11, 17, 21, and then you can generate like a sample application like a hello world, and then you can specify your application artifacted project. More importantly, you can actually choose to some other project capability to implement your application. For example, like a web application or a data transaction using like some database, relation database, post-SQL, like a MySQL database, or even non-SQL database like Amazon DynamoDB or MongoDB or some any other like a non-SQL database. There are many hyperscalar integration, Amazon, Google, Microsoft, and then like a messaging capability. There are more than 650 extension Quarkus station now available, you can actually pull it down and then pushy integrate your application just like a maybe dependencies or gradle modules. So you can also using some of the Maven command line or Quarkus CLI to generate your project and maintain your ongoing project. So let me try to use Quarkus CLI today, which give me more benefit because I don't need to remember or memorize all Maven or gradle parameter. It's pretty much easier to add a new extension or remove them as well as a build application, deploy application. Pretty much a shorter command line and it give me some auto completion capability as well at the same time. So let me try to do Quarkus project, let's say Quarkus project name Kubernetes with Java. It automatically generate a bunch of the file, for example, computation property and then Docker file in case you're not packaging application and deploy to Kubernetes as a part of your algorithm process and then Maven wrapper. So just say imagine that many developers actually take care of multiple projects at the same time. So this project actually using Java 11 and that project using Java 17, which means you have some different version of a Maven tool to build and packaging application. So you want to switch it back to back is a really not easy way to manage multiple projects at the same time. So that's Quarkus actually generate Maven wrapper, which you don't need to change in Maven version whenever you change a project. You just run Maven wrapper to build application and packaging application. But in my demo, I just focused on one Java project. So I don't need to maybe use the Maven wrapper. And then here's some rest easy reactive core to start example as well. Let me try to quit my Java version here. I'm using Java 21 open JDK. And then so when I go to change a new directory, and you can see that new Maven project automatically generated by default, you can actually change it to Gradle or Gradle with a company. Let me bring up using my ID tool. Let me try to make it bigger for you. And then go to search directory. And then one separate application just like a hello world. So endpoint for RESTful API hello and the return hello from message reactive. So just for your information, Quarkus actually builds on reactive Angie, which is your birthday and netty. So you could actually implement reactive and non-reactive application at the same time, which was the same class. And then you can just define, okay, this is a non-reactive method. And this is a method of the truly reactive programming, which is really cool for developers because if you have any experience with Spring reactive to migrate from Spring application, it's totally messy to rewrite right by line to based on Spring web rocks and Spring integration or sometimes Spring function and Spring cloud, specifically like a Kafka integration, which is a totally non-migrationism model of refactoring while rewriting whole applications. And let me go back to terminal. Let me try to run Quarkus Dev, which he gives some live coding capability. And just first thing, I'm going to run my application for my local to start application. And as you can see, okay, as you can see, I'm running on Java, JVM, and then 21. So the REST version 362. And then you can see that their profile activated and the live coding activated. So when I go to press W here, it's just going to welcome page. And now you can see that some of the visual UI and endpoint when I click on that, it's a really, really hello from message reactive. When I go to Dev UI, there are a bunch of the capability you can find. So what I'm going to try to explain this kind of like a Dev UI or live coding stuff, maybe you think about that, oh, this is not related to Kubernetes network application. Because I'm expecting more how to make an application integrate Kubernetes capability, just like a normal application development. But what I want to try to say here, just imagine that. So traditionally, you only focus on inner loop for your daily job. You need to write in code and the build and the testing application. Once you don't just push the code in the new key to be positive. That's it. And then you don't need to battle for your application production or pre product, which is not your responsibility at a time. However, when your company adopt Kubernetes, you need to also battle for your application capability, I mean functionality or features with the container environment, even if not production, maybe you can have a small Kubernetes environment like a mini cube or developer sandbox for open container platform. So this is you can say a little bit small, a lot of powerful scope of outer loop. And then how do you spend more time out of the process to develop application capabilities? But your company most likely doesn't give you more time to do that for you. So best of the way you need to make it faster, your whole job in inner loop process. So this whole kind of new feature and then develop a productivity feature allows you make a shorter life cycle from writing code to testing and vehicle your application as a part of the inner loop process. And then once you save your time and have a more spare time after finish your inner loop process, you can spend that spare time for out of the process with the purpose, specifically making your application Kubernetes and every application. Hopefully you understand that why I try to start from scratch and try to showcase just capability. And then you can see that continue testing. So make what is the best way was best practice to make your application more like a more like a high quality. So that's the reason why TDD test-driven development was born. And a lot of enterprise architects really impressed with that practice. However, it's not easy to apply that practice for individual developer because a lot of developers, we're so busy and we don't have enough time to create the test case every single time and then start some of the test tool, check style, what the other stuff. And then if they could have a continue testing capability automatically rather than manually hit the button whenever change the code, which is awesome. So Hork is actually probably continue testing capability. Let me try to start continue testing first. And then it literally just run one use case is like a unit test, which is green means your test is succeeded. So let me go back to my application and go to test case here. Now you can see one test case when you set a quarter test annotation. And then with the test annotation, it's back to invoke less API, hello, and the return hello from message is a week, which is exactly same code, my actual implementation. Let me try to go terminal and put new terminal and try to, let me try to a little bit bigger and try to access endpoint in the terminal and then hello from message reactive. And then let me go back to my application and whatever I change my application, just like imagine that, oh, yeah, I need to change my business logic for like a bug fix or add a new features or some of the testing for performance tuning. So I'm going to change like a welcome to DevNation met 2023. I just save a file and then go back to and just rerun endpoint. And now I can have a welcome to DevNation met 2023. This is really live coding means so in another process, whenever you change the code and verify your application, you need to stop runtime, recompile and review, make a job file and read on the application and verify that a few more steps isn't necessary. It's not because this isn't necessary practices, it's a known practices. However, you just need to just change the file, of course, in an application, it really happens. So course provided the continued testing, the first thing you already save some time without compiling the building and restart your application manually. However, when I go back to runtime environment, I just recognize in the readerly, there are some error. So because of my continued testing, oh, I just expecting hello from less is reactive as a return code. However, you actually turned welcome to DevNation met 2023. I want to be mad, but I just let you know there is something wrong, your test case. So if you couldn't prepare to when you why and then you can also go to continue testing the same result here. So let me try to fix the problem right away as just like a daily job of a normal developer. And then I'm going to welcome to DevNation. Is that a space in there? Oh, okay, let me try to copy just to make sure in like avoid like a typo. Same just a file back to the here. And then now it's good. My test is back to the normal. And then this is really happening wherever you change the code, even add a new functions or add a new test cases. Let me try to give it a try. One year new test gets real good because a lot of people will be doubted. Oh, yeah, you just add a new just change one text code. If you I could add a new method, is it still working for continue testing as your as a live coding? If it is broken, I just need to spend more time like a back to the in a little process as usual, which means I'll have extra time to take care of our little process for making cloud-native job, Kubernetes Java application. So let me try to add a new method, just copy and then change the method name here and the new endpoint, let's say grueling. And then let me try to new and code Kubernetes Java with the purpose and that's it. And then back to the here. Now I have your new test here. You have a new test case and then you got some new error here. For both, there's no resources to map my test cases. So this is exactly I didn't actually edit a new method to map my new test case. So let me try to add one and then try to method the name and then you pass just like I defined in test case. And then the return is a cube native Java with and then I'm not going to type in the same thing. However, I just maybe maybe save some bio for three because let's say we're going to keep changing course version. So let me try to make a more dynamically binding this valuable rather than static code here. And then I'm going to add the config property here. Now not this one. Let me try the config properly and then try to name, which is just like a name. That's it. Let me go try to back to the application. Oh, I'm going to steal an error one more error and it cannot fail because I cannot find some name, the key, the name as a key and there's no value with the name because when I go to application property, I don't actually didn't add the one. If I just reload the purpose that we are, it's really showed the error loss right away. Instantly, which is so helpful for developers to recognize and troubleshoot the error because all I need to add like a purpose here and updated it. And now you got to go to here. It's just a fixed up problem. And I go back to terminal window and then try to involve rest API and then now because Cuban every job with the purpose. And also, and I go to a compilation is show what kind of compilation you can have, not only application or some like the core level, sometimes like a build time engine. And then let me try to find the name here. And then here is the where is the here is the parkers here. Let me try to change your parker three because I'm using parker three right now. And then save a file and back to the terminal and then invoke rest API. And now I got a new return here. What happened? Because when I changed some of the configuration from when you want, it really changed my local file system here, application property. Here's one mistake. I changed my application configuration from when you want, which he automatically updated my local file system. However, it didn't change my test case. When I go back to continue testing, I just say again, there is no parker version three. You can also, if we can also prefer the terminal window, you can find really the same matter here as you prefer. And then let me try to go back to test cases and then change that and then back to the terminal. Now you can stay to test cases passing. You can go to when you want, you also have all green two cases, which is a call. So this is literally some of the fundamental feature for developer productivity. So you can save more time to process, handle your inner process right now. And you can spare, you can use this spare time for our local process. And let me try to stop QuarkX demo. So what about the, but you maybe sometimes care about your ops team as well, like a platform engineer or DevOps engineer, what they say, like an SRA, something like that. They actually, they are not much care about application, like a developer productivity, but much more like a resource utilization. They only care about the scalability and the scalability as well as the resource utilization. So what if you could make your application smaller, as many as as much as possible. So that's QuarkX provider, native compilation and native build make it smaller. And then even if the Java application based on JVM pretty much faster and smaller, rather than any other Java application framework, like Spring Boot. So let me try to build my application using QuarkX CLI. And you can also using maybe like a clean package or maybe clean install, what grid install, something like that. It automatically kicking off the test cases. And then I just build my application. Let me try to, before I run my application under the target directory. And then here's my active monitor. I already have a bunch of the job, a JVM application. So let me try to highlight to distinguish a new JVM when I run my application locally. And try to, like this one, Java jar, and then target directory and app and then runner. When I run your application, you can see that it's sort of time, like, let's stand half a second. You put maybe just maybe second time is a little bit faster, like still about 441 second. Just remember that I'm going to bring that up once again. And then when I go to active monitor and then I can say new JVM, that's a 90 megabyte as a memory footprint. And then let me try to just better buy my application capability in Vocalized Spray PR, my application is totally working. And then memory slider increased from 90 to 93, like a 3.2 megabyte and just increased. So this is more like a JVM stop, but still less than half a second, the start of time. So if I try to build an application with native application, I'm going to skip unit test because I already succeed and I spend my demo time. So with the native compilation, it's pretty much smaller, making it smaller and tiny, not only start up time and memory footprint. Just imagine that whenever you deploy application Kubernetes, and that application can be, should be scaled out, a large number of parts, like not just one, one, like 10 parts market, 100 or 10,000 part could be possible, based on your incoming traffic for the application. And then when you push the container image and the pull down and the scale out, it's all about cost of money on infrastructure, for example, storage as well as a network bandwidth as well. So make it smaller and there's like a small size of container image, which is pretty cool. Save your money on also faster start up time, specifically scalability or event-driven application with some messaging broker or Kafka cluster or serverless application, it avoids some of the challenges of a core to start strategy. So when I go check it up, the target gateway now I can have 46 megabytes size and then one runnable executable native file. Just here, so when I try to build same application with Spring 3.2 with the native Spring native, it's more than 120 megabytes size. So maybe it's almost 2.5 bigger, but maybe you could say, oh, it's still small enough for you. However, just imagine that it's not your local, it's more like a think about the production and then 120 megabytes size times like a 10,000 part or even million part, which is a huge storage you see on your production environment. And then I don't need to Java command run anymore to run this executable file, it's a really executable file. And let me try to target and run it. And now you can see that like a 24 millisecond, if you try to make a second time, it'll be faster like a 15 second. Previously, like a 441 millisecond. So this same application is somewhere like a 25, almost 30 times faster start of time. And then when I go to the activity monitor, now you can see that 10 megabytes, previously 90 is a nine times less than memory footprint as well. If I just check it out, the memory, the new Raspberry PR, same return, my function is still working. And then slides increase like a two or 1.5 megabyte. So just think about that. So if some of the purpose of the Kubernetes deployment, if you're more looking for the high scalability, well, faster start of time, and then native compilation, which is one of the best option for you, because a lot of people companies are moving forward to a .NET goal and a JavaScript to solve these kind of challenges. But now to Java developer, you don't need to learn something new around the JavaScript or GoLang or .NET platform, because your purpose and with the Java provide even better performance, like a start of time, as well as a small memory footprint from now on. So let me try to stop it and then just open you, just go back to my project. So let's say this is a pretty much a hello world. And then what about the more realistic scenario or application capability? For example, most likely application and a project application communicate with the database to store business data, like some using RDBMS, like a port SQL or Oracle database, or some non-SQL data. So let me bring up database capability into my application. To do that, I'm going to need to add some extension, like a JDBC port SQL, I'm going to use a JDBC port SQL, and then like a JPA implementation based on Hibernate Water and Panache. And then I'm going to try to consume and produce some data based on JSON format. This exactly I'm going to use the rest easy reactive projection. So let me try to run my application before that. So I'm just checking my, I mean, actually using part man right now, but I add your part man to Docker, which is more like some familiar with a lot of people. So this is really part man, just add your command line. So I don't have any runtime running container at this moment. And when I try to run cork step again, and the cork is actually always try to figure it out what kind of extension you already have. For example, JDBC port SQL, the cork is really, really realized, okay, you want to try to create some database business logic. Let me check to bring up some quick database like a container. For example, when I go back to another terminal, now you can see post SQL database here. So this is a really, the feature of corks dev services. Let me go back to UI and try to reopen, reload my WUI and then go to dev services and now you can see that. So post SQL automatically create post SQL container automatically start up and a few compilation already set up. But this is not editing my application properly directly. It's like an out of box feature. So we say zero configuration with a dev services based on test containers. So if you have any experience to use test container on Java project for pro, you need to add test container configuration, for example, some of the dependency on your palm XML or Gradle. And also you need to start test container like a Kafka class or some, any other like a post SQL class to initialize your test container on your Java method. However, cork is actually based on test container with zero compilation, which means whether you add relevant extension post SQL or MS SQL server or like some messaging vocal key clock for SSO, you know, there are many extensions, which allows automatically stand up dev services automatically. So if you wanted to override the password, for example, I don't want to use the password, the partner to obvious. And you could just go to here, copy and change whatever you want. So I'm going to leave by default, by the way, so this is really good thing for developer. You don't need to memorize all keys and values to stand up some specific capability, for example, database connection. So I don't remember the JTBC URL keys keyword and then you don't need to remember the focus actually provides that kind of stuff. Okay, so now I'm going to try to add a few Java code here, try to like any like let's say person. And then let me try to add any class here. And then I'm going to extend and then punish any and then I'm going to try to specify some name and then like a city, that's it. So the panache actually, so a lot of people are actually wondering what is a panache? Panache is give some, it's try to augment your hybrid and 1M capability. So whenever you define like a DAO, DTO application or some data, prior to it, you need to implement fundamental operation, for example, getter, setter, and then like a crowd capability, process data, update data, insert data, delete data, things like that. And then our panache and it actually already implement the kind of capability by default. You just need to consume that rather than overriding or overriding that application capability on your application side. So just it, just it, I just finished my, created my new entity. Let me try to add a new method here. For example, I want to try to return not text format like a JSON format, and then like a new endpoint person, and then we see return all person data from database, person here. And then I'm going to try to restore all data. And then like I said, is a person and already defined, predefined fundamental operation. That's it. I just created a new one method. Let me try to skip the test to deliver development using continual testing at this moment, because there's a bunch of stuff I need to showcase the rest of my demo time. And I'm going to give it another one thing, just try to find specific ID rather than whole data. And then it will return one person data here. And then let's say bind by ID, and then I need to pass down parameter, which is like ID. And then try to, here we go. So I just created two methods here. You can also create a new method like a post method by HTTP requests to store new data, or you can actually define a pre-sql data. So like I'm going to try to create the new pre-sql. So when I do the same thing in Springboard, you actually create some SQL file for DDL, like a create a table, and create some schema index or something like that. And the Quarkas actually, there was some automatically create the DDL, which means you don't need to define the DDL statement, just more like insert or some update to statement rather than DDL. It's more like a pretty much DML stuff. So let me try to insert into person table and the values. Let's say my name is Dan. And then I'm actually based on Boston. Okay. And then I try to add two more like a Jenny from New York City. And then let's say Justin from Render. Okay. Just a file. And let me go back to terminal finger crossed and then try to new endpoint person. So now I got to return quality part, try to find the number two, which is a Jenny and then probably go to number one, which is Dan with me. That's it. Well, I just created, I just spent like a five-minute to create a new quality capability. And then with the devil services, save my time to stand up container. I don't need to write a Docker container, Docker file. I don't need to find which container I need to use that. And what is a Docker pull command line? We just pull pass of a container registry. It's all kind of necessary job to use test container or like some traditional container environment. I just save a whole time. As long as you're going to run container runtime on your local machine, which is a part man or a Docker Quarkus automatic startup. And then I'm going to try to now deploy my application as a part of the out of the process to better buy my application still working on Kubernetes environment. So I'm going to try to use redhead developer sandbox, which he give you opposite cluster for free for 30 days. So as long as you sign in, just a quick, you can go to developers at redhead.com and then go to developer sandbox and then go to developer sandbox here. And then you can actually start when this is your first time for you. You could you need to sign in your valid address and then verify your identification like email or text message, something like that. And you're going to give some you're going to have some new Kubernetes cluster for next 30 days, not only Kubernetes cluster, but also which is open shipped by the way. There are many tutorials as well as some learning speeders and the blog posts. And there are many kinds of learning stuff you can actually give a trial with the developer sandbox. And then here's my developer sandbox, my empty project at dash dev. And then go to terminal. Let me just make sure I'm in the right namespace, DOH dev. And then in order to deploy my application, the previously and the traditionally I need to create a container image with some Docker file. As I'll add, I need to Kubernetes and manifest like a YAML file, define the deployment service, as well as where is my container image, how to set up the replication. There are a bunch of students who specify on your manifest file like a YAML file. And then you need to run a cube code to apply that manifest to your targeting Kubernetes cluster. So Quarkus actually provides some nice features to avoid the dead necessarily, but just more like a print your whole property on your application, which you have more from programmatically way to define and then that process. Let me try to add to extension like openshift and Kubernetes config, which allows me integrate Kubernetes configuration as well as a secret just really later. And then I go back to my application here and then open the application properly. I'm going to try to use real Popsicle database to validate my dev spaces. I'm going to try to set up new Popsicle and then let's say the database name and the table name is a person. And I'm going to create to drop and create to strategy, validate, update because this is your first time. And then this is not the environment of production environment. And then I'm going to try to delete that prefix right now. And then loads script while here, which is import SQL. This is all Popsicle computation. Let me try to bring on Kubernetes configuration to deploy this application, including real application containerized application and pushy and pull and then some involved with some of the Kubernetes API as well. So Kubernetes and deployment, I'm going to make it true. And then what is the target, which is open ship, you connect say Kubernetes or Knet, which you make an application, serverless application. And then I'm going to expose the route URL, URL true, which automatically generate like a full, fully qualified domain name like EpicDUN based on a push of the HA proxy, the similar concept of NGINX ingress controller in a vanilla Kubernetes. And then one more thing is client and sorry, PK trust. So let me try to just compile and then build just to hit, hit the command line and then back to the here try to explain the last configuration. So up to the developer sandbox actually use self-assertive key for like a TLS termination like HTTP as protocol. So with that, I'm going to try to, I'm going to trust this self-assertive key rather than commercial one. So this configuration allows me to use and trust the self-assertive key file on up to the developer sandbox. And then when you go back to terminal and they're just looking at the runtime logs. So first time, we're going to build application like a job file here. And then we're going to create a new container image based on image stream using open jdk21. And then containerize application and then starting up with the processor, which he just create container image and then push that image into container registry inside of the cluster. And then when I go back to home in the window, oh, I just forgot that I don't have any database here. So this application will be failed. So let me try to add a new database in the meantime, go back to post SQL and then name is pursue. And then username user and password is super secret, which I define here. And then database name is pursue again. And then back to the topology, my course application failed because there's no database to connect. And then let me try to add this label more like a distinct issue, the corpus project, post SQL. Okay, so let me try to quickly my part, maybe just really make sure in the back to the topology view. And then so corpus application starting again. And then it's communicating my post SQL. And then go to view logs. Okay. Person unknown is the person. So did I miss something here? This created a person. Let me try to delete post SQL once again, and then try to create a new database or more time maybe there are some type of in there. Try to person, right? And then user and then my super secret person. Let me try to create a new one. And then add the label. So now it's a pro SQL. And then try to connect to my application. And then here's my personal application, go to view logs. There we go. And then you can see that automatically create a new database on import. And then you now you can see that file, product, there's no library coding because this is a production. Let me go back to topology and then automatically create a route URL. Copy that go back to terminal. And then try to access to first endpoint. Hello, which is welcome to definition map 2023. What about the greeting endpoint? Cube native job with the product three, which is cool. And the one last thing is person. And then which return three data like Daniel, Jenny, and Justin, if you're able to three should be Justin here, which is cool. So now I perfectly better find my application from my local to Kubernetes with just like a couple, like, let's say, like 35 minutes to make it happen. But now I'm not going to say my application Kubernetes Java application, because when I go back to my application, you can see that still some of the computation static, how they could in my application rather than externalization. Also some of the sense information like a user super secret database password still stored in my application rather than externalize it. So there are some opportunities make my application better Kubernetes network Java app with Kubernetes capability, such as the computer map and secret. So that's exactly I tried to add cube config extension in advance here, cube compute extension, which allows me to connect to Kubernetes resources directly from my application to that resources. Let me go back to application property. I'm going to enable that Kubernetes complements secret. So Kubernetes complements map here. Oh, not this one actually. Okay, let me try to create the Kubernetes complements first. Let me try to queue Kato. You can use the queue Kato. Here's the username, user and the super secret. When I go back to the developer sandbox and UI, you can see here, I just created a secret, a DB credential name, and then we build a value. And you can see username key and a value of user and a key password and a value super secret. Exactly same on my static code, my application. You can also create a compute map. Let me try to create a new compute map. And then let's say a name, my config, and then like a data, my config name with the corkers 6.2, 3.6.2. This is a race one. I just save a file, and you can see that the key, my config name and the value corkers is 3.6.2. Let me go back to here, and then I'm going to try to add a new Kubernetes config map. So I'm going to make a enable. And then this is a, the config map is a my config. And then also I'm going to secret DB credential. And then I'm going to enable this feature as well. So let me try to rebuild and compile and redeploy application, which is one single command line corker CLI. So literally you can actually using a predefined.co file in case you want to want. And then when I go to target directory, previously it automatically generate Kubernetes manifestor like YAML and JSON, which is all automatically defined, generated based on your application properties. So that's, you don't need to write a Kubernetes YAML, just like your traditional auto processor, which save your time to take care of, spend more time, make a Kubernetes native Java application. So I'm going to add one more thing is let me try to add really fast. We have running the time package type, which is a mutable. And then live reload, password. This is between remote Kubernetes cluster and my local machine and the live reload and the URL, which is this endpoint URL. And pass here and then corkers of push of the imbar amount and valuable and then corkers, launch demo, which is a truth. So, and then with that, so this is just imagine that sometimes you're going to deploy application Kubernetes and then you've got some adder. You just notify for your DevOps engineer. And then when I try to troubleshoot that adder inside the container, the container is already gone. Due to the, the fantastic Kubernetes feature like a replication has to check, just to get the pop and create the new one. So of course, you probably have some centralized log log distribution and procedure like open telemetry or dynamic trace or SSD. But in order to access their real logs in production model, you may be open the ticket and it takes maybe a couple of hours or even one day or two days. In the meantime, you have maybe more than like a 10,000 line of logs. It's not easy to find the right adder logs. As I read, it's maybe too complicated, too hard to solve that problem like a couple of hours later. So if you could have like live coding capability, just like a local machine with the remote Kubernetes cluster to fix the problem right away, that would be awesome. And there'll be actually save you a more time and a pretty more Apple into making your application Kubernetes Java apps. So the container is a really like a immutable image. However, this compilation make your container like a mutable because we're going to connect from local to remote cluster. And then whatever you change is called it automatically change it and sending to remote container part. That's why we make a mutable jar. And then for the security, this is a password between my local percussion runtime. And then remote container part is a targeting URL and just running demo here. And I also based on a secret, let me try to change this, just delete hardcore and then change it to provider. So key was username. And then password also key is a password. And then go back to my application. And then my computer map key is my computer name. So I just changed it's all referring to Kubernetes secret to get database credential and then get some of the compilation, not from my local, it's from Kubernetes complement. So let me try to, this should be the last build. And then once it just deployed the application Kubernetes, it's going to start Quarkus remote to there, which allows me to connect from my local Quarkus runtime to remote to Kubernetes pod directly. That's it. That's what I wanted to say today. And then just to quick summarize. So you normally create a new application for like American services and container application, there are a bunch of steps from writing code and testing build just like in the local process. And also you need to a little bit spend time to a little bit process like a better by application container application and it creates some Kubernetes and manifest like a mobile and then deploy your application to Kubernetes. And in the meantime, you can actually push that container image into some of the container registry like a Docker Hub or a query that IO or your internal container registry. This all kind of like a seven or eight step you already needed to do whenever you change the code or add a new business capability or bug fix or some regression test anytime you need to do that. So it's really hard to find some time to improve your application more Kubernetes enabled Java app, even if you already understand how to do that. So this Quarkus capability gives some make some more spare time to focus more on Kubernetes Java app also increase your developer productivity, not only application development but also testing and then creating some Kubernetes and manifest directly deployed to Kubernetes cluster. Okay, it's a packaging app and the containerized app and then pushing into container registry almost done. And then when I go back to my topology view here and then you can see that our second bill is just working on it right now. And then, oh, we got some matter. Oh, it's just a connection error moves. So sometimes this is happening for some network issue. So let me try to go back to slide the deck just summarize just during the second bill. So I already created some kind of pretty coding demo video for this talk. So I just posted my YouTube channel here is like a Bini URL Daniel TV or like a YouTube handler Daniel 030 if you can actually scan in this QR code on your mobile phone and please subscribe and then just to share your thought around that more than 200 demo videos as well as a technical tutorial. You can also give me just some idea. Hey, Dan, I just wondering how to create like Argo CD like for my deal of practice on Java application and specifically Kubernetes cluster with some ham chart integration and more than happy to create a new tutorial and provide us some of the more valuable content for individual developer but also platform and IT operation team as well. So let me try to go back to terminal and then it takes a little more time. And I think this is my last my session is the last session today. So luckily, there's no other speaker right after me. So hopefully this is going to be work at this moment. Okay. Okay. Be a success. And then back to the window. Excuse me. Okay. So new deploy and then go to view logs. And then caucus is not started. I'm starting right now. And then I'm going to try to run. Cork is the remote to that using maven command line. Now you can see that database connection is so fine because I just created new data. One of the interesting here. You can see that Quark step activity live coding activity even if a production and then just run my local runtime. In the meantime, let me try to call like a person which is make sure I can access database with the credential from Kubernetes secret rather than my local. Now I can ask database. And what about the the other endpoint, which is not caucus race, of course, the risks to from company man. And when I run a remote to that, you can see that connect remote server here. Excuse me. And then go back to application. And let me try to add a new like a data here, like a number four, like here, Mike, like a just so rally from like a redhead tower. And I'm going to try to go to person number four, and then go to runtime caucus automatic detail, which file actually changed that like a impossible and ascending repackaging and sending to remote to Kubernetes cluster. And now you can see that I just got a new turn here, Mike, which is really happening in the remote to Kubernetes cluster, not my local machine. You can actually get all data like a number four here. It's not only SQL, you couldn't actually change anything here. Okay, I just changed my mind. I don't want to report to my computer man anymore. However, my local ball system just for the test and then like looking for the corpus floor here. And then I just save a file. And then let me try to go to gridding again. And then when I go back to remote runtime, and then it really define detected the application properly, also change it, and then bring me to Java class also change that. And then go to here. Now you can see that our purpose for Kubernetes Java rather than corpus three, six, two, something like that. That's it. That's what I will show case today. And then hopefully you enjoyed my session and demo. Feel free, reach out to me if we have any question and then any other, like some, like some technical question around not only corpus, but like a more like a Kubernetes, and then some less, so less information. I'm more than happy to address your question. Thank you so much. And then happy Thursday. And then I'm going to hand over back to Mike. Mike, you on mute. That would help isn't it late in the day. All right. Thanks, Daniel thing for a great session. Well, this wraps up our definition day today. I want to thank everyone for joining us. Hopefully you found some some interesting and informative and educational content along the way. As a reminder, these will be pushed out to the Red Hat developer YouTube channel in a couple of weeks by to allow them to process the videos and get those uploaded. So look for that. You will be receiving an email shortly from, I believe from Hopin or Ring Central that basically a post event survey. We definitely would like you to provide your feedback on the event, how it went, the session, the content, and all that so that we can continue to improve these going forward. So again, thanks for your time and joining us today and look forward to seeing you at the next one. Thanks much. Bye-bye. Bye-bye.