Zelfstudie: Implementeren van GitHub naar Azure Kubernetes Service met behulp van Jenkins
Belangrijk
Veel Azure-services hebben Jenkins-invoegtoepassingen. Sommige van deze invoegtoepassingen worden vanaf 29 februari 2024 niet meer ondersteund. Azure CLI is momenteel de aanbevolen manier om Jenkins te integreren met Azure-services. Raadpleeg het artikel Jenkins-invoegtoepassingen voor Azure voor meer informatie.
In deze zelfstudie wordt een voorbeeld-app van GitHub geïmplementeerd in een AKS-cluster (Azure Kubernetes Service) door continue integratie (CI) en continue implementatie (CD) in Jenkins in te stellen.
In deze zelfstudie voert u de volgende taken uit:
- Een azure vote-voorbeeld-app implementeren in een AKS-cluster.
- Maak een eenvoudig Jenkins-project.
- Stel referenties in voor Jenkins om te communiceren met ACR.
- Maak een Jenkins-buildtaak en GitHub-webhook voor geautomatiseerde builds.
- Test de CI/CD-pijplijn om een toepassing in AKS bij te werken op basis van GitHub-codedoorvoeringen.
Vereisten
Voor het voltooien van deze zelfstudie hebt u de volgende items nodig:
Basiskennis van Kubernetes, Git, CI/CD en containerinstallatiekopieën
Een AKS-cluster en
kubectl
geconfigureerd met de AKS-clusterreferenties.Een ACR-register (Azure Container Registry), de naam van de ACR-aanmeldingsserver en het AKS-cluster dat is geconfigureerd voor verificatie met het ACR-register.
Een Jenkins-controller die is geïmplementeerd op een virtuele Azure-machine.
De Azure CLI versie 2.0.46 of hoger is geïnstalleerd en geconfigureerd. Voer
az --version
uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.Docker geïnstalleerd op uw ontwikkelsysteem
Een GitHub-account, een persoonlijk GitHub-toegangstoken en een Git-client die op uw ontwikkelsysteem is geïnstalleerd
Als u uw eigen Jenkins-exemplaar opgeeft in plaats van dit voorbeeldscript om Jenkins te implementeren, moet Docker zijn geïnstalleerd en geconfigureerd voor uw Jenkins-exemplaar en kubectl.
Uw app voorbereiden
In dit artikel gebruikt u een Azure Vote-voorbeeldtoepassing die een webinterface en Redis bevat voor tijdelijke gegevensopslag.
Voordat u Jenkins en AKS integreert voor geautomatiseerde implementaties, moet u eerst de Azure Vote-toepassing handmatig voorbereiden en implementeren in uw AKS-cluster. Met deze handmatige implementatie kunt u de toepassing in actie zien.
Notitie
De Azure Vote-voorbeeldtoepassing maakt gebruik van een Linux-pod die is gepland voor uitvoering op een Linux-knooppunt. De stroom die in dit artikel wordt beschreven, werkt ook voor een Windows Server-pod die is gepland op een Windows Server-knooppunt.
Fork de volgende GitHub-opslagplaats voor de voorbeeldtoepassing - https://github.com/Azure-Samples/azure-voting-app-redis. Om de opslagplaats naar uw eigen GitHub-account te vertakken, selecteert u de knop Fork in de rechterbovenhoek.
Kloon de fork naar uw ontwikkelsysteem. Zorg ervoor dat u de URL van uw fork gebruikt bij het klonen van deze opslagplaats:
git clone https://github.com/<your-github-account>/azure-voting-app-redis.git
Ga naar de map van de gekloonde fork:
cd azure-voting-app-redis
Als u de containerinstallatiekopieën wilt maken die nodig zijn voor de voorbeeldtoepassing, gebruikt u het bestand docker-compose.yaml met docker-compose
:
docker-compose up -d
De vereiste basisinstallatiekopieën worden opgehaald en de toepassingscontainers zijn gebouwd. Vervolgens kunt u de opdracht docker-installatiekopieën gebruiken om de gemaakte installatiekopieën te bekijken. Er zijn drie installatiekopieën gedownload of gemaakt. De azure-vote-front
-installatiekopie bevat de toepassing en gebruikt de nginx-flask
-installatiekopie als basis. De redis
installatiekopie wordt gebruikt om een Redis-exemplaar te starten:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
azure-vote-front latest 9cc914e25834 40 seconds ago 694MB
redis latest a1b99da73d05 7 days ago 106MB
tiangolo/uwsgi-nginx-flask flask 788ca94b2313 9 months ago 694MB
Meld u aan bij uw Azure-containerregister.
az acr login -n <acrLoginServer>
Vervang door <acrLoginServer>
uw ACR-aanmeldingsserver.
Gebruik de opdracht docker-tag om de installatiekopieën te taggen met de naam van de ACR-aanmeldingsserver en een versienummer van v1
. Gebruik uw eigen <acrLoginServer>
naam die u in de vorige stap hebt verkregen:
docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1
Push ten slotte de installatiekopieën van azure-vote-front naar uw ACR-register. <acrLoginServer>
Vervang opnieuw door de naam van de aanmeldingsserver van uw eigen ACR-register, zoalsmyacrregistry.azurecr.io
:
docker push <acrLoginServer>/azure-vote-front:v1
De voorbeeldtoepassing implementeren in AKS
Als u de voorbeeldtoepassing wilt implementeren in uw AKS-cluster, kunt u het Kubernetes-manifestbestand gebruiken in de hoofdmap van de Opslagplaats voor Azure Vote. Open het azure-vote-all-in-one-redis.yaml
manifestbestand met een editor, zoals vi
. Vervang microsoft
door de naam van de ACR-aanmeldingsserver. Deze waarde vindt u op regel 60 van het manifestbestand:
containers:
- name: azure-vote-front
image: azuredocs/azure-vote-front
Gebruik vervolgens de opdracht kubectl apply om de toepassing te implementeren in uw AKS-cluster:
kubectl apply -f azure-vote-all-in-one-redis.yaml
Er wordt een Kubernetes Load Balancer-service gemaakt om de toepassing beschikbaar te maken op internet. Dit proces kan enkele minuten in beslag nemen. Als u de voortgang van de implementatie van de load balancer wilt controleren, gebruikt u de opdracht kubectl get service met het --watch
argument.
$ kubectl get service azure-vote-front --watch
Nadat het adres EXTERNAL-IP is gewijzigd van pending in een IP-adres, gebruikt u Control + C
om het controleproces van kubectl te stoppen.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Als u de toepassing in actie wilt zien, opent u een webbrowser naar het externe IP-adres van uw service. De Azure Vote-toepassing wordt weergegeven, zoals wordt weergegeven in het volgende voorbeeld:
Jenkins-controller configureren
Pas de volgende wijzigingen toe om AKS-implementaties vanuit de Jenkins-controller in te schakelen:
Open poort 80
binnenkomend.
az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM> \
--port 80 --priority 1020
Vervang <Resource_Group_name>
en <Jenkins_Controller_VM>
door de juiste waarden.
SSH in de Jenkins-controller
ssh azureuser@<PublicIPAddress>
Vervang <PublicIPAddress>
door het IP-adres van de Jenkins-controller.
Installeren en aanmelden in AzCLI
curl -L https://aka.ms/InstallAzureCli | bash
az login
Notitie
Volg deze instructies om AzCLI handmatig te installeren.
Docker installeren
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;
Kubectl installeren en verbinding maken met AKS
sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>
Vervang <Resource_Group>
en <AKS_Name>
door de juiste waarden.
Toegang configureren
sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config
Een Jenkins-omgevingsvariabele maken
Een Jenkins-omgevingsvariabele wordt gebruikt voor het opslaan van de naam van de ACR-aanmeldingsserver. Naar deze variabele wordt verwezen tijdens de Jenkins-buildtaak. Voer de volgende stappen uit om deze omgevingsvariabele te maken:
Selecteer Aan de linkerkant van de Jenkins-portal de optie Jenkins>Configure System beheren
Selecteer onder Globale eigenschappen omgevingsvariabelen. Voeg een variabele toe met de naam
ACR_LOGINSERVER
en de waarde van uw ACR-aanmeldingsserver.Wanneer u klaar bent, selecteert u Opslaan onderaan de pagina.
Een Jenkins-referentie maken voor ACR
Tijdens het CI/CD-proces bouwt Jenkins nieuwe containerinstallatiekopieën op basis van toepassingsupdates en moet deze installatiekopieën vervolgens naar het ACR-register pushen .
Als u wilt dat Jenkins bijgewerkte containerinstallatiekopieën naar ACR pusht, moet u referenties voor ACR opgeven.
Voor scheiding van rollen en machtigingen configureert u een service-principal voor Jenkins met inzendermachtigingen voor uw ACR-register.
Een service-principal maken voor Jenkins voor het gebruik van ACR
Maak eerst een service-principal met behulp van de opdracht az ad sp create-for-rbac :
az ad sp create-for-rbac
Met deze opdracht wordt uitvoer geproduceerd die vergelijkbaar is met het volgende voorbeeld:
{
"appId": "<app-ID>",
"displayName": "azure-cli-2018-09-28-22-19-34",
"name": "http://azure-cli-2018-09-28-22-19-34",
"password": "<password>",
"tenant": "<tenant-ID>"
}
Noteer de appId en wachtwoord. Deze waarden worden gebruikt in de volgende stappen om de referentieresource in Jenkins te configureren.
Haal de resource-id van uw ACR-register op met behulp van de opdracht az acr show en sla deze op als een variabele.
ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)
Vervang <Resource_Group>
en <acrLoginServer>
door de juiste waarden.
Maak een roltoewijzing om de rechten van de inzender voor de service-principal toe te wijzen aan het ACR-register.
az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID
Vervang <appId>
door de waarde die is opgegeven in de uitvoer van de pervious-opdracht die wordt gebruikt om de service-principal te maken.
Een referentieresource maken in Jenkins voor de ACR-service-principal
Nu de roltoewijzing is gemaakt in Azure, slaat u uw ACR-referenties op in een Jenkins-referentieobject. Er wordt naar deze referenties verwezen tijdens de Jenkins-buildtaak.
Selecteer aan de linkerkant van de Jenkins-portal de optie Manage Jenkins>Manage Credentials>Jenkins Store>Global credentials (onbeperkte)>Add Credentials
Zorg ervoor dat het type referentie gebruikersnaam met wachtwoord is en voer de volgende items in:
- Gebruikersnaam : de appId van de service-principal die is gemaakt voor verificatie met uw ACR-register.
- Wachtwoord : het wachtwoord van de service-principal die is gemaakt voor verificatie met uw ACR-register.
- Id - Referentie-id, zoals acr-credentials
Wanneer u klaar bent, ziet het formulier met referenties eruit zoals in het volgende voorbeeld:
Selecteer OK en ga terug naar de Jenkins-portal.
Een Jenkins-project maken
Selecteer nieuw item aan de linkerkant op de startpagina van uw Jenkins-portal:
Voer azure-vote in als taaknaam. Kies Freestyle-project en selecteer VERVOLGENS OK
Selecteer in de sectie Algemeen het GitHub-project en voer de URL van uw vervalste opslagplaats in, zoals https://github.com/<uw-github-account>/azure-voting-app-redis
Selecteer Git in de sectie Broncodebeheer, voer de URL van uw vervalste opslagplaats
.git
in, zoalshttps://github.com/< uw github-account>/azure-voting-app-redis.gitSelecteer in de sectie Build-triggers gitHub-hooktrigger voor GITscm-polling
Selecteer Onder Build Environment de optie Geheime teksten of bestanden gebruiken
Selecteer Onder Bindingen de optie Gebruikersnaam en wachtwoord toevoegen>(gescheiden)
Voer
ACR_ID
in voor de gebruikersnaamvariabele enACR_PASSWORD
voor de wachtwoordvariabele
Kies ervoor om een buildstap van het type Execute Shell toe te voegen en gebruik de volgende tekst. Met dit script wordt een nieuwe containerinstallatiekopieën gemaakt en naar uw ACR-register gepusht.
# Build new image and push to ACR. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" docker build -t $WEB_IMAGE_NAME ./azure-vote docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD} docker push $WEB_IMAGE_NAME
Voeg nog een buildstap van het type Execute Shell toe en gebruik de volgende tekst. Met dit script wordt de implementatie van de toepassing in AKS bijgewerkt met de nieuwe containerinstallatiekopieën van ACR.
# Update kubernetes deployment with new image. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
Nadat u klaar bent, klikt u op Opslaan.
De Jenkins-build testen
Voordat u de taak automatiseert op basis van GitHub-doorvoeringen, test u de Jenkins-build handmatig.
Deze build valideert dat de taak correct is geconfigureerd. Er wordt bevestigd dat het juiste Kubernetes-verificatiebestand aanwezig is en dat de verificatie voor ACR werkt.
Selecteer Nu bouwen in het menu aan de linkerkant van het project.
De eerste build duurt langer naarmate de Docker-installatiekopielagen naar de Jenkins-server worden getrokken.
De builds voeren de volgende taken uit:
- Kloont de GitHub-opslagplaats
- Hiermee wordt een nieuwe containerinstallatiekopieën gebouwd
- Pusht de containerinstallatiekopieën naar het ACR-register
- Hiermee werkt u de installatiekopieën bij die worden gebruikt door de AKS-implementatie
Omdat er geen wijzigingen zijn aangebracht in de toepassingscode, is de webgebruikersinterface ongewijzigd.
Zodra de buildtaak is voltooid, selecteert u build 1 onder de buildgeschiedenis. Selecteer Console-uitvoer en bekijk de uitvoer van het buildproces. De laatste regel moet duiden op een geslaagde build.
Een GitHub-webhook maken
Nu een geslaagde handmatige build is voltooid, integreert u GitHub in de Jenkins-build. Gebruik een webhook om de Jenkins-buildtaak uit te voeren telkens wanneer code wordt doorgevoerd in GitHub.
Voer de volgende stappen uit om de GitHub-webhook te maken:
Blader in een webbrowser naar uw geforkte GitHub-opslagplaats.
Selecteer Instellingen, selecteer daarna Webhooks aan de linkerkant.
Kies ervoor om een webhook toe te voegen. Voer
http://<publicIp:8080>/github-webhook/
<publicIp>
voor de payload-URL het IP-adres van de Jenkins-server in. Zorg ervoor dat u het volgpad/
opneemt. Laat de andere standaardwaarden voor het inhoudstype staan en om te activeren bij pushgebeurtenissen .Selecteer Webhook toevoegen.
De volledige CI/CD-pijplijn testen
U kunt nu de hele CI/CD-pijplijn testen. Wanneer u een codedoorvoering naar GitHub pusht, worden de volgende stappen uitgevoerd:
- De GitHub-webhook meldt Jenkins.
- Jenkins start de buildtaak en haalt de meest recente codedoorvoering op vanuit GitHub.
- Een Docker-build wordt gestart met de bijgewerkte code en de nieuwe containerinstallatiekopieën worden getagd met het nieuwste buildnummer.
- Deze nieuwe containerinstallatiekopieën worden naar Azure Container Registry gepusht.
- Uw toepassing die wordt uitgevoerd in Azure Kubernetes Service wordt bijgewerkt met de nieuwste installatiekopieën van Azure Container Registry.
Open de gekloonde toepassing op uw ontwikkelcomputer met een code-editor. Open onder de map /azure-vote/azure-vote het bestand met de naam config_file.cfg. Werk de stemwaarden in dit bestand bij naar iets anders dan katten en honden, zoals wordt weergegeven in het volgende voorbeeld:
# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'
Wanneer het bestand is bijgewerkt, slaat u het bestand op, voert u de wijzigingen door en pusht u deze naar uw fork van de GitHub-opslagplaats. De GitHub-webhook activeert een nieuwe buildtaak in Jenkins. Controleer het buildproces in het Jenkins-webdashboard. Het duurt enkele seconden om de meest recente code op te halen, de bijgewerkte installatiekopie te maken en te pushen en de bijgewerkte toepassing in AKS te implementeren.
Zodra de build is voltooid, vernieuwt u de webbrowser van de voorbeeldtoepassing azure vote. Uw wijzigingen worden weergegeven, zoals wordt weergegeven in het volgende voorbeeld: