AKS 및 Azure Arc 지원 Kubernetes용 GitOps(Flux v2)를 사용한 애플리케이션 배포
Azure는 AKS(Azure Kubernetes Service) 및 Azure Arc 지원 Kubernetes 클러스터에서 작동하는 GitOps를 사용하여 자동화된 애플리케이션 배포 기능을 제공합니다. Kubernetes 클러스터에 애플리케이션을 배포하기 위해 GitOps를 채택함으로써 제공되는 주요 이점은 다음과 같습니다.
- 클러스터에서 실행되는 애플리케이션의 상태를 지속적으로 파악합니다.
- 애플리케이션 개발 팀과 인프라 팀 간의 문제 분리. 애플리케이션 팀은 Kubernetes 배포 경험이 필요하지 않습니다. 플랫폼 엔지니어링 팀은 일반적으로 애플리케이션 팀을 위한 셀프 서비스 모델을 만들어 더 높은 신뢰도로 배포를 실행할 수 있도록 합니다.
- 크래시가 발생하거나 스케일 아웃할 때 원하는 상태가 동일한 클러스터를 다시 만들 수 있습니다.
GitOps를 사용하여 Git 리포지토리 파일에서 Kubernetes 클러스터의 원하는 상태를 선언합니다. Git 리포지토리에는 다음 파일이 포함될 수 있습니다.
- Kubernetes 리소스(예: 네임스페이스, 비밀, 배포 등)를 설명하는 YAML 형식의 매니페스트
- 애플리케이션 배포를 위한 Helm 차트
- 환경별 변경 내용을 설명하는 Kustomize 파일
이러한 파일은 Git 리포지토리에 저장되므로 버전이 지정되고 버전 간 변경 내용을 쉽게 추적할 수 있습니다. Kubernetes 컨트롤러는 클러스터에서 실행되며, Git 리포지토리에서 선언된 원하는 상태와 클러스터의 상태를 지속적으로 조정합니다. 이러한 연산자는 Git 리포지토리에서 파일을 가져와서 원하는 상태를 클러스터에 적용합니다. 또한 연산자는 클러스터가 원하는 상태로 유지되도록 지속적으로 보장합니다.
Azure Arc 지원 Kubernetes 또는 Azure Kubernetes Service의 GitOps는 인기 있는 오픈 소스 도구 집합인 Flux를 사용합니다. Flux는 일반적인 파일 원본(Git 및 Helm 리포지토리, 버킷, Azure Blob Storage) 및 템플릿 형식(YAML, Helm 및 Kustomize)을 지원합니다. Flux는 다른 기능 간에 다중 테넌트 및 배포 종속성 관리도 지원합니다.
Flux는 클러스터에 직접 배포되고 각 클러스터의 컨트롤 플레인은 논리적으로 구분됩니다. 이를 통해 수백, 수천 개의 클러스터로 크기 조정이 가능합니다. Flux는 순수 풀 기반 GitOps 애플리케이션 배포를 사용하도록 설정합니다. 원본 리포지토리 또는 다른 클러스터에서는 클러스터에 액세스할 필요가 없습니다.
Flux 클러스터 확장
GitOps는 Azure Arc 지원 Kubernetes 또는 AKS 클러스터에서 Microsoft.KubernetesConfiguration/extensions/microsoft.flux
클러스터 확장 리소스로 사용하도록 설정됩니다. 하나 이상의 fluxConfigurations
를 만들려면 먼저 클러스터에 microsoft.flux
확장을 설치해야 합니다. 클러스터에서 첫 번째 Microsoft.KubernetesConfiguration/fluxConfigurations
을(를) 만들 때 확장이 자동으로 설치되거나 포털, Azure CLI(az k8s-extension create --extensionType=microsoft.flux
), ARM 템플릿 또는 REST API를 사용하여 수동으로 설치할 수 있습니다.
컨트롤러
기본적으로 microsoft.flux
확장은 Flux 컨트롤러(원본, Kustomize, Helm, 알림)와 FluxConfig CRD(사용자 지정 리소스 정의), fluxconfig-agent
및 fluxconfig-controller
를 설치합니다. 선택적으로 Docker 이미지를 업데이트하고 검색하는 기능을 제공하는 Flux image-automation
및 image-reflector
컨트롤러를 설치할 수도 있습니다.
Flux 원본 컨트롤러:
source.toolkit.fluxcd.io
사용자 지정 리소스를 감시합니다. Git 리포지토리, Helm 리포지토리, 버킷 및 Azure Blob 스토리지 간의 동기화를 처리합니다. 프라이빗 Git, Helm 리포지토리 및 Azure Blob Storage 계정에 대한 원본으로 권한 부여를 처리합니다. tar 보관 파일을 통해 원본에 대한 최신 변경 내용을 표시합니다.Flux Kustomize 컨트롤러:
kustomization.toolkit.fluxcd.io
사용자 지정 리소스를 감시합니다. 원본의 Kustomize 또는 원시 YAML 파일을 클러스터에 적용합니다.Flux Helm 컨트롤러:
helm.toolkit.fluxcd.io
사용자 지정 리소스를 감시합니다. Source 컨트롤러가 표시한 Helm Repository 원본에서 연결된 차트를 검색합니다. 사용자 지정 리소스HelmChart
를 만들고 특정 버전, 이름 및 고객 정의 값을 사용하여HelmRelease
를 클러스터에 적용합니다.Flux Notification 컨트롤러: 사용자 지정 리소스
notification.toolkit.fluxcd.io
를 감시합니다. 모든 Flux 컨트롤러에서 알림을 받습니다. 사용자 정의 웹후크 엔드포인트에 알림을 푸시합니다.Flux 사용자 지정 리소스 정의:
kustomizations.kustomize.toolkit.fluxcd.io
imagepolicies.image.toolkit.fluxcd.io
imagerepositories.image.toolkit.fluxcd.io
imageupdateautomations.image.toolkit.fluxcd.io
alerts.notification.toolkit.fluxcd.io
providers.notification.toolkit.fluxcd.io
receivers.notification.toolkit.fluxcd.io
buckets.source.toolkit.fluxcd.io
gitrepositories.source.toolkit.fluxcd.io
helmcharts.source.toolkit.fluxcd.io
helmrepositories.source.toolkit.fluxcd.io
helmreleases.helm.toolkit.fluxcd.io
fluxconfigs.clusterconfig.azure.com
FluxConfig CRD:
FluxConfig
Kubernetes 개체를 정의하는fluxconfigs.clusterconfig.azure.com
사용자 지정 리소스에 대한 사용자 지정 리소스 정의입니다.fluxconfig-agent
: Azure에서 신규 또는 업데이트된fluxConfigurations
리소스를 관찰하고 클러스터에서 연결된 Flux 구성을 시작하는 일을 담당합니다. 또한 클러스터에서 각fluxConfigurations
리소스의 Flux 상태 변경 내용을 Azure로 다시 푸시하는 역할을 합니다.fluxconfig-controller
:fluxconfigs.clusterconfig.azure.com
사용자 지정 리소스를 감시하고 클러스터에 있는 GitOps 컴퓨터의 새로운 구성 또는 업데이트된 구성으로 변경 내용에 응답합니다.
참고 항목
microsoft.flux
확장은 flux-system
네임스페이스에 설치되며 클러스터 전체 범위를 사용합니다. 네임스페이스 범위에서는 이 확장을 설치할 수 없습니다.
Flux 구성
Flux 구성 리소스(Microsoft.KubernetesConfiguration/fluxConfigurations
)를 만들어 Git 리포지토리, 버킷 원본 또는 Azure Blob Storage 클러스터의 GitOps 관리를 사용하도록 설정합니다. fluxConfigurations
리소스를 만들면 대상 Git 리포지토리와 같은 매개 변수에 대해 제공하는 값은 해당 클러스터에서 GitOps 프로세스를 사용하도록 설정하는 Kubernetes 개체를 만들고 구성하는 데 사용됩니다. 데이터 보안을 위해 미사용 fluxConfigurations
리소스 데이터는 Cluster Configuration 서비스에 의해 암호화되어 Azure Cosmos DB 데이터베이스에 저장됩니다.
microsoft.flux
확장과 함께 설치되는 fluxconfig-agent
및 fluxconfig-controller
에이전트는 GitOps 구성 프로세스를 관리합니다.
fluxconfig-agent
은(는) 다음 작업을 담당합니다.
- Kubernetes Configuration 데이터 평면 서비스에서 신규 또는 업데이트된
fluxConfigurations
리소스를 폴링합니다. - 구성 정보를 사용하여 클러스터에서 사용자 지정 리소스
FluxConfig
를 만들거나 업데이트합니다. - 사용자 지정 리소스
FluxConfig
를 감시하고 상태 변경 내용을 연결된 Azure fluxConfiguration 리소스로 다시 푸시합니다.
fluxconfig-controller
은(는) 다음 작업을 담당합니다.
- 관리되는
fluxConfigurations
에서 만든 Flux 사용자 지정 리소스에 대한 상태 업데이트를 감시합니다. fluxConfigurations
의 수명 동안 존재하는 프라이빗/공개 키 쌍을 만듭니다. 이 키는 URL이 SSH 기반이고 사용자가 구성을 만드는 동안 자체 프라이빗 키를 제공하지 않을 경우 인증에 사용됩니다.- 사용자가 제공한 private-key/http basic-auth/known-hosts/no-auth 데이터를 기반으로 사용자 지정 인증 비밀을 만듭니다.
- 역할 기반 액세스 제어를 설정합니다(서비스 계정 프로비전, 역할 바인딩 만들기/할당, 역할 만들기/할당).
- 사용자 지정 리소스
FluxConfig
의 정보에서 사용자 지정 리소스GitRepository
또는Bucket
및 사용자 지정 리소스Kustomization
을 만듭니다.
Azure의 각 fluxConfigurations
리소스는 하나의 Flux GitRepository
또는 Bucket
사용자 지정 리소스와 하나 이상의 Kustomization
사용자 지정 리소스가 있는 Kubernetes 클러스터에 연결됩니다. fluxConfigurations
리소스를 만들 때 원본(Git 리포지토리, 버킷 또는 Azure Blob Storage)에 대한 URL과 각 Kustomization
에 대한 원본의 동기화 대상을 지정합니다. Kustomization
사용자 지정 리소스 간의 종속성을 구성하여 배포 시퀀스를 제어할 수 있습니다. 또한 동일한 클러스터에 다양한 애플리케이션 및 앱 팀에 대한 여러 네임스페이스 범위가 지정된 fluxConfigurations
리소스를 만들 수 있습니다.
참고 항목
fluxconfig-agent
는 Azure에서 신규 또는 업데이트된 fluxConfiguration
리소스를 모니터링합니다. 이 에이전트는 fluxConfiguration
의 바람직한 상태를 클러스터에 적용하기 위해 Azure에 연결해야 합니다. 에이전트가 Azure에 연결할 수 없는 경우 클러스터의 변경 내용은 에이전트가 연결할 수 있을 때까지 기다립니다. 클러스터와 Azure의 연결이 48시간 넘게 끊기면 클러스터에 대한 요청 시간이 초과되고 Azure에서 변경 내용을 다시 적용해야 합니다.
프라이빗 키 및 토큰/암호 같은 민감한 고객 입력은 Kubernetes Configuration 서비스에 48시간 미만 동안 저장됩니다. Azure에서 이러한 값을 업데이트하는 경우 클러스터가 48시간 이내에 Azure와 연결되도록 합니다.
Azure Portal에서 Flux 구성 상태 및 규정 준수를 모니터링하거나 대시보드를 사용하여 상태, 규정 준수, 리소스 사용량 및 조정 활동을 모니터링할 수 있습니다. 자세한 내용은 GitOps(Flux v2) 상태 및 활동 모니터링을 참조하세요.
버전 지원
Flux v2 확장의 최신 버전(microsoft.flux
)과 이전 버전 두 개(N-2)가 지원됩니다. 일반적으로 최신 버전의 확장을 사용하는 것이 좋습니다. microsoft.flux
버전 1.7.0부터 ARM64 기반 클러스터가 지원됩니다.
참고 항목
Flux v1을 사용한 경우 가능한 한 빨리 Flux v2로 마이그레이션하는 것이 좋습니다.
2024년 1월 1일 이전에 만들어진 Flux v1 기반 클러스터 구성 리소스에 대한 지원은 2025년 5월 24일에 종료됩니다. 2024년 1월 1일부터 새로운 Flux v1 기반 클러스터 구성 리소스를 만들 수 없습니다.
프라이빗 링크를 사용하는 GitOps
Azure Arc 지원 Kubernetes 클러스터에 프라이빗 링크에 대한 지원을 추가한 경우 확장은 microsoft.flux
Azure로의 통신을 통해 기본으로 작동합니다. Git 리포지토리, Helm 리포지토리 또는 Kubernetes 매니페스트를 배포하는 데 필요한 다른 엔드포인트에 연결하려면 Flux Source 컨트롤러가 성공적으로 연결할 수 있도록 이러한 엔드포인트를 방화벽 뒤에 프로비전하거나 방화벽에 나열해야 합니다.
데이터 보존
Azure GitOps 서비스(Azure Kubernetes Configuration Management)는 고객 데이터를 저장/처리합니다. 기본적으로 고객 데이터는 쌍을 이루는 지역에 복제됩니다. 싱가포르, 동아시아 및 브라질 남부 지역의 경우 모든 고객 데이터가 해당 지역에서 저장되고 처리됩니다.
대규모 Flux 구성 적용
Azure Resource Manager에서 구성을 관리하므로 구독 또는 리소스 그룹의 범위 내에서 Azure Policy를 사용하여 모든 Azure Kubernetes Service 및 Azure Arc 지원 Kubernetes 리소스에 대해 동일한 구성 만들기를 자동화할 수 있습니다. 이러한 대규모 적용을 통해 전체 클러스터 그룹에 특정 구성이 일관되게 적용됩니다.
자세한 내용은 Flux v2 구성 및 Azure Policy를 사용하여 대규모로 일관되게 애플리케이션 배포를 참조하세요.
매개 변수
Azure의 Flux v2에서 지원하는 모든 매개 변수를 보려면 az k8s-configuration
설명서를 참조하세요. Azure 구현은 현재 Flux에서 지원하는 모든 매개 변수를 지원하지 않습니다.
사용 가능한 매개 변수 및 사용 방법에 대한 자세한 내용은 GitOps(Flux v2) 지원 매개 변수를 참조하세요.
다중 테넌트
Flux v2는 버전 0.26부터 멀티 테넌트를 지원합니다. 이 기능은 Azure의 Flux v2에 통합되었습니다.
참고 항목
다중 테넌트 지원 기능의 경우 매니페스트에 HelmRelease, Kustomization, ImagePolicy 또는 기타 개체에 대한 네임스페이스 간 sourceRef가 포함되어 있는지 또는 1.20.6 미만의 Kubernetes 버전을 사용하는지 알아야 합니다. 준비하려면 다음을 수행합니다.
- Kubernetes 버전 1.20.6 이상으로 업그레이드합니다.
- Kubernetes 매니페스트에서 모든
sourceRef
이(가) GitOps 구성과 동일한 네임스페이스 내의 개체에 있는지 확인합니다.- 매니페스트를 업데이트하는 데 시간이 필요한 경우 다중 테넌트에서 옵트아웃할 수 있습니다. 그러나 여전히 Kubernetes 버전을 업그레이드해야 합니다.
다중 테넌트용 매니페스트 업데이트
클러스터 범위가 있는 cluster-config
네임스페이스의 Kubernetes 클러스터 중 하나에 fluxConfiguration
을 배포한다고 가정해 보겠습니다. https://github.com/fluxcd/flux2-kustomize-helm-example
리포지토리를 동기화하도록 원본을 구성합니다. Flux v2에서 GitOps를 사용하여 애플리케이션 배포 자습서에서 사용되는 것과 동일한 샘플 Git 리포지토리입니다.
Flux는 리포지토리를 동기화한 후 매니페스트(YAML 파일)에 설명된 리소스를 배포합니다. 매니페스트 중 두 개는 HelmRelease
및 HelmRepository
개체를 설명합니다.
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: nginx
namespace: nginx
spec:
releaseName: nginx-ingress-controller
chart:
spec:
chart: nginx-ingress-controller
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
version: "5.6.14"
interval: 1h0m0s
install:
remediation:
retries: 3
# Default values
# https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
values:
service:
type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 30m
url: https://charts.bitnami.com/bitnami
기본적으로 Flux 확장은 cluster-config
네임스페이스에만 배포되는 flux-applier
서비스 계정을 가장하여 fluxConfigurations
를 배포합니다. 위 매니페스트를 사용하면 다중 테넌트가 사용하도록 설정되면 HelmRelease
가 차단됩니다. 이는 HelmRelease
가 nginx
네임스페이스에 있지만 flux-system
네임스페이스의 HelmRepository를 참조하기 때문입니다. 또한 nginx
네임스페이스에 flux-applier
서비스 계정이 없기 때문에 Flux helm-controller
는 HelmRelease
를 적용할 수 없습니다.
다중 테넌트 작업을 위해 올바른 방법은 모든 Flux 개체를 fluxConfigurations
과(와) 동일한 네임스페이스에 배포하는 것입니다. 이 방법은 네임스페이스 간 참조 문제를 방지하고 Flux 컨트롤러가 개체를 적용할 수 있는 권한을 가져올 수 있도록 합니다. 따라서 cluster-config
네임스페이스에 만들어진 GitOps 구성의 경우 이러한 예 매니페스트는 다음과 같이 변경됩니다.
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: nginx
namespace: cluster-config
spec:
releaseName: nginx-ingress-controller
targetNamespace: nginx
chart:
spec:
chart: nginx-ingress-controller
sourceRef:
kind: HelmRepository
name: bitnami
namespace: cluster-config
version: "5.6.14"
interval: 1h0m0s
install:
remediation:
retries: 3
# Default values
# https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
values:
service:
type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
name: bitnami
namespace: cluster-config
spec:
interval: 30m
url: https://charts.bitnami.com/bitnami
다중 테넌트 옵트아웃
microsoft.flux
확장이 설치되면 다중 테넌트가 기본적으로 사용하도록 설정됩니다. 멀티 테넌트를 사용하지 않도록 설정해야 하는 경우 다음 명령 예에 표시된 대로 클러스터에서 --configuration-settings multiTenancy.enforce=false
를 사용하여 microsoft.flux
확장을 만들거나 업데이트하여 옵트아웃할 수 있습니다.
az k8s-extension create --extension-type microsoft.flux --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
az k8s-extension update --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
Flux v1에서 마이그레이션
Flux v1을 계속 사용하는 경우 최대한 빨리 Flux v2로 마이그레이션하는 것이 좋습니다.
Flux v1을 사용한 동일한 클러스터에서 Flux v2를 사용하도록 마이그레이션하려면 먼저 클러스터에서 모든 Flux v1 sourceControlConfigurations
을(를) 삭제해야 합니다. Flux v2에는 기본적으로 다른 아키텍처가 있으므로 클러스터에 Flux v1 sourceControlConfigurations
리소스가 있는 경우 microsoft.flux
클러스터 확장이 설치되지 않습니다. Flux v1 구성을 제거하고 Flux v2 구성을 배포하는 프로세스는 30분 이상 걸리지 않아야 합니다.
Flux v1 sourceControlConfigurations
을(를) 제거해도 클러스터에서 실행되는 애플리케이션은 중지되지 않습니다. 그러나 Flux v1 구성이 제거되고 Flux v2 확장이 아직 완전히 배포되지 않은 기간 동안:
- Git 리포지토리에 저장된 애플리케이션 매니페스트에 새 변경 내용이 있는 경우 이러한 변경 내용은 마이그레이션 중에 이러한 변경 내용을 끌어오지 않으며 클러스터에 배포된 애플리케이션 버전이 부실합니다.
- 클러스터 상태에 의도하지 않은 변경 내용이 있고 원본 Git 리포지토리에 지정된 원하는 상태에서 벗어나면 클러스터가 자체 복구할 수 없습니다.
프로덕션 환경을 마이그레이션하기 전에 개발 환경에서 마이그레이션 시나리오를 테스트하는 것이 좋습니다.
Flux v1 구성 보기 및 삭제
다음 Azure CLI 명령을 사용하여 클러스터에서 기존 sourceControlConfigurations
항목을 찾아서 삭제합니다.
az k8s-configuration flux list --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
az k8s-configuration flux delete --name <configuration name> --cluster-name <cluster name> --cluster-type <connectedClusters or managedClusters> --resource-group <resource group name>
Azure Portal 클러스터에 대한 기존 GitOps 구성을 찾고 삭제할 수도 있습니다. 이렇게 하려면 구성이 만들어진 클러스터로 이동하고 왼쪽 창에서 GitOps를 선택합니다. 구성을 선택한 다음 삭제를 선택합니다.
Flux v2 구성 배포
Azure Portal 또는 Azure CLI를 사용하여 Flux v2 구성을 클러스터에 적용합니다.
Flux v1 사용 중지 정보
Flux v1의 오픈 소스 프로젝트가 보관되었으며 기능 개발이 무기한 중지되었습니다.
Flux v2는 Flux의 업그레이드된 오픈 소스 프로젝트로 시작되었습니다. 새로운 아키텍처가 있으며 더 많은 GitOps 사용 사례를 지원합니다. Microsoft는 2022년 5월에 Flux v2를 사용하여 확장 버전을 출시했습니다. 이후 Flux v1 사용에 대한 지원이 2025년 5월에 종료될 예정이므로 고객은 3년 이내에 Flux v2로 이동하는 것이 좋습니다.
Flux v2용 GitOps 확장에 도입된 주요 새 기능:
- Flux v1은 모놀리식 do-it-all 연산자입니다. Flux v2는 기능을 특수 컨트롤러(원본 컨트롤러, Kustomize 컨트롤러, Helm 컨트롤러 및 알림 컨트롤러)로 구분합니다.
- 여러 원본 리포지토리와의 동기화를 지원합니다.
- 고유한 권한 집합을 사용하여 각 원본 리포지토리를 적용하는 것과 같은 다중 테넌트를 지원합니다.
- 상태 검사, 이벤트 및 경고를 통해 운영 인사이트를 제공합니다.
- Git 분기를 지원하고, 커밋 및 태그에 고정하고, SemVer 태그 범위를 따르도록 지원합니다.
- GitRepository 리소스당 자격 증명 구성: SSH 프라이빗 키, HTTP/S 사용자 이름/암호/토큰 및 OpenPGP 공개 키.
다음 단계
- 자습서를 사용하여 AKS 또는 Azure Arc 지원 Kubernetes 클러스터에서 GitOps를 사용하도록 설정하는 방법을 알아봅니다.
- GitOps를 사용하는 CI/CD 워크플로에 대해 알아봅니다.