Kubernetes 이야기

argocd (설치) 본문

Kubernetes/devops

argocd (설치)

kmaster 2022. 5. 13. 12:44
반응형

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를 관리할 수 있다.

 

아키텍처

 

출처 : https://argo-cd.readthedocs.io/en/stable/

 

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

 

Nginx ingress - External OAUTH Authentication ( Google )

Kubernetes에서는 Kubernetes Nginx Controller를 선택하여 Prometheus, grafana, 다양한 애플리케이션 등과 같은 공개 URL을 애플리케이션 로드 밸런서(AWS 또는 GCP의 경우 Google 로드 밸런서)를 통해 노출시켜..

kmaster.tistory.com

 

콜백주소를 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
Comments