[AEWS-3기][8주차 도전과제] ArgoCD API 활용하기
ArgoCD 에 User 에 API Key 발급 후 ArgoCD API(SYNC/DELETE)를 호출하여 Trigger 동작 설정하는 도전과제를 진행해보고자 한다.
이 과제에서는 apikey를 발급받고, swagger를 통해 api를 확인한 후 실제로 요청을 보내 자동화할 수 있도록 알아볼 수 있는 과제이다.
argocd 로그인
먼저 로그인을 진행한다. 해당 server url을 통해서 argocd에 접속하니 확인하기 바란다.
로그인이 성공되면 login successfully가 나온다.
argocd login <argocd-server-url>
apikey 허용하기
먼저 해당 User에 apikey에 대한 내용을 허용해 주어야한다.
나는 admin에 대해서 다음과 같이 설정하였다.
kubectl edit cm -n argocd argocd-cm
# data 밑에 다음 항목을 둔다.
accounts.admin: apiKey, login
argocd account 명령어를 통해서 반영여부를 확인해본다.
argocd account get --account admin
admin 계정의 토큰 발급
argocd account get --account admin
argocd account generate-token --account admin
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NDMyMzc2MDMsImlhdCI6MTc0MzIzNzYwMywianRpIjoiZmQ1YTk4ZDYtYTM5Ny00ODI0LWI5OTUtOGZiYzQ1ZDljNWIxIn0.ix04HMPa9Ucgcynnk-94ZbWkH8RTFl3cf6y5RIHXHik
물론 이렇게 UI상에서도 토큰을 발급할 수 있다.
토큰 정보 확인
argocd account get --account admin
이제 토큰을 받았으면 모든 준비는 끝났다. ArgoCD에서 제공하는 Swagger를 통해서 직접 api를 사용해 통제해보자.
https://argo-cd.readthedocs.io/en/stable/developer-guide/api-docs/
swagger 접속
argocd swagger에 접속해 Sync를 확인해본다.
http://localhost:30002/swagger-ui
curl로 application 정보 GET해보기
ARGOCD_SERVER=http://localhost:30002
ARGOCDTOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjphcGlLZXkiLCJuYmYiOjE3NDMyMzc2MDMsImlhdCI6MTc0MzIzNzYwMywianRpIjoiZmQ1YTk4ZDYtYTM5Ny00ODI0LWI5OTUtOGZiYzQ1ZDljNWIxIn0.ix04HMPa9Ucgcynnk-94ZbWkH8RTFl3cf6y5RIHXHik"
curl -s $ARGOCD_SERVER/api/v1/applications -H "Authorization: Bearer $ARGOCDTOKEN" | jq
postman을 통해서 POST로 sync 실행하기
POST 방식으로 다음과 같이 넣은 후 Authorization에서는 bearer token을 입력했다.
http://127.0.0.1:30002/api/v1/applications/{앱이름}/sync
body에는 다음과 같이 JSON을 입력하고 Send하면 바로 반영되는 것을 볼 수 있다.
{
"prune": true
}
애플리케이션 삭제
만약 애플리케이션을 삭제하고 싶다면 이렇게 해보면된다. 다음과 같이 delete application 정보를 swagger에서 찾아본다.
다음과 같이 DELETE method를 선택하고 url과 token을 입력한다. body에는 {}만 넣은 후 Send를 해보자.
http://127.0.0.1:30002/api/v1/applications/dev-nginx
깔끔하게 삭제되었다.
운영자 관점
그렇다면 결국 이렇게 요약할 수 있다.
1. apikey 발급이 가능한 user를 생성하고 관리한다.
2. apikey를 관리한다.
3. 별도의 apiserver를 만들어서 관리한다.
4. 자주 쓰는 api를 별도로 관리하여 slack 혹은 자동화 페이지를 만들어서 훨씬더 쉽게 관리할 수 있게된다.
주요 API 엔드포인트:
- /api/v1/applications: 애플리케이션 관리 (생성, 조회, 수정, 삭제)
- /api/v1/repositories: Git 저장소 관리
- /api/v1/session: 로그인 세션 관리
- /api/v1/settings: ArgoCD 설정 관리
- /api/v1/projects: 프로젝트 관리
- /api/webhook: 웹훅 수신 엔드포인트
웹훅 관련 API:
- /api/webhook: 다양한 Git 제공자(GitHub, GitLab, Bitbucket, Gogs)의 웹훅을 처리
자동화 관련 API:
- /api/v1/applications/{name}/sync: 애플리케이션 수동 동기화
- 자동 동기화 설정: PUT /api/v1/applications/{name} API에 syncPolicy 필드 포함
API를 사용한 상태 모니터링:
- /api/v1/applications/{name}: 애플리케이션 상태 확인
- /api/v1/applications/{name}/resource-tree: 리소스 상태 확인
- /api/v1/applications/{name}/events: 애플리케이션 이벤트 확인
API 키 생성 및 관리:
- /api/v1/account/token: API 토큰 생성
403 오류
https://argo-cd.readthedocs.io/en/stable/developer-guide/api-docs/#services
이곳에서는 argocd는 보안을 강화하기 위해 실제 API 호출 시 특정 프로젝트 쿼리 파라미터를 사용하는 것이 좋다는 것을 이야기하고 있다.
프로젝트 쿼리가 있다면 argocd api에서 존재하지 않는 애플리케이션에 접근하면 404(Not Found) 오류가 반환된다. 그러나 실제로 존재하는 애플리케이션이 있지만 접근 권한이 사용자에게 없다면 403(Forbidden)오류를 반환한다.
정말 argocd의 세계는 무한하다고 보인다.