인생은 여행

Argo CD Core(headless mode) 본문

카테고리 없음

Argo CD Core(headless mode)

산떠 버하둘 2025. 1. 4. 16:22
일반적으로 headless라 함은 모니터(GUI)가 없는 컴퓨팅 환경 또는 두뇌 역할을 하는 컨트롤 타워가 없는 상황을 이야기 합니다.

 

Argo CD의 아키텍처는 다음 이미지와 같이 4개의 레이어로 구분되어 있습니다. headless mode는 여기에서 Core 계층만 설치되어 작동합니다. 그래서 core 모드라고 하는 듯 합니다. 실제로 초기에 headless 라고 불리던 용어를 core로 대대적으로 변경하는 작업이 있었습니다. (참고 PR: https://github.com/argoproj/argo-cd/pull/6819)

Core mode는 다음 제안으로부터 시작했습니다.

 

- Neat Enhancement Idea: https://argo-cd.readthedocs.io/en/stable/proposals/headless-argocd/

제안서에 있는 headless라는 용어나 옵션은 후에 core로 대체되었습니다.

 

다음은 core 모드의 개념을 설명하는 문서입니다.

- Argo CD Core: https://argo-cd.readthedocs.io/en/stable/operator-manual/core/

Multi-Tenant 멀티 테넌트
Argo CD 멀티 테넌트 설치는 일반적으로 많이 사용하는 방식입니다. Argo CD나 쿠버네티스 클러스터를 관리하는 플랫폼 팀 뿐 만 아니라 개발팀에서도 직접 활용할 수 있도록 Web UI를 지원하고, API를 서비스하며 자체적인 RBAC 체계를 가지고 있습니다.
이에 반하여 Core 설치는 플랫폼 팀 만을 위한 서비스 제공을 목적으로 하며, API 서버가 설치되지 않으므로 여기에 포함된 Web UI도 서비스되지 않습니다. 보안은 쿠버네티스의 인증/인가 체계를 사용하게됩니다.
- Multi-Tenant <-> Core

 

Core 모드 설치

- Argo CD Core Installation: https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/#core

Core 모드에서 CLI 사용하기

Core 모드로 설치된 Argo CD를 다루기 위해서는 argocd cli를 이용하게 됩니다. 이때 사용할 수 있는 옵션이 '--core' 입니다.

--core 옵션

--core는 global 옵션입니다. 어느 명령에서든지 사용할 수 있으며, 이 경우 Argo CD API에 접속하는 것이 아니라 kubernetes API를 이용하게 됩니다. 실제로는 CLI 내부적으로 로컬에 API 서버를 띄워서 이를 이용하는 것으로 보입니다.

core 로그인

다음과 같이 --core 옵션을 사용하게되면 argocd cli의 기본 context가 kubernetes로 바뀌면서 앞으로의 모든 CLI 명령에 --core 옵션을 붙인 효과가 발생하게 됩니다. 이 때 실제로 kubernetes API와 상호 작용하지는 않고 단지 context 파일에 업데이트만 하는 것으로 보입니다.

kubectl config set-context --current --namespace=argocd # change current kube context to argocd namespace
argocd login --core

Web UI

Core 모드에서는 API 서버와 Web UI가 제공되지 않지만 아래와 같이 CLI를 이용해서 로컬에 Web UI 서비스를 띄울 수 있습니다.

argocd admin dashboard -n argocd

 

브라우저를 이용하여 http://localhost:8080에 접속하면 Web UI를 사용할 수 있습니다.

코드 속의 core 모드

아래의 코드는, cli 코드 중에 API에 접속하기위한 client를 얻는 부분(headless.NewClientOrDie)에서 core 모드 사용 여부를 염두에 두고 공통 함수를 호출하고 있습니다. 아래의 공통 함수(NewClinetOrDie)에서는 core 옵션 사용 여부에 따라 로컬 서버를 시작할 지 판단하고 있습니다.

...
conn, appIf := headless.NewClientOrDie(clientOpts, c).NewApplicationClientOrDie()
defer argoio.Close(conn)
apps, err := appIf.List(ctx, &application.ApplicationQuery{
    Selector:     ptr.To(selector),
    AppNamespace: &appNamespace,
})

...

// NewClientOrDie creates a new API client from a set of config options, or fails fatally if the new client creation fails.
func NewClientOrDie(opts *apiclient.ClientOptions, c *cobra.Command) apiclient.Client {
	ctx := c.Context()

	ctxStr := initialize.RetrieveContextIfChanged(c.Flag("context"))
	// If we're in core mode, start the API server on the fly and configure the client `opts` to use it.
	// If we're not in core mode, this function call will do nothing.
	err := MaybeStartLocalServer(ctx, opts, ctxStr, nil, nil, cache.RedisCompressionNone, nil)
	if err != nil {
		log.Fatal(err)
	}
	client, err := apiclient.NewClient(opts)
	if err != nil {
		log.Fatal(err)
	}
	return client
}

 

요약

- Argo CD에서 core와 headless는 동일한 의미이며 core가 정착된 용어로 보입니다.

- Core 모드에서는 API 서버가 설치되지 않습니다. 그러므로 API 서버에 포함된 Web UI도 서비스하지 않습니다.

- CLI에서 --core 옵션을 붙이면 현재의 kubectl context를 사용하여 kubernetes API에 요청을 보냅니다.

- CLI의 --core 옵션은 Argo CD 서비스의 core 설치 여부와는 상관 없이 작동합니다.

- CLI의 login 명령에서 --core 옵션 사용은 기본 옵션으로 --core 플래그를 켠 정도의 효과만 있습니다.

- 인증/인가는 전적으로 kubernetes의 RBAC 체계를 따릅니다.

 

생각

Argo CD Core 모드는 반대되는 개념인 멀티 테넌트 모드 대비 간소화된 설치로 클러스터의 리소스를 절약할 수 있다는 장점이 있지만 그보다는 인증/인가를 전적으로 쿠버네티스에 의존함으로써 클러스터를 관리하는 입장에서 훨씬 간결한 관리가 가능해진다는 장점이 클 것 같습니다.

Comments