Zelfstudie: Implementeren van GitHub naar Azure Kubernetes Service met behulp van Jenkins

Belangrijk

Veel Azure-services hebben Jenkins-in plug-ins. Sommige van deze in plug-ins worden vanaf 29 februari 2024 niet meer ondersteund. Azure CLI is de momenteel aanbevolen manier om Jenkins te integreren met Azure-services. Raadpleeg het artikel Jenkins-in plug-ins voor Azure voor meer informatie.

In deze zelfstudie wordt een voorbeeld-app geïmplementeerd van GitHub naar 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 jenkins-basisproject.
  • Referenties instellen voor Jenkins om te communiceren met ACR.
  • Maak een Jenkins-build-taak en GitHub webhook voor geautomatiseerde builds.
  • Test de CI/CD-pijplijn om een toepassing in AKS bij te werken op basis van GitHub code-commits.

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 om te worden uitgevoerd 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 repo:

git clone https://github.com/<your-github-account>/azure-voting-app-redis.git

Wijzig in de map van de gekloonde fork:

cd azure-voting-app-redis

Als u de container-afbeeldingen wilt maken die nodig zijn voor de voorbeeldtoepassing, gebruikt u het bestand docker-compose.yaml met :

docker-compose up -d

De vereiste basisafbeeldingen worden getrokken en de toepassingscontainers worden gebouwd. U kunt vervolgens de opdracht docker images gebruiken om de gemaakte afbeelding 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 afbeelding 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 <acrLoginServer> door uw ACR-aanmeldingsserver.

Gebruik de opdracht docker tag om de afbeelding te taggen met de naam van de ACR-aanmeldingsserver en een versienummer van . 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 azure-vote-front-afbeelding naar uw ACR-register. Vervang opnieuw <acrLoginServer> door de naam van de aanmeldingsserver van uw eigen ACR-register, zoals myacrregistry.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 op internet weer te geven. Dit proces kan enkele minuten duren. Als u de voortgang van de implementatie load balancer, gebruikt u de opdracht kubectl get service met het argument . Zodra het EXTERNAL-IP-adres is gewijzigd van In behandeling in een IP-adres,gebruikt u om het kubectl-watchproces 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-voorbeeldtoepassing voor stemmen die wordt uitgevoerd in AKS

Jenkins Controller configureren

Pas de volgende wijzigingen toe om AKS-implementaties vanuit de Jenkins-controller in teschakelen:

Open poort 80 voor binnenkomende poort.

az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM>  \
--port 80 --priority 1020

Vervang <Resource_Group_name> en door de juiste <Jenkins_Controller_VM> waarden.

SSH in de Jenkins-controller

ssh azureuser@<PublicIPAddres>

Vervang <PublicIPAddress> door het IP-adres van de Jenkins-controller.

Aanmelden & bij AzCLI installeren

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 naar AKS

sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>

Vervang <Resource_Group> en door de juiste <AKS_Name> 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 om de naam van de ACR-aanmeldingsserver op te geven. Er wordt naar deze variabele verwezen tijdens de Jenkins-build-taak. Voltooi de volgende stappen om deze omgevingsvariabele te maken:

  • Selecteer aan de linkerkant van de Jenkins-portal De Jenkins-configuratiesysteembeheren

  • Selecteer onder Globale eigenschappende optie Omgevingsvariabelen. Voeg een variabele toe met de naam ACR_LOGINSERVER en de waarde van uw ACR-aanmeldingsserver.

    Jenkins-omgevingsvariabelen

  • Wanneer u klaar is, selecteert u Opslaan onderaan de pagina.

Een Jenkins-referentie voor ACR maken

Tijdens het CI/CD-proces bouwt Jenkins nieuwe containerafbeeldingen op basis van toepassingsupdates en moet deze vervolgens naar het ACR-register pushen.

Als u wilt dat Jenkins bijgewerkte containerafbeeldingen 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 om ACR te gebruiken

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 in de volgende stappen gebruikt om de referentieresource in Jenkins te configureren.

Haal de resource-id van uw ACR-register op met 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 door de juiste <acrLoginServer> waarden.

Maak een roltoewijzing om de inzendersrechten van 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 om de service-principal te maken.

Een referentieresource maken in Jenkins voor de ACR-service-principal

Nu de roltoewijzing is gemaakt in Azure, moet u uw ACR-referenties opslaan in een Jenkins-referentieobject. Er wordt naar deze referenties verwezen tijdens de Jenkins-build-taak.

Terug aan de linkerkant van de Jenkins-portal selecteert u JenkinsBeheren Referenties beheren Globale referenties voor Jenkins Store(onbeperkt)Referenties toevoegen

Zorg ervoor dat het referentie-type 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 is, ziet het aanmeldingsformulier eruit zoals in het volgende voorbeeld:

Een Jenkins-referentieobject maken met de informatie over de service-principal

