Öğretici: Jenkins kullanarak GitHub'dan Azure Kubernetes Service'e dağıtma

Önemli

Birçok Azure hizmeti Jenkins eklentilerine sahiptir. Bu eklentilerden bazıları 29 Şubat 2024 itibarıyla destekten çıkarılacaktır. Azure CLI, Jenkins'i Azure hizmetleriyle tümleştirmenin şu anda önerilen yoludur. Daha fazla bilgi için Azure için Jenkins eklentileri makalesine bakın.

Bu öğretici, Jenkins'te sürekli tümleştirme (CI) ve sürekli dağıtım (CD) ayarlayarak GitHub'dan Azure Kubernetes Service (AKS) kümesine örnek bir uygulama dağıtır.

Bu öğreticide şu görevleri tamamlayacaksınız:

  • Aks kümesine örnek bir Azure vote uygulaması dağıtın.
  • Temel bir Jenkins projesi oluşturun.
  • Jenkins'in ACR ile etkileşim kuracak kimlik bilgilerini ayarlayın.
  • Otomatik derlemeler için bir Jenkins derleme işi ve GitHub web kancası oluşturun.
  • GITHub kod işlemelerini temel alarak AKS'de bir uygulamayı güncelleştirmek için CI/CD işlem hattını test edin.

Önkoşullar

Bu öğreticiyi tamamlamak için şu öğelere ihtiyacınız vardır:

Uygulamanızı hazırlama

Bu makalede, geçici veri depolama için bir web arabirimi ve Redis içeren örnek bir Azure vote uygulaması kullanacaksınız.

Jenkins ve AKS'yi otomatik dağıtımlar için tümleştirmeden önce Azure vote uygulamasını el ile hazırlayın ve AKS kümenize dağıtın. Bu el ile dağıtım, uygulamayı uygulamada görmenizi sağlar.

Dekont

Örnek Azure vote uygulaması, Linux düğümünde çalışacak şekilde zamanlanmış bir Linux podunu kullanır. Bu makalede özetlenen akış, Windows Server düğümünde zamanlanmış bir Windows Server podunda da çalışır.

Örnek uygulama için aşağıdaki GitHub deposunu oluşturun - https://github.com/Azure-Samples/azure-voting-app-redis. Depo için GitHub hesabınızda çatal oluşturmak üzere sağ üst köşedeki Fork (Çatal Oluştur) düğmesini seçin.

Çatalı geliştirme sisteminize kopyalama. Bu depoyu klonlarken çatalınızın URL'sini kullandığınızdan emin olun:

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

Kopyalanan çatalınızın dizinine geçin:

cd azure-voting-app-redis

Örnek uygulama için gereken kapsayıcı görüntülerini oluşturmak için ile docker-composedocker-compose.yaml dosyasını kullanın:

docker-compose up -d

Gerekli temel görüntüler çekilir ve uygulama kapsayıcıları oluşturulur. Ardından docker images komutunu kullanarak oluşturulan görüntüyü görebilirsiniz. Üç görüntü indirilir veya oluşturulur. azure-vote-front görüntüsü uygulamayı içerir ve temel olarak nginx-flask görüntüsünü kullanır. Görüntü redis , redis örneğini başlatmak için kullanılır:

$ 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

Azure kapsayıcı kayıt defterinizde oturum açın.

az acr login -n <acrLoginServer>

değerini ACR oturum açma sunucunuzla değiştirin <acrLoginServer> .

Görüntüyü ACR oturum açma sunucusu adı ve sürüm numarası v1ile etiketlemek için docker tag komutunu kullanın. Önceki adımda elde edilen kendi <acrLoginServer> adınızı kullanın:

docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1

Son olarak azure-vote-front görüntüsünü ACR kayıt defterinize gönderin. Değerini yeniden kendi ACR kayıt defterinizin oturum açma sunucusu adıyla değiştirin <acrLoginServer> ; örneğin myacrregistry.azurecr.io:

docker push <acrLoginServer>/azure-vote-front:v1

