Argocd 구성 요소
1. Application
여러 팀에서 사용할 때 어플리케이션의 논리적 그룹을 제공한다.
- 항목:
- Source: Git 리포지토리와 브랜치, 디렉토리 경로를 설정하여 어떤 Kubernetes 매니페스트를 사용할지를 정의합니다.
- Destination: 리소스가 배포될 Kubernetes 클러스터와 네임스페이스를 설정한다.
- Sync Policy: 애플리케이션이 어떻게 배포되고 업데이트될지를 정의하는 정책으로, 자동 또는 수동으로 동기화할 수 있다.
2. Project
Project는 여러 Application을 논리적으로 그룹화하여 관리할 수 있다.
특정 클러스터 내에서 리소스를 체계적으로 관리하기 위해 애플리케이션을 논리적으로 묶는 역할을 한다.
application은 무조건 한 project에는 포함되어야한다.
- 구성 요소:
- Source Repository: 프로젝트에 포함된 애플리케이션에서 사용할 수 있는 Git 리포지토리 목록을 정의합니다.
- Destination: 애플리케이션이 배포될 수 있는 클러스터와 네임스페이스를 지정합니다. 특정 네임스페이스나 클러스터에 대한 접근 권한을 설정할 수 있습니다.
- Resource Limits: 프로젝트 내에서 사용할 수 있는 리소스의 한계를 설정하여 과도한 사용을 방지할 수 있습니다.
- 사용 목적:
- 여러 Application을 그룹화하여 관리함으로써, 애플리케이션 간의 권한 및 리소스 관리를 용이하게 할 수 있습니다.
- RBAC(역할 기반 접근 제어)를 통해 프로젝트에 대한 접근 권한을 설정하여 보안을 강화할 수 있습니다.
3. Sync Policy (Application 당 설정)
Argocd는 GitOps를 기반한 도구로, git과의 동기화를 어떤 방식으로 진행할 것인지 설정할 수 있다.
- Automatic Sync: 변경 사항이 Git 리포지토리에 푸시되면 Argo CD가 자동으로 Kubernetes 클러스터에 변경 사항을 적용한다. 이를 통해 항상 최신 상태를 유지할 수 있다.
- Manual Sync : 변경 사항이 있을 때 Argo CD 대시보드 또는 CLI를 통해 수동으로 동기화 버튼을 통한다. 이 방법은 변경 사항을 검토하고 수동으로 적용할 필요가 있는 경우 유용하다.
4. Sync Options (Application 당 설정)
동기화 방식 하위로 다양한 옵션이 지원된다.
- Prune: 이전에 배포된 리소스 중 Git 리포지토리에서 더 이상 정의되지 않은 리소스를 자동으로 삭제한다.
- Self-Heal: 클러스터의 상태가 Git 리포지토리의 정의와 다를 경우, Argo CD가 자동으로 상태를 복원한다.
- Sync Waves: 리소스를 배포할 때의 순서를 정의합니다. 예를 들어, 특정 리소스가 다른 리소스보다 먼저 배포되어야 하는 경우 유용하다.
5. Sync Status
Argocd는 git에 명시된 상태를 desired state로 놓고, 현재 상태와 비교하여 sync 상태를 보여준다.
- Synced: 애플리케이션의 상태 == Git 리포지토리 상태
- OutOfSync: 애플리케이션의 상태 =/= Git 리포지토리 상태
- Syncing: 동기화 작업이 진행 중인 상태
6. User
- 사용자 생성을 위한 configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
accounts.test: apiKey, login
- 사용자 생성
kubectl apply -f new_user.yaml
- 비밀번호 생성
kubectl create secret generic argocd-secret \
--from-literal=password=<YOUR_PASSWORD> \
-n argocd
- 비밀번호 Secret 오브젝트로 생성하여 보호
kubectl create secret generic argocd-secret --from-literal=password=<YOUR_PASSWORD> -n argocd
- Configmap - Secret 연동(하단을 추가해서 다시 apply 한다)
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
accounts.test: apiKey, login
users: |
<YOUR_USERNAME>:
password:
$from_secret: argocd-secret
accounts.test: apiKey, login
7. Role
Role은 JWT 토큰이 할당되고, 연결되어야 이용할 수 있다.
- 각 프로젝트에 대한 세부적인 권한을 설정할 수 있다.
user : developer
project : test-project
role : applications에 대한 권한
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: test-project
namespace: argocd
spec:
roles:
- name: developer
description: Developer role for managing apps in test-project
policies:
- p, proj:test-project:developer, applications, create, test-project/*, allow
- p, proj:test-project:developer, applications, get, test-project/*, allow
- p, proj:test-project:developer, applications, sync, test-project/*, allow
jwtTokens:
- expiresIn: 1000h
- Role: Role은 애플리케이션을 Create, Update, Delete, Get, List, Sync하는 권한을 가질 수 있다.
- Policy: Role을 사용하여 사용자 또는 그룹에게 권한을 부여하는 정책을 정의한다.
- Access Control:Project Role은 역할 기반 접근 제어(RBAC)를 사용하여 사용자의 접근 권한을 관리한다.
- 전체 Project에 대한 Role 설정
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.csv: |
p, role:developer, applications, get, */*, allow # developer 역할에 모든 앱 조회 권한 부여
p, role:admin, applications, *, */*, allow # admin 역할에 전체 권한 부여
policy.default: role:readonly # 기본적으로 모든 사용자에게 읽기 전용 권한 부여
- Role과 User를 연결
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
accounts.test: apiKey, login
users: |
<YOUR_USERNAME>:
password:
$from_secret: argocd-secret
accounts.test: apiKey, login
accounts.test-user.role: developer # 사용자에게 developer 역할 부여
로그인을 하게 되면 자동으로 JWT 토큰이 발급되어 인가된 API만 날릴 수 있다.
실습
💡ArgoCD를 통해서 git repository와 연결하여 올바르게 sync되는지 확인한다.
user: developer
project : backend
application : hellospring
argocd는 UI로도 충분히 설정이 가능하나 cli를 경험해보고자 위 환경의 세팅을 모두 cli로 진행하였다.
- 이전 helm 문서에서 argocd에 대한 설치를 완료하였다.
하지만, admin에 argod ctl 을 사용할 수 없게 설정했기 때문에, values.yaml을 수정하고 다시 배포한다.
이 명령어는 helm upgrade로 수행이 가능하다.
config:
accounts:
admin: **apiKey**, login
helm upgrade argocd argo/argo-cd -f values.yaml -n argocd
- 먼저 user backend를 생성하고 application hellospring에 대한 create, sync, get 권한을 부여한다.
helm으로 설치하였다면 argocd에는 아래와 같은 configmap이 보인다. 그중, 사용자 정보를 저장하고 있는 argocd-rbac-cm를 수정한다.
kubectl edit cm/argocd-rbac-cm -n argocd
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.csv: |
p, role:admin, applications, *, */*, allow
p, role:developer, applications, get, my-app/*, allow
p, role:developer, applications, create, my-app/*, al
low
p, role:developer, applications, update, my-app/*, allow
p, role:developer, applications, delete, my-app/*, allow
# 사용자와 역할 매핑
g, developer, role:developer
policy.default: "allow"
policy.matchMode: glob
scopes: '[groups]'
- 비밀번호 생성
비밀번호를 생성 후 data.developer.apssword 에 인코딩된 값을 넣어 저장한다. (길고 특수문자 필수)
echo -n 'my-password' | base64 # bXktcGFzc3dvcmQ= # base64인코딩
k edit secret argocd-secret -n argocd -o yaml # 비밀번호 저장
- 이제, user와 password를 연동한다. 이건 argocd-cm에서 진행한다.
k -n argocd edit cm/argocd-cm
# data하단 정보 추가
data:
users: |
developer:
password:
$from_secret: argocd-secret
accounts.developer: apiKey, login
- 이제 developer는 password를 가지고 로그인이 가능하다.
먼저 argocd admin으로 로그인하여 계정이 생성되었는지 확인한다.
argocd login 43.203.14.92:30800 --username admin --password password
정상적으로 생성되었다.
- project 생성
먼저 admin으로 backend project를 생성한다.
backend 네임스페이스에 넣기 위해 ns를 생성하고 ,아래 명령어를 통해 project를 생성한다.
source는 생성한 helm chart를 기입한다.
k create ns backend
argocd proj create backend --description "hello spring!" --src https://github.com/suhyeonXYZ/hellospring-helm --dest https://kubernetes.default.svc,backend
먼저 admin으로 backend project를 생성한다.
앞서, gitops 구조를 다시 살펴보면, application이 argocd가 sysnc하는 repository이다. application의 code 가 들어있는 repository가 아닌, 배포할 때 사용하는 파일이 있어야한다.
├── applications/
│ └── hellospring/
│ ├── charts/ # Helm 차트 디렉토리
│ │ └── hellospring/ # 애플리케이션 Helm 차트
│ │ ├── Chart.yaml # 차트 메타데이터
│ │ ├── values.yaml # 기본 값 파일
│ │ ├── templates/ # Kubernetes 리소스 템플릿
│ │ │ ├── deployment.yaml
│ │ │ └── service.yaml
│ │ └── README.md
│ └── README.md
├── infrastructure/
│ └── my-infrastructure/
│ ├── base/
│ └── overlays/
└── deployment/
├── ci-cd/
│ ├── github-actions/ # CI/CD 설정
│ └── argocd/
└── README.md
- developer 계정 로그인
troubleshooting)
참고로, does not match the following expression: ^.{8,32}$. 를 만족해야한다.
따라서 너무 쉬운 비밀번호를 secret으로 입력하게되면 로그인이… 안된다.
time="2024-11-01T08:14:46Z" level=warning msg="User developer failed login 1 time(s)"
time="2024-11-01T08:14:47Z" level=info msg="finished unary call with code Unauthenticated" error="rpc error: code = Unauthenticated desc = Invalid username or password" grpc.code=Unauthenticated
argocd logout 43.203.14.92:30800 # admin 계정에서 logout
argocd login 43.203.14.92:30800 --username developer --password password
- Application 생성
argocd app create hellospring \
--project backend \
--repo https://github.com/suhyeonXYZ/hellospring-helm \
--path hellospring \
--dest-server https://kubernetes.default.svc \
--dest-namespace backend \
--sync-policy automated
--sync-option Prune=true
argocd proj update backend \
--repo https://github.com/suhyeonXYZ/hellospring-helm \
--dest-server https://kubernetes.default.svc \
--dest-namespace backend
수행하면 오류를 볼 수 있다. 왜냐면.. argocd-cm에서 backend/* 해서, hellospring에 대한 권한으로 들어갔다. hellospring에 대한 권한을 backend로 수정한다.
이후 정상적으로 배포된 것을 볼 수 있다.
이제, UI를 통해서 sync가 되었는지 확인해본다. 정상적으로 sync되었다.
TroubleShooting
- argocd 재시작
kubectl rollout restart deployment argocd-server -n argocd
- argocd cli로 배포한 리소스들 yaml로 보기 (원래 yaml 작성해서 k apply -f 해도 된다)
argocd app get hellospring
argocd app list
argocd proj get backend
- 처음에 helm repo를 git page url로 등록해서 argocd로 등록했는데 argocd 에는 git url로 작성해야한다.
'사이드 프로젝트' 카테고리의 다른 글
[CI/CD 프로젝트] ArgoRollout로 canary배포하기 (0) | 2024.11.20 |
---|---|
[CI/CD 프로젝트] ArgoRollout로 Blue/Green 배포하기 (1) | 2024.11.20 |
[CI/CD 프로젝트] GitAction을 통한 CI 구성 (0) | 2024.11.20 |
[CI/CD 프로젝트] API gateway의 도입 배경과 역할 (0) | 2024.11.20 |
[CI/CD 프로젝트] Ingress 를 통한 외부 트래픽 관리 (0) | 2024.11.20 |