Azure Kubernetes Service용 GitOps

AKS(Azure Kubernetes Service)
GitHub

GitOps는 소프트웨어 시스템을 운영하고 관리하기 위한 일련의 원칙입니다. 이 문서에서는 GitOps 원칙을 사용하여 AKS(Azure Kubernetes Services) 클러스터를 운영하고 관리하는 기술을 설명합니다.

Flux, Argo CD, OPA Gatekeeper, Kubernetesgit 로고는 해당 회사의 상표입니다. 이러한 상표를 사용한다고 해서 어떠한 보증도 암시되지 않습니다.

아키텍처

AKS와 함께 사용할 수 있는 두 개의 GitOps 연산자는 FluxArgo CD입니다. 둘 다 CNCF(클라우드 네이티브 컴퓨팅 재단) 프로젝트를 졸업했으며 널리 사용됩니다. 다음 시나리오에서는 이를 사용하는 방법을 보여 줍니다.

시나리오 1: Flux 및 AKS를 사용하는 GitOps

Flux v2, GitHub 및 AKS를 사용하는 GitOps 다이어그램

이 아키텍처의 Visio 파일을 다운로드합니다.

시나리오 1의 데이터 흐름

Flux는 AKS에 대한 네이티브 클러스터 확장 입니다. 클러스터 확장은 AKS 클러스터에 솔루션을 설치하고 관리하기 위한 플랫폼을 제공합니다. Azure Portal, Azure CLI 또는 IaC(Infrastructure as Code) 스크립트(예: Terraform 또는 Bicep 스크립트)를 사용하여 Flux를 AKS에 대한 확장으로 사용하도록 설정할 수 있습니다. Azure Policy를 사용하여 AKS 클러스터에서 대규모로 Flux v2 구성을 적용할 수도 있습니다. 자세한 내용은 Flux v2 구성 및 Azure Policy를 사용하여 대규모로 일관되게 애플리케이션 배포를 참조하세요.

Flux는 Kubernetes 매니페스트, Helm 차트 및 Kustomization 파일을 AKS에 배포할 수 있습니다. Flux는 설문 조사 기반 프로세스이므로 클러스터 엔드포인트를 빌드 에이전트에 노출하지 않고도 구성 변경 내용을 감지, 끌어오기 및 조정할 수 있습니다.

이 시나리오에서 Kubernetes 관리자는 비밀 및 구성과 같은 Kubernetes 구성 개체를 변경하고지도 변경 내용을 GitHub 리포지토리에 직접 커밋할 수 있습니다.

이 시나리오의 데이터 흐름은 다음과 같습니다.

  1. 개발자는 GitHub 리포지토리에 구성 변경 내용을 커밋합니다.
  2. Flux는 Git 리포지토리에서 구성 드리프트를 검색하고 구성 변경 내용을 가져옵니다.
  3. Flux는 Kubernetes 클러스터의 상태를 조정합니다.

시나리오 1에 대한 대안

  • Flux를 Azure DevOps, GitLab 및 BitBucket과 같은 다른 Git 리포지토리와 함께 사용할 수 있습니다.
  • Flux Bucket API는 Git 리포지토리 대신 Amazon S3 및 Google Cloud Storage 버킷과 같은 스토리지 솔루션에서 개체에 대한 아티팩트를 생성하는 원본을 정의합니다. S3 호환 API가 있는 솔루션을 사용할 수도 있습니다. 두 가지 예는 Minio와 Alibaba 클라우드 OS S이지만 다른 예제도 있습니다.
  • Azure Blob Storage 컨테이너에 대해 Flux를 원본으로 구성하여 아티팩트를 생성할 수도 있습니다. 자세한 내용은 AKS 및 Azure Arc 지원 Kubernetes를 사용하는 GitOps Flux v2 구성을 참조하세요.

시나리오 2: Flux, GitHub 및 AKS에서 GitOps를 사용하여 CI/CD 구현

Flux, GitHub 및 AKS에서 GitOps를 사용하여 CI/CD를 구현하는 다이어그램

이 아키텍처의 Visio 파일을 다운로드합니다.

시나리오 2의 데이터 흐름

