자습서: Jenkins를 사용하여 GitHub에서 Azure Kubernetes Service로 배포

Important

많은 Azure 서비스에 Jenkins 플러그 인이 있습니다. 이러한 플러그 인 중 일부는 2024년 2월 29일부터 지원되지 않습니다. Azure CLI는 현재 Jenkins를 Azure 서비스와 통합하는 데 권장되는 방법입니다. 자세한 내용은 Azure용 Jenkins 플러그 인 문서를 참조하세요.

이 자습서에서는 Jenkins에서 CI(연속 통합) 및 CD(지속적인 배포)를 설정하여 GitHub 에서 AKS(Azure Kubernetes Service) 클러스터로 샘플 앱을 배포합니다.

이 자습서에서는 다음 작업을 수행합니다.

  • AKS 클러스터에 샘플 Azure 투표 앱을 배포합니다.
  • 기본 Jenkins 프로젝트를 만듭니다.
  • Jenkins가 ACR과 상호 작용하도록 자격 증명을 설정합니다.
  • 자동화된 빌드에 대한 Jenkins 빌드 작업 및 GitHub 웹후크를 만듭니다.
  • CI/CD 파이프라인을 테스트하여 GitHub 코드 커밋에 따라 AKS에서 애플리케이션을 업데이트합니다.

필수 조건

이 자습서를 완료하려면 다음 항목이 필요합니다.

앱 준비

이 문서에서는 웹 인터페이스와 임시 데이터 저장을 위한 Redis가 포함된 샘플 Azure 투표 애플리케이션을 사용합니다.

자동화된 배포를 위해 Jenkins 및 AKS를 통합하기 전에 먼저 AKS 클러스터에 Azure 투표 애플리케이션을 수동으로 준비하고 배포합니다. 이 수동 배포를 사용하면 작동 중인 애플리케이션을 볼 수 있습니다.

참고 항목

샘플 Azure 투표 애플리케이션은 Linux 노드에서 실행되도록 예약된 Linux Pod를 사용합니다. 이 문서에 설명된 흐름은 Windows Server 노드에서 예약된 Windows Server Pod에도 작동합니다.