Örnek uygulamayı AKS'ye dağıtma

Örnek uygulamayı AKS kümenize dağıtmak için Azure vote deposu deposunun kökündeki Kubernetes bildirim dosyasını kullanabilirsiniz. azure-vote-all-in-one-redis.yaml Bildirim dosyasını gibi vibir düzenleyiciyle açın. microsoft yerine ACR oturum açma sunucunuzun adını yazın. Bu değer bildirim dosyasının 60. satırında bulunur:

containers:
- name: azure-vote-front
  image: azuredocs/azure-vote-front

Ardından kubectl apply komutunu kullanarak uygulamayı AKS kümenize dağıtın:

kubectl apply -f azure-vote-all-in-one-redis.yaml

Uygulamayı İnternet'te kullanıma açmak için bir Kubernetes yük dengeleyici hizmeti oluşturulur. Bu işlem birkaç dakika sürebilir. Yük dengeleyici dağıtımının ilerleme durumunu izlemek için kubectl get service komutunu bağımsız değişkeniyle birlikte --watch kullanın. EXTERNAL-IP adresi pending durumundan IP address değerine değiştiğinde kubectl izleme işlemini durdurmak için Control + C komutunu kullanın.

$ 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

Uygulamayı uygulamada görmek için, hizmetinizin dış IP adresine bir web tarayıcısı açın. Aşağıdaki örnekte gösterildiği gibi Azure vote uygulaması görüntülenir:

Azure sample vote application running in AKS

Jenkins Denetleyicisini Yapılandırma

Jenkins Denetleyicisi'nden AKS dağıtımlarını etkinleştirmek için aşağıdaki değişiklikleri uygulayın:

Gelen bağlantı noktasını 80 açın.

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

ve <Jenkins_Controller_VM> değerlerini uygun değerlerle değiştirin<Resource_Group_name>.

Jenkins Denetleyicisine SSH

ssh azureuser@<PublicIPAddres>

değerini Jenkins Denetleyicisi'nin IP adresiyle değiştirin <PublicIPAddress> .

AzCLI'yi Yükleme ve Oturum Açma

curl -L https://aka.ms/InstallAzureCli | bash
az login

Dekont

AzCLI'yi el ile yüklemek için bu yönergeleri izleyin.

Docker'ı yükleme

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 ve Bağlan AKS'ye yükleme

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

ve <AKS_Name> değerlerini uygun değerlerle değiştirin<Resource_Group>.

Erişimi yapılandırma

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

Jenkins ortam değişkeni oluşturma

Jenkins ortam değişkeni, ACR oturum açma sunucusu adını tutmak için kullanılır. Jenkins derleme işi sırasında bu değişkene başvurulur. Bu ortam değişkenini oluşturmak için aşağıdaki adımları tamamlayın:

  • Jenkins portalının sol tarafında Jenkins>Yapılandırma Sistemini Yönet'i seçin

  • Genel Özellikler'in altında Ortam değişkenleri'ni seçin. ACR oturum açma sunucunuzun adını ACR_LOGINSERVER ve değerini içeren bir değişken ekleyin.

    Jenkins environment variables

  • Tamamlandığında, sayfanın alt kısmındaki Kaydet'i seçin.

ACR için Jenkins kimlik bilgisi oluşturma

CI/CD işlemi sırasında Jenkins, uygulama güncelleştirmelerini temel alan yeni kapsayıcı görüntüleri oluşturur ve ardından bu görüntüleri ACR kayıt defterine göndermesi gerekir.

Jenkins'in güncelleştirilmiş kapsayıcı görüntülerini ACR'ye göndermesine izin vermek için ACR kimlik bilgilerini belirtmeniz gerekir.

Rollerin ve izinlerin ayrılması için Jenkins için ACR kayıt defterinizde Katkıda Bulunan izinlerine sahip bir hizmet sorumlusu yapılandırın.

Jenkins'in ACR kullanması için hizmet sorumlusu oluşturma

İlk olarak az ad sp create-for-rbac komutunu kullanarak bir hizmet sorumlusu oluşturun:

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"
}

