Containerization and scaling of a PHP application : Docker & Kubernetes
Juntunen, Joni (2019)
Juntunen, Joni
2019
All rights reserved. This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:amk-2019121125930
https://urn.fi/URN:NBN:fi:amk-2019121125930
Tiivistelmä
Opinnäytetyössä tehtiin ohjelmistokontitus PHP-ohjelmalle käyttäen Docker-kontteja ja Kubernetes-orkestrointiteknologiaa. PHP-ohjelma oli luotu käyttäen Symfony-ohjelmistokehystä. Lisävaatimuksena oli tarve tarjota jokaiselle asiakkaalle oma kopio ohjelmasta perustuen DNS-verkkonimeen. Työ tehtiin yritykselle IT-palvelut Joni Juntunen.
PHP-tulkiksi valittiin PHP-FPM-moottori ja web-palvelimeksi Nginx. Nämä laitettiin erillisiin kontteihin, yksi sovellus konttia kohti periaatteen mukaisesti. Ohjelmiston lähdekoodi tallennettiin mukaan PHP-FPM-konttiin ja kontin kuvaustiedosto muodostettiin monivaiheisella Dockerfile-määrityksellä.
Kubernetesilla hallittiin näistä konteista muodostettuja kapseleita (Pod). Yhteen kapseliin laitettiin kaksi konttia, Nginx-kontti ja PHP-FPM-kontit. Ympäristömuuttujilla kapseleissa olevat kontit muokattiin asiakaskohtaisilla asetuksilla. Kubernetes asennettiin virtuaalipalvelimille.
Ulkoisia yhteyksiä varten Kubernetes-klusterin eteen asetettiin Nginx-välityspalvelin. Ulkoinen pääsy klusteriin eristettiin tämän välityspalvelimen taakse. Yhteydet välityspalvelimeen salattiin SSL-salauksella.
Kubernetes soveltui alustaksi Software as a Service muotoisen palvelun tuottamiseen. Konttien ajaminen Kubernetesissä vaati useiden eri Kubernetes-palveluiden asetusten määrittelyitä, mikä taas lisäsi palvelun ylläpidon monimutkaisuutta. In this project, a monolithic PHP application was containerized with Docker and orchestrated using Kubernetes. The PHP application was built using the Symfony framework. An additional requirement was serving each client organization with their own copy of the application accessed via different DNS names.
Choices for the PHP engine and web server were PHP-FPM and Nginx. These were separated to multiple containers to maintain the single process per container principle. PHP application source was added to the PHP-FPM container. The PHP container was built using multistage Dockerfile with a separate build stage.
Kubernetes was used to orchestrate the pods consisting of two containers, Nginx and PHP-FPM. Environment variables were used to customize each pod for each client organization. Kubernetes was built on virtual machines as a bare metal solution.
To handle the network connections to Kubernetes, a Nginx proxy was used between the WAN network and the Kubernetes network. All traffic to the nodes in the Kubernetes network must pass through the proxy, separating the cluster from public access. Traffic to the proxy was secured with an SSL certificate.
Kubernetes was found to be suitable platform for a software as a service product. Running containers inside Kubernetes required definition of multiple different layers and services which increased the complexity of the backend administration.
PHP-tulkiksi valittiin PHP-FPM-moottori ja web-palvelimeksi Nginx. Nämä laitettiin erillisiin kontteihin, yksi sovellus konttia kohti periaatteen mukaisesti. Ohjelmiston lähdekoodi tallennettiin mukaan PHP-FPM-konttiin ja kontin kuvaustiedosto muodostettiin monivaiheisella Dockerfile-määrityksellä.
Kubernetesilla hallittiin näistä konteista muodostettuja kapseleita (Pod). Yhteen kapseliin laitettiin kaksi konttia, Nginx-kontti ja PHP-FPM-kontit. Ympäristömuuttujilla kapseleissa olevat kontit muokattiin asiakaskohtaisilla asetuksilla. Kubernetes asennettiin virtuaalipalvelimille.
Ulkoisia yhteyksiä varten Kubernetes-klusterin eteen asetettiin Nginx-välityspalvelin. Ulkoinen pääsy klusteriin eristettiin tämän välityspalvelimen taakse. Yhteydet välityspalvelimeen salattiin SSL-salauksella.
Kubernetes soveltui alustaksi Software as a Service muotoisen palvelun tuottamiseen. Konttien ajaminen Kubernetesissä vaati useiden eri Kubernetes-palveluiden asetusten määrittelyitä, mikä taas lisäsi palvelun ylläpidon monimutkaisuutta.
Choices for the PHP engine and web server were PHP-FPM and Nginx. These were separated to multiple containers to maintain the single process per container principle. PHP application source was added to the PHP-FPM container. The PHP container was built using multistage Dockerfile with a separate build stage.
Kubernetes was used to orchestrate the pods consisting of two containers, Nginx and PHP-FPM. Environment variables were used to customize each pod for each client organization. Kubernetes was built on virtual machines as a bare metal solution.
To handle the network connections to Kubernetes, a Nginx proxy was used between the WAN network and the Kubernetes network. All traffic to the nodes in the Kubernetes network must pass through the proxy, separating the cluster from public access. Traffic to the proxy was secured with an SSL certificate.
Kubernetes was found to be suitable platform for a software as a service product. Running containers inside Kubernetes required definition of multiple different layers and services which increased the complexity of the backend administration.