Drinking the Kubernetes Kool-Aid
How (not) to install WordPress on Kubernetes
Today we’re dragging LAMP into the 21st century in the worst possible way.
Much of the world wide web reportedly runs on PHP. This includes large online platforms, like Facebook, Flickr, and Wikipedia, but also a countless number of WordPress-based corporate websites and personal blogs.
This does not mean that PHP is a popular programming language. In fact, it’s probably one of the most ridiculed languages on the internet. WordPress’s reputation isn’t exactly stellar among web developers either.
EvErYtHiNg WaS bEtTeR iN tHe PaSt
Now, there are a lot of reasons to hate on PHP (and WordPress). Some of those are perfectly justified. Most however are based on negative experiences that people once had with some version of the language or ecosystem that hasn’t existed for a very long time now.
The language, its interpreter, community, and ecosystem have all made huge leaps forward, to the point where everything about it is basically just a slightly different Java. Things are pretty okay nowadays.
But sometimes I do long for the “good old days”, when you could still get away with absolutely awful spaghetti code without tests, debug code by (repeatedly) adding var_dump()s to your PHP files on production, and deploy new code by just FTP’ing a bunch of files to the right directory.
Today, we’re going to use modern development and hosting tools to relive those good old days – or at least parts of it. We’ll do this by packaging WordPress and some other stuff into a Docker container and hosting it on a local Kubernetes cluster as if it is a virtual machine.
Packaging our app
The first thing we need is Docker, a tool that lets you run your code in containers. A container contains your code and an operating system, so it is kind of like a virtual machine, except that it is not a virtual machine.
Containers can be provisioned using a so-called Dockerfile. A Dockerfile is sort of like a shell script, except that it is not a shell script.
One major difference between shell scripts and Dockerfiles, is that Dockerfiles also specify which operating system you’ll use. In our case, we’ll go with the latest LTS version of Ubuntu, for no reason other than that it is a popular choice among those who maintain actual virtual machines:
FROM ubuntu:20.04Almost everything after this line looks a lot like a shell script, albeit one with a slightly more convoluted syntax. For example, this is how we install the packages that we need in our container:
# Make sure that we don’t get annoying promptsARG DEBIAN_FRONTEND=noninteractive
# Install our best friends; Apache, MySQL, and PHP. And also some other stuff# that we may or may not needRUN apt update \ && \ apt install -y \ wordpress \ php \ libapache2-mod-php \ mysql-server \ php-mysql \ php-mbstring \ php-zip \ php-gd \ php-json \ php-curl \ phpmyadmin \ htop \ less \ vim \ sl \ && \ ln -s /usr/games/sl /usr/bin/slNote that we put everything into a single RUN instruction. This is something that you see often in Dockerfiles, because it’s a best practice.
Since we’re not particularly interested in following best (or even acceptable) practices in this guide we’ll just use individual instructions as much as possible, if only because I think it looks prettier.
Anyway, in the previous snippet we used apt to install two web applications: WordPress and phpMyAdmin. We still need to configure them so that they can be accessed via Apache and know how to connect to the database:
# Configure Apache so that it can serve WordPress and phpMyadminCOPY wordpress.conf /etc/apache2/sites-available/wordpress.confCOPY phpmyadmin.conf /etc/apache2/sites-available/phpmyadmin.conf
# Make sure that Apache will actually serve our applicationsRUN a2ensite wordpressRUN a2ensite phpmyadminRUN a2enmod rewrite
# Create database accountsRUN service mysql start \ && \ mysql -e 'CREATE DATABASE wordpress;' \ && \ mysql -e "CREATE USER wordpress@localhost IDENTIFIED BY 'wordpress';" \ && \ mysql -e "GRANT ALL ON wordpress.* TO wordpress@localhost;" \ && \ mysql -e "CREATE USER phpmyadmin@localhost IDENTIFIED BY 'phpmyadmin';" \ && \ mysql -e "GRANT ALL ON *.* TO phpmyadmin@localhost;" \ && \ mysql -e "CREATE USER pma@localhost IDENTIFIED BY 'pmapass';" \ && \ mysql -e "GRANT ALL ON *.* TO pma@localhost;" \ && \ mysql -e 'FLUSH PRIVILEGES;'
# Configure applications with database credentialsCOPY phpmyadmin-config.php /etc/phpmyadmin/config-db.phpCOPY wordpress-config.php /etc/wordpress/config-localhost.phpAs you can see, I took the liberty of hardcoding some credentials that are easy to remember, so you’ll never have to worry about locking yourself out of the system!
Speaking of which, we’ll also pretend that we care about security by installing and configuring ufw so that it allows traffic for ports between 1 and 443 (which we do not actually use in this guide, but whatever):
# This doesn’t do much, but at least we’ve installed and configured somethingRUN apt install -y ufwRUN ufw allow 1:443/tcp
# Why would you want this? I don’t know, but let’s do it anywayEXPOSE 1EXPOSE 2EXPOSE 3EXPOSE 4EXPOSE 5EXPOSE 6EXPOSE 7EXPOSE 8EXPOSE 9EXPOSE 10EXPOSE 11EXPOSE 12EXPOSE 13EXPOSE 14EXPOSE 15EXPOSE 16EXPOSE 17EXPOSE 18EXPOSE 19EXPOSE 20EXPOSE 21EXPOSE 22EXPOSE 23EXPOSE 24EXPOSE 25EXPOSE 26EXPOSE 27EXPOSE 28EXPOSE 29EXPOSE 30EXPOSE 31# I may have omitted a line or 412 hereThere is one very important thing that we haven’t done yet: we still need to start the Apache web server using CMD, which is sort of like RUN, except that it’s the thing that is executed when the container is actually running.
There are also two other very important things.
Remember that MySQL server that we had started earlier so that we could create some database users? It’s no longer up at this point, so we’ll need to start it again as well.
Moreover, Docker containers stop when their main process stops. In our case, we want to start two perpetually running processes via service start. However, these commands exit once they have started the service in the background and thus so will our container.
Fortunately, we can easily keep our Docker container alive by keeping it comatose until the end of time by adding sleep infinity to our CMD instruction:
CMD \ service apache2 start \ && \ service mysql start \ && \ sleep infinityThe resulting Dockerfile can be found in the accompanying GitHub repository, along with the various configuration files that were referenced in the snippets above.
We can build a container by executing the following command in the directory that contains the Dockerfile and configuration files for WordPress and phpMyAdmin:
docker build -t chunfeilung/kubernutty .The -t chunfeilung/kubernutty part is used to name the container, which you can also find on Docker Hub.
Run our app with Docker
Our container can be started by executing the following command:
docker run -d -P -p 80:80 chunfeilung/kubernuttyThis will take a few seconds. Not only because the container needs to start multiple services, but also because we have exposed an obscene number of ports in our Dockerfile.
It’s worth the wait though; the end result looks glorious in docker ps! The formatted output below is reasonably close to what I’m seeing on my screen.
Article continues below big-ass code block
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES 85c102059687 chunfeilung/kubernutty "/bin/sh -c 'service…" 33 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:58967->1/tcp, :::58968->1/tcp, 0.0.0.0:58966->2/tcp, :::58967->2/tcp, 0.0.0.0:58965->3/tcp, :::58966->3/tcp, 0.0.0.0:58964->4/tcp, :::58965->4/tcp, 0.0.0.0:58963->5/tcp, :::58964->5/tcp, 0.0.0.0:58962->6/tcp,:::58963->6/tcp, 0.0.0.0:58961->7/tcp, :::58962->7/tcp, 0.0.0.0:58960->8/tcp, :::58961->8/tcp, 0.0.0.0:58959->9/tcp, :::58960->9/tcp, 0.0.0.0:58958->10/tcp, :::58959->10/tcp, 0.0.0.0:58957->11/tcp, :::58958->11/tcp, 0.0.0.0:58956->12/tcp, :::58957->12/tcp, 0.0.0.0:58955->13/tcp, :::58956->13/tcp, 0.0.0.0:58954->14/tcp, :::58955->14/tcp, 0.0.0.0:58953->15/tcp, :::58954->15/tcp, 0.0.0.0:58952->16/tcp, :::58953->16/tcp, 0.0.0.0:58951->17/tcp, :::58952->17/tcp, 0.0.0.0:58950->18/tcp, :::58951->18/tcp, 0.0.0.0:58949->19/tcp, :::58950->19/tcp, 0.0.0.0:58948->20/tcp, :::58949->20/tcp, 0.0.0.0:58947->21/tcp, :::58948->21/tcp, 0.0.0.0:58946->22/tcp, :::58947->22/tcp, 0.0.0.0:58945->23/tcp, :::58946->23/tcp, 0.0.0.0:58944->24/tcp, :::58945->24/tcp, 0.0.0.0:58943->25/tcp, :::58944->25/tcp, 0.0.0.0:58942->26/tcp, :::58943->26/tcp, 0.0.0.0:58941->27/tcp, :::58942->27/tcp, 0.0.0.0:58940->28/tcp, :::58941->28/tcp, 0.0.0.0:58939->29/tcp, :::58940->29/tcp, 0.0.0.0:58938->30/tcp, :::58939->30/tcp, 0.0.0.0:58937->31/tcp, :::58938->31/tcp, 0.0.0.0:58936->32/tcp, :::58937->32/tcp, 0.0.0.0:58935->33/tcp, :::58936->33/tcp, 0.0.0.0:58934->34/tcp, :::58935->34/tcp, 0.0.0.0:58933->35/tcp, :::58934->35/tcp,0.0.0.0:58932->36/tcp, :::58933->36/tcp, 0.0.0.0:58931->37/tcp, :::58932->37/tcp, 0.0.0.0:58930->38/tcp, :::58931->38/tcp, 0.0.0.0:58929->39/tcp, :::58930->39/tcp, 0.0.0.0:58928->40/tcp, :::58929->40/tcp, 0.0.0.0:58927->41/tcp, :::58928->41/tcp, 0.0.0.0:58926->42/tcp, :::58927->42/tcp, 0.0.0.0:58925->43/tcp, :::58926->43/tcp, 0.0.0.0:58924->44/tcp, :::58925->44/tcp, 0.0.0.0:58923->45/tcp, :::58924->45/tcp, 0.0.0.0:58922->46/tcp, :::58923->46/tcp, 0.0.0.0:58921->47/tcp, :::58922->47/tcp, 0.0.0.0:58920->48/tcp, :::58921->48/tcp, 0.0.0.0:58919->49/tcp, :::58920->49/tcp, 0.0.0.0:58918->50/tcp, :::58919->50/tcp, 0.0.0.0:58917->51/tcp, :::58918->51/tcp, 0.0.0.0:58916->52/tcp, :::58917->52/tcp, 0.0.0.0:58915->53/tcp,:::58916->53/tcp, 0.0.0.0:58914->54/tcp, :::58915->54/tcp, 0.0.0.0:58913->55/tcp, :::58914->55/tcp, 0.0.0.0:58912->56/tcp, :::58913->56/tcp, 0.0.0.0:58911->57/tcp, :::58912->57/tcp, 0.0.0.0:58910->58/tcp, :::58911->58/tcp, 0.0.0.0:58909->59/tcp, :::58910->59/tcp, 0.0.0.0:58908->60/tcp, :::58909->60/tcp, 0.0.0.0:58907->61/tcp, :::58908->61/tcp, 0.0.0.0:58906->62/tcp, :::58907->62/tcp, 0.0.0.0:58905->63/tcp, :::58906->63/tcp, 0.0.0.0:58904->64/tcp, :::58905->64/tcp, 0.0.0.0:58903->65/tcp, :::58904->65/tcp, 0.0.0.0:58902->66/tcp, :::58903->66/tcp, 0.0.0.0:58901->67/tcp, :::58902->67/tcp, 0.0.0.0:58900->68/tcp, :::58901->68/tcp, 0.0.0.0:58899->69/tcp, :::58900->69/tcp, 0.0.0.0:58898->70/tcp, :::58899->70/tcp, 0.0.0.0:58897->71/tcp, :::58898->71/tcp, 0.0.0.0:58896->72/tcp, :::58897->72/tcp, 0.0.0.0:58895->73/tcp, :::58896->73/tcp, 0.0.0.0:58894->74/tcp, :::58895->74/tcp, 0.0.0.0:58893->75/tcp, :::58894->75/tcp, 0.0.0.0:58892->76/tcp, :::58893->76/tcp, 0.0.0.0:58891->77/tcp, :::58892->77/tcp, 0.0.0.0:58890->78/tcp, :::58891->78/tcp, 0.0.0.0:58889->79/tcp, :::58890->79/tcp, 0.0.0.0:58888->81/tcp, :::58889->81/tcp, 0.0.0.0:58887->82/tcp, :::58888->82/tcp, 0.0.0.0:58886->83/tcp, :::58887->83/tcp, 0.0.0.0:58885->84/tcp, :::58886->84/tcp, 0.0.0.0:58884->85/tcp, :::58885->85/tcp, 0.0.0.0:58883->86/tcp, :::58884->86/tcp, 0.0.0.0:58882->87/tcp, :::58883->87/tcp, 0.0.0.0:58881->88/tcp, :::58882->88/tcp, 0.0.0.0:58880->89/tcp, :::58881->89/tcp, 0.0.0.0:58879->90/tcp, :::58880->90/tcp, 0.0.0.0:58878->91/tcp, :::58879->91/tcp, 0.0.0.0:58877->92/tcp, :::58878->92/tcp, 0.0.0.0:58876->93/tcp, :::58877->93/tcp, 0.0.0.0:58875->94/tcp, :::58876->94/tcp, 0.0.0.0:58874->95/tcp, :::58875->95/tcp, 0.0.0.0:58873->96/tcp, :::58874->96/tcp, 0.0.0.0:58872->97/tcp, :::58873->97/tcp, 0.0.0.0:58871->98/tcp, :::58872->98/tcp, 0.0.0.0:58870->99/tcp, :::58871->99/tcp, 0.0.0.0:58869->100/tcp, :::58870->100/tcp, 0.0.0.0:58868->101/tcp, :::58869->101/tcp, 0.0.0.0:58867->102/tcp, :::58868->102/tcp, 0.0.0.0:58866->103/tcp, :::58867->103/tcp, 0.0.0.0:58865->104/tcp, :::58866->104/tcp, 0.0.0.0:58864->105/tcp, :::58865->105/tcp, 0.0.0.0:58863->106/tcp, :::58864->106/tcp, 0.0.0.0:58862->107/tcp, :::58863->107/tcp, 0.0.0.0:58861->108/tcp, :::58862->108/tcp, 0.0.0.0:58860->109/tcp, :::58861->109/tcp, 0.0.0.0:58859->110/tcp, :::58860->110/tcp, 0.0.0.0:58858->111/tcp, :::58859->111/tcp, 0.0.0.0:58857->112/tcp, :::58858->112/tcp, 0.0.0.0:58856->113/tcp, :::58857->113/tcp, 0.0.0.0:58855->114/tcp, :::58856->114/tcp, 0.0.0.0:58854->115/tcp, :::58855->115/tcp, 0.0.0.0:58853->116/tcp, :::58854->116/tcp, 0.0.0.0:58852->117/tcp, :::58853->117/tcp, 0.0.0.0:58851->118/tcp, :::58852->118/tcp, 0.0.0.0:58850->119/tcp, :::58851->119/tcp, 0.0.0.0:58849->120/tcp, :::58850->120/tcp, 0.0.0.0:58848->121/tcp, :::58849->121/tcp, 0.0.0.0:58847->122/tcp, :::58848->122/tcp, 0.0.0.0:58846->123/tcp, :::58847->123/tcp, 0.0.0.0:58845->124/tcp, :::58846->124/tcp, 0.0.0.0:58844->125/tcp, :::58845->125/tcp, 0.0.0.0:58843->126/tcp, :::58844->126/tcp, 0.0.0.0:58842->127/tcp, :::58843->127/tcp, 0.0.0.0:58841->128/tcp, :::58842->128/tcp, 0.0.0.0:58840->129/tcp, :::58841->129/tcp, 0.0.0.0:58839->130/tcp, :::58840->130/tcp, 0.0.0.0:58838->131/tcp, :::58839->131/tcp, 0.0.0.0:58837->132/tcp, :::58838->132/tcp, 0.0.0.0:58836->133/tcp, :::58837->133/tcp, 0.0.0.0:58835->134/tcp, :::58836->134/tcp, 0.0.0.0:58834->135/tcp, :::58835->135/tcp, 0.0.0.0:58833->136/tcp, :::58834->136/tcp, 0.0.0.0:58832->137/tcp, :::58833->137/tcp, 0.0.0.0:58831->138/tcp, :::58832->138/tcp, 0.0.0.0:58830->139/tcp, :::58831->139/tcp, 0.0.0.0:58829->140/tcp, :::58830->140/tcp, 0.0.0.0:58828->141/tcp, :::58829->141/tcp, 0.0.0.0:58827->142/tcp, :::58828->142/tcp, 0.0.0.0:58826->143/tcp, :::58827->143/tcp, 0.0.0.0:58825->144/tcp, :::58826->144/tcp, 0.0.0.0:58824->145/tcp, :::58825->145/tcp, 0.0.0.0:58823->146/tcp, :::58824->146/tcp, 0.0.0.0:58822->147/tcp, :::58823->147/tcp, 0.0.0.0:58821->148/tcp, :::58822->148/tcp, 0.0.0.0:58820->149/tcp, :::58821->149/tcp, 0.0.0.0:58819->150/tcp, :::58820->150/tcp, 0.0.0.0:58818->151/tcp,:::58819->151/tcp, 0.0.0.0:58817->152/tcp, :::58818->152/tcp, 0.0.0.0:58816->153/tcp, :::58817->153/tcp, 0.0.0.0:58815->154/tcp, :::58816->154/tcp, 0.0.0.0:58814->155/tcp, :::58815->155/tcp, 0.0.0.0:58813->156/tcp, :::58814->156/tcp, 0.0.0.0:58812->157/tcp, :::58813->157/tcp, 0.0.0.0:58811->158/tcp, :::58812->158/tcp,0.0.0.0:58810->159/tcp, :::58811->159/tcp, 0.0.0.0:58809->160/tcp, :::58810->160/tcp, 0.0.0.0:58808->161/tcp, :::58809->161/tcp, 0.0.0.0:58807->162/tcp, :::58808->162/tcp, 0.0.0.0:58806->163/tcp, :::58807->163/tcp, 0.0.0.0:58805->164/tcp, :::58806->164/tcp, 0.0.0.0:58804->165/tcp, :::58805->165/tcp, 0.0.0.0:58803->166/tcp, :::58804->166/tcp, 0.0.0.0:58802->167/tcp, :::58803->167/tcp, 0.0.0.0:58801->168/tcp, :::58802->168/tcp, 0.0.0.0:58800->169/tcp, :::58801->169/tcp, 0.0.0.0:58799->170/tcp, :::58800->170/tcp, 0.0.0.0:58798->171/tcp, :::58799->171/tcp, 0.0.0.0:58797->172/tcp, :::58798->172/tcp, 0.0.0.0:58796->173/tcp, :::58797->173/tcp, 0.0.0.0:58795->174/tcp, :::58796->174/tcp, 0.0.0.0:58794->175/tcp, :::58795->175/tcp, 0.0.0.0:58793->176/tcp, :::58794->176/tcp, 0.0.0.0:58792->177/tcp, :::58793->177/tcp, 0.0.0.0:58791->178/tcp, :::58792->178/tcp, 0.0.0.0:58790->179/tcp, :::58791->179/tcp, 0.0.0.0:58789->180/tcp, :::58790->180/tcp, 0.0.0.0:58788->181/tcp, :::58789->181/tcp, 0.0.0.0:58787->182/tcp, :::58788->182/tcp, 0.0.0.0:58786->183/tcp, :::58787->183/tcp, 0.0.0.0:58785->184/tcp, :::58786->184/tcp, 0.0.0.0:58784->185/tcp, :::58785->185/tcp, 0.0.0.0:58783->186/tcp, :::58784->186/tcp, 0.0.0.0:58782->187/tcp, :::58783->187/tcp, 0.0.0.0:58781->188/tcp, :::58782->188/tcp, 0.0.0.0:58780->189/tcp, :::58781->189/tcp, 0.0.0.0:58779->190/tcp, :::58780->190/tcp, 0.0.0.0:58778->191/tcp, :::58779->191/tcp, 0.0.0.0:58777->192/tcp, :::58778->192/tcp, 0.0.0.0:58776->193/tcp, :::58777->193/tcp, 0.0.0.0:58775->194/tcp, :::58776->194/tcp, 0.0.0.0:58774->195/tcp, :::58775->195/tcp, 0.0.0.0:58773->196/tcp, :::58774->196/tcp, 0.0.0.0:58772->197/tcp, :::58773->197/tcp, 0.0.0.0:58771->198/tcp, :::58772->198/tcp, 0.0.0.0:58770->199/tcp, :::58771->199/tcp, 0.0.0.0:58769->200/tcp, :::58770->200/tcp, 0.0.0.0:58768->201/tcp, :::58769->201/tcp, 0.0.0.0:58767->202/tcp, :::58768->202/tcp, 0.0.0.0:58766->203/tcp, :::58767->203/tcp, 0.0.0.0:58765->204/tcp, :::58766->204/tcp, 0.0.0.0:58764->205/tcp, :::58765->205/tcp, 0.0.0.0:58763->206/tcp, :::58764->206/tcp, 0.0.0.0:58762->207/tcp, :::58763->207/tcp, 0.0.0.0:58761->208/tcp, :::58762->208/tcp, 0.0.0.0:58760->209/tcp, :::58761->209/tcp, 0.0.0.0:58759->210/tcp, :::58760->210/tcp, 0.0.0.0:58758->211/tcp, :::58759->211/tcp, 0.0.0.0:58757->212/tcp, :::58758->212/tcp, 0.0.0.0:58756->213/tcp, :::58757->213/tcp, 0.0.0.0:58755->214/tcp, :::58756->214/tcp, 0.0.0.0:58754->215/tcp, :::58755->215/tcp, 0.0.0.0:58753->216/tcp, :::58754->216/tcp, 0.0.0.0:58752->217/tcp, :::58753->217/tcp, 0.0.0.0:58751->218/tcp, :::58752->218/tcp, 0.0.0.0:58750->219/tcp, :::58751->219/tcp, 0.0.0.0:58749->220/tcp, :::58750->220/tcp, 0.0.0.0:58748->221/tcp, :::58749->221/tcp, 0.0.0.0:58747->222/tcp, :::58748->222/tcp, 0.0.0.0:58746->223/tcp, :::58747->223/tcp, 0.0.0.0:58745->224/tcp, :::58746->224/tcp, 0.0.0.0:58744->225/tcp, :::58745->225/tcp, 0.0.0.0:58743->226/tcp, :::58744->226/tcp, 0.0.0.0:58742->227/tcp, :::58743->227/tcp, 0.0.0.0:58741->228/tcp, :::58742->228/tcp, 0.0.0.0:58740->229/tcp, :::58741->229/tcp, 0.0.0.0:58739->230/tcp, :::58740->230/tcp, 0.0.0.0:58738->231/tcp,:::58739->231/tcp, 0.0.0.0:58737->232/tcp, :::58738->232/tcp, 0.0.0.0:58736->233/tcp, :::58737->233/tcp, 0.0.0.0:58735->234/tcp, :::58736->234/tcp, 0.0.0.0:58734->235/tcp, :::58735->235/tcp, 0.0.0.0:58733->236/tcp, :::58734->236/tcp, 0.0.0.0:58732->237/tcp, :::58733->237/tcp, 0.0.0.0:58731->238/tcp, :::58732->238/tcp,0.0.0.0:58730->239/tcp, :::58731->239/tcp, 0.0.0.0:58729->240/tcp, :::58730->240/tcp, 0.0.0.0:58728->241/tcp, :::58729->241/tcp, 0.0.0.0:58727->242/tcp, :::58728->242/tcp, 0.0.0.0:58726->243/tcp, :::58727->243/tcp, 0.0.0.0:58725->244/tcp, :::58726->244/tcp, 0.0.0.0:58724->245/tcp, :::58725->245/tcp, 0.0.0.0:58723->246/tcp, :::58724->246/tcp, 0.0.0.0:58722->247/tcp, :::58723->247/tcp, 0.0.0.0:58721->248/tcp, :::58722->248/tcp, 0.0.0.0:58720->249/tcp, :::58721->249/tcp, 0.0.0.0:58719->250/tcp, :::58720->250/tcp, 0.0.0.0:58718->251/tcp, :::58719->251/tcp, 0.0.0.0:58717->252/tcp, :::58718->252/tcp, 0.0.0.0:58716->253/tcp, :::58717->253/tcp, 0.0.0.0:58715->254/tcp, :::58716->254/tcp, 0.0.0.0:58714->255/tcp, :::58715->255/tcp, 0.0.0.0:58713->256/tcp, :::58714->256/tcp, 0.0.0.0:58712->257/tcp, :::58713->257/tcp, 0.0.0.0:58711->258/tcp, :::58712->258/tcp, 0.0.0.0:58710->259/tcp, :::58711->259/tcp, 0.0.0.0:58709->260/tcp, :::58710->260/tcp, 0.0.0.0:58708->261/tcp, :::58709->261/tcp, 0.0.0.0:58707->262/tcp, :::58708->262/tcp, 0.0.0.0:58706->263/tcp, :::58707->263/tcp, 0.0.0.0:58705->264/tcp, :::58706->264/tcp, 0.0.0.0:58704->265/tcp, :::58705->265/tcp, 0.0.0.0:58703->266/tcp, :::58704->266/tcp, 0.0.0.0:58702->267/tcp, :::58703->267/tcp, 0.0.0.0:58701->268/tcp, :::58702->268/tcp, 0.0.0.0:58700->269/tcp, :::58701->269/tcp, 0.0.0.0:58699->270/tcp, :::58700->270/tcp, 0.0.0.0:58698->271/tcp, :::58699->271/tcp, 0.0.0.0:58697->272/tcp, :::58698->272/tcp, 0.0.0.0:58696->273/tcp, :::58697->273/tcp, 0.0.0.0:58695->274/tcp, :::58696->274/tcp, 0.0.0.0:58694->275/tcp, :::58695->275/tcp, 0.0.0.0:58693->276/tcp, :::58694->276/tcp, 0.0.0.0:58692->277/tcp, :::58693->277/tcp, 0.0.0.0:58691->278/tcp, :::58692->278/tcp, 0.0.0.0:58690->279/tcp, :::58691->279/tcp, 0.0.0.0:58689->280/tcp, :::58690->280/tcp, 0.0.0.0:58688->281/tcp, :::58689->281/tcp, 0.0.0.0:58687->282/tcp, :::58688->282/tcp, 0.0.0.0:58686->283/tcp, :::58687->283/tcp, 0.0.0.0:58685->284/tcp, :::58686->284/tcp, 0.0.0.0:58684->285/tcp, :::58685->285/tcp, 0.0.0.0:58683->286/tcp, :::58684->286/tcp, 0.0.0.0:58682->287/tcp, :::58683->287/tcp, 0.0.0.0:58681->288/tcp, :::58682->288/tcp, 0.0.0.0:58680->289/tcp, :::58681->289/tcp, 0.0.0.0:58679->290/tcp, :::58680->290/tcp, 0.0.0.0:58678->291/tcp, :::58679->291/tcp, 0.0.0.0:58677->292/tcp, :::58678->292/tcp, 0.0.0.0:58676->293/tcp, :::58677->293/tcp, 0.0.0.0:58675->294/tcp, :::58676->294/tcp, 0.0.0.0:58674->295/tcp, :::58675->295/tcp, 0.0.0.0:58673->296/tcp, :::58674->296/tcp, 0.0.0.0:58672->297/tcp, :::58673->297/tcp, 0.0.0.0:58671->298/tcp, :::58672->298/tcp, 0.0.0.0:58670->299/tcp, :::58671->299/tcp, 0.0.0.0:58669->300/tcp, :::58670->300/tcp, 0.0.0.0:58668->301/tcp, :::58669->301/tcp, 0.0.0.0:58667->302/tcp, :::58668->302/tcp, 0.0.0.0:58666->303/tcp, :::58667->303/tcp, 0.0.0.0:58665->304/tcp, :::58666->304/tcp, 0.0.0.0:58664->305/tcp, :::58665->305/tcp, 0.0.0.0:58663->306/tcp, :::58664->306/tcp, 0.0.0.0:58662->307/tcp, :::58663->307/tcp, 0.0.0.0:58661->308/tcp, :::58662->308/tcp, 0.0.0.0:58660->309/tcp, :::58661->309/tcp, 0.0.0.0:58659->310/tcp, :::58660->310/tcp, 0.0.0.0:58658->311/tcp,:::58659->311/tcp, 0.0.0.0:58657->312/tcp, :::58658->312/tcp, 0.0.0.0:58656->313/tcp, :::58657->313/tcp, 0.0.0.0:58655->314/tcp, :::58656->314/tcp, 0.0.0.0:58654->315/tcp, :::58655->315/tcp, 0.0.0.0:58653->316/tcp, :::58654->316/tcp, 0.0.0.0:58652->317/tcp, :::58653->317/tcp, 0.0.0.0:58651->318/tcp, :::58652->318/tcp,0.0.0.0:58650->319/tcp, :::58651->319/tcp, 0.0.0.0:58649->320/tcp, :::58650->320/tcp, 0.0.0.0:58648->321/tcp, :::58649->321/tcp, 0.0.0.0:58647->322/tcp, :::58648->322/tcp, 0.0.0.0:58646->323/tcp, :::58647->323/tcp, 0.0.0.0:58645->324/tcp, :::58646->324/tcp, 0.0.0.0:58644->325/tcp, :::58645->325/tcp, 0.0.0.0:58643->326/tcp, :::58644->326/tcp, 0.0.0.0:58642->327/tcp, :::58643->327/tcp, 0.0.0.0:58641->328/tcp, :::58642->328/tcp, 0.0.0.0:58640->329/tcp, :::58641->329/tcp, 0.0.0.0:58639->330/tcp, :::58640->330/tcp, 0.0.0.0:58638->331/tcp, :::58639->331/tcp, 0.0.0.0:58637->332/tcp, :::58638->332/tcp, 0.0.0.0:58636->333/tcp, :::58637->333/tcp, 0.0.0.0:58635->334/tcp, :::58636->334/tcp, 0.0.0.0:58634->335/tcp, :::58635->335/tcp, 0.0.0.0:58633->336/tcp, :::58634->336/tcp, 0.0.0.0:58632->337/tcp, :::58633->337/tcp, 0.0.0.0:58631->338/tcp, :::58632->338/tcp, 0.0.0.0:58630->339/tcp, :::58631->339/tcp, 0.0.0.0:58629->340/tcp, :::58630->340/tcp, 0.0.0.0:58628->341/tcp, :::58629->341/tcp, 0.0.0.0:58627->342/tcp, :::58628->342/tcp, 0.0.0.0:58626->343/tcp, :::58627->343/tcp, 0.0.0.0:58625->344/tcp, :::58626->344/tcp, 0.0.0.0:58624->345/tcp, :::58625->345/tcp, 0.0.0.0:58623->346/tcp, :::58624->346/tcp, 0.0.0.0:58622->347/tcp, :::58623->347/tcp, 0.0.0.0:58621->348/tcp, :::58622->348/tcp, 0.0.0.0:58620->349/tcp, :::58621->349/tcp, 0.0.0.0:58619->350/tcp, :::58620->350/tcp, 0.0.0.0:58618->351/tcp, :::58619->351/tcp, 0.0.0.0:58617->352/tcp, :::58618->352/tcp, 0.0.0.0:58616->353/tcp, :::58617->353/tcp, 0.0.0.0:58615->354/tcp, :::58616->354/tcp, 0.0.0.0:58614->355/tcp, :::58615->355/tcp, 0.0.0.0:58613->356/tcp, :::58614->356/tcp, 0.0.0.0:58612->357/tcp, :::58613->357/tcp, 0.0.0.0:58611->358/tcp, :::58612->358/tcp, 0.0.0.0:58610->359/tcp, :::58611->359/tcp, 0.0.0.0:58609->360/tcp, :::58610->360/tcp, 0.0.0.0:58608->361/tcp, :::58609->361/tcp, 0.0.0.0:58607->362/tcp, :::58608->362/tcp, 0.0.0.0:58606->363/tcp, :::58607->363/tcp, 0.0.0.0:58605->364/tcp, :::58606->364/tcp, 0.0.0.0:58604->365/tcp, :::58605->365/tcp, 0.0.0.0:58603->366/tcp, :::58604->366/tcp, 0.0.0.0:58602->367/tcp, :::58603->367/tcp, 0.0.0.0:58601->368/tcp, :::58602->368/tcp, 0.0.0.0:58600->369/tcp, :::58601->369/tcp, 0.0.0.0:58599->370/tcp, :::58600->370/tcp, 0.0.0.0:58598->371/tcp, :::58599->371/tcp, 0.0.0.0:58597->372/tcp, :::58598->372/tcp, 0.0.0.0:58596->373/tcp, :::58597->373/tcp, 0.0.0.0:58595->374/tcp, :::58596->374/tcp, 0.0.0.0:58594->375/tcp, :::58595->375/tcp, 0.0.0.0:58593->376/tcp, :::58594->376/tcp, 0.0.0.0:58592->377/tcp, :::58593->377/tcp, 0.0.0.0:58591->378/tcp, :::58592->378/tcp, 0.0.0.0:58590->379/tcp, :::58591->379/tcp, 0.0.0.0:58589->380/tcp, :::58590->380/tcp, 0.0.0.0:58588->381/tcp, :::58589->381/tcp, 0.0.0.0:58587->382/tcp, :::58588->382/tcp, 0.0.0.0:58586->383/tcp, :::58587->383/tcp, 0.0.0.0:58585->384/tcp, :::58586->384/tcp, 0.0.0.0:58584->385/tcp, :::58585->385/tcp, 0.0.0.0:58583->386/tcp, :::58584->386/tcp, 0.0.0.0:58582->387/tcp, :::58583->387/tcp, 0.0.0.0:58581->388/tcp, :::58582->388/tcp, 0.0.0.0:58580->389/tcp, :::58581->389/tcp, 0.0.0.0:58579->390/tcp, :::58580->390/tcp, 0.0.0.0:58578->391/tcp,:::58579->391/tcp, 0.0.0.0:58577->392/tcp, :::58578->392/tcp, 0.0.0.0:58576->393/tcp, :::58577->393/tcp, 0.0.0.0:58575->394/tcp, :::58576->394/tcp, 0.0.0.0:58574->395/tcp, :::58575->395/tcp, 0.0.0.0:58573->396/tcp, :::58574->396/tcp, 0.0.0.0:58572->397/tcp, :::58573->397/tcp, 0.0.0.0:58571->398/tcp, :::58572->398/tcp,0.0.0.0:58570->399/tcp, :::58571->399/tcp, 0.0.0.0:58569->400/tcp, :::58570->400/tcp, 0.0.0.0:58568->401/tcp, :::58569->401/tcp, 0.0.0.0:58567->402/tcp, :::58568->402/tcp, 0.0.0.0:58566->403/tcp, :::58567->403/tcp, 0.0.0.0:58565->404/tcp, :::58566->404/tcp, 0.0.0.0:58564->405/tcp, :::58565->405/tcp, 0.0.0.0:58563->406/tcp, :::58564->406/tcp, 0.0.0.0:58562->407/tcp, :::58563->407/tcp, 0.0.0.0:58561->408/tcp, :::58562->408/tcp, 0.0.0.0:58560->409/tcp, :::58561->409/tcp, 0.0.0.0:58559->410/tcp, :::58560->410/tcp, 0.0.0.0:58558->411/tcp, :::58559->411/tcp, 0.0.0.0:58557->412/tcp, :::58558->412/tcp, 0.0.0.0:58556->413/tcp, :::58557->413/tcp, 0.0.0.0:58555->414/tcp, :::58556->414/tcp, 0.0.0.0:58554->415/tcp, :::58555->415/tcp, 0.0.0.0:58553->416/tcp, :::58554->416/tcp, 0.0.0.0:58552->417/tcp, :::58553->417/tcp, 0.0.0.0:58551->418/tcp, :::58552->418/tcp, 0.0.0.0:58550->419/tcp, :::58551->419/tcp, 0.0.0.0:58549->420/tcp, :::58550->420/tcp, 0.0.0.0:58548->421/tcp, :::58549->421/tcp, 0.0.0.0:58547->422/tcp, :::58548->422/tcp, 0.0.0.0:58546->423/tcp, :::58547->423/tcp, 0.0.0.0:58545->424/tcp, :::58546->424/tcp, 0.0.0.0:58544->425/tcp, :::58545->425/tcp, 0.0.0.0:58543->426/tcp, :::58544->426/tcp, 0.0.0.0:58542->427/tcp, :::58543->427/tcp, 0.0.0.0:58541->428/tcp, :::58542->428/tcp, 0.0.0.0:58540->429/tcp, :::58541->429/tcp, 0.0.0.0:58539->430/tcp, :::58540->430/tcp, 0.0.0.0:58538->431/tcp, :::58539->431/tcp, 0.0.0.0:58537->432/tcp, :::58538->432/tcp, 0.0.0.0:58536->433/tcp, :::58537->433/tcp, 0.0.0.0:58535->434/tcp, :::58536->434/tcp, 0.0.0.0:58534->435/tcp, :::58535->435/tcp, 0.0.0.0:58533->436/tcp, :::58534->436/tcp, 0.0.0.0:58532->437/tcp, :::58533->437/tcp, 0.0.0.0:58531->438/tcp, :::58532->438/tcp, 0.0.0.0:58530->439/tcp, :::58531->439/tcp, 0.0.0.0:58529->440/tcp, :::58530->440/tcp, 0.0.0.0:58528->441/tcp, :::58529->441/tcp, 0.0.0.0:58527->442/tcp, :::58528->442/tcp, 0.0.0.0:58526->443/tcp, :::58527->443/tcp jovial_moserThings look pretty alright in the browser too:
Deploy our app to Kubernetes
Good, we’re almost done! Let’s deploy our app to Kubernetes so we can call it a day.
First, create a kubernutty namespace for our project:
kubectl create namespace kubernuttyThen, we’ll provide definitions for two types of Kubernetes objects that will help us deploy our WordPress container, a Deployment and a Service:
apiVersion: apps/v1kind: Deploymentmetadata: name: kubernuttyspec: replicas: 1 selector: matchLabels: name: kubernutty template: metadata: labels: name: kubernutty spec: containers: - name: kubernutty image: chunfeilung/kubernutty ports: - containerPort: 80 resources: requests: cpu: 1 memory: 2G limits: cpu: 1 memory: 2G---apiVersion: v1kind: Servicemetadata: name: kubernuttyspec: type: LoadBalancer ports: - name: http port: 80 selector: name: kubernuttyThe Deployment tells us that we want to run a single instance of the chunfeilung/kubernutty image and give it access to 1 CPU and 2 gigabytes of memory. The Service makes the deployed application accessible within the Kubernetes cluster.
I saved the configuration in a file named kubernutty.yaml, which I’m going to apply to our kubernutty namespace:
kubectl apply -n kubernutty -f kubernutty.yamlThis creates a single pod that runs our container:
NAME READY STATUS RESTARTS AGEkubernutty-57f79c7757-5mmz9 1/1 Running 0 8sThe first thing you probably want to do now, is view the result in a browser. Unfortunately you can’t do that yet. Our configuration doesn’t tell Kubernetes how to do that!
What we can do though, is use kubectl port-forward to forward traffic on our host to the newly created pod:
kubectl port-forward kubernutty-57f79c7757-5mmz9 8080:80 -n kubernuttyWe can now access our WordPress installation on localhost:8080:
What’s next
Hooray, you have committed your first crimes against humanity!
While we could definitely add more cool things, like a domain name or an FTP server, the best thing we can do for now is delete the kubernutty namespace by executing
kubectl delete namespace kubernuttyand not talk about this ever again.