Een OTAP-straat is onmisbaar voor een stabiel ontwikkelproces. Toch wordt vaak niet of mondjesmaat gebruik gemaakt van een ontwikkelstraat. Een aparte omgeving voor Ontwikkeling, Test, Acceptatie en Productie zorgt voor een hogere kwaliteit van je code. Doordat je voor iedere fase van de softwareontwikkeling een afscheiden omgeving hebt, heb je meer controle over je testproces en je uiteindelijke deployments.
Door naast je lokale ontwikkelomgeving een test- en een acceptatieomgeving in te richten, kan je in je team codewijzigingen testen voordat ze ter acceptatie naar de klant gaan, en zorg je dat wijzigingen pas op de productieomgeving terechtkomen als alle seinen op groen staan. Om de testbaarheid en betrouwbaarheid van je code te waarborgen, is het van belang dat je ontwikkelstraat met zorg is ingericht. Je wilt dat de omgeving waarop je applicatie draait, bij iedere fase in het proces identiek is.
Wij zien in de praktijk vaak moeilijkheden bij het inrichten en vervolgens bij het onderhouden van een OTAP-straat. Met de opkomst van Docker en Kubernetes, wordt de inrichting van een OTAP-straat een stuk eenvoudiger en automatiseer je het proces waarmee de code tussen de verschillende stappen van je ontwikkelstraat beweegt.
Waarom Docker en Kubernetes?
In een traditionele ontwikkelstraat, zet je per fase in je ontwikkelproces een omgeving neer. Een omgeving waarop je applicatie getest wordt, een omgeving waarop de acceptatie-versie draait en een omgeving waarop de productie-versie draait. Zorgen dat de juiste omgeving de juiste code heeft, kan al een uitdaging zijn. Daar komt dan nog bij dat de configuratie van iedere omgeving dient te zijn en te blijven. Anders kan je in de situatie belanden dat je applicatie perfect draait op je acceptatie-server en dan tijdens de livegang op de productie-omgeving ineens problemen geeft omdat die ene serverinstelling net iets anders is.
De rol van Docker
Docker zorgt voor volledig reproduceerbare omgevingen, waarin je zowel de configuratie van je omgeving als je applicatie bundelt. Dat geeft je betere controle over hoe je omgeving eruit ziet en vereenvoudigt het opzetten van je ontwikkelstraat. Docker stelt je in staat in één configuratie te definiëren hoe je volledige omgeving opgebouwd dient te worden. Op basis van die configuratie, kan je overal je Docker-omgeving opstarten. De overhead die het opzetten van een nieuwe omgeving per project en per ontwikkelfase met zich meebrengt, wordt met Docker volledig weggenomen.
De rol van Kubernetes
Met Docker regel je dat je snel een omgeving met je applicatie kunt neerzetten, maar je hebt ook tooling nodig waarmee je je Docker-containers beheert: hoe wordt geregeld dat een container na een crash opnieuw opstart, dat je containers onderling met elkaar kunnen communiceren (je applicatie-omgeving en de database-server bijvoorbeeld) of dat je storage veilig is? Dat regel je met een container orchestration tool. De leidende orchestrator voor Docker containers is Kubernetes.
Ontwikkelstraat met Docker en Kubernetes: de theorie
Er zijn diverse manieren om tot de gewenste ontwikkelstraat met behulp van Docker en Kubernetes te komen. In de praktijk zien we dat je ontwikkelstraat vaak gecombineerd wordt met CI/CD: iedere codewijziging op de betreffende branch in je Git-repository triggert je deployment pipeline:
- De git-repository wordt opnieuw gecloned
- Op basis van je Docker-configuratiebestand wordt een nieuwe omgeving gebouwd
- De nieuwe omgeving komt online (op je test-, acceptatie- of productie-URL).
Omdat je Dockerfile onder versiebeheer hebt, kan je van iedere branch een nieuwe omgeving opzetten. Daardoor zijn je ‘hostingomgeving’ én je applicatie altijd met elkaar in sync, ze staan namelijk beiden onder versiebeheer in dezelfde repository.
Ontwikkelstraat met Docker en Kubernetes: de praktijk
Het werken met een geautomatiseerde ontwikkelstraat stelt een paar eisen aan je ontwikkelproces. Niet iedere applicatie is out-of-the-box geschikt voor het automatiseren van je ontwikkelstraat en CI/CD. Als we in het achterhoofd houden dat iedere nieuwe codewijziging een nieuwe deployment triggert en een nieuwe Docker-omgeving bouwt, dan heeft dat een grote impact op de manier waarop je applicatie opgezet zal worden en zal gaan draaien. In deze context wordt veel gerefereerd aan de 12-factor principles: de belangrijkste principes die van belang zijn bij het ontwikkelen van ‘moderne’ en ‘cloud native’ software. Onderstaand de belangrijkste van deze twaalf principes die voor Docker / Kubernetes van belang zijn.
- Alle code moet onder versiebeheer. Je code repository vormt immers de basis voor iedere nieuwe Docker-container.
- Dependency management. Afhankelijkheid van zaken die je zelf niet onder controle hebt is altijd een potentieel risico. Daarom wil je je dependency management goed op orde hebben. Daarom adviseren wij je ook je software dependencies onder versiebeheer brengen (voor PHP-applicaties met Composer, voor Javascript-applicaties met NPM/Yarn voor Ruby met RubyGems, etc).
- Je applicatie dient stateless te zijn: Zodra er een Docker-container met de nieuwe versie van je applicatie online komt, is het niet de bedoeling dat je uploads van de gebruiker, geplaatste berichten of andere zaken kwijt bent. De bezoeker of gebruiker van je applicatie mag dus geen sporen achterlaten in je applicatie. Kunnen gebruikers bijvoorbeeld afbeeldingen uploaden, dan dienen deze ergens centraal opgeslagen te worden. Maak je gebruik van een database? Dan dient deze uiteraard ook buiten je Docker-container te draaien.
Bestaande applicaties volledig herschrijven volgens het 12 factor principe is een tijdrovende en vaak onrealistische klus. Gelukkig realiseer je met relatief kleine ingrepen al de noodzakelijke punten waardoor je met Docker en Kubernetes je ontwikkelstraat kunt inrichten en automatiseren.
Aan de slag!
In veel gevallen is de stap naar Docker niet zo groot als het lijkt. Ook de inzet van Kubernetes is met alle moderne tooling en mogelijkheden niet meer ver weg. Het vereist vooral een andere mindset. Zodra je je coderepository een goede Dockerfile bevat, heb je in één oogopslag een ontwikkelomgeving opgezet:
Wij adviseren je graag hoe je Docker en Kubernetes optimaal inzet in jouw omgeving. Ook kunnen wij de Docker-omgeving voor je bouwen.