appId ve password değerlerini not edin. Bu değerler Jenkins'te kimlik bilgisi kaynağını yapılandırmak için aşağıdaki adımlarda kullanılır.

az acr show komutunu kullanarak ACR kayıt defterinizin kaynak kimliğini alın ve bunu değişken olarak depolayın.

ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)

ve <acrLoginServer> değerlerini uygun değerlerle değiştirin<Resource_Group>.

Hizmet sorumlusu Katkıda Bulunan haklarını ACR kayıt defterine atamak için bir rol ataması oluşturun.

az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID

değerini, hizmet sorumlusunu oluşturmak için kullanılan sapkın komutun çıkışında sağlanan değerle değiştirin <appId> .

Jenkins'te ACR hizmet sorumlusu için kimlik bilgisi kaynağı oluşturma

Azure'da oluşturulan rol atamasıyla, şimdi ACR kimlik bilgilerinizi bir Jenkins kimlik bilgisi nesnesinde depolayın. Bu kimlik bilgilerine Jenkins derleme işi sırasında başvurulur.

Jenkins portalının sol tarafında Jenkins Kimlik Bilgilerini>Yönet Jenkins>Deposu>Genel kimlik bilgilerini (kısıtlamasız)>Kimlik Bilgileri Ekle'yi seçin

Kimlik bilgisi türünün Parolalı Kullanıcı Adı olduğundan emin olun ve aşağıdaki öğeleri girin:

  • Kullanıcı adı - ACR kayıt defterinizle kimlik doğrulaması için oluşturulan hizmet sorumlusunun appId değeri.
  • Parola - ACR kayıt defterinizle kimlik doğrulaması için oluşturulan hizmet sorumlusunun parolası .
  • Kimlik - acr-credentials gibi kimlik bilgisi tanımlayıcısı

Tamamlandığında, kimlik bilgileri formu aşağıdaki örneğe benzer:

Create a Jenkins credential object with the service principal information

Tamam'ı seçin ve Jenkins portalına dönün.

Jenkins projesi oluşturma

Jenkins portalınızın giriş sayfasından sol taraftaki Yeni öğe'yi seçin:

  1. azure-vote'i iş adı olarak girin. Serbest stil proje'yi ve ardından Tamam'ı seçin

  2. Genel bölümünün altında GitHub projesi'ni seçin ve çatallanmış depo URL'nizi girin; örneğinhttps://github.com/<, your-github-account>/azure-voting-app-redis

  3. Kaynak kodu yönetimi bölümünde Git'i seçin, çatallanmış depo .git URL'nizi girin; örneğinhttps://github.com/<, your-github-account>/azure-voting-app-redis.git

  4. Derleme Tetikleyicileri bölümünde GITscm yoklaması için GitHub kanca tetikleyicisi'ni seçin

  5. Derleme Ortamı'nın altında Gizli dizi metinleri veya dosyaları kullan'ı seçin

  6. Bağlamalar'ın altında Kullanıcı adı ve parola ekle 'yi>seçin (ayrılmış)

    • Kullanıcı Adı Değişkeni ve ACR_PASSWORD Parola Değişkeni için girin ACR_ID

      Jenkins bindings

  7. Execute shell türünde bir Derleme Adımı eklemeyi seçin ve aşağıdaki metni kullanın. Bu betik yeni bir kapsayıcı görüntüsü oluşturur ve ACR kayıt defterinize gönderir.

    # 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. Execute shell türünde başka bir Derleme Adımı ekleyin ve aşağıdaki metni kullanın. Bu betik AKS'deki uygulama dağıtımını ACR'deki yeni kapsayıcı görüntüsüyle güncelleştirir.

    # 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. Tamamlandıktan sonra Kaydet'e tıklayın.

Jenkins derlemesini test etme

GitHub işlemelerini temel alarak işi otomatikleştirmeden önce Jenkins derlemesini el ile test edin.

