1 00:00:00,000 --> 00:00:06,760 Hi everyone! Thanks for coming. I know it's 1 to 2, so some of you again sacrificed your lunch. 2 00:00:06,760 --> 00:00:15,040 Anyone here who was also at the Rust talk? Wow, you sacrificed two lunch periods for me 5 00:00:16,040 --> 00:00:21,040 I also have to know who was there because I can't repeat the same jokes now, can I? 6 00:00:21,040 --> 00:00:23,040 So hello, welcome to my talk. 7 00:00:23,080 --> 00:00:28,600 I'm going to give a little bit of a talk about how and also why you'd be interested in building 8 00:00:28,600 --> 00:00:31,600 your own cloud service provider from scratch. 9 00:00:31,600 --> 00:00:38,600 No Azure, AWS, GCP, I know we've got all these GDEs, but ignore them for now, we're doing it from scratch. 11 00:00:38,600 --> 00:00:42,600 We do local first, right? Digital sovereignty. 13 00:00:46,600 --> 00:00:48,600 We'll see how it goes. 14 00:00:48,600 --> 00:00:52,600 So yeah, this is me several years ago. 15 00:00:53,160 --> 00:00:55,160 I had short hair, small rack. 16 00:00:55,160 --> 00:00:57,160 Now I have big rack, big servers. 17 00:00:57,160 --> 00:01:05,160 A bit about me, I have a website, I have Mastodon, and GitHub, and some of my 18 00:01:05,160 --> 00:01:08,160 interests include server stuff. 19 00:01:08,160 --> 00:01:10,160 As you can see I have a mini server rack here. 20 00:01:10,160 --> 00:01:14,160 Now I've got a much bigger server rack, it's big enough for me to sleep in. 21 00:01:14,160 --> 00:01:18,160 Much bigger servers as well. 22 00:01:18,720 --> 00:01:22,720 I work in Kubernetes and infrastructure and all that kind of stuff. 23 00:01:22,720 --> 00:01:26,720 And for some reason I decided I'm going to work on Kubernetes at work, 24 00:01:26,720 --> 00:01:30,720 and when I get home, my hobby is going to be Kubernetes on the home lab. 25 00:01:30,720 --> 00:01:33,720 So work at work, work at home. 26 00:01:33,720 --> 00:01:37,720 This talk is influenced a lot by my homelab. 27 00:01:37,720 --> 00:01:43,720 And also by the fact that I'm one of the organizers of Cloud Native Mauritius. 28 00:01:44,280 --> 00:01:48,280 It's a community group, kinda like the MSCC, PyMUG, etc, for cloud native stuff. 30 00:01:50,280 --> 00:01:54,280 Now is there anyone here not familiar with what cloud native means? 31 00:01:56,280 --> 00:01:58,280 Wow, nobody raised their hand. 32 00:01:58,280 --> 00:02:02,280 If you don't raise your hand, I can't answer your question, 33 00:02:02,280 --> 00:02:05,280 and then you go home and you go, Alex, what is cloud native? 34 00:02:05,280 --> 00:02:09,280 And then you're going to make a LinkedIn post and be like "I did not understand cloud native" 36 00:02:09,840 --> 00:02:13,840 This is us. 37 00:02:16,840 --> 00:02:18,840 I mean, you can't even be sure this is us. 38 00:02:18,840 --> 00:02:22,840 I just chose a random pixel somewhere near us here. 39 00:02:22,840 --> 00:02:24,840 And this is a problem. 40 00:02:24,840 --> 00:02:26,840 I mean, we're all Mauritians here. 41 00:02:26,840 --> 00:02:30,840 This is a talk I gave at KubeCon in Amsterdam, and you'd be surprised at how few Europeans 42 00:02:30,840 --> 00:02:32,840 or Americans know where Mauritius is. 44 00:02:31,840 --> 00:02:33,840 So that was important. 45 00:02:33,840 --> 00:02:34,840 It's relevant here as well. 46 00:02:35,840 --> 00:02:37,840 We're all very familiar with our geographical position. 47 00:02:37,400 --> 00:02:41,400 Somewhere in the Indian Ocean, a little speck of dust, 48 00:02:41,400 --> 00:02:45,400 far from big cloud giants in Europe, in America, and so on. 49 00:02:47,400 --> 00:02:51,400 So I'm a bit sad about this. 50 00:02:51,400 --> 00:02:53,400 There was this Reddit post a while back 51 00:02:53,400 --> 00:02:55,400 which compiled all the data centres 52 00:02:55,400 --> 00:02:59,400 from Azure, Amazon, Google, and Facebook, 53 00:02:59,400 --> 00:03:03,400 and the concentration of the data centres around the world. 54 00:03:03,400 --> 00:03:05,400 And look at this. 55 00:03:05,960 --> 00:03:07,960 America, plenty. 56 00:03:07,960 --> 00:03:09,960 Europe, many. 57 00:03:09,960 --> 00:03:11,960 East Asia, you've got many. 58 00:03:11,960 --> 00:03:13,960 Here is Africa. 59 00:03:13,960 --> 00:03:15,960 We've got so little capacity here. 60 00:03:15,960 --> 00:03:17,960 It's a bit sad. 61 00:03:17,960 --> 00:03:21,960 During the panel of digital sovereignty, 62 00:03:21,960 --> 00:03:25,960 I remember hearing the number floating around that 63 00:03:25,960 --> 00:03:33,960 Africa represents 0.6% of data centre capacity in the world by megawatts. 65 00:03:34,520 --> 00:03:36,520 That's so little. 66 00:03:36,520 --> 00:03:38,520 You've got so little compute in the entirety of Africa, 67 00:03:38,520 --> 00:03:40,520 which, I mean, is kind of big, right? 68 00:03:40,520 --> 00:03:44,520 So this made me sad. 69 00:03:46,520 --> 00:03:48,520 We do have local cloud providers. 70 00:03:48,520 --> 00:03:50,520 Don't worry, all slides are light mode now. 71 00:03:50,520 --> 00:03:52,520 We do have a few local CSPs. 72 00:03:52,520 --> 00:03:54,520 We've got Cloud.MU, 73 00:03:54,520 --> 00:03:56,520 which is one we've known for quite a while. 74 00:03:56,520 --> 00:03:58,520 Hodi, I met them yesterday. 75 00:03:58,520 --> 00:04:00,520 I forgot about them for a while. 76 00:04:00,520 --> 00:04:02,520 You have Mauritius Telecom, 77 00:04:03,080 --> 00:04:05,080 which has cloud offerings now, I think. 78 00:04:05,080 --> 00:04:07,080 I'm not sure to what extent it's public. 79 00:04:07,080 --> 00:04:09,080 I've heard the prices are outrageous. 80 00:04:09,080 --> 00:04:11,080 Sorry. 81 00:04:10,080 --> 00:04:12,080 Anyone from MyT here? 82 00:04:12,080 --> 00:04:15,080 The booth is right outside. I don't want to... 84 00:04:17,080 --> 00:04:21,080 But MyT's prices are outrageous. Go harass them later. 86 00:04:21,080 --> 00:04:25,080 Emtel as well, they had plans for cloud. 88 00:04:25,080 --> 00:04:27,080 I haven't heard much about the public side of it. 89 00:04:27,080 --> 00:04:29,080 At least, you know, with Cloud.MU... 90 00:04:29,080 --> 00:04:31,080 Where's my mouse? 91 00:04:33,080 --> 00:04:35,080 There it is. 92 00:04:35,080 --> 00:04:39,080 At least with CloudMU, you have a very public website 93 00:04:39,080 --> 00:04:43,080 You can just go to VPS hosting, virtual servers, 96 00:04:43,080 --> 00:04:45,080 and then you can actually get your stuff here, right? 97 00:04:47,080 --> 00:04:49,080 It's something. 98 00:04:49,080 --> 00:04:51,080 But local cloud service providers 99 00:04:51,080 --> 00:04:53,080 in Mauritius are what I call old school. 100 00:04:53,080 --> 00:04:59,080 When you go to AWS or GCP, or those big tech conglomerates in Europe and America, 103 00:04:59,080 --> 00:05:01,080 they have a lot to offer, and not just compute. 104 00:05:01,640 --> 00:05:03,640 They offer load balancers, 105 00:05:03,640 --> 00:05:05,640 managed databases, manage Kubernetes. 106 00:05:05,640 --> 00:05:07,640 So much stuff. 107 00:05:07,640 --> 00:05:11,640 S3. Do we have S3 in Mauritius? 109 00:05:11,640 --> 00:05:15,640 In Mauritius, we have VPS, basically only. 111 00:05:15,640 --> 00:05:17,640 It's very expensive. 112 00:05:17,640 --> 00:05:19,640 If anyone here has ever tried a hobby project 113 00:05:19,640 --> 00:05:23,640 on cloud.mu or looked at MyT's offerings, it's expensive. 115 00:05:23,640 --> 00:05:25,640 Even accounting for the fact 116 00:05:25,640 --> 00:05:27,640 that hardware around the world 117 00:05:27,640 --> 00:05:29,640 is more expensive nowadays, 118 00:05:29,640 --> 00:05:31,640 it's very, very bad. 119 00:05:31,640 --> 00:05:33,640 So a lot of companies, because of that, 120 00:05:33,640 --> 00:05:35,640 instead of going towards 121 00:05:35,640 --> 00:05:37,640 cloud offerings, they'll 122 00:05:37,640 --> 00:05:41,640 prefer to run Windows VMs on VMware on prem. 124 00:05:41,640 --> 00:05:45,640 And there's many things wrong with that statement. 126 00:05:45,640 --> 00:05:49,640 Local CSPs, at least at the time I was writing this, 128 00:05:49,640 --> 00:05:51,640 I think it's changed since, 129 00:05:51,640 --> 00:05:57,640 they still rely heavily on humans 132 00:05:57,640 --> 00:06:01,640 When I wanted a VPS at CloudMU 134 00:06:01,640 --> 00:06:03,640 I had to 135 00:06:03,640 --> 00:06:05,640 do the payment. It was approved, I think, 136 00:06:05,640 --> 00:06:07,640 manually, and then a guy had to actually 137 00:06:07,640 --> 00:06:09,640 provision the VM. 138 00:06:09,640 --> 00:06:11,640 I don't think it's like that anymore, but... 139 00:06:13,640 --> 00:06:15,640 [audience]: not like that anymore. 140 00:06:15,640 --> 00:06:17,640 It was like that very recently. 141 00:06:17,640 --> 00:06:19,640 But with this kind of small-scale approach 142 00:06:19,640 --> 00:06:22,640 and attitude that we're taking towards infrastructure, it 144 00:06:23,640 --> 00:06:25,640 is never going to compare to hyperscalers 145 00:06:25,640 --> 00:06:28,640 Even compared to Europe we're nothing 147 00:06:28,640 --> 00:06:31,640 And Europe as well, they have OVH and Hetzner 148 00:06:31,640 --> 00:06:35,640 are still nothing compared to AWS and GCP 150 00:06:35,640 --> 00:06:39,640 And yeah, as I mentioned, I do cloud-native stuff, Kubernetes. 152 00:06:39,640 --> 00:06:41,640 Cloud-native takes the backbench, we don't 153 00:06:41,640 --> 00:06:45,640 talk about cloud-native here, we still do Windows VMs, Linux VMs. 155 00:06:45,640 --> 00:06:47,640 That's the offering. 156 00:06:47,640 --> 00:06:49,640 So I wanted to change that. 157 00:06:49,640 --> 00:06:53,640 Another problem is the connectivity. I mean, we've 159 00:06:53,640 --> 00:06:55,640 had problems in the past, haven't we? 160 00:06:55,640 --> 00:06:57,640 We had SAFE which got broken, we had 161 00:06:57,640 --> 00:07:00,640 some on the west side of Africa which got broken. 162 00:07:00,640 --> 00:07:01,640 Another one which got 163 00:07:01,640 --> 00:07:03,640 broken around, what was it, 164 00:07:03,640 --> 00:07:07,640 between Madagascar and somewhere. 166 00:07:07,640 --> 00:07:09,640 It's bad. 167 00:07:09,640 --> 00:07:11,640 And another thing I was doing when I was researching 168 00:07:11,640 --> 00:07:13,640 this whole topic 169 00:07:13,640 --> 00:07:15,640 is that bandwidth is surprisingly expensive. 170 00:07:15,640 --> 00:07:19,640 Everyone here has home internet, right? 172 00:07:19,640 --> 00:07:24,640 At home, it's 200 Mbps download, 30 Mbps upload. 174 00:07:24,640 --> 00:07:29,640 Now, of course, you don't get 200 download, 30 upload to Europe or America. 177 00:07:29,640 --> 00:07:33,640 But just that speed alone, I think it's 179 00:07:33,640 --> 00:07:37,640 2000-ish rupees a month, so let's say 40-ish euros. 181 00:07:37,640 --> 00:07:39,640 I have friends, they were telling me 182 00:07:39,640 --> 00:07:43,640 "Yeah Alex, well I have 8 gigabit internet at home." 184 00:07:43,640 --> 00:07:46,640 8 gigabits! And he pays 80 euros a month. 186 00:07:47,640 --> 00:07:49,640 It's insane just how little 187 00:07:49,640 --> 00:07:51,640 internet capacity we have. 188 00:07:51,640 --> 00:07:53,640 So yeah, Mauritius has the 189 00:07:53,640 --> 00:07:57,640 "SAFE" undersea cable as our main connection 191 00:07:57,640 --> 00:07:59,640 to the rest of the world. 192 00:07:59,640 --> 00:08:04,640 And so, as I mentioned when those cables got damaged, 194 00:08:04,640 --> 00:08:07,640 we had huge latency spikes to Europe. 196 00:08:07,640 --> 00:08:09,640 US was inaccessible. I couldn't watch 197 00:08:09,640 --> 00:08:11,640 YouTube, you couldn't watch Netflix, it was awful. 198 00:08:11,640 --> 00:08:15,640 We had to go outside, look at the sun and touch grass. 200 00:08:15,640 --> 00:08:17,640 But, yeah, 201 00:08:17,640 --> 00:08:19,640 Sorry? 202 00:08:19,640 --> 00:08:21,640 Oh, 203 00:08:21,640 --> 00:08:23,640 [audience member touches ground] carpet, doesn't count 205 00:08:25,640 --> 00:08:29,640 And yeah, I wanted to have symmetric 1 gigabit, just symmetric! 207 00:08:29,640 --> 00:08:31,640 And you don't have that offering on home plans. 208 00:08:31,640 --> 00:08:35,640 You've got to go with business plans and that costs a fortune. 210 00:08:35,640 --> 00:08:40,640 Okay, so why am I complaining? I do a lot of complaining these days. 212 00:08:40,640 --> 00:08:43,640 I complain in my last talk, I'm complaining again 214 00:08:43,640 --> 00:08:45,640 I'm complaining because a lack of local infrastructure means that we 215 00:08:45,640 --> 00:08:49,640 depend a lot on foreign systems and companies 217 00:08:49,640 --> 00:08:51,640 [someone walks in] Hello, there's plenty of space in front for you. 218 00:08:53,640 --> 00:08:57,640 [he's dressed very well] Sorry, you look like someone important, do you work for MyT by any chance? 220 00:08:57,640 --> 00:08:59,640 Guy From MyT: Yes! [audience laughs] 221 00:09:01,640 --> 00:09:05,640 Nobody tell him what we were talking about before he arrived 223 00:09:05,640 --> 00:09:07,640 Pleasure to have you. 224 00:09:07,640 --> 00:09:09,640 Sorry, I like to engage 225 00:09:09,640 --> 00:09:12,640 with the audience, hopefully you'll find me funny 227 00:09:12,640 --> 00:09:15,640 Alright, so! A lack of local infrastructure means high 228 00:09:15,640 --> 00:09:19,640 dependency on foreign systems and companies 230 00:09:19,640 --> 00:09:21,640 Yeah, I don't even have to elaborate, we're all familiar with this. 231 00:09:21,640 --> 00:09:25,640 Push to cloud, a lot of companies and even the government, possibly, 233 00:09:25,640 --> 00:09:29,640 went with things like AWS, GCP, which 235 00:09:29,640 --> 00:09:31,640 if we go back a few slides, 236 00:09:31,640 --> 00:09:33,640 all the way here in South Africa. 237 00:09:33,640 --> 00:09:35,640 And then we've got an undersea cable 238 00:09:35,640 --> 00:09:39,640 joining us right now, so... problem 240 00:09:39,640 --> 00:09:41,640 Owning our data and our infrastructure 241 00:09:41,640 --> 00:09:45,640 is very important nowadays, given geopolitical tensions. 243 00:09:45,640 --> 00:09:47,640 I mean, there's certain presidents 244 00:09:47,640 --> 00:09:51,640 somewhere around the world who are crazy. 246 00:09:51,640 --> 00:09:53,640 And that causes problems for us, because 247 00:09:53,640 --> 00:09:55,640 one day they'll be like: 248 00:09:55,640 --> 00:09:57,640 "Oh, I want Diego Garcia, I'm going to put tariffs, 249 00:09:57,640 --> 00:09:59,640 I'm going to cut off internet, I'm going to do 250 00:09:59,640 --> 00:10:01,640 this, I'm going to do that. 251 00:10:01,640 --> 00:10:03,640 And that was the 252 00:10:03,640 --> 00:10:05,640 case for the ICC, 253 00:10:05,640 --> 00:10:07,640 where they lost access to 254 00:10:07,640 --> 00:10:11,640 their mails to Microsoft 365, and plenty of stuff. 255 00:10:11,640 --> 00:10:13,640 All because the government was like, "we don't like what you're doing". 257 00:10:13,640 --> 00:10:17,640 And at the same time, by outsourcing all of our infrastructure 259 00:10:17,640 --> 00:10:21,640 to, you know, Google Cloud/AWS, we are handicapping 261 00:10:21,640 --> 00:10:23,640 both local companies and local talent. 262 00:10:23,640 --> 00:10:25,640 And we've got a lot of cool 263 00:10:25,640 --> 00:10:31,640 people here, I mean DevCon's shown you, we've got many cool people in tech. 265 00:10:31,640 --> 00:10:33,640 We should make the most of it, right? 266 00:10:33,640 --> 00:10:37,640 Okay, so a quick detour on sovereign infrastructure. 268 00:10:37,640 --> 00:10:43,640 NextCloud is not a replacement for Google Drive or Microsoft Drive. 271 00:10:43,640 --> 00:10:47,640 OVH and Hetzner, which are European offerings, 273 00:10:47,640 --> 00:10:51,640 they are not even full replacements for the American hyperscalers. 275 00:10:51,640 --> 00:10:55,640 Now, what is a full replacement, a good comparison, is Airbus against Boeing. 277 00:10:55,640 --> 00:11:03,640 Both produce planes, commercial, and Airbus, which is the EU version 281 00:11:03,640 --> 00:11:05,640 appeared much later. It wasn't easy 282 00:11:05,640 --> 00:11:07,640 at all for Airbus to become 283 00:11:07,640 --> 00:11:09,640 a thing, and even nowadays both companies 284 00:11:09,640 --> 00:11:13,640 are having their share of challenges. 286 00:11:13,640 --> 00:11:15,640 What I mean is, Airbus and Boeing have what I would 287 00:11:15,640 --> 00:11:17,640 call feature parity. They both offer the same thing. 289 00:11:19,640 --> 00:11:21,640 Us in tech, we like to compromise 290 00:11:21,640 --> 00:11:23,640 to compromise. We'll say, 291 00:11:23,640 --> 00:11:26,640 We'll say "well, you can't do that, 292 00:11:26,640 --> 00:11:29,640 but it doesn't matter, you can do this other thing instead". 294 00:11:29,640 --> 00:11:31,640 But I want to do *that*. 295 00:11:31,640 --> 00:11:37,640 If I can't get a plane with so many seats from Airbus 298 00:11:37,640 --> 00:11:39,640 Then Airbus is not the same as Boeing. 299 00:11:39,640 --> 00:11:43,640 So replacement is only possible when all the demands, even the 301 00:11:43,640 --> 00:11:45,640 niche ones, are met. I was 302 00:11:45,640 --> 00:11:49,640 talking the other day, there's Microsoft Office 304 00:11:49,640 --> 00:11:51,640 People say, "just use Libreoffice. It's the same thing, isn't it?" 305 00:11:51,640 --> 00:11:55,640 Except we've got decades of technical debt, things like 307 00:11:55,640 --> 00:11:57,640 HR payrolls, which are still working on 308 00:11:57,640 --> 00:12:01,640 mail merge, made for Microsoft Word 2000. 310 00:12:01,640 --> 00:12:07,640 I'm not that old to know those technologies, so, you know, just take my word for it. 313 00:12:07,640 --> 00:12:11,640 Back in 2024, I gave a workshop at Devcon. 315 00:12:11,640 --> 00:12:13,640 It was in Port Louis, not here. 317 00:12:13,640 --> 00:12:18,640 It was for Kubernetes, because I like doing Kubernetes, I want to 318 00:12:18,640 --> 00:12:21,640 teach more people about cloud-native technologies. 319 00:12:21,640 --> 00:12:23,640 So I ran that workshop on Kubernetes, and, 321 00:12:23,640 --> 00:12:25,640 attendees participated on many things, 322 00:12:25,640 --> 00:12:27,640 laptops, tablets, and phones, 323 00:12:27,640 --> 00:12:29,640 which means you had a cocktail 324 00:12:29,640 --> 00:12:31,640 of operating systems, Windows, 325 00:12:31,640 --> 00:12:35,640 macOS, Linux, Android, iOS, Apple's tablet... 327 00:12:35,640 --> 00:12:37,640 You get the gist. 328 00:12:37,640 --> 00:12:39,640 So many different flavors, 329 00:12:39,640 --> 00:12:41,640 and even within Linux, you've got 330 00:12:41,640 --> 00:12:43,640 Arch, you've got Ubuntu, you've got 331 00:12:43,640 --> 00:12:47,640 Gentoo, so many choices, right? 333 00:12:47,640 --> 00:12:49,640 And workshops, they need consistent 334 00:12:49,640 --> 00:12:51,640 environments, because I can't have all of you 335 00:12:51,640 --> 00:12:53,640 come to a workshop someday, with your 336 00:12:53,640 --> 00:12:55,640 laptops, and we're going to spend an hour debugging. 337 00:12:55,640 --> 00:12:57,640 Why is it working on his laptop, 338 00:12:57,640 --> 00:12:59,640 but not his? Is the firewall a problem? 339 00:12:59,640 --> 00:13:01,640 You use UFW, you use 340 00:13:01,640 --> 00:13:03,640 firewalld, the commands are going to be different. 341 00:13:03,640 --> 00:13:05,640 So at the end of the day, I said, well, 342 00:13:05,640 --> 00:13:09,640 the cloud was needed, but at what cost? 344 00:13:09,640 --> 00:13:11,640 I wanted to have a look at running 345 00:13:11,640 --> 00:13:13,640 a cloud. 346 00:13:13,640 --> 00:13:17,640 Well, here are my options, okay? 348 00:13:17,640 --> 00:13:19,640 Proxmox, it's an easy 349 00:13:19,640 --> 00:13:21,640 and very free way to run VMs. 350 00:13:21,640 --> 00:13:23,640 You've got the option of cloud VMs, 351 00:13:23,640 --> 00:13:25,640 which, I mean, they're VMs, 352 00:13:25,640 --> 00:13:27,640 so they're kind of expensive. At the time, 353 00:13:27,640 --> 00:13:29,640 there was cloud.mu. 354 00:13:29,640 --> 00:13:31,640 Another one was a shared 355 00:13:31,640 --> 00:13:33,640 Kubernetes cluster, so everyone 356 00:13:33,640 --> 00:13:35,640 who was attending would 357 00:13:35,640 --> 00:13:37,640 maybe have their own namespace with their own service 358 00:13:37,640 --> 00:13:39,640 account, and you'd have 359 00:13:39,640 --> 00:13:41,640 role based access control to split them 360 00:13:41,640 --> 00:13:43,640 apart, so I can't delete 361 00:13:43,640 --> 00:13:45,640 someone else's workload, for example. 362 00:13:45,640 --> 00:13:49,640 And that year I had been at Kubecon in France, 364 00:13:49,640 --> 00:13:51,640 and the another of people, they gave 365 00:13:51,640 --> 00:13:53,640 a workshop on their platform 366 00:13:53,640 --> 00:13:55,640 called HobbyFarm, which gave me a lot of 367 00:13:55,640 --> 00:13:57,640 inspiration for this project. 368 00:13:57,640 --> 00:13:59,640 It was an entire lab platform, 369 00:13:59,640 --> 00:14:01,640 free and open source, 370 00:14:01,640 --> 00:14:03,640 self-hostable, 371 00:14:03,640 --> 00:14:05,640 but the only downside is, even though it's 372 00:14:05,640 --> 00:14:07,640 self-hostable, it still relied on stuff like 373 00:14:07,640 --> 00:14:09,640 AWS or DigitalOcean, 374 00:14:09,640 --> 00:14:11,640 which means it's not free. 375 00:14:11,640 --> 00:14:13,640 And for the workshop, 376 00:14:13,640 --> 00:14:15,640 there were like 50 people, so if I 377 00:14:15,640 --> 00:14:17,640 want to have a Kubernetes cluster 378 00:14:17,640 --> 00:14:19,640 per person, then we're looking at 3 VMs 379 00:14:19,640 --> 00:14:21,640 per person, 150 VMs, 380 00:14:21,640 --> 00:14:23,640 and I don't have any money by the end of it. 381 00:14:25,640 --> 00:14:27,640 So my question at the end of the day was 382 00:14:27,640 --> 00:14:29,640 how do we build a cloud? And finally 383 00:14:29,640 --> 00:14:31,640 we get into the central topic. 384 00:14:31,640 --> 00:14:33,640 So, what is a 385 00:14:33,640 --> 00:14:35,640 cloud? Well, cloud 386 00:14:35,640 --> 00:14:37,640 is someone else's computer. 387 00:14:37,640 --> 00:14:39,640 Everyone's heard this, it's a recurring 388 00:14:39,640 --> 00:14:41,640 joke. Let me elaborate 389 00:14:41,640 --> 00:14:43,640 on it a little bit more. You've got isolation, 390 00:14:43,640 --> 00:14:45,640 so the different users 391 00:14:45,640 --> 00:14:47,640 must still stay separate 392 00:14:47,640 --> 00:14:49,640 and unable to interact. I can't see someone 393 00:14:49,640 --> 00:14:51,640 else's database, I can't log in as someone else, 394 00:14:51,640 --> 00:14:53,640 you know, needs to be isolated. 395 00:14:53,640 --> 00:14:55,640 Cloud, so someone else's computer, 396 00:14:55,640 --> 00:14:57,640 someone else's hardware, you don't manage 397 00:14:57,640 --> 00:14:59,640 that hardware in-house yourself. 398 00:14:59,640 --> 00:15:01,640 And then, my 399 00:15:01,640 --> 00:15:03,640 personal thing is, it has to be automated. 400 00:15:03,640 --> 00:15:05,640 Everything must run without 401 00:15:05,640 --> 00:15:07,640 human intervention, so I can be 402 00:15:07,640 --> 00:15:09,640 sick, I can be on holiday, and nothing's going 403 00:15:09,640 --> 00:15:11,640 to break. I'm not gonna get a call and say 404 00:15:11,640 --> 00:15:13,640 yeah, well, I need to provision a new VM. 405 00:15:15,640 --> 00:15:17,640 By cutting the human out of the loop, 406 00:15:17,640 --> 00:15:19,640 I don't need someone like me on standby 407 00:15:19,640 --> 00:15:21,640 24-7, it will 408 00:15:21,640 --> 00:15:23,640 run without human intervention, it will be 409 00:15:23,640 --> 00:15:25,640 easily scaled. 410 00:15:29,640 --> 00:15:31,640 Finally, I've decided I'm going 411 00:15:31,640 --> 00:15:33,640 to make a cloud. I've got 412 00:15:33,640 --> 00:15:35,640 to look now, do I want to do VMs, 413 00:15:35,640 --> 00:15:37,640 like virtual private servers, or 414 00:15:37,640 --> 00:15:39,640 containers? And remember, I'm 415 00:15:39,640 --> 00:15:41,640 approaching this from the perspective of someone who does a lot of 416 00:15:41,640 --> 00:15:43,640 cloud native. I do Kubernetes 417 00:15:43,640 --> 00:15:45,640 every day. So I have 418 00:15:45,640 --> 00:15:47,640 an allergy to virtual machines. 419 00:15:47,640 --> 00:15:49,640 They're heavy, you've got stuff like 420 00:15:49,640 --> 00:15:51,640 hardware emulation, 421 00:15:51,640 --> 00:15:53,640 each VM has its own 422 00:15:53,640 --> 00:15:55,640 kernel, has its own OS, it's a waste 423 00:15:55,640 --> 00:15:57,640 of space. Anyone here who uses 424 00:15:57,640 --> 00:15:59,640 Windows? 425 00:16:01,640 --> 00:16:03,640 Alright. 426 00:16:03,640 --> 00:16:05,640 Any Windows. 427 00:16:05,640 --> 00:16:07,640 You just open task manager, you see 428 00:16:07,640 --> 00:16:09,640 at idle, it's eating half your RAM, 429 00:16:09,640 --> 00:16:11,640 your CPU's spiking, your battery doesn't 430 00:16:11,640 --> 00:16:13,640 last very long, you're gonna cry. 431 00:16:13,640 --> 00:16:15,640 Stuff like that. 434 00:16:19,640 --> 00:16:21,640 Containers on the other hand, they're small, 435 00:16:21,640 --> 00:16:23,640 they're lightweight, and they scale very fast. 436 00:16:23,640 --> 00:16:25,640 That being said, 437 00:16:25,640 --> 00:16:27,640 VMs having separate kernels 438 00:16:27,640 --> 00:16:29,640 means they're most, yeah. 439 00:16:39,640 --> 00:16:41,640 *audience question about running containers in VMs* 439 00:16:39,640 --> 00:16:41,640 You'll see my logic, my reasoning 440 00:16:41,640 --> 00:16:43,640 in a minute. So yeah, VMs 441 00:16:43,640 --> 00:16:45,640 at the end of the day, they're more secure, 442 00:16:45,640 --> 00:16:47,640 you get better isolation. 443 00:16:47,640 --> 00:16:49,640 Containers, 444 00:16:49,640 --> 00:16:51,640 you can share networking and 445 00:16:51,640 --> 00:16:53,640 storage much more easily 446 00:16:53,640 --> 00:16:55,640 by having many small containers. 447 00:16:55,640 --> 00:16:59,640 The room is very full, I mean it's stressful 449 00:16:59,640 --> 00:17:03,640 audience: You're lucky, the other session is not happening. 451 00:17:03,640 --> 00:17:05,640 Hi everyone, we are Trash Talking 452 00:17:05,640 --> 00:17:07,640 local cloud service providers and building our own. 453 00:17:07,640 --> 00:17:09,640 There's a guy from MyT here, 454 00:17:09,640 --> 00:17:11,640 he scares me. 455 00:17:11,640 --> 00:17:13,640 So yeah, thank you. 456 00:17:13,640 --> 00:17:15,640 There's space in front, 457 00:17:15,640 --> 00:17:17,640 a few more seats. 458 00:17:17,640 --> 00:17:19,640 Containers, you can share networking and storage 459 00:17:19,640 --> 00:17:21,640 much more easily than with VMs. 460 00:17:21,640 --> 00:17:23,640 And containers at the end of the day are cloud native-first. 461 00:17:23,640 --> 00:17:25,640 Your question, ask it 462 00:17:25,640 --> 00:17:27,640 to me at the end. 463 00:17:27,640 --> 00:17:29,640 Now, all of this 464 00:17:29,640 --> 00:17:31,640 is good, I still wanted Kubernetes. 465 00:17:31,640 --> 00:17:33,640 So I discovered this thing 466 00:17:33,640 --> 00:17:35,640 called Virtual Clusters. 467 00:17:35,640 --> 00:17:37,640 Maybe you're familiar with Kubernetes 468 00:17:37,640 --> 00:17:39,640 in Docker; "KinD". 469 00:17:39,640 --> 00:17:41,640 You might be running microk8s or something 470 00:17:41,640 --> 00:17:43,640 locally on your laptop, dev 471 00:17:43,640 --> 00:17:45,640 environments and stuff, it's really cool. 472 00:17:45,640 --> 00:17:47,640 Perfect for testing, 473 00:17:47,640 --> 00:17:49,640 but again, I don't want people to install things 474 00:17:49,640 --> 00:17:51,640 on their laptops. That's not the cloud. 475 00:17:51,640 --> 00:17:53,640 Virtual Clusters on the other hand, 476 00:17:53,640 --> 00:17:55,640 they can be deployed to an existing Kubernetes 477 00:17:55,640 --> 00:17:59,640 cluster, and you have Kubernetes in Kubernetes 479 00:17:59,640 --> 00:18:01,640 At the time of me writing this, there are two main options, 480 00:18:01,640 --> 00:18:03,640 there's VCluster, 481 00:18:03,640 --> 00:18:05,640 Virtual Cluster, from a company called Loftlabs, 482 00:18:05,640 --> 00:18:07,640 another one called K3K from 483 00:18:07,640 --> 00:18:09,640 the Rancher and Suse People. 484 00:18:09,640 --> 00:18:11,640 I'm already a fan of the Rancher and Suse people 485 00:18:11,640 --> 00:18:13,640 because I run K3S at home, 486 00:18:13,640 --> 00:18:15,640 there's rke2, there's a lot of 487 00:18:15,640 --> 00:18:17,640 nice things in that ecosystem. 488 00:18:17,640 --> 00:18:19,640 So, yeah. 489 00:18:19,640 --> 00:18:21,640 Let's have a quick talk about K3K and 490 00:18:21,640 --> 00:18:23,640 vCluster. 491 00:18:23,640 --> 00:18:25,640 There's space in front, in the middle. 492 00:18:25,640 --> 00:18:27,640 You provision Virtual 493 00:18:27,640 --> 00:18:29,640 Clusters on a host. 494 00:18:29,640 --> 00:18:31,640 These Virtual Clusters are going to live in their own 495 00:18:31,640 --> 00:18:33,640 pods containers for the 496 00:18:33,640 --> 00:18:35,640 un-initiated. 497 00:18:37,640 --> 00:18:39,640 Since you escaped from the other talk, 498 00:18:39,640 --> 00:18:41,640 anyone here who does not know 499 00:18:41,640 --> 00:18:43,640 Kubernetes or Cloud Native... 500 00:18:43,640 --> 00:18:45,640 Oh, come on. 501 00:18:45,640 --> 00:18:47,640 You can raise your hand. I'm not going to judge. 502 00:18:47,640 --> 00:18:49,640 Okay, a few 503 00:18:49,640 --> 00:18:51,640 raised hands. Kubernetes is 504 00:18:51,640 --> 00:18:53,640 a framework for running distributed 505 00:18:53,640 --> 00:18:55,640 compute. You can have many servers, 506 00:18:55,640 --> 00:18:57,640 physical servers, which are clustered together. 507 00:18:57,640 --> 00:18:59,640 By clustering them together, 508 00:18:59,640 --> 00:19:01,640 you can just say, I want to run 509 00:19:01,640 --> 00:19:03,640 maybe Nginx. I want to run 510 00:19:03,640 --> 00:19:05,640 my website. And it will just throw 511 00:19:05,640 --> 00:19:07,640 that workload onto your physical 512 00:19:07,640 --> 00:19:09,640 servers. You can have as many 513 00:19:09,640 --> 00:19:11,640 physical servers as you want, which 514 00:19:11,640 --> 00:19:13,640 means that if I were to unplug one of them, 515 00:19:13,640 --> 00:19:15,640 your server is still going to stay 516 00:19:15,640 --> 00:19:17,640 working. And Cloud Native 517 00:19:17,640 --> 00:19:19,640 is... 518 00:19:23,640 --> 00:19:25,640 I'll just show the landscape. 519 00:19:25,640 --> 00:19:27,640 So, the CNCF is 520 00:19:27,640 --> 00:19:29,640 a branch of the Linux Foundation. 521 00:19:29,640 --> 00:19:31,640 CNCF stands for Cloud Native Computing Foundation. 522 00:19:31,640 --> 00:19:35,640 They are the branch which does a lot of 524 00:19:35,640 --> 00:19:37,640 Cloud Native stuff. But what does 525 00:19:37,640 --> 00:19:39,640 Cloud Native mean? It's everything 526 00:19:39,640 --> 00:19:41,640 built Cloud-first. 527 00:19:41,640 --> 00:19:43,640 So, the whole 528 00:19:43,640 --> 00:19:45,640 ecosystem kind of revolves around 529 00:19:45,640 --> 00:19:47,640 Kubernetes. Not strictly, but that's the 530 00:19:47,640 --> 00:19:49,640 reality. And you have a bunch 531 00:19:49,640 --> 00:19:51,640 of projects, 532 00:19:51,640 --> 00:19:53,640 which... Let's just filter by CNCF 533 00:19:53,640 --> 00:19:55,640 projects here. All of these 534 00:19:55,640 --> 00:19:57,640 projects are open source stuff. 535 00:19:57,640 --> 00:19:59,640 A lot of it is written in Go, so Go developers 536 00:19:59,640 --> 00:20:01,640 have stuff for you to do. 537 00:20:03,640 --> 00:20:05,640 You've got 538 00:20:05,640 --> 00:20:07,640 applications which are 539 00:20:07,640 --> 00:20:09,640 pre-written for managing basically 540 00:20:09,640 --> 00:20:11,640 everything. If you want to have 541 00:20:11,640 --> 00:20:13,640 massive, I really mean 542 00:20:13,640 --> 00:20:15,640 insanely huge databases, you've got 543 00:20:15,640 --> 00:20:17,640 things like Vitess. I think 544 00:20:17,640 --> 00:20:19,640 YouTube runs off Vitess. 545 00:20:19,640 --> 00:20:21,640 Very big stuff, but very complicated 546 00:20:21,640 --> 00:20:23,640 as well. If you want to do 547 00:20:23,640 --> 00:20:25,640 storage, you've got stuff like Rook 548 00:20:25,640 --> 00:20:27,640 and Ceph, Longhon, 549 00:20:27,640 --> 00:20:29,640 you've got networking stuff. 550 00:20:29,640 --> 00:20:31,640 This is a whole ecosystem, 551 00:20:31,640 --> 00:20:33,640 what you call Cloud Native, which is 552 00:20:33,640 --> 00:20:35,640 a bunch of 553 00:20:35,640 --> 00:20:37,640 free and open source projects which work together. 554 00:20:37,640 --> 00:20:39,640 They do really cool stuff. 555 00:20:39,640 --> 00:20:41,640 From my perspective, I'm an organizer of 556 00:20:41,640 --> 00:20:43,640 Cloud Native Mauritius, it's 557 00:20:43,640 --> 00:20:45,640 the future, at least, if not the present, 558 00:20:45,640 --> 00:20:49,640 of infrastructure and servers 560 00:20:51,640 --> 00:20:53,640 It's been that for 10 years, it's still not the thing in Mauritius. 561 00:20:53,640 --> 00:20:55,640 Anyways, 562 00:20:55,640 --> 00:20:57,640 back on track. 563 00:20:57,640 --> 00:20:59,640 Thank you, whoever raised their 564 00:20:59,640 --> 00:21:01,640 hands, because plenty of people didn't, and I know 565 00:21:01,640 --> 00:21:03,640 they don't know Kubernetes. 566 00:21:03,640 --> 00:21:05,640 Stop being shy, I won't bite you. 567 00:21:05,640 --> 00:21:07,640 I will laugh at you. 568 00:21:07,640 --> 00:21:09,640 Virtual clusters live in pods, 569 00:21:09,640 --> 00:21:11,640 the containers on your host 570 00:21:11,640 --> 00:21:13,640 cluster, and will expose 571 00:21:13,640 --> 00:21:15,640 the API server for people to work 572 00:21:15,640 --> 00:21:17,640 with. You've got the option 573 00:21:17,640 --> 00:21:19,640 to pass through host resources, stuff 574 00:21:19,640 --> 00:21:21,640 like storage class, ingress class, 575 00:21:21,640 --> 00:21:23,640 configmap, secrets... If you're not familiar 576 00:21:23,640 --> 00:21:27,640 with all of this, Kubernetes is a great thing to learn 578 00:21:27,640 --> 00:21:29,640 These are all, you know, like configuration 579 00:21:29,640 --> 00:21:31,640 or other facilities 580 00:21:31,640 --> 00:21:33,640 like when I showed the 581 00:21:33,640 --> 00:21:35,640 landscape of earlier. 582 00:21:35,640 --> 00:21:37,640 Virtual clusters, they are isolated across 583 00:21:37,640 --> 00:21:39,640 different namespaces, so 584 00:21:39,640 --> 00:21:41,640 it helps keep things a bit more secure. There's 585 00:21:41,640 --> 00:21:45,640 a space in front for the newcomers 587 00:21:45,640 --> 00:21:47,640 Okay, so there's some other Cloud Native tech 588 00:21:47,640 --> 00:21:49,640 that I use for my project of 589 00:21:49,640 --> 00:21:51,640 building a Cloud at home. 590 00:21:51,640 --> 00:21:53,640 There's Longhorn, it does 591 00:21:53,640 --> 00:21:55,640 distributed and low resource 592 00:21:55,640 --> 00:21:57,640 intensive storage, 593 00:21:57,640 --> 00:21:59,640 so I can replicate storage across my servers. 594 00:21:59,640 --> 00:22:01,640 At the block level, if I do 595 00:22:01,640 --> 00:22:03,640 a write to a volume on one server, 596 00:22:03,640 --> 00:22:05,640 it will be replicated to another. 597 00:22:05,640 --> 00:22:07,640 And this is great because if that server dies, 598 00:22:07,640 --> 00:22:09,640 your data is safe. 599 00:22:09,640 --> 00:22:11,640 And we had an incident at work recently. 600 00:22:11,640 --> 00:22:13,640 Bad stuff. Data's fine, 601 00:22:13,640 --> 00:22:15,640 but yeah. 602 00:22:15,640 --> 00:22:17,640 You've got Traefik. 603 00:22:17,640 --> 00:22:19,640 You can also think of Nginx. Nginx 604 00:22:19,640 --> 00:22:21,640 Ingress got deprecated recently. 605 00:22:21,640 --> 00:22:23,640 But Traefik is an Ingress class. 606 00:22:23,640 --> 00:22:25,640 It does Gateway API. 607 00:22:25,640 --> 00:22:27,640 And for those of you who may not 608 00:22:27,640 --> 00:22:29,640 be in the Cloud Native world, 609 00:22:29,640 --> 00:22:31,640 it's sort of like a reverse proxy. 610 00:22:31,640 --> 00:22:33,640 I've got Cert Manager. 611 00:22:33,640 --> 00:22:35,640 Cert Manager is a really cool tool 612 00:22:35,640 --> 00:22:37,640 to automatically provision TLS certs, 613 00:22:37,640 --> 00:22:39,640 at least in my case it's from Let's Encrypt. 614 00:22:39,640 --> 00:22:43,640 And finally, the glue which holds everything together, 616 00:22:43,640 --> 00:22:45,640 the foundation of the whole stack, is 617 00:22:45,640 --> 00:22:47,640 K3S, my choice of Kubernetes. 618 00:22:47,640 --> 00:22:49,640 Much like you have 619 00:22:49,640 --> 00:22:51,640 Linux, which exists as Red Hat Linux, 620 00:22:51,640 --> 00:22:53,640 Suse Linux, 621 00:22:53,640 --> 00:22:55,640 Ubuntu, Arch, 622 00:22:55,640 --> 00:22:57,640 etc. You also have flavors 623 00:22:57,640 --> 00:22:59,640 of Kubernetes. So I chose 624 00:22:59,640 --> 00:23:01,640 K3S. It's nice and lightweight. 625 00:23:01,640 --> 00:23:03,640 Okay. 626 00:23:03,640 --> 00:23:05,640 Getting a bit closer 627 00:23:05,640 --> 00:23:07,640 to my actual project. So my actual 628 00:23:07,640 --> 00:23:09,640 project is called KRaft, not the 629 00:23:09,640 --> 00:23:11,640 cheese. I'm not good 630 00:23:11,640 --> 00:23:13,640 at naming. I will take name suggestions 631 00:23:13,640 --> 00:23:15,640 if anyone has any good ones. 632 00:23:15,640 --> 00:23:17,640 KRaft, I named it like this. The K is 633 00:23:17,640 --> 00:23:19,640 for Kubernetes. And 634 00:23:19,640 --> 00:23:21,640 KRaft, as in to craft, 635 00:23:21,640 --> 00:23:23,640 means to build stuff, 636 00:23:23,640 --> 00:23:25,640 to do stuff, and then 637 00:23:25,640 --> 00:23:27,640 yeah. I don't 638 00:23:27,640 --> 00:23:29,640 know. Give me better names, guys. 639 00:23:29,640 --> 00:23:31,640 So it's a 640 00:23:31,640 --> 00:23:33,640 combination of Rust and Static HTML. 641 00:23:33,640 --> 00:23:35,640 I'm not a front-end developer. 642 00:23:35,640 --> 00:23:37,640 There are some front-end developers among us. 643 00:23:37,640 --> 00:23:39,640 They'll say that my website 644 00:23:39,640 --> 00:23:41,640 might look ugly. 645 00:23:41,640 --> 00:23:43,640 But the main magic 646 00:23:43,640 --> 00:23:45,640 is the Rust backend. 647 00:23:45,640 --> 00:23:47,640 I chose Rust because I wanted an excuse to write 648 00:23:47,640 --> 00:23:49,640 in Rust. I like the language and I don't like 649 00:23:49,640 --> 00:23:51,640 GO. That's offensive to some people 650 00:23:51,640 --> 00:23:53,640 as well. Anyways, 651 00:23:53,640 --> 00:23:55,640 triggering everyone in the room. 652 00:23:55,640 --> 00:23:57,640 So the backend, it handles 653 00:23:57,640 --> 00:23:59,640 everything from authentication, cluster 654 00:23:59,640 --> 00:24:01,640 creation, workspaces. I'll get to that 655 00:24:01,640 --> 00:24:03,640 in a minute. It's really cool. And 656 00:24:03,640 --> 00:24:05,640 basically the entire lifecycle of your virtual 657 00:24:05,640 --> 00:24:07,640 clusters. The front-end 658 00:24:07,640 --> 00:24:09,640 itself is a UI for people to 659 00:24:09,640 --> 00:24:11,640 go clicky clicky because I know not everyone lives 660 00:24:11,640 --> 00:24:13,640 in a terminal. You like the website, 661 00:24:13,640 --> 00:24:15,640 you go click, click, click. It works for 662 00:24:15,640 --> 00:24:17,640 you. The Rust side is 663 00:24:17,640 --> 00:24:19,640 built on Actix Web. And this was 664 00:24:19,640 --> 00:24:21,640 built a long time ago when I was still learning 665 00:24:21,640 --> 00:24:23,640 about Rust, so it's not perfect. 666 00:24:23,640 --> 00:24:25,640 Actix Web is 667 00:24:25,640 --> 00:24:27,640 a small framework, a bit like 668 00:24:27,640 --> 00:24:29,640 Flask for those familiar with 669 00:24:29,640 --> 00:24:31,640 Python development. And 670 00:24:31,640 --> 00:24:35,640 it's very bare bones and gives you the 672 00:24:35,640 --> 00:24:37,640 possibility to customize a lot of things. 673 00:24:37,640 --> 00:24:39,640 Because it's so bare bones, I wrote my own 674 00:24:39,640 --> 00:24:41,640 authentication. It's 675 00:24:41,640 --> 00:24:43,640 probably vulnerable. 676 00:24:43,640 --> 00:24:45,640 Please pentest it. PRs welcome. 677 00:24:45,640 --> 00:24:47,640 And lastly, I've got 678 00:24:47,640 --> 00:24:49,640 resource handling. This is not 679 00:24:49,640 --> 00:24:51,640 yet something I've 680 00:24:51,640 --> 00:24:53,640 opened up. I wanted the possibilities 681 00:24:53,640 --> 00:24:55,640 of managing resources, 682 00:24:55,640 --> 00:24:57,640 monitoring cluster use, and 683 00:24:57,640 --> 00:24:59,640 so that I know who is eating all the 684 00:24:59,640 --> 00:25:01,640 RAM on my server because RAM's expensive, guys. 685 00:25:01,640 --> 00:25:03,640 The resource 686 00:25:03,640 --> 00:25:05,640 handling actually what it does is reads the metrics 687 00:25:05,640 --> 00:25:07,640 server and then puts it in a nice 688 00:25:07,640 --> 00:25:09,640 format for the UI. 689 00:25:09,640 --> 00:25:11,640 Okay. 690 00:25:11,640 --> 00:25:13,640 Oh, I was supposed to replace this. 691 00:25:15,640 --> 00:25:17,640 Let's see, let's see, let's see. 692 00:25:21,640 --> 00:25:23,640 Let's see. Does this work? 693 00:25:25,640 --> 00:25:27,640 It works. Great. 694 00:25:29,640 --> 00:25:31,640 So this was the old stuff. 695 00:25:31,640 --> 00:25:33,640 I had separated the authentication, 696 00:25:33,640 --> 00:25:35,640 the cluster management, 697 00:25:35,640 --> 00:25:37,640 the resource management. These are all 698 00:25:37,640 --> 00:25:39,640 three separate things. 699 00:25:39,640 --> 00:25:41,640 And you'll notice I did these two in Rust 700 00:25:41,640 --> 00:25:43,640 and then I went with Python and Flask 701 00:25:43,640 --> 00:25:45,640 for the last one because I got lazy. 702 00:25:45,640 --> 00:25:47,640 And if you're not in my Rust 703 00:25:47,640 --> 00:25:49,640 talk, I just want to point out, these two do 704 00:25:49,640 --> 00:25:51,640 most of the work. They use 10 megs of RAM. 705 00:25:51,640 --> 00:25:53,640 This one uses 300 megs of RAM. 706 00:25:53,640 --> 00:25:55,640 It makes me sad. So that's why 707 00:25:55,640 --> 00:25:57,640 you'll see between this old 708 00:25:57,640 --> 00:25:59,640 screenshot and now, you'll see 709 00:25:59,640 --> 00:26:01,640 the Python thing's not here anymore. It all got 710 00:26:01,640 --> 00:26:03,640 rewritten into KRaft Core. 711 00:26:03,640 --> 00:26:05,640 12 MB of RAM, guys. 712 00:26:05,640 --> 00:26:07,640 And I'm sure it will 713 00:26:07,640 --> 00:26:09,640 that your Kubernetes cluster will 714 00:26:09,640 --> 00:26:11,640 time out 715 00:26:11,640 --> 00:26:13,640 before my program does. 716 00:26:13,640 --> 00:26:15,640 Okay. 717 00:26:15,640 --> 00:26:17,640 Along the road, I made 718 00:26:17,640 --> 00:26:19,640 this crate. So crate is like a package 719 00:26:19,640 --> 00:26:21,640 called k3k-rs. 720 00:26:21,640 --> 00:26:23,640 In the whole 721 00:26:23,640 --> 00:26:25,640 cloud native landscape, Rust is not 722 00:26:25,640 --> 00:26:27,640 the first choice. Go is. 723 00:26:27,640 --> 00:26:29,640 By that being said, there is this 724 00:26:29,640 --> 00:26:31,640 project called kube-rs. It's 725 00:26:31,640 --> 00:26:33,640 a crate (package) for 726 00:26:33,640 --> 00:26:35,640 interacting with Kubernetes resources directly 727 00:26:35,640 --> 00:26:37,640 from Rust. It's an actually 728 00:26:37,640 --> 00:26:39,640 approved, like CNCF approved thing. 730 00:26:41,640 --> 00:26:43,640 I wanted to re-implement 731 00:26:43,640 --> 00:26:45,640 those k3k CRDs, 732 00:26:45,640 --> 00:26:47,640 so custom resources, 733 00:26:47,640 --> 00:26:49,640 into Rust structs. 734 00:26:49,640 --> 00:26:51,640 So like classes, if you 735 00:26:51,640 --> 00:26:53,640 are from an object-oriented perspective. 736 00:26:53,640 --> 00:26:55,640 So that I would benefit from 737 00:26:55,640 --> 00:26:57,640 type safety and 738 00:26:57,640 --> 00:26:59,640 many other features that Rust provides. 739 00:26:59,640 --> 00:27:01,640 It should have been at my other talk if you wanted to 740 00:27:01,640 --> 00:27:03,640 know more about it. 741 00:27:03,640 --> 00:27:05,640 So k3k-rs, it's 742 00:27:05,640 --> 00:27:07,640 an off-shoot project which re-implements all 743 00:27:07,640 --> 00:27:11,640 the CRDs of the main k3k project 745 00:27:11,640 --> 00:27:13,640 And has plenty of convenience functions to 746 00:27:13,640 --> 00:27:15,640 manage those resources. 747 00:27:15,640 --> 00:27:17,640 I believe I have, yes, 748 00:27:17,640 --> 00:27:19,640 I have. 749 00:27:19,640 --> 00:27:21,640 So this is two lines of code. 750 00:27:21,640 --> 00:27:23,640 Let client, client, 751 00:27:23,640 --> 00:27:25,640 try default.await. 752 00:27:25,640 --> 00:27:27,640 All this does is create a 753 00:27:27,640 --> 00:27:29,640 client to interact with the Kubernetes API. 754 00:27:29,640 --> 00:27:31,640 And then the second one, 755 00:27:31,640 --> 00:27:33,640 let list. It's a 756 00:27:33,640 --> 00:27:35,640 list of clusters. 757 00:27:35,640 --> 00:27:37,640 You just list clusters in 758 00:27:37,640 --> 00:27:39,640 the namespace and you pass the namespace to it. 759 00:27:39,640 --> 00:27:41,640 So in two lines I've reduced 760 00:27:41,640 --> 00:27:43,640 what would be a lot of manual work - 761 00:27:43,640 --> 00:27:45,640 maybe you're re-implementing stuff into 762 00:27:45,640 --> 00:27:47,640 just these two lines. 763 00:27:47,640 --> 00:27:49,640 And I know a lot of you 764 00:27:49,640 --> 00:27:51,640 maybe don't do Rust. It's a bit of a niche language. 765 00:27:51,640 --> 00:27:53,640 That's why I like it, I guess. 766 00:27:53,640 --> 00:27:57,640 This is YAML in Rust 768 00:27:57,640 --> 00:27:59,640 You can probably read most 769 00:27:59,640 --> 00:28:01,640 of this even if you're not a Rust person. 770 00:28:01,640 --> 00:28:03,640 All the way at the top here, 771 00:28:03,640 --> 00:28:05,640 I'm just defining a cluster schema. 772 00:28:05,640 --> 00:28:07,640 And it's a type of 773 00:28:07,640 --> 00:28:09,640 k3krs cluster. It's a cluster type 774 00:28:09,640 --> 00:28:13,640 with some metadata. It's got a name, 776 00:28:13,640 --> 00:28:15,640 test cluster, a namespace which is 777 00:28:15,640 --> 00:28:17,640 k3k namespace. And the rest is just 778 00:28:17,640 --> 00:28:19,640 default. In the spec itself 779 00:28:19,640 --> 00:28:21,640 you just define things, for example you've got 780 00:28:21,640 --> 00:28:23,640 servers. 781 00:28:23,640 --> 00:28:25,640 Servers 1, agent 0. 782 00:28:25,640 --> 00:28:27,640 Commented out because those are defaults, 783 00:28:27,640 --> 00:28:31,640 but your entire YAML file is now just in Rust. 785 00:28:31,640 --> 00:28:33,640 And it will also tell you, for example 786 00:28:33,640 --> 00:28:35,640 if you pass a string instead of an 787 00:28:35,640 --> 00:28:37,640 integer as port it will tell you 788 00:28:37,640 --> 00:28:39,640 and refuse to compile. 789 00:28:39,640 --> 00:28:41,640 So that's some cool stuff. 790 00:28:43,640 --> 00:28:45,640 Now UI people in the audience 791 00:28:45,640 --> 00:28:47,640 behold my ugly creation 792 00:28:47,640 --> 00:28:49,640 while I drink some water. 794 00:28:57,640 --> 00:28:59,640 I'll sound less like Kermit the frog now. 795 00:28:59,640 --> 00:29:01,640 So this is the 796 00:29:01,640 --> 00:29:05,640 UI I made. It's very rudimentary. 798 00:29:05,640 --> 00:29:09,640 You can see that I do infrastructure because it's very functional. 800 00:29:09,640 --> 00:29:11,640 Create a cluster, view clusters, 801 00:29:11,640 --> 00:29:13,640 read me and your account. That's all you need. 802 00:29:13,640 --> 00:29:17,640 Has anyone here used AWS? Have you logged into 804 00:29:17,640 --> 00:29:19,640 the console? Have you seen all the options 805 00:29:19,640 --> 00:29:21,640 and have you nearly cried and said 806 00:29:21,640 --> 00:29:23,640 I want to go work on a farm, I don't want to 807 00:29:23,640 --> 00:29:25,640 do tech anymore. 808 00:29:25,640 --> 00:29:27,640 I went through that as well. 809 00:29:27,640 --> 00:29:29,640 So that's the landing page. 810 00:29:29,640 --> 00:29:31,640 You have an account. 811 00:29:31,640 --> 00:29:33,640 The dummyuser 812 00:29:33,640 --> 00:29:35,640 you've got passwords, you can set 813 00:29:35,640 --> 00:29:37,640 your password, you can delete your account. 814 00:29:37,640 --> 00:29:39,640 What more do you need? 815 00:29:39,640 --> 00:29:41,640 It's GDPR compliant by the way. 816 00:29:41,640 --> 00:29:43,640 You delete this, it deletes everything. 817 00:29:45,640 --> 00:29:47,640 I won't keep anything about you. 818 00:29:47,640 --> 00:29:49,640 Okay, in terms of 819 00:29:49,640 --> 00:29:51,640 creating a cluster. 820 00:29:51,640 --> 00:29:53,640 Ah, funny name. 821 00:29:53,640 --> 00:29:55,640 You just pass the cluster name and then 822 00:29:55,640 --> 00:29:57,640 if you want a custom domain attached 823 00:29:57,640 --> 00:29:59,640 to your cluster, you'll pass up as a TLS-SAN here. 824 00:29:59,640 --> 00:30:03,640 So the certificates will be generated accordingly. 826 00:30:03,640 --> 00:30:05,640 So here I just named the cluster help me 827 00:30:05,640 --> 00:30:07,640 and then you click submit and it's done. 828 00:30:07,640 --> 00:30:09,640 Guys, do you have any idea how complicated 829 00:30:09,640 --> 00:30:11,640 it is to go through like the cloud 830 00:30:11,640 --> 00:30:13,640 providers' consoles and not 831 00:30:13,640 --> 00:30:15,640 shoot yourself in the foot with bad configuration? 832 00:30:15,640 --> 00:30:17,640 Here it's simple. You give a name, 833 00:30:17,640 --> 00:30:19,640 you say submit. It's fine. 834 00:30:19,640 --> 00:30:21,640 So then you 835 00:30:21,640 --> 00:30:23,640 have view clusters. So I've got 836 00:30:23,640 --> 00:30:25,640 a test cluster, I've got one for 837 00:30:25,640 --> 00:30:27,640 cloud native community. It gives you the name, 838 00:30:27,640 --> 00:30:29,640 an endpoint and the kubeconfig for you to 839 00:30:29,640 --> 00:30:31,640 download. For those 840 00:30:31,640 --> 00:30:33,640 not familiar with Kubernetes, the kubeconfig 841 00:30:33,640 --> 00:30:37,640 is a file with certificates and stuff which 843 00:30:37,640 --> 00:30:39,640 is what authenticates you with the server 844 00:30:39,640 --> 00:30:43,640 for you to do things with Kubernetes 846 00:30:43,640 --> 00:30:47,640 Another really cool thing is 848 00:30:47,640 --> 00:30:49,640 you can view the cluster, sure, 849 00:30:49,640 --> 00:30:51,640 and you also have cluster logs. So you can 850 00:30:51,640 --> 00:30:53,640 get logs from your cluster right in your browser. 851 00:30:53,640 --> 00:30:55,640 You can copy it, you can refresh it, 852 00:30:55,640 --> 00:30:57,640 stuff like that. You get all your information. 853 00:30:57,640 --> 00:30:59,640 So example, this is the server logs 854 00:30:59,640 --> 00:31:01,640 you can just see here and if anything 855 00:31:01,640 --> 00:31:03,640 is out of the ordinary. 856 00:31:03,640 --> 00:31:05,640 It's right there. 857 00:31:05,640 --> 00:31:07,640 And workspaces. 858 00:31:07,640 --> 00:31:09,640 This is something I'm really, really proud of. 859 00:31:09,640 --> 00:31:15,640 When I was done with the whole virtual cluster side of things, 861 00:31:15,640 --> 00:31:17,640 I was like, great! 862 00:31:17,640 --> 00:31:19,640 Your cluster will live on the cloud, 863 00:31:19,640 --> 00:31:21,640 ie my servers, 864 00:31:21,640 --> 00:31:23,640 and all you have to do is install kubectl, 865 00:31:23,640 --> 00:31:25,640 the command line tool, 866 00:31:23,640 --> 00:31:27,640 on your own laptop, and done! 868 00:31:28,640 --> 00:31:30,640 That's all you have to do. 869 00:31:30,640 --> 00:31:32,640 You only have to install kubectl. 870 00:31:32,640 --> 00:31:35,640 Then I was like, you still have to install kubectl, 871 00:31:35,640 --> 00:31:37,640 and I don't want people to have to go through that 873 00:31:37,640 --> 00:31:41,640 Because, it is still a platform dependent thing. 875 00:31:41,640 --> 00:31:43,640 You might want autocomplete, you might want 876 00:31:43,640 --> 00:31:45,640 some nicer features. 877 00:31:45,640 --> 00:31:47,640 And then all of that will need more configuration 878 00:31:47,640 --> 00:31:49,640 on your end. So workspaces 879 00:31:49,640 --> 00:31:51,640 is a terminal in your browser 880 00:31:51,640 --> 00:31:55,640 which comes with all the utilities, everything, 882 00:31:55,640 --> 00:31:57,640 all the command line tools that you would like to have. 883 00:31:57,640 --> 00:32:01,640 So you can see here, this is a workspace right here. 885 00:32:01,640 --> 00:32:03,640 It is in the browser. It's running 886 00:32:03,640 --> 00:32:05,640 just bash in the browser basically. There's kubectl 887 00:32:05,640 --> 00:32:07,640 kubecolor, which gives 888 00:32:07,640 --> 00:32:09,640 some nice colors to your stuff. 889 00:32:09,640 --> 00:32:11,640 k9s, for those familiar with Kubernetes, it's a nice 890 00:32:11,640 --> 00:32:13,640 UI to manage your stuff. Of course 891 00:32:13,640 --> 00:32:17,640 you get git, fish, wget, vim, iputils, 893 00:32:17,640 --> 00:32:19,640 stuff for you to debug your 894 00:32:19,640 --> 00:32:21,640 cluster and work with it. 895 00:32:21,640 --> 00:32:23,640 And so other nice things you have, you have alias 896 00:32:23,640 --> 00:32:25,640 k for kubectl 898 00:32:27,640 --> 00:32:29,640 That's a... 899 00:32:29,640 --> 00:32:31,640 It's a necessity. 900 00:32:31,640 --> 00:32:33,640 Because sometimes I'm going to go to a terminal 901 00:32:33,640 --> 00:32:35,640 and type k, it's not found and 902 00:32:35,640 --> 00:32:37,640 I'm annoyed. You also have kubectl 903 00:32:37,640 --> 00:32:41,640 with autocompletion, another nice thing. 905 00:32:41,640 --> 00:32:43,640 And the way I made this workspace is actually kind of neat 906 00:32:43,640 --> 00:32:45,640 because initially I made 907 00:32:45,640 --> 00:32:47,640 a Dockerfile as one does. 908 00:32:47,640 --> 00:32:49,640 And it was just installing 909 00:32:49,640 --> 00:32:51,640 packages. I installed fish, I installed kubectl, 910 00:32:51,640 --> 00:32:53,640 I added the files 911 00:32:53,640 --> 00:32:55,640 or changed some config files. 912 00:32:55,640 --> 00:32:57,640 And I was like, but there's other ways of doing this. 913 00:32:57,640 --> 00:32:59,640 This is actually the first time I 914 00:32:59,640 --> 00:33:01,640 experimented with making 915 00:33:01,640 --> 00:33:03,640 containers with Nix. 916 00:33:03,640 --> 00:33:05,640 Because in Nix, I just had to specify 917 00:33:05,640 --> 00:33:07,640 all the packages I wanted and some of the configuration 918 00:33:07,640 --> 00:33:09,640 and the welcome message 919 00:33:09,640 --> 00:33:11,640 and it just creates the container for me. 920 00:33:11,640 --> 00:33:13,640 I'd send a talk about 921 00:33:13,640 --> 00:33:15,640 nix containers. It's still a bit advanced 922 00:33:15,640 --> 00:33:17,640 for my level, but it works. 923 00:33:17,640 --> 00:33:19,640 And 924 00:33:19,640 --> 00:33:21,640 yeah, so you can run 925 00:33:21,640 --> 00:33:23,640 neofetch. The container itself 926 00:33:23,640 --> 00:33:27,640 is built on Suse containers. 928 00:33:27,640 --> 00:33:29,640 You can see the host, this is my actual host, the kernel. 929 00:33:29,640 --> 00:33:31,640 This is probably vulnerable to 930 00:33:31,640 --> 00:33:33,640 at least 10 of the vulnerabilities discovered 931 00:33:33,640 --> 00:33:35,640 in the last week, right? We've got AI, 932 00:33:35,640 --> 00:33:38,640 everyone's finding vulnerabilities in the kernel these days. 934 00:33:39,640 --> 00:33:41,640 Copyfail definitely would work. 935 00:33:41,640 --> 00:33:43,640 So yeah, you get the packages. 936 00:33:43,640 --> 00:33:45,640 Shell is bash, you also have fish. I'm a fish person. 937 00:33:45,640 --> 00:33:49,640 And, you have some other stats listed. 939 00:33:49,640 --> 00:33:53,640 So that's workspaces for you! 941 00:33:53,640 --> 00:33:55,640 And recently I realized I 942 00:33:55,640 --> 00:33:57,640 was doing all my admin work from the terminal. 943 00:33:57,640 --> 00:33:59,640 I ran a workshop with the Cloud Native 944 00:33:59,640 --> 00:34:01,640 people not that long ago. 945 00:34:01,640 --> 00:34:03,640 And I said, well, 946 00:34:03,640 --> 00:34:05,640 it's not cool because the cleanup - 947 00:34:05,640 --> 00:34:07,640 I've got to do it manually. So instead, 948 00:34:07,640 --> 00:34:09,640 let's have an admin view so you can view 949 00:34:09,640 --> 00:34:11,640 all your users. E-mails obviously 950 00:34:11,640 --> 00:34:13,640 not shown by default. 951 00:34:13,640 --> 00:34:15,640 You have beta codes, 952 00:34:15,640 --> 00:34:17,640 so, I'm giving codes out to 953 00:34:17,640 --> 00:34:19,640 close friends to break my stuff. 954 00:34:19,640 --> 00:34:21,640 They haven't broken much yet. Clifford? 955 00:34:21,640 --> 00:34:23,640 You haven't broken it yet? 957 00:34:25,640 --> 00:34:31,640 Some other beta codes, none of these are enabled anymore. 960 00:34:31,640 --> 00:34:33,640 You can try. 961 00:34:35,640 --> 00:34:37,640 So 962 00:34:37,640 --> 00:34:39,640 I mentioned at the beginning the requirements 963 00:34:39,640 --> 00:34:41,640 for Cloud is to keep everyone isolated, 964 00:34:41,640 --> 00:34:43,640 keep everyone safe. So a major 965 00:34:43,640 --> 00:34:45,640 focus has also been on keeping your 966 00:34:45,640 --> 00:34:47,640 workloads safe. Users, for starters, 967 00:34:47,640 --> 00:34:49,640 will interact only with their virtual APIs, 968 00:34:49,640 --> 00:34:52,640 with isolated ETCD 969 00:34:52,640 --> 00:34:53,640 ETCD being the data store 970 00:34:53,640 --> 00:34:55,640 for Kubernetes, for those unfamiliar. 971 00:34:55,640 --> 00:34:57,640 Which also means that you're 972 00:34:57,640 --> 00:34:59,640 not, you can never 973 00:34:59,640 --> 00:35:01,640 have the same ETCD 974 00:35:01,640 --> 00:35:03,640 data store as someone 975 00:35:03,640 --> 00:35:05,640 else using the platform. 976 00:35:05,640 --> 00:35:07,640 Clusters themselves are separated by 977 00:35:07,640 --> 00:35:09,640 namespace within Kubernetes, 978 00:35:09,640 --> 00:35:11,640 isolated through network policies. So your 979 00:35:13,640 --> 00:35:15,640 workloads can't reach workloads 980 00:35:15,640 --> 00:35:17,640 from other people, nor can they reach other devices 981 00:35:17,640 --> 00:35:19,640 on my home network. 982 00:35:19,640 --> 00:35:21,640 Don't worry Ma, everything's safe. 983 00:35:21,640 --> 00:35:23,640 Secured by pod security 984 00:35:23,640 --> 00:35:25,640 admission level, so you can 985 00:35:25,640 --> 00:35:27,640 have unrestricted 986 00:35:27,640 --> 00:35:29,640 baseline restricted. 987 00:35:29,640 --> 00:35:31,640 And then each cluster has its own core DNS. 988 00:35:31,640 --> 00:35:37,640 So another cool separation thing. 991 00:35:37,640 --> 00:35:39,640 Virtual cluster policies is another 992 00:35:39,640 --> 00:35:41,640 thing. And don't worry, I'm nearly done with 993 00:35:41,640 --> 00:35:43,640 technical stuff. They give me a lot more 994 00:35:43,640 --> 00:35:45,640 control over these K3K clusters and 995 00:35:45,640 --> 00:35:47,640 resources by letting me implement resource 996 00:35:47,640 --> 00:35:49,640 quotas, so nobody's going to eat all my RAM. 997 00:35:49,640 --> 00:35:51,640 Default resource limits, 998 00:35:51,640 --> 00:35:53,640 and requests. Again, so you don't eat all my RAM. 999 00:35:53,640 --> 00:35:55,640 Allowed mode. 1000 00:35:55,640 --> 00:35:57,640 What does that one do again? Oh, 1001 00:35:57,640 --> 00:35:59,640 you can have shared clusters. 1002 00:35:59,640 --> 00:36:01,640 So right now this is running in shared, which means 1003 00:36:01,640 --> 00:36:03,640 you'll still use 1004 00:36:03,640 --> 00:36:07,640 my host's ingress, my host's storage layer. 1006 00:36:07,640 --> 00:36:09,640 You don't have to install that yourself. It's ready to 1007 00:36:09,640 --> 00:36:11,640 go out of the box like you'd expect, you know, 1008 00:36:11,640 --> 00:36:13,640 with AWS or similar. 1009 00:36:13,640 --> 00:36:15,640 So what resources 1010 00:36:15,640 --> 00:36:17,640 to sync? Again, I have ingress and 1011 00:36:17,640 --> 00:36:19,640 storage being synced across. 1012 00:36:19,640 --> 00:36:21,640 Pod security admission level. 1014 00:36:23,640 --> 00:36:25,640 Anyway, priority class. 1015 00:36:25,640 --> 00:36:27,640 Some of these configs 1016 00:36:27,640 --> 00:36:29,640 isn't really needed, but yeah. You have max 1017 00:36:29,640 --> 00:36:31,640 resource limits or requests because 1018 00:36:31,640 --> 00:36:33,640 RAM is expensive, guys. 1019 00:36:33,640 --> 00:36:37,640 And you can disable network policy, but I'm not doing that 1021 00:36:37,640 --> 00:36:39,640 A while ago I 1022 00:36:39,640 --> 00:36:41,640 had a friend, she helped me 1023 00:36:41,640 --> 00:36:43,640 test it out. This was in the very early days. 1024 00:36:43,640 --> 00:36:47,640 And I gave her a beta code. 1026 00:36:47,640 --> 00:36:49,640 She named the cluster 1027 00:36:49,640 --> 00:36:51,640 something like, helpmeplease. 1028 00:36:51,640 --> 00:36:53,640 She downloaded 1029 00:36:53,640 --> 00:36:55,640 the kubeconfig, so you can see 1030 00:36:55,640 --> 00:36:57,640 export kubeconfig here, and then 1031 00:36:57,640 --> 00:36:59,640 got the nodes, and was like, it's alive!! 1032 00:36:59,640 --> 00:37:01,640 Very surprised because obviously 1033 00:37:01,640 --> 00:37:03,640 my stuff is not expected to work, right? 1034 00:37:03,640 --> 00:37:05,640 I was also surprised because I 1035 00:37:05,640 --> 00:37:07,640 expected my stuff to not work. 1036 00:37:07,640 --> 00:37:09,640 You can see. She said, I'm so 1037 00:37:09,640 --> 00:37:11,640 surprised. I have no faith in myself. It's right. 1038 00:37:11,640 --> 00:37:13,640 We found some fun 1039 00:37:13,640 --> 00:37:15,640 bugs together, like 1040 00:37:15,640 --> 00:37:17,640 you get a 200 response, but it still says 1041 00:37:17,640 --> 00:37:19,640 an error occurred somewhere. 1042 00:37:19,640 --> 00:37:21,640 And finally, 1043 00:37:21,640 --> 00:37:23,640 at midnight, so I wasn't there when she witnessed 1044 00:37:23,640 --> 00:37:25,640 the thing happen, she said, wow, listen. 1045 00:37:25,640 --> 00:37:27,640 It's not covered by TLS 1046 00:37:27,640 --> 00:37:29,640 and there's HSTS, but 1047 00:37:29,640 --> 00:37:31,640 it actually works. And she said 1048 00:37:31,640 --> 00:37:33,640 she's impressed. I impressed 1049 00:37:33,640 --> 00:37:35,640 someone. 1055 00:37:35,640 --> 00:37:37,640 So there's still some stuff 1056 00:37:37,640 --> 00:37:39,640 in progress. At the 1057 00:37:39,640 --> 00:37:41,640 time I made this, I was waiting on some 1058 00:37:41,640 --> 00:37:43,640 hardware. I needed more disks. 1059 00:37:43,640 --> 00:37:45,640 Those arrived recently. 1060 00:37:45,640 --> 00:37:47,640 Then a rabbit ate my fiber cable. 1061 00:37:47,640 --> 00:37:49,640 And then MyT generously 1062 00:37:49,640 --> 00:37:51,640 came to replace the fiber cable. 1063 00:37:51,640 --> 00:37:53,640 Thank you. There's a 1064 00:37:53,640 --> 00:37:55,640 Helm chart on the way to deploy 1065 00:37:55,640 --> 00:37:57,640 Kraft easily so that 1066 00:37:57,640 --> 00:37:59,640 you can host your own cloud service provider 1067 00:37:59,640 --> 00:38:01,640 from your own computer. 1068 00:38:01,640 --> 00:38:03,640 Some more hosting features and options. 1069 00:38:03,640 --> 00:38:05,640 Like you see, 1070 00:38:05,640 --> 00:38:07,640 initially I started out by comparing the Airbus 1071 00:38:07,640 --> 00:38:09,640 to Boeing, saying that's the only comparison 1072 00:38:09,640 --> 00:38:11,640 which has feature parity. 1073 00:38:11,640 --> 00:38:13,640 So I want Mauritius to have 1074 00:38:13,640 --> 00:38:15,640 a lot more options. 1075 00:38:15,640 --> 00:38:17,640 S3, someone mentioned 1076 00:38:17,640 --> 00:38:19,640 Cloudflare Pages. You see, 1077 00:38:19,640 --> 00:38:21,640 plenty of features like this which don't exist 1078 00:38:21,640 --> 00:38:23,640 here. You've got to make the hop to 1079 00:38:23,640 --> 00:38:25,640 South Africa for that, at least. 1080 00:38:25,640 --> 00:38:27,640 So yeah, some of those 1081 00:38:27,640 --> 00:38:29,640 features like that, I'd love to have them 1082 00:38:29,640 --> 00:38:31,640 integrated as well. 1083 00:38:31,640 --> 00:38:33,640 I wanted to make my own 1084 00:38:33,640 --> 00:38:35,640 virtual cluster solution because I found limitations 1085 00:38:35,640 --> 00:38:37,640 in K3K. And it's in Go. 1086 00:38:37,640 --> 00:38:39,640 I can't contribute to it. 1087 00:38:39,640 --> 00:38:42,640 So I'm like, I'm gonna rewrite it in Rust! 1088 00:38:42,640 --> 00:38:43,640 [silence] 1089 00:38:43,640 --> 00:38:45,640 Nobody's laughing. 1090 00:38:45,640 --> 00:38:47,640 Some backup and 1091 00:38:47,640 --> 00:38:49,640 restore because backing up data is 1092 00:38:49,640 --> 00:38:51,640 useful. And yeah, some 1093 00:38:51,640 --> 00:38:53,640 annoying K3K bugs which I'm still 1094 00:38:53,640 --> 00:38:55,640 working through. 1095 00:38:55,640 --> 00:38:57,640 So yeah, that's it from me. 1096 00:38:57,640 --> 00:38:59,640 Here's my website, Telegram 1097 00:38:59,640 --> 00:39:01,640 and Mastodon. 1098 00:39:01,640 --> 00:39:03,640 So if you want to reach out, I'll be around the convenience 1100 00:39:09,640 --> 00:39:11,640 I risk not getting a yellow card today. 1101 00:39:11,640 --> 00:39:14,640 I'm very proud of it. Pleased and proud of myself 1102 00:39:14,640 --> 00:39:15,640 So yeah, does anyone have any questions or comments? 1104 00:39:17,640 --> 00:39:19,640 Alex, you are 1105 00:39:19,640 --> 00:39:21,640 insane. 1106 00:39:21,640 --> 00:39:23,640 Yes. Oh No. 1107 00:39:25,640 --> 00:39:27,640 Ish: He's going to buy it from you. 1108 00:39:29,640 --> 00:39:31,640 Ish: He's got a lot of money. Let's talk later. 1109 00:39:33,640 --> 00:39:36,640 MyT: So why not using something like OKD4 and then build on that? 1110 00:39:36,640 --> 00:39:39,640 MyT: It already has a lot of stuff. 1112 00:39:39,640 --> 00:39:43,640 I'm not familiar. I've never heard of OKD4 1114 00:39:45,640 --> 00:39:47,640 Clifford: This room last year. 1115 00:39:47,640 --> 00:39:49,640 Sorry? 1116 00:39:49,640 --> 00:39:51,640 Clifford: OKD is an upstream project for OpenShift. 1118 00:39:53,640 --> 00:39:55,640 Oh, OpenShift! 1119 00:39:55,640 --> 00:39:57,640 Ish: Upstream. 1120 00:39:57,640 --> 00:39:59,640 Clifford: The community version, yes. 1121 00:39:59,640 --> 00:40:01,640 Yes. Well, I mean, you have 1122 00:40:01,640 --> 00:40:03,640 the choice. 1123 00:40:03,640 --> 00:40:05,640 When I was making this, I 1124 00:40:05,640 --> 00:40:07,640 had a bad 1125 00:40:07,640 --> 00:40:09,640 taste in my mouth from Red Hat. 1126 00:40:09,640 --> 00:40:11,640 Well, not Red Hat in particular, but 1127 00:40:11,640 --> 00:40:13,640 very American-aligned companies. 1128 00:40:15,640 --> 00:40:17,640 Clifford: I mean, it's open source. 1129 00:40:17,640 --> 00:40:19,640 Yeah, improved on it. 1130 00:40:19,640 --> 00:40:21,640 Maybe. 1131 00:40:21,640 --> 00:40:23,640 But you've got plenty of options. Actually, 1132 00:40:23,640 --> 00:40:25,640 it's not specific to 1133 00:40:25,640 --> 00:40:27,640 your underlying Kubernetes distribution. 1134 00:40:27,640 --> 00:40:29,640 You can run K3S, rke2, 1135 00:40:29,640 --> 00:40:31,640 OpenShift, plain KubeADM . 1136 00:40:31,640 --> 00:40:33,640 Anything will work. 1137 00:40:33,640 --> 00:40:35,640 So I wanted to keep it as open 1138 00:40:35,640 --> 00:40:37,640 as possible. 1139 00:40:37,640 --> 00:40:39,640 That good? 1140 00:40:39,640 --> 00:40:41,640 PR, is that alright? 1141 00:40:41,640 --> 00:40:43,640 Yes. 1142 00:40:43,640 --> 00:40:46,640 Joki: "Do you offer it as a container" 1144 00:40:46,640 --> 00:40:49,640 "so that somebody that sets up a Homelab could just" 1145 00:40:49,640 --> 00:40:53,640 "run it as a host instantly?" 1147 00:40:53,640 --> 00:40:57,640 "Like, supporting you, that we get redundancy" 1150 00:40:59,640 --> 00:41:01,640 "about, your Homelab, 20 other Homelabs?" 1151 00:41:03,640 --> 00:41:05,640 Spreading homelabs is not a thing 1152 00:41:05,640 --> 00:41:07,640 I've considered. It still just matters 1153 00:41:07,640 --> 00:41:09,640 about the host Kubernetes there. 1154 00:41:09,640 --> 00:41:11,640 So if you want to join your nodes 1155 00:41:11,640 --> 00:41:13,640 to my cluster, then 1156 00:41:13,640 --> 00:41:15,640 that would work as redundancy. 1157 00:41:15,640 --> 00:41:19,640 Joki: "You're maybe even having replication" 1159 00:41:19,640 --> 00:41:21,640 "between different, you know," 1160 00:41:21,640 --> 00:41:23,640 "like creating a zone." 1161 00:41:25,640 --> 00:41:27,640 Yes... You see, Ish, I'm going to retire from 1162 00:41:27,640 --> 00:41:31,640 La Sentinelle. I'm just going to end up working on this full-time. 1164 00:41:33,640 --> 00:41:35,640 But another thing on the self-hosting 1165 00:41:35,640 --> 00:41:37,640 thing is there's a Helm chart, so 1166 00:41:37,640 --> 00:41:39,640 most of the stuff are 1167 00:41:39,640 --> 00:41:43,640 just right here as Helm templates. 1169 00:41:43,640 --> 00:41:45,640 So even if you're not part of my cluster 1170 00:41:45,640 --> 00:41:47,640 you can still run it on your own. 1171 00:41:47,640 --> 00:41:49,640 Joki: "I would, but it's easy to run" 1172 00:41:49,640 --> 00:41:53,640 "I mean, the thing is what are the necessary steps" 1174 00:41:53,640 --> 00:41:57,640 "to set up my own Homelab with the same setup." 1178 00:42:01,640 --> 00:42:03,640 "So you install on a host system, install KRaft, and have those templates." 1181 00:42:07,640 --> 00:42:09,640 It's very simple. You install 1182 00:42:09,640 --> 00:42:11,640 Kubernetes on your host, then you do Helm install 1183 00:42:11,640 --> 00:42:13,640 and you point to this repository. 1184 00:42:13,640 --> 00:42:15,640 You have some 1185 00:42:15,640 --> 00:42:17,640 sensible defaults for values here. You just 1186 00:42:17,640 --> 00:42:19,640 customize that and then you're good to go 1188 00:42:21,640 --> 00:42:23,640 Yes? 1189 00:42:23,640 --> 00:42:25,640 Audience: "OKD, you would have" 1190 00:42:25,640 --> 00:42:27,640 "a similar conflict with Kubernetes." 1191 00:42:27,640 --> 00:42:31,640 "There's a specific project that was done" 1193 00:42:31,640 --> 00:42:35,640 "seven years ago that's called Incus that's based on LXC and LXD" 1195 00:42:35,640 --> 00:42:37,640 "That is the exact use case" 1196 00:42:37,640 --> 00:42:39,640 You said several things 1197 00:42:39,640 --> 00:42:42,640 I don't know. So what did you say first of all? 1198 00:42:42,640 --> 00:42:45,640 "So OKD would be similar because it's OpenShift." 1200 00:42:45,640 --> 00:42:47,640 Yeah, that's established. Kubernetes is Kubernetes. 1201 00:42:47,640 --> 00:42:49,640 "The other one is called Incas which is a fork of LXC." 1203 00:42:51,640 --> 00:42:53,640 "INCUS" 1204 00:42:53,640 --> 00:42:55,640 Which is a fork of? 1205 00:42:55,640 --> 00:42:57,640 "which is a fork of LXC." 1206 00:42:57,640 --> 00:42:59,640 "LXC." 1207 00:42:59,640 --> 00:43:01,640 Oh, LXC! 1208 00:43:01,640 --> 00:43:03,640 Linux Containers. 1209 00:43:03,640 --> 00:43:05,640 "Yeah." Okay. 1210 00:43:05,640 --> 00:43:07,640 "I helped on that project" 1211 00:43:07,640 --> 00:43:09,640 "and it was made for security projects" 1212 00:43:09,640 --> 00:43:11,640 "to host the" 1213 00:43:11,640 --> 00:43:13,640 Do we have any Google people in the room? 1214 00:43:13,640 --> 00:43:15,640 There's a problem here. 1215 00:43:15,640 --> 00:43:17,640 Joki: "No, it's the second one." 1216 00:43:17,640 --> 00:43:19,640 Okay, it's fine. I'm sorry. 1219 00:43:23,640 --> 00:43:25,640 "The first Google link." 1220 00:43:25,640 --> 00:43:31,640 "It was made for security and for pen testing entire environments" 1223 00:43:31,640 --> 00:43:33,640 "and so it would be ideal" 1224 00:43:33,640 --> 00:43:35,640 "You wouldn't have to do a lot of hardening" 1225 00:43:35,640 --> 00:43:37,640 "It's made for internet-based" 1226 00:43:37,640 --> 00:43:41,640 "security applications and it's been public for 10 years" 1228 00:43:41,640 --> 00:43:43,640 It's again, not something 1229 00:43:43,640 --> 00:43:45,640 that I've looked into. I wanted to make my own 1230 00:43:45,640 --> 00:43:47,640 solution, but also 1231 00:43:47,640 --> 00:43:49,640 the thing about Kraft is that I did 1232 00:43:49,640 --> 00:43:51,640 just want to make something 1233 00:43:51,640 --> 00:43:53,640 myself. I wanted an excuse to write Rust. 1234 00:43:55,640 --> 00:43:57,640 Ish: "By the way, that" 1235 00:43:57,640 --> 00:44:01,640 "Incus project you say was created by Aleksa Sarai" 1237 00:44:01,640 --> 00:44:03,640 No. 1238 00:44:03,640 --> 00:44:07,640 Ish: "On the page it's written, created by Aleksa Sarai." 1240 00:44:07,640 --> 00:44:11,640 Ish: "You met that guy while he worked at Suse." 1242 00:44:11,640 --> 00:44:13,640 Ish: "You probably forgot his face." 1243 00:44:13,640 --> 00:44:15,640 Definitely. 1244 00:44:15,640 --> 00:44:17,640 Audience: "But it was [unintelligible]" 1245 00:44:17,640 --> 00:44:19,640 Ish: "Yeah, but it was created by that guy, man." 1246 00:44:19,640 --> 00:44:27,640 Ish: "It could have been maintained by Navin Ramgoolam it doesn't matter" 1246 00:44:27,640 --> 00:44:31,640 Ish: "And he had the lucky chance to meet the guy in Germany." 1248 00:44:31,640 --> 00:44:33,640 Ish: "That was the point." 1249 00:44:33,640 --> 00:44:35,640 Alright, so are there any other 1250 00:44:35,640 --> 00:44:37,640 questions people interested 1251 00:44:37,640 --> 00:44:39,640 or, you know, because I 1252 00:44:39,640 --> 00:44:41,640 realize we do have a bit of a non-cloud 1253 00:44:41,640 --> 00:44:43,640 native audience here. So, yeah, 1254 00:44:43,640 --> 00:44:45,640 if anyone's got any questions. Is the next speaker 1255 00:44:45,640 --> 00:44:47,640 in the room? Mum: "Clifford!" 1256 00:44:47,640 --> 00:44:49,640 Oh, that's you! Right, of course. 1257 00:44:49,640 --> 00:44:51,640 Okay, so 1258 00:44:51,640 --> 00:44:53,640 we can keep going. 1259 00:44:53,640 --> 00:44:57,640 Joki: "It's already in my hand" (yellow card for timekeeping) 1261 00:44:57,640 --> 00:44:59,640 Joki: "Not for you, not for you." 1262 00:44:59,640 --> 00:45:01,640 Joki: "would have been, you know, like somebody asking questions." 1264 00:45:03,640 --> 00:45:05,640 Alright, so, any other 1265 00:45:05,640 --> 00:45:07,640 questions of people who are curious? 1266 00:45:07,640 --> 00:45:09,640 There's the Cloud Native 1267 00:45:09,640 --> 00:45:13,640 community, so cloudnativemauritius.com 1269 00:45:17,640 --> 00:45:19,640 cloudnativemauritius.com, long URL, 1270 00:45:19,640 --> 00:45:23,640 ugly website, we are sysadmins, not frontend people 1272 00:45:23,640 --> 00:45:25,640 We have a telegram you can join here. 1273 00:45:25,640 --> 00:45:27,640 We have a matrix server which is 1274 00:45:27,640 --> 00:45:29,640 unmaintained. But, yeah, you can 1275 00:45:29,640 --> 00:45:31,640 see what we're doing over here. 1276 00:45:31,640 --> 00:45:33,640 We've got events coming up if you want to get in touch, 1277 00:45:33,640 --> 00:45:35,640 get involved, 1278 00:45:35,640 --> 00:45:37,640 I'd be happy for you to reach out. 1279 00:45:37,640 --> 00:45:41,640 All good? No more questions? 1281 00:45:45,640 --> 00:45:47,640 Honestly, I'm so disappointed 1282 00:45:47,640 --> 00:45:49,640 we made it in time. Joki, can you give me 1283 00:45:49,640 --> 00:45:51,640 a yellow card just for the sake of it, please? 1284 00:45:51,640 --> 00:45:53,640 Joki: "Fair play, fair play." 1285 00:45:53,640 --> 00:45:55,640 Joki: "All good."