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:

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. Nadat het adres EXTERNAL-IP is gewijzigd van pending in een IP-adres, gebruikt u Control + C om het controleproces van kubectl te stoppen.

$ kubectl get service azure-vote-front --watch

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.215.27   <pending>     80:30747/TCP   22s
azure-vote-front   LoadBalancer   10.0.215.27   40.117.57.239   80:30747/TCP   2m

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:

Azure sample vote application running in AKS

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@<PublicIPAddres>

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 en Verbinding maken installeren in 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.

    Jenkins environment variables

  • 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
{
  "appId": "626dd8ea-042d-4043-a8df-4ef56273670f",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "1ceb4df3-c567-4fb6-955e-f95ac9460297",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

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:

Create a Jenkins credential object with the service principal information

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:

  1. Voer azure-vote in als taaknaam. Kies Freestyle-project en selecteer VERVOLGENS OK

  2. 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

  3. 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.git

  4. Selecteer in de sectie Build-triggers gitHub-hooktrigger voor GITscm-polling

  5. Selecteer Onder Build Environment de optie Geheime teksten of bestanden gebruiken

  6. Selecteer Onder Bindingen de optie Gebruikersnaam en wachtwoord toevoegen>(gescheiden)

    • Voer ACR_ID in voor de gebruikersnaamvariabele en ACR_PASSWORD voor de wachtwoordvariabele

      Jenkins bindings

  7. 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
    
  8. 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
    
  9. 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.

Jenkins test build

De eerste build duurt langer naarmate de Docker-installatiekopielagen naar de Jenkins-server worden getrokken.

De builds voeren de volgende taken uit:

  1. Kloont de GitHub-opslagplaats
  2. Hiermee wordt een nieuwe containerinstallatiekopieën gebouwd
  3. Pusht de containerinstallatiekopieën naar het ACR-register
  4. 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:

  1. Blader in een webbrowser naar uw geforkte GitHub-opslagplaats.

  2. Selecteer Instellingen, selecteer daarna Webhooks aan de linkerkant.

  3. 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 .

  4. Selecteer Webhook toevoegen.

    Create a GitHub webhook for Jenkins

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:

  1. De GitHub-webhook meldt Jenkins.
  2. Jenkins start de buildtaak en haalt de meest recente codedoorvoering op vanuit GitHub.
  3. Een Docker-build wordt gestart met de bijgewerkte code en de nieuwe containerinstallatiekopieën worden getagd met het nieuwste buildnummer.
  4. Deze nieuwe containerinstallatiekopieën worden naar Azure Container Registry gepusht.
  5. 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:

Sample Azure vote in AKS updated by the Jenkins build job

Volgende stappen