Bu derleme, işin doğru yapılandırıldığını doğrular. Doğru Kubernetes kimlik doğrulama dosyasının yerinde olduğunu ve ACR kimlik doğrulamasının çalıştığını onaylar.

Projenin sol tarafındaki menüde Şimdi Derle'yi seçin.

Jenkins test build

Docker görüntü katmanları Jenkins sunucusuna çekilirken ilk derleme daha uzun sürer.

Derlemeler aşağıdaki görevleri yerine getirin:

  1. GitHub deposunu klonlar
  2. Yeni bir kapsayıcı görüntüsü oluşturur
  3. Kapsayıcı görüntüsünü ACR kayıt defterine gönderir
  4. AKS dağıtımı tarafından kullanılan görüntüyü Güncelleştirmeler

Uygulama kodunda hiçbir değişiklik yapılmadığından web kullanıcı arabirimi değiştirilmez.

Derleme işi tamamlandıktan sonra derleme geçmişi'nin altında derleme #1'i seçin. Konsol Çıkışı'nı seçin ve derleme işleminden çıkışı görüntüleyin. Son satır başarılı bir derlemeyi göstermelidir.

GitHub web kancası oluşturma

Başarıyla el ile derleme tamamlandıktan sonra GitHub'ı Jenkins derlemesiyle tümleştirin. Kod GitHub'a her işlendiğinde Jenkins derleme işini çalıştırmak için bir web kancası kullanın.

GitHub web kancasını oluşturmak için aşağıdaki adımları tamamlayın:

  1. Web tarayıcısında çatallanmış GitHub deponuza göz atın.

  2. Ayarlar'ı ve ardından sol taraftaki Web Kancaları'nı seçin.

  3. Web kancası ekle'yi seçin. Yük URL'si için girinhttp://<publicIp:8080>/github-webhook/; burada <publicIp> Jenkins sunucusunun IP adresidir. Sondaki /öğesini eklediğinizden emin olun. İçerik türü ve gönderme olaylarında tetikleme için diğer varsayılan değerleri bırakın.

  4. Web kancası ekle'yi seçin.

    Create a GitHub webhook for Jenkins

Ci/CD işlem hattının tamamını test edin

Artık CI/CD işlem hattının tamamını test edebilirsiniz. GitHub'a bir kod işleme gönderdiğinizde aşağıdaki adımlar gerçekleşir:

  1. GitHub web kancası Jenkins'e bildirimde bulunur.
  2. Jenkins derleme işini başlatır ve GitHub'dan en son kod işlemesini çeker.
  3. Güncelleştirilmiş kod kullanılarak bir Docker derlemesi başlatılır ve yeni kapsayıcı görüntüsü en son derleme numarasıyla etiketlenmiştir.
  4. Bu yeni kapsayıcı görüntüsü Azure Container Registry'ye gönderilir.
  5. Azure Kubernetes Service üzerinde çalışan uygulamanız, Azure Container Registry'den en son görüntüyle güncelleştirilir.

Geliştirme makinenizde kopyalanan uygulamayı bir kod düzenleyicisiyle açın. /azure-vote/azure-vote dizininin altında config_file.cfg adlı dosyayı açın. Aşağıdaki örnekte gösterildiği gibi, bu dosyadaki oy değerlerini kedi ve köpek dışında bir değerle güncelleştirin:

# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'

Güncelleştirdiğinizde dosyayı kaydedin, değişiklikleri işleyin ve GitHub deposu çatalınıza gönderin. GitHub web kancası Jenkins'te yeni bir derleme işi tetikler. Jenkins web panosunda derleme işlemini izleyin. En son kodu çekmek, güncelleştirilmiş görüntüyü oluşturup göndermek ve güncelleştirilmiş uygulamayı AKS'de dağıtmak birkaç saniye sürer.

Derleme tamamlandıktan sonra örnek Azure vote uygulamasının web tarayıcınızı yenileyin. Değişiklikleriniz aşağıdaki örnekte gösterildiği gibi görüntülenir:

Sample Azure vote in AKS updated by the Jenkins build job

Sonraki adımlar