이 시나리오는 일반적인 웹 애플리케이션에 대한 끌어오기 기반 DevOps 파이프라인입니다. 파이프라인은 빌드에 GitHub Actions를 사용합니다. 배포의 경우 Flux를 GitOps 연산자로 사용하여 앱을 끌어오고 동기화합니다. 시나리오를 통한 데이터 흐름은 다음과 같습니다.

  1. 앱 코드는 Visual Studio Code와 같은 IDE를 사용하여 개발됩니다.
  2. 앱 코드는 GitHub 리포지토리에 커밋됩니다.
  3. GitHub Actions는 앱 코드에서 컨테이너 이미지를 빌드하고 컨테이너 이미지를 Azure Container Registry에 밀어넣습니다.
  4. GitHub Actions는 Azure Container Registry의 컨테이너 이미지 버전 번호를 기반으로 하는 현재 이미지 버전으로 Kubernetes 매니페스트 배포 파일을 업데이트합니다.
  5. Flux 연산자는 Git 리포지토리에서 구성 드리프트를 감지하고 구성 변경 내용을 가져옵니다.
  6. Flux는 매니페스트 파일을 사용하여 AKS 클러스터에 앱을 배포합니다.

시나리오 3: Argo CD, GitHub 리포지토리 및 AKS를 사용하는 GitOps

Argo CD, GitHub 및 AKS를 사용하는 GitOps 다이어그램

이 아키텍처의 Visio 파일을 다운로드합니다.

시나리오 3의 데이터 흐름

이 시나리오에서 Kubernetes 관리자는 비밀 및 구성과 같은 Kubernetes 구성 개체를 변경하고지도 변경 내용을 GitHub 리포지토리에 직접 커밋할 수 있습니다.

이 시나리오의 데이터 흐름은 다음과 같습니다.

  1. Kubernetes 관리자는 YAML 파일에서 구성을 변경하고 GitHub 리포지토리에 변경 내용을 커밋합니다.
  2. Argo CD는 Git 리포지토리에서 변경 내용을 가져옵니다.
  3. Argo CD는 AKS 클러스터에 대한 구성 변경 내용을 조정합니다.

Argo CD는 원하는 대상 상태를 AKS 클러스터에 자동으로 동기화할 필요가 없습니다. 실행 중인 애플리케이션을 지속적으로 모니터링하는 Kubernetes 컨트롤러로 구현됩니다. AKS 클러스터의 현재 라이브 상태를 Git 리포지토리에 지정된 원하는 대상 상태와 비교합니다. Argo CD는 라이브 상태를 원하는 대상 상태로 자동 또는 수동으로 동기화하는 기능을 제공하면서 차이점을 보고하고 시각화합니다.

Argo CD는 브라우저 기반 사용자 인터페이스를 제공합니다. 애플리케이션 구성을 추가하고, 클러스터와 관련하여 동기화 상태를 관찰하고, 클러스터에 대한 동기화를 시작하는 데 사용할 수 있습니다. Argo CD 명령줄을 사용하여 이러한 작업을 수행할 수도 있습니다. 사용자 인터페이스와 명령줄 인터페이스는 모두 구성 변경 기록을 보고 이전 버전으로 롤백하는 기능을 제공합니다.

기본적으로 Argo CD 사용자 인터페이스 및 API 서버는 노출되지 않습니다. 액세스하려면 내부 IP 주소가 있는 수신 컨트롤러를 만드는 것이 좋습니다. 또는 내부 부하 분산 장치를 사용하여 노출할 수 있습니다.

시나리오 3에 대한 대안

Azure DevOps를 포함하여 Git과 호환되는 모든 리포지토리는 구성 원본 리포지토리로 사용될 수 있습니다.

시나리오 4: Argo CD, GitHub Actions 및 AKS에서 GitOps를 사용하여 CI/CD 구현

Argo CD, GitHub 및 AKS에서 GitOps를 사용하여 CI/CD를 구현하는 다이어그램

이 아키텍처의 Visio 파일을 다운로드합니다.

시나리오 4의 데이터 흐름

이 시나리오는 일반적인 웹 애플리케이션에 대한 끌어오기 기반 DevOps 파이프라인입니다. 파이프라인은 빌드에 GitHub Actions를 사용합니다. 배포의 경우 Argo CD를 GitOps 연산자로 사용하여 앱을 끌어오고 동기화합니다. 시나리오를 통한 데이터 흐름은 다음과 같습니다.

  1. 앱 코드는 Visual Studio Code와 같은 IDE를 사용하여 개발됩니다.
  2. 앱 코드는 GitHub 리포지토리에 커밋됩니다.
  3. GitHub Actions는 앱 코드에서 컨테이너 이미지를 빌드하고 컨테이너 이미지를 Azure Container Registry에 밀어넣습니다.
  4. GitHub Actions는 Azure Container Registry의 컨테이너 이미지 버전 번호를 기반으로 하는 현재 이미지 버전으로 Kubernetes 매니페스트 배포 파일을 업데이트합니다.
  5. Argo CD는 Git 리포지토리에서 가져옵니다.
  6. Argo CD는 AKS 클러스터에 앱을 배포합니다.