Selecteer OK en ga terug naar de Jenkins-portal.

Een Jenkins-project maken

Selecteer op de startpagina van de Jenkins-portal Nieuw item aan de linkerkant:

  1. Voer azure-vote in als taaknaam. Kies Freestyle-projecten selecteer vervolgens OK

  2. Selecteer in de sectie Algemeen GitHub project en voer de URL van uw gevorkte opslagplaats in, zoals uw-github-account /azure-voting-app-redis

  3. Selecteer in de sectie Broncodebeheer de optie Git,voer de URL van uw gevorkte opslagplaats in, zoals uw-github-account /azure-voting-app-redis.git

  4. Selecteer in de sectie Triggers bouwen de optie GitHub voor GITscm-polling

  5. Selecteer onder Build Environmentde optie Geheime teksten of bestanden gebruiken

  6. Selecteer onder Bindingende optie Gebruikersnaamen wachtwoord toevoegen (gescheiden)

    • Voer ACR_ID in voor de ACR_IDen ACR_PASSWORD voor de ACR_PASSWORD

      Jenkins-bindingen

  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 containerafbeelding gemaakt en naar het ACR-register pusht.

    # 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 Shell uitvoeren toe en gebruik de volgende tekst. Met dit script wordt de implementatie van de toepassing in AKS bijgewerkt met de nieuwe containerafbeelding 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. Klik na het voltooide menu op Opslaan.

De Jenkins-build testen

Voordat u de taak automatiseert op basis van GitHub commits, moet u de Jenkins-build handmatig testen.

Deze build controleert of de taak correct is geconfigureerd. Het bevestigt dat het juiste Kubernetes-verificatiebestand is gemaakt en dat de verificatie voor ACR werkt.

Selecteer in het menu aan de linkerkant van het project de optie Nu bouwen.

Jenkins-test build

De eerste build is langer omdat de Docker-afbeeldingslagen naar de Jenkins-server worden gehaald.

De builds voeren de volgende taken uit:

  1. Kloont de GitHub opslagplaats
  2. Een nieuwe containerafbeelding maken
  3. Pusht de container-afbeelding naar het ACR-register
  4. Werkt de installatie afbeelding bij die wordt gebruikt door de AKS-implementatie

Omdat er geen wijzigingen zijn aangebracht in de toepassingscode, blijft de webinterface ongewijzigd.

Zodra de build-taak is voltooid, selecteert u build 1 onder buildgeschiedenis. Selecteer Console-uitvoer en bekijk de uitvoer van het buildproces. De laatste regel moet een geslaagde build aangeven.

Een webhook GitHub maken

Nu de handmatige build is voltooid, integreert u GitHub in de Jenkins-build. Gebruik een webhook om de Jenkins-build-taak uit te voeren telkens als code wordt GitHub.

Voltooi de volgende GitHub om de webhook te maken:

  1. Blader naar uw gevorkte GitHub in een webbrowser.

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

  3. Kies Webhook toevoegen. Voer bij Payload URLin, waarbij het <publicIp> IP-adres van de Jenkins-server is. Zorg ervoor dat u de aan het volgende / bevat. Laat de andere standaardwaarden staan voor inhoudstype en om te activeren bij pushgebeurtenissen.

  4. Selecteer Webhook toevoegen.

    Een webhook GitHub Jenkins maken

De volledige CI/CD-pijplijn testen

U kunt nu de hele CI/CD-pijplijn testen. Wanneer u een code-commit naar GitHub pusht, vinden de volgende stappen uit:

  1. De GitHub webhook waarschuwt Jenkins.
  2. Jenkins start de build-taak en haalt de meest recente code-commit op uit GitHub.
  3. Een Docker-build wordt gestart met behulp van de bijgewerkte code en de nieuwe containerafbeelding wordt getagd met het meest recente buildnummer.
  4. Deze nieuwe containerafbeelding wordt naar de Azure Container Registry.
  5. Uw toepassing die wordt uitgevoerd op Azure Kubernetes Service updates met de nieuwste afbeelding van Azure Container Registry.

Open de gekloonde toepassing op uw ontwikkelmachine 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, moet u het bestand opslaan, de wijzigingen doorgevoerd en naar uw fork van de GitHub pushen. De GitHub webhook activeert een nieuwe build-taak in Jenkins. Controleer het bouwproces in het Jenkins-webdashboard. Het duurt een paar seconden om de meest recente code op te halen, de bijgewerkte afbeelding te maken en te pushen en de bijgewerkte toepassing in AKS te implementeren.

Nadat de build is voltooid, vernieuwt u de webbrowser van de Azure Vote-voorbeeldtoepassing. Uw wijzigingen worden weergegeven, zoals wordt weergegeven in het volgende voorbeeld:

Voorbeeld van Azure Vote in AKS bijgewerkt door de Jenkins-build-taak

Volgende stappen