애플리케이션 예제(https://github.com/Azure-Samples/azure-voting-app-redis)의 다음 GitHub 리포지토리를 포크합니다. 리포지토리를 사용자 고유의 GitHub 계정으로 포크하려면 오른쪽 위 모서리에서 포크 단추를 선택합니다.

개발 시스템에 포크를 복제합니다. 이 리포지토리를 복제할 때 포크 URL을 사용해야 합니다.

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

복제된 포크의 디렉터리로 변경합니다.

cd azure-voting-app-redis

샘플 애플리케이션에 필요한 컨테이너 이미지를 만들려면 docker-compose.yaml 파일을 다음과 함께 docker-compose사용합니다.

docker-compose up -d

필요한 기본 이미지가 끌어오고 애플리케이션 컨테이너가 빌드됩니다. 그러면 docker images 명령을 사용하여 만들어진 이미지를 볼 수 있습니다. 3개 이미지가 다운로드되거나 생성되었는지 확인합니다. 이미지는 azure-vote-front 애플리케이션을 포함하고 이미지를 기본으로 사용합니다 nginx-flask . redis 이미지는 Redis 인스턴스를 시작하는 데 사용됩니다.

$ 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 Container Registry에 로그인합니다.

az acr login -n <acrLoginServer>

ACR 로그인 서버로 대체 <acrLoginServer> 합니다.

docker tag 명령을 사용하여 이미지에 ACR 로그인 서버 이름 및 버전 번호(v1)를 태그로 지정합니다. 이전 단계에서 얻은 고유한 <acrLoginServer> 이름을 사용합니다.

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

마지막으로 azure-vote-front 이미지를 ACR 레지스트리에 푸시합니다. 다시 말하지만, 다음과 같이 myacrregistry.azurecr.io사용자 고유의 ACR 레지스트리의 로그인 서버 이름으로 바꿉 <acrLoginServer> 있습니다.

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

AKS에 애플리케이션 예제 배포

AKS 클러스터에 샘플 애플리케이션을 배포하려면 Azure 투표 리포지토리 리포지토리의 루트에 있는 Kubernetes 매니페스트 파일을 사용할 수 있습니다. azure-vote-all-in-one-redis.yaml 와 같은 vi편집기를 사용하여 매니페스트 파일을 엽니다. microsoft를 ACR 로그인 서버 이름으로 바꿉니다. 이 값은 매니페스트 파일의 줄 60에서 찾을 수 있습니다.

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

다음으로 kubectl apply 명령을 사용하여 AKS 클러스터에 애플리케이션을 배포합니다.

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

Kubernetes 부하 분산 장치 서비스는 애플리케이션을 인터넷에 노출하기 위해 만들어집니다. 이 프로세스는 몇 분 정도 걸릴 수 있습니다. 부하 분산 장치 배포에 대한 진행 상황을 모니터링하려면 --watch 인수가 포함된 kubectl get service 명령을 사용합니다. EXTERNAL-IP 주소가 보류 중인 IP 주소에서 IP 주소변경되면 kubectl 조사식 프로세스를 중지하는 데 사용합니다Control + C.

$ 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

작동 중인 애플리케이션을 보려면 웹 브라우저를 서비스의 외부 IP 주소로 엽니다. 다음 예제와 같이 Azure 투표 애플리케이션이 표시됩니다.

AKS에서 실행 중인 Azure 투표 애플리케이션 예제

Jenkins 컨트롤러 구성

Jenkins 컨트롤러에서 AKS 배포를 사용하도록 설정하려면 다음 변경 내용을 적용합니다.

포트 80 인바운드를 엽니다.

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

<Resource_Group_name><Jenkins_Controller_VM>을 해당 값으로 바꿉니다.

Jenkins 컨트롤러에 대한 SSH

ssh azureuser@<PublicIPAddres>

Jenkins 컨트롤러의 IP 주소로 바꿉니다 <PublicIPAddress> .

AzCLI에 설치 및 로그인

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

참고 항목

AzCLI를 수동으로 설치하려면 다음 지침을 따릅니다.

Docker 설치

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 설치 및 AKS에 커넥트

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

<Resource_Group><AKS_Name>을 해당 값으로 바꿉니다.

액세스 구성

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 환경 변수 만들기

Jenkins 환경 변수는 ACR 로그인 서버 이름을 저장하는 데 사용됩니다. 이 변수는 Jenkins 빌드 작업 중에 참조됩니다. 이 환경 변수를 만들려면 다음 단계를 완료합니다.

  • Jenkins 포털의 왼쪽에서 Jenkins>구성 시스템 관리를 선택합니다.

  • 전역 속성에서 환경 변수를 선택합니다. ACR 로그인 서버의 이름과 ACR_LOGINSERVER 값을 사용하여 변수를 추가합니다.

    Jenkins 환경 변수

  • 완료되면 페이지 아래쪽에서 저장을 선택합니다.

ACR용 Jenkins 자격 증명 만들기

CI/CD 프로세스 중에 Jenkins는 애플리케이션 업데이트를 기반으로 새 컨테이너 이미지를 빌드한 다음 해당 이미지를 ACR 레지스트리에 푸시 해야 합니다.

Jenkins가 업데이트된 컨테이너 이미지를 ACR에 푸시할 수 있게 하려면 ACR의 자격 증명을 지정해야 합니다.

역할 및 권한을 분리하기 위해 ACR 레지스트리에 대한 기여자 권한이 있는 Jenkins의 서비스 주체를 구성합니다.

ACR을 사용할 Jenkins에 대한 서비스 주체 만들기

먼저 az ad sp create-for-rbac 명령을 사용하여 서비스 주체를 만듭니다.

az ad sp create-for-rbac

이 명령은 다음 예제와 유사한 출력을 생성합니다.

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

appId암호를 기록해 둡다. 이러한 값은 Jenkins에서 자격 증명 리소스를 구성하기 위해 다음 단계에서 사용됩니다.

az acr show 명령을 사용하여 ACR 레지스트리의 리소스 ID를 가져와서 변수로 저장합니다.

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

<Resource_Group><acrLoginServer>을 해당 값으로 바꿉니다.

ACR 레지스트리에 서비스 주체 기여자 권한을 할당하는 역할 할당을 만듭니다.

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

서비스 주체를 만드는 데 사용하는 악의적인 명령의 출력에 제공된 값으로 바꿉 <appId> 다.

Jenkins에서 ACR 서비스 주체에 대한 자격 증명 리소스 만들기

Azure에서 만든 역할 할당을 사용하여 이제 ACR 자격 증명을 Jenkins 자격 증명 개체에 저장합니다. 이러한 자격 증명은 Jenkins 빌드 작업 중에 참조됩니다.

Jenkins 포털의 왼쪽으로 돌아가서 Jenkins>자격 증명 관리 Jenkins 저장소>전역 자격 증명>관리(무제한)>자격 증명 추가를 선택합니다.

자격 증명 종류가 암호가 있는 사용자 이름인지 확인하고 다음 항목을 입력합니다.

  • 사용자 이름 - ACR 레지스트리로 인증하기 위해 만든 서비스 주체의 appId 입니다.
  • 암호 - ACR 레지스트리로 인증하기 위해 만든 서비스 주체의 암호 입니다.
  • ID - acr-credentials와 같은 자격 증명 식별자

완료되면 자격 증명 양식은 다음 예제와 같습니다.

서비스 주체 정보를 사용하여 Jenkins 자격 증명 개체 만들기

확인을 선택하고 Jenkins 포털로 돌아갑니다.

Jenkins 프로젝트 만들기

Jenkins 포털 홈페이지의 왼쪽에 있는 새 항목을 선택합니다.

  1. azure-vote를 작업 이름으로 입력합니다. 자유형 프로젝트를 선택한 다음 확인을 선택합니다.

  2. 일반 섹션에서 GitHub 프로젝트를 선택하고 분기된 리포지토리 URL(예: https://github.com/<your-github-account>/azure-voting-app-redis)을 입력합니다.

  3. 소스 코드 관리 섹션에서 Git를 선택하고, 분기된 리포지토리 .git URL(예: https://github.com/<your-github-account>/azure-voting-app-redis.git)을 입력합니다.

  4. 빌드 트리거 섹션에서 GITscm 폴링에 대한 GitHub 후크 트리거를 선택합니다.

  5. 빌드 환경에서 비밀 텍스트 또는 파일 사용을 선택합니다.

  6. 바인딩에서 추가>사용자 이름 및 암호(구분)를 선택합니다.

    • 사용자 이름 변수 및 ACR_PASSWORD 암호 변수대해 입력 ACR_ID 합니다.

      Jenkins 바인딩

  7. Execute 셸 형식의 빌드 단계를 추가하고 다음 텍스트를 사용하도록 선택합니다. 이 스크립트는 새 컨테이너 이미지를 빌드하고 ACR 레지스트리에 푸시합니다.

    # 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 셸 형식의 다른 빌드 단계를 추가하고 다음 텍스트를 사용합니다. 이 스크립트는 ACR의 새 컨테이너 이미지로 AKS의 애플리케이션 배포를 업데이트합니다.

    # 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. 완료되면 저장을 클릭합니다.

Jenkins 빌드 테스트

GitHub 커밋을 기반으로 작업을 자동화하기 전에 Jenkins 빌드를 수동으로 테스트합니다.

이 빌드는 작업이 올바르게 구성되었는지 확인합니다. 적절한 Kubernetes 인증 파일이 있고 ACR에 대한 인증이 작동하는지 확인합니다.

프로젝트의 왼쪽 메뉴에서 지금 빌드를 선택합니다.

Jenkins 테스트 빌드

Docker 이미지 계층을 Jenkins 서버로 끌어오면 첫 번째 빌드가 더 길어집니다.

빌드는 다음 작업을 수행합니다.

  1. GitHub 리포지토리 복제
  2. 새 컨테이너 이미지 빌드
  3. 컨테이너 이미지를 ACR 레지스트리에 푸시합니다.
  4. AKS 배포에서 사용하는 이미지 업데이트

애플리케이션 코드가 변경되지 않으므로 웹 UI는 변경되지 않습니다.

빌드 작업이 완료되면 빌드 기록에서 빌드 #1을 선택합니다. 콘솔 출력을 선택하고 빌드 프로세스의 출력을 확인합니다. 마지막 줄은 성공적인 빌드를 나타내야 합니다.

GitHub 웹후크 만들기

수동 빌드가 완료되면 이제 GitHub를 Jenkins 빌드에 통합합니다. 웹후크를 사용하여 코드가 GitHub에 커밋할 때마다 Jenkins 빌드 작업을 실행합니다.

GitHub 웹후크를 만들려면 다음 단계를 완료합니다.

  1. 웹 브라우저에서 포크된 GitHub 리포지토리로 이동합니다.

  2. 설정 선택한 다음 왼쪽에서 웹후크를 선택합니다.

  3. 웹후크 추가를 선택합니다. ‘페이로드 URL’에 http://<publicIp:8080>/github-webhook/를 입력합니다. 여기서 <publicIp>는 Jenkins 서버의 IP 주소입니다. 후행을 포함해야 합니다 /. 콘텐츠 형식에 대한 다른 기본값을 그대로 두고 푸시 이벤트를 트리거합니다.

  4. 웹후크 추가를 선택합니다.

    Jenkins의 GitHub 웹후크 만들기

전체 CI/CD 파이프라인 테스트

이제 전체 CI/CD 파이프라인을 테스트할 수 있습니다. 코드 커밋을 GitHub에 푸시하면 다음 단계가 수행됩니다.

  1. GitHub 웹후크는 Jenkins에 알깁니다.
  2. Jenkins는 빌드 작업을 시작하고 GitHub에서 최신 코드 커밋을 가져옵니다.
  3. Docker 빌드는 업데이트된 코드를 사용하여 시작되고 새 컨테이너 이미지에는 최신 빌드 번호가 태그로 지정됩니다.
  4. 이 새 컨테이너 이미지는 Azure Container Registry로 푸시됩니다.
  5. Azure Kubernetes Service에서 실행되는 애플리케이션은 Azure Container Registry의 최신 이미지로 업데이트됩니다.

개발 컴퓨터에서 코드 편집기를 사용하여 복제된 애플리케이션을 엽니다. /azure-vote/azure-vote 디렉터리 아래에서 config_file.cfg라는 파일을 엽니다. 다음 예제와 같이 이 파일의 투표 값을 고양이와 개가 아닌 다른 항목으로 업데이트합니다.

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

업데이트되면 파일을 저장하고 변경 내용을 커밋한 다음 GitHub 리포지토리의 포크로 푸시합니다. GitHub 웹후크는 Jenkins에서 새 빌드 작업을 트리거합니다. Jenkins 웹 대시보드에서 빌드 프로세스를 모니터링합니다. 최신 코드를 끌어오고, 업데이트된 이미지를 만들고 푸시하고, AKS에서 업데이트된 애플리케이션을 배포하는 데 몇 초가 걸립니다.

빌드가 완료되면 샘플 Azure 투표 애플리케이션의 웹 브라우저를 새로 고칩니다. 다음 예제와 같이 변경 내용이 표시됩니다.

Jenkins 빌드 작업으로 업데이트된 샘플 AKS 투표

다음 단계