일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kopf
- 카오스 엔지니어링
- nginx ingress
- Argo
- Pulumi
- Litmus
- gitea
- knative
- 오퍼레이터
- MLflow
- kubernetes operator
- Kubernetes 인증
- opentelemetry
- CI/CD
- gitops
- operator
- serving
- Kubernetes
- seldon core
- argocd
- Continuous Deployment
- tekton
- CANARY
- blue/green
- Kubeflow
- keda
- argo rollout
- mlops
- opensearch
- Model Serving
- Today
- Total
Kubernetes 이야기
argocd (설치) 본문
argo project에는 다양한 오픈소스 프로젝트들이 있다. 대표적으로 argo workflow, argocd, argo rollout, argo event 등이 있다.
이 중 argo workflow의 pipeline을 이용하여 ci/cd 하는 방법에 대해 글을 쓴적이 있는데, 이번에는 argocd 를 사용하여 배포하는 방법에 대해서 알아보자.
argo workflow와 argocd 는 무엇이 틀린가요?
Argo Workflows는 파이프라인/워크플로를 구성하고 오케스트레이션 및 배포를 처리하기 위한 일반 프레임워크입니다. 다양한 사용 사례가 있으며 argo worflow를 통해 CI/CD를 구성할 수 있다.
Argo CD는 CD ( Continuous Deployment )에 초점을 맞추며 GitOps 스타일의 지속적 전달에 더 적합하며 kustomize/helm과 같은 도구를 사용하여 manifest를 관리할 수 있다.
아키텍처
Argo CD는 실행 중인 애플리케이션을 지속적으로 모니터링하고 현재 라이브 상태를 원하는 대상 상태(Git 리포지토리에 지정된 대로)와 비교하는 kubernetes 컨트롤러로 구현된다.
특징
- 지정된 대상 환경에 애플리케이션 자동 배포
- 여러 구성 관리/템플릿 도구 지원(Kustomize, Helm, Ksonnet, Jsonnet, plain-YAML)
- 여러 클러스터에 대한 관리 및 배포 기능
- SSO 통합(OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn)
- 권한 부여를 위한 다중 테넌시 및 RBAC 정책
- Git 리포지토리에서 커밋된 모든 애플리케이션 구성으로 롤백/어디서나 롤백
- 애플리케이션 리소스의 상태 분석
- 자동화된 구성 드리프트 감지 및 시각화
- 애플리케이션을 원하는 상태로 자동 또는 수동 동기화
- 애플리케이션 활동의 실시간 보기를 제공하는 웹 UI
- 자동화 및 CI 통합을 위한 CLI
- Webhook 통합(GitHub, BitBucket, GitLab)
- 자동화를 위한 액세스 토큰
- 복잡한 애플리케이션 롤아웃을 지원하는 PreSync, Sync, PostSync 후크(예: 블루/그린 및 카나리아 업그레이드)
- 애플리케이션 이벤트 및 API 호출에 대한 감사 추적
- 프로메테우스 측정항목
- Git에서 ksonnet/helm 매개변수 재정의를 위한 매개변수 재정의
설치
argo 설치는 간단히 yaml 실행으로 설치가 가능하다. 현재 시점에 최신 버전인 2.4.0-rc1 버전으로 테스트해 보자.
# kubectl create namespace argocd
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.0-rc1/manifests/install.yaml
stable 버전을 설치하려면 아래의 manifest를 실행한다.
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
설치를 완료하면 다음과 같은 Resource들이 생성된다.
# k get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 2m35s
pod/argocd-applicationset-controller-7d5777ffb6-tn9wk 1/1 Running 0 2m35s
pod/argocd-dex-server-68959f56df-l6lnd 1/1 Running 0 2m35s
pod/argocd-notifications-controller-55fcb44b9c-728fn 1/1 Running 0 2m35s
pod/argocd-redis-558cfbbf7-wgfxz 1/1 Running 0 2m35s
pod/argocd-repo-server-6b5846685b-d8z9t 1/1 Running 0 2m35s
pod/argocd-server-c84f7cb75-29dnh 1/1 Running 0 2m35s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.96.139.238 <none> 7000/TCP,8080/TCP 2m35s
service/argocd-dex-server ClusterIP 10.96.247.207 <none> 5556/TCP,5557/TCP,5558/TCP 2m35s
service/argocd-metrics ClusterIP 10.96.32.60 <none> 8082/TCP 2m35s
service/argocd-notifications-controller-metrics ClusterIP 10.96.242.70 <none> 9001/TCP 2m35s
service/argocd-redis ClusterIP 10.96.219.111 <none> 6379/TCP 2m35s
service/argocd-repo-server ClusterIP 10.96.101.203 <none> 8081/TCP,8084/TCP 2m35s
service/argocd-server ClusterIP 10.96.64.197 <none> 80/TCP,443/TCP 2m35s
service/argocd-server-metrics ClusterIP 10.96.162.52 <none> 8083/TCP 2m35s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 2m35s
deployment.apps/argocd-dex-server 1/1 1 1 2m35s
deployment.apps/argocd-notifications-controller 1/1 1 1 2m35s
deployment.apps/argocd-redis 1/1 1 1 2m35s
deployment.apps/argocd-repo-server 1/1 1 1 2m35s
deployment.apps/argocd-server 1/1 1 1 2m35s
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-7d5777ffb6 1 1 1 2m35s
replicaset.apps/argocd-dex-server-68959f56df 1 1 1 2m35s
replicaset.apps/argocd-notifications-controller-55fcb44b9c 1 1 1 2m35s
replicaset.apps/argocd-redis-558cfbbf7 1 1 1 2m35s
replicaset.apps/argocd-repo-server-6b5846685b 1 1 1 2m35s
replicaset.apps/argocd-server-c84f7cb75 1 1 1 2m35s
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 2m35s
CLI 설치
# wget https://github.com/argoproj/argo-cd/releases/download/v2.4.0-rc1/argocd-linux-amd64
# mv argocd-linux-amd64 /usr/local/bin/argocd
# chmod +x /usr/local/bin/argocd
# argocd
argocd controls a Argo CD server
Usage:
argocd [flags]
argocd [command]
Available Commands:
account Manage account settings
admin Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
app Manage applications
cert Manage repository certificates and SSH known hosts entries
cluster Manage cluster credentials
completion output shell completion code for the specified shell (bash or zsh)
context Switch between contexts
gpg Manage GPG keys used for signature verification
help Help about any command
login Log in to Argo CD
logout Log out from Argo CD
proj Manage projects
relogin Refresh an expired authenticate token
repo Manage repository connection parameters
repocreds Manage repository connection parameters
version Print version information
Flags:
--auth-token string Authentication token
--client-crt string Client certificate file
--client-crt-key string Client certificate key file
--config string Path to Argo CD config (default "/root/.config/argocd/config")
--core If set to true then CLI talks directly to Kubernetes instead of talking to Argo CD API server
--grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2.
--grpc-web-root-path string Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root.
-H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers)
-h, --help help for argocd
--http-retry-max int Maximum number of retries to establish http connection to Argo CD server
--insecure Skip server certificate and domain verification
--kube-context string Directs the command to the given kube-context
--logformat string Set the logging format. One of: text|json (default "text")
--loglevel string Set the logging level. One of: debug|info|warn|error (default "info")
--plaintext Disable TLS
--port-forward Connect to a random argocd-server port using port forwarding
--port-forward-namespace string Namespace name which should be used for port forwarding
--server string Argo CD server address
--server-crt string Server certificate file
Use "argocd [command] --help" for more information about a command.
argo 접속을 위한 ingress 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argo-ingress
namespace: argocd
annotations:
nginx.ingress.kubernetes.io/backend-protocol: https
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
ingress.kubernetes.io/app-root: "/"
spec:
rules:
- host: "argocd.192.168.50.16.nip.io"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 80
tls:
- hosts:
- argocd.192.168.50.16.nip.io
secretName: argo-cert
ingress까지 설정하였으면 브라우저에서 호출해 보자.
계정정보
- Username : admin
- Password : kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
패스워드 변경이 필요한 경우는 아래와 같이 수정가능하다.
# argocd login argocd.192.168.50.16.nip.io --insecure --grpc-web
Username: admin
Password:
'admin:login' logged in successfully
Context 'argocd.192.168.50.16.nip.io' updated
# argocd account update-password --account admin --current-password dPrSmoeWwkYve0r9 --new-password password --grpc-web
Password updated
Context 'argocd.192.168.50.16.nip.io' updated
admin 계정을 disable 하려고 하는 경우
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
admin.enabled: "false"
SSO 연동
argocd 와 google 연동을 해보자. ( google 뿐만 아니라 oauth를 제공하는 Provider는 비슷한 설정이 가능하다. )
- google oauth 설정
설정 방법은 아래를 참고한다.
https://kmaster.tistory.com/51
콜백주소를 https://<domain>/api/dex/callback 로 요청한다.
[configmap 수정]
argocd-cm 설정
apiVersion: v1
data:
dex.config: |
connectors:
- config:
issuer: https://accounts.google.com
clientID: "YOUR_CLIENT_ID"
clientSecret: "YOUR_CLIENT_SECRET"
type: oidc
id: google
name: Google
url: https://argocd.192.168.50.16.nip.io
argocd-rbac-cm 설정
data:
policy.default: role:readonly
policy.csv: |
g, kmaster8k@gmail.com, role:admin
scopes: '[cognito:groups, email]'
configmap을 수정한 후 다시 로그인 화면을 호출하면 아래와 같다. ( configmap을 수정하면 동적으로 바로 반영된다. )
google 로그인을 클릭하면 Google계정으로 연동된다.
만약 등록된 계정이 아닌 다른 계정으로 로그인을 하면 아래와 같이 생성 시 권한 오류가 발생한다.
다음에는 On-prem 환경에서 사용하기 위한 Keyclock 와 SSO 연동을 테스트해보자.
참고
https://argo-cd.readthedocs.io/en/stable/getting_started/
https://argo-cd.readthedocs.io/en/stable/operator-manual/user-management/google/
https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/
'Kubernetes > devops' 카테고리의 다른 글
argocd (활용 - Git 연동) (0) | 2022.05.17 |
---|---|
argocd와 keycloak을 사용하여 SSO 구축하기 (0) | 2022.05.14 |
GitOps and Flux (0) | 2022.05.07 |
Argo Event (0) | 2022.05.03 |
Keda와 Prometheus를 이용한 Scale in/out (0) | 2022.04.28 |