시나리오 4에 대한 대안

Azure DevOps를 포함하여 Git과 호환되는 모든 리포지토리는 구성 원본 리포지토리로 사용될 수 있습니다.

시나리오 정보

GitOps는 소프트웨어 시스템을 운영하고 관리하기 위한 일련의 원칙입니다.

  • 소스 제어를 시스템의 단일 진리 원본으로 사용합니다.
  • 버전 제어, 협업, 규정 준수, CI/CD(지속적인 통합/지속적인 배포)와 같은 개발 사례를 인프라 자동화에 적용합니다.
  • 모든 소프트웨어 시스템에 적용할 수 있습니다.

GitOps는 Kubernetes 클러스터 관리 및 애플리케이션 배달에 자주 사용됩니다. 이 문서에서는 AKS 클러스터와 함께 GitOps를 사용하는 몇 가지 일반적인 옵션을 설명합니다.

GitOps 원칙에 따라 GitOps 관리 시스템의 원하는 상태는 다음과 여야 합니다.

  1. 선언적: GitOps가 관리하는 시스템에는 원하는 상태가 선언적으로 표현되어야 합니다. 선언은 일반적으로 Git 리포지토리에 저장됩니다.
  2. 버전 관리 및 변경할 수 없음: 원하는 상태는 불변성 및 버전 관리 기능을 적용하고 전체 버전 기록을 유지하는 방식으로 저장됩니다.
  3. 자동으로 끌어오기: 소프트웨어 에이전트는 원본에서 원하는 상태 선언을 자동으로 가져옵니다.
  4. 지속적인 조정: 소프트웨어 에이전트는 실제 시스템 상태를 지속적으로 관찰하고 원하는 상태를 적용하려고 시도합니다.

GitOps 에서 IaC(Infrastructure as code) 는 코드를 사용하여 VM(가상 머신), 네트워크 및 방화벽과 같은 인프라 구성 요소의 원하는 상태를 선언합니다. 이 코드는 버전이 제어되고 감사할 수 있습니다.

Kubernetes는 매니페스트를 사용하여 클러스터 상태부터 애플리케이션 배포에 이르기까지 모든 것을 선언적으로 설명합니다. Kubernetes용 GitOps는 클러스터 인프라의 원하는 상태에 버전 제어를 적용합니다. 일반적으로 연산자라고 하는 클러스터의 구성 요소는 선언적 상태를 지속적으로 동기화합니다. 이 방법을 사용하면 클러스터에 영향을 주는 코드 변경 내용을 검토하고 감사할 수 있습니다. 최소 권한 원칙을 지원하여 보안을 강화합니다.

GitOps 에이전트는 코드 리포지토리에 저장된 원하는 상태로 시스템 상태를 지속적으로 조정합니다. 일부 GitOps 에이전트는 Kubernetes 개체의 수동 생성과 같이 클러스터 외부에서 수행되는 작업을 되돌리기 수 있습니다. 예를 들어 허용 컨트롤러는 만들기, 업데이트 및 삭제 작업 중에 개체에 정책을 적용합니다. 이를 사용하여 원본 리포지토리의 배포 코드가 변경되는 경우에만 배포가 변경되도록 할 수 있습니다.

정책 관리 및 적용 도구를 GitOps와 결합하여 정책을 적용하고 제안된 정책 변경에 대한 피드백을 제공할 수 있습니다. 다양한 팀에 대한 알림을 구성하여 최신 GitOps 상태 제공할 수 있습니다. 예를 들어 배포 성공 및 조정 실패에 대한 알림을 보낼 수 있습니다.

GitOps를 진실의 단일 소스로

GitOps는 클러스터 상태의 일관성 및 표준화를 제공하며 보안을 강화하는 데 도움이 될 수 있습니다. GitOps를 사용하여 여러 클러스터에서 일관된 상태를 보장할 수도 있습니다. 예를 들어 GitOps는 기본 및 DR(재해 복구) 클러스터 또는 클러스터 팜에서 동일한 구성을 적용할 수 있습니다.

GitOps만 클러스터 상태를 변경할 수 있도록 적용하려면 클러스터에 대한 직접 액세스를 제한할 수 있습니다. Azure RBAC(역할 기반 액세스 제어), 허용 컨트롤러 및 기타 도구를 포함하여 다양한 방법으로 이 작업을 수행할 수 있습니다.

GitOps를 사용하여 초기 구성 부트스트랩

기준 구성의 일부로 AKS 클러스터를 배포해야 할 수 있습니다. 예를 들어 워크로드를 배포하기 전에 공유 서비스 집합 또는 구성을 배포해야 합니다. 이러한 공유 서비스는 다음과 같은 AKS 추가 기능을 구성할 수 있습니다.

AKS 클러스터를 만들 때 적용되는 확장으로 Flux를 사용하도록 설정할 수 있습니다. 그런 다음 Flux는 기준 구성을 클러스터로 부트스트랩할 수 있습니다. AKS 클러스터에 대한 기준 아키텍처는 부트스트래핑에 GitOps를 사용하는 것이 좋습니다. Flux 확장을 사용하는 경우 배포 후 바로 클러스터를 부트스트랩할 수 있습니다.

기타 GitOps 도구 및 추가 기능

설명된 시나리오를 다른 GitOps 도구로 확장할 수 있습니다. Jenkins X는 Azure에 통합하는 지침을 제공하는 또 다른 GitOps 도구입니다. GitOps를 통해 배포되는 프로덕션 워크로드의 점진적 전환을 위해 플래그와 같은 점진적 배달 도구를 사용할 수 있습니다.

잠재적인 사용 사례

이 솔루션은 모든 변경 내용의 감사 내역을 사용하여 애플리케이션 및 인프라를 코드로 배포할 경우의 이점을 원하는 모든 조직에게 유용합니다.

GitOps는 컨테이너 환경 관리의 복잡성으로부터 개발자를 보호합니다. 개발자는 Git과 같은 친숙한 도구로 계속 작업하여 업데이트 및 새 기능을 관리할 수 있습니다. 이러한 방식으로 GitOps는 개발자 생산성을 향상시킵니다.

고려 사항

이러한 고려 사항은 워크로드의 품질을 향상시키는 데 사용할 수 있는 일련의 기본 원칙인 Azure Well-Architected Framework의 핵심 요소를 구현합니다. 자세한 내용은 Microsoft Azure Well-Architected Framework를 참조하세요.

안정성

안정성은 애플리케이션이 고객에 대한 약정을 충족할 수 있도록 보장합니다. 자세한 내용은 안정성 핵심 요소 개요를 참조하세요.

안정성의 핵심 핵심 요소 중 하나는 복원력입니다. 복원력의 목표는 오류가 발생한 후에 애플리케이션을 완전히 작동하는 상태로 되돌리기 위한 것입니다. 클러스터를 사용할 수 없게 되면 GitOps에서 새 클러스터를 빠르게 만들 수 있습니다. Kubernetes 구성 및 애플리케이션 논리에 대한 단일 소스로 Git 리포지토리를 사용합니다. 클러스터 구성 및 애플리케이션 배포를 규모 단위로 만들고 적용할 수 있으며 배포 스탬프 패턴을 설정할 수 있습니다.

보안

우수한 보안은 중요한 데이터 및 시스템에 대한 고의적인 공격과 악용을 방어합니다. 자세한 내용은 보안 요소의 개요를 참조하세요.

GitOps 접근 방식의 경우 개별 개발자 또는 관리자가 Kubernetes 클러스터에 직접 액세스하여 변경 내용 또는 업데이트를 적용하지 않습니다. 대신 사용자는 Git 리포지토리에 변경 내용을 푸시하고 GitOps 연산자(Flux 또는 Argo CD)는 변경 내용을 읽고 클러스터에 적용합니다. 이 방법은 DevOps 팀에게 Kubernetes API에 대한 쓰기 권한을 부여하지 않음으로써 최소 권한의 보안 모범 사례를 따릅니다. 진단 또는 문제 해결 시나리오에서는 사례별로 제한된 시간 동안 클러스터 권한을 부여할 수 있습니다.

리포지토리 권한을 설정하는 작업과 별도로, AKS 클러스터와 동기화되는 Git 리포지토리에서 다음 보안 조치를 구현하는 것이 좋습니다.

  • 분기 보호: Kubernetes 클러스터의 상태를 나타내는 분기가 변경 내용을 직접 푸시하지 않도록 보호합니다. PR을 사용하여 변경하고 하나 이상의 다른 사용자가 모든 PR을 검토하도록 합니다. 또한 PR을 사용하여 자동 검사 수행합니다.
  • PR 검토: 네 개의 눈 원칙을 적용하기 위해 PR 검토자가 한 명 이상 있어야 합니다. GitHub 코드 소유자 기능을 사용하여 리포지토리에서 특정 파일을 검토할 책임이 있는 개인 또는 팀을 정의할 수도 있습니다.
  • 변경할 수 없는 기록: 기존 변경 내용 위에 새 커밋만 허용합니다. 변경할 수 없는 기록은 감사 용도에 특히 중요합니다.
  • 추가 보안 조치: GitHub 사용자가 2단계 인증을 활성화하도록 요구합니다. 또한 변경 내용을 방지하기 위해 서명된 커밋만 허용합니다.

비용 최적화

비용 최적화는 불필요한 비용을 줄이고 운영 효율성을 높이는 방법을 찾는 것입니다. 자세한 내용은 비용 최적화 핵심 요소 개요를 참조하세요.

  • 무료 계층에서 AKS는 무료 클러스터 관리를 제공합니다. 비용은 AKS가 노드를 호스트하는 데 사용하는 컴퓨팅, 스토리지 및 네트워킹 리소스로 제한됩니다.
  • GitHub는 무료 서비스를 제공하지만 코드 소유자 또는 필수 검토자와 같은 고급 보안 관련 기능을 사용하려면 팀 계획이 필요합니다. 자세한 내용은 GitHub 가격 책정 페이지를 참조하세요.
  • Azure DevOps는 일부 시나리오에 사용할 수 있는 무료 계층을 제공합니다.
  • Azure 가격 계산기를 사용하여 비용을 예측합니다.

운영 우수성

운영 우수성은 애플리케이션을 배포하고 프로덕션에서 계속 실행하는 운영 프로세스를 다룹니다. 자세한 내용은 운영 우수성 핵심 요소 개요를 참조하세요.

GitOps는 DevOps 생산성을 높일 수 있습니다. 가장 유용한 기능 중 하나는 Git 작업을 수행하는 것만으로 예기치 않게 동작하는 변경 내용을 신속하게 롤백하는 기능입니다. 커밋 그래프는 여전히 모든 커밋을 포함하므로 사후 분석에 도움이 될 수 있습니다.

GitOps 팀은 종종 동일한 애플리케이션에 대한 여러 환경을 관리합니다. 일반적으로 여러 Kubernetes 클러스터 또는 네임스페이스에 배포되는 애플리케이션의 여러 단계가 있습니다. 단일 진실 공급원인 Git 리포지토리는 현재 클러스터에 배포된 애플리케이션 버전을 보여 줍니다.

시나리오 배포

다음 목록에서는 5가지 시나리오를 배포하는 방법에 대한 참조를 제공합니다.

  • 시나리오 1: Flux v2와 함께 GitOps를 사용하여 AKS에 애플리케이션을 배포하는 방법에 대한 지침은 자습서: Flux v2에서 GitOps를 사용하여 애플리케이션 배포를 참조하세요. Flux 확장을 사용하여 AKS 클러스터 배포를 부트스트랩하는 방법에 대한 예제는 AKS 기준에 대한 참조 구현을 참조 하세요.
  • 시나리오 2: AKS에서 Flux v2와 함께 GitOps를 사용하여 애플리케이션을 배포하고 CI/CD를 구현하는 방법에 대한 지침은 다음 을 참조하세요. 자습서: GitOps를 사용하여 CI/CD 구현(Flux v2).
  • 시나리오 3 및 4: Argo CD 및 AKS를 사용하여 샘플 워크로드를 배포하는 방법에 대한 단계별 지침은 AKS 기준 자동화풀 기반 CI/CD 시나리오를 참조하세요.

참가자

Microsoft에서 이 문서를 유지 관리합니다. 원래 다음 기여자가 작성했습니다.

보안 주체 작성자:

비공개 LinkedIn 프로필을 보려면 LinkedIn에 로그인합니다.

다음 단계