DevOps, Infra

[ArgoCD] ArgoCD Install

seulseul 2022. 12. 28. 12:03

목차

 

     

    1. GitOps

    GitOps 는 Weaveworks 라는 회사에서 처음 쓰기 시작했다.

    • Git 저장소에 저장된 쿠버네티스 매니페스트 파일이 쿠버네티스 클러스터에 똑같이 반영된다.
      • Human Error 를 줄일 수 있어 안정성이 보장된다.
      • 변경사항을 커밋 로그및 히스토리로 확인 할 수 있어 장애 발생시 빠르게 롤백할 수 있고 버전 관리 가 된다.
      • 누가 수정했는지 코드로 확인할 수 있다.

    매니페스트가 정의되어 있는 Git 저장소가 변경되면, Git 저장소의 내용과 쿠버네티스 클러스터를 동기화 해주는 에이전트가(=ArgoCD) 변경 내역을 쿠버네티스 클러스터에 반영해 주게 되는 것입니다.

    인프라 관리를 점차 코드를 통해 관리하는 추세인데 GitOps 또한 그런 맥락으로 이해할 수 있을 것 같다. IaC(Infrastructure as Code) 가 더 포괄적인 개념.

    2. ArgoCD 란?

    ArgoCD 는 GitOps 스타일의 배포를 지원하는 CD 도구이다.

    Git Repository 에 선언된 쿠버네티스 설정을 쿠버네티스 클러스터에 동기화 해주는 역할을한다.

    즉, 지정한 대상 환경에 (=쿠버네티스 클러스터) 원하는 상태로 애플리케이션을 자동 배포하는 도구라고 이해하면 된다.

     

    3.ArgoCD Sync

    argocd는 default 설정으로 3분마다 git과 쿠버네티스 클러스터의 현재상태를 비교하며 이 주기를 Period라고 한다.

    GitOps Repository 에 push 하는 동시에 쿠버네티스 클러스터에 매니페스트 내용이 자동으로 적용되도록 하고 싶다면 argocd webhook 을 설정하면된다.

     

    4. ArogdCD 설치

    Window WSL2 환경에서 Kind 설치후 ArgoCD 설치 진행함

    4.1. ArgoCD 최신 버전 설치

    # argocd namespace 생성
    kubectl create namespace argocd
    
    # argocd 최신버전 설치
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

    ArgoCD 특정 버전 설치시 stable 대신 버전명 ( stable  →  v2.4.11 ) 을 넣으면 된다.

    운영환경에서 설치하거나, 로컬에서 운영환경과 동일하게 설치하고 싶다면 버전명을 기입하는것이 좋다.

    (Argo CD 버전에 따라 UI ,기능 들이 조금씩 달라진다.)

     

    ArgoCD 설치 터미널

    # ArgoCD 설치 터미널
    11:28:44 ubuntu@DESKTOP ~ → kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
    customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
    customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
    customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
    serviceaccount/argocd-application-controller created
    serviceaccount/argocd-applicationset-controller created
    serviceaccount/argocd-dex-server created
    serviceaccount/argocd-notifications-controller created
    serviceaccount/argocd-redis created
    serviceaccount/argocd-repo-server created
    serviceaccount/argocd-server created
    role.rbac.authorization.k8s.io/argocd-application-controller created
    role.rbac.authorization.k8s.io/argocd-applicationset-controller created
    role.rbac.authorization.k8s.io/argocd-dex-server created
    role.rbac.authorization.k8s.io/argocd-notifications-controller created
    role.rbac.authorization.k8s.io/argocd-server created
    clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
    clusterrole.rbac.authorization.k8s.io/argocd-server created
    rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
    rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
    rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
    rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
    rolebinding.rbac.authorization.k8s.io/argocd-redis created
    rolebinding.rbac.authorization.k8s.io/argocd-server created
    clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
    clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
    configmap/argocd-cm created
    configmap/argocd-cmd-params-cm created
    configmap/argocd-gpg-keys-cm created
    configmap/argocd-notifications-cm created
    configmap/argocd-rbac-cm created
    configmap/argocd-ssh-known-hosts-cm created
    configmap/argocd-tls-certs-cm created
    secret/argocd-notifications-secret created
    secret/argocd-secret created
    service/argocd-applicationset-controller created
    service/argocd-dex-server created
    service/argocd-metrics created
    service/argocd-notifications-controller-metrics created
    service/argocd-redis created
    service/argocd-repo-server created
    service/argocd-server created
    service/argocd-server-metrics created
    deployment.apps/argocd-applicationset-controller created
    deployment.apps/argocd-dex-server created
    deployment.apps/argocd-notifications-controller created
    deployment.apps/argocd-redis created
    deployment.apps/argocd-repo-server created
    deployment.apps/argocd-server created
    statefulset.apps/argocd-application-controller created
    networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
    networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
    networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
    networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
    networkpolicy.networking.k8s.io/argocd-redis-network-policy created
    networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
    networkpolicy.networking.k8s.io/argocd-server-network-policy created

     

    ArgoCD 설치후 Pod , Service 조회

    # argocd 설치후 Pod, Service 조회
    11:29:48 ubuntu@DESKTOP ~ → k get svc,pod -n argocd
    NAME                                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    service/argocd-applicationset-controller          ClusterIP   10.96.164.148   <none>        7000/TCP,8080/TCP            60s
    service/argocd-dex-server                         ClusterIP   10.96.181.111   <none>        5556/TCP,5557/TCP,5558/TCP   60s
    service/argocd-metrics                            ClusterIP   10.96.244.128   <none>        8082/TCP                     60s
    service/argocd-notifications-controller-metrics   ClusterIP   10.96.170.72    <none>        9001/TCP                     60s
    service/argocd-redis                              ClusterIP   10.96.153.103   <none>        6379/TCP                     59s
    service/argocd-repo-server                        ClusterIP   10.96.131.99    <none>        8081/TCP,8084/TCP            59s
    service/argocd-server                             ClusterIP   10.96.233.212   <none>        80/TCP,443/TCP               59s
    service/argocd-server-metrics                     ClusterIP   10.96.123.102   <none>        8083/TCP                     59s
    
    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/argocd-application-controller-0                     1/1     Running   0          59s
    pod/argocd-applicationset-controller-74575b6959-r27r5   1/1     Running   0          59s
    pod/argocd-dex-server-64897989f8-8zv4z                  1/1     Running   0          59s
    pod/argocd-notifications-controller-566bc99494-bzp7q    1/1     Running   0          59s
    pod/argocd-redis-79c755c747-vwdqb                       1/1     Running   0          59s
    pod/argocd-repo-server-bc9c646dc-svdfq                  1/1     Running   0          59s
    pod/argocd-server-757fddb4d7-cb2cl                      1/1     Running   0          59s

     

    초기 설치시 service type 이 ClusterIP 로 생성됨을 확인할 수 있다.

     

    로컬 쿠버네티스에서 설치한경우 ArgoCD Service 에 접속하는 방법은 1) NodePort 2) PortForwarding 3) Ingress Controller 설치후 ingress 생성이 있다.

     

    AWS , GCP , Naver Cloud 와 같이 공인 IP 가 부여되는 Cloud 환경에 설치한 경우 Service 를 LoadBalancer type 으로 변경 후 ArgoCD Service 에 접속이 가능하다.

     

    5. ArgoCD Service 접속

    5.1. Service Type NodePort 로 변경

    11:30:50 ubuntu@DESKTOP ~ → kubectl patch svc argocd-server -n argocd --patch \
    > '{"spec": { "type": "NodePort", "ports": [ { "nodePort": 30000, "port": 80, "protocol": "TCP", "targetPort": 8080} ] } }'
    service/argocd-server patched

     

    Service 확인

    11:30:54 ubuntu@DESKTOP ~ → k get svc -n argocd
    NAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    argocd-applicationset-controller          ClusterIP   10.96.164.148   <none>        7000/TCP,8080/TCP            2m8s
    argocd-dex-server                         ClusterIP   10.96.181.111   <none>        5556/TCP,5557/TCP,5558/TCP   2m8s
    argocd-metrics                            ClusterIP   10.96.244.128   <none>        8082/TCP                     2m8s
    argocd-notifications-controller-metrics   ClusterIP   10.96.170.72    <none>        9001/TCP                     2m8s
    argocd-redis                              ClusterIP   10.96.153.103   <none>        6379/TCP                     2m7s
    argocd-repo-server                        ClusterIP   10.96.131.99    <none>        8081/TCP,8084/TCP            2m7s
    argocd-server                             NodePort    10.96.233.212   <none>        80:30000/TCP,443:31998/TCP   2m7s
    argocd-server-metrics                     ClusterIP   10.96.123.102   <none>        8083/TCP                     2m7s

     

    argocd-server 서비스가 NodePort Type 으로 바뀐 것을 확인할수 있다.

    http://localhost:30000/ 을 브라우저에 입력하면 ArgoCD 로그인 창으로 이동하게된다.

    http://localhost:30000/ 을 브라우저에 입력하면 ArgoCD 로그인 창으로 이동하게된다.

     

    5.2. 포트 포워딩

    argocd-server 서비스를 19090 포트로 포트포워딩을 실행한다.

    11:45:59 ubuntu@DESKTOP kind → kubectl port-forward svc/argocd-server 19090:80 -n argocd
    Forwarding from 127.0.0.1:19090 -> 8080
    Forwarding from [::1]:19090 -> 8080
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090
    Handling connection for 19090

     

    http://localhost:19090/ 으로 접속하면 ArgoCD 로그인창으로 이동한다.

    포트포워딩 명령어를 실행한 터미널을 닫거나 Ctrl (컨트롤) + C 를 누르면 Port Forwarding 이 종료됨을 주의해야한다.

     

    5.3. ingress 생성

     

    ArgoCD 는 내부적으로 https 를 사용하기 때문에 kubernetes 에 설치한  ingress controller의 deployment 를 수정해줘야한다. (Nginx Ingress Controller 기준)

    kubectl edit deploy -n ingress-nginx

     

    spec.containers.args[] 에 아래 내용을 추가해준다.

    --enable-ssl-passthrough

    운영 환경에서는 SSL 인증서를 Setting 하면 되므로 위 절차는 생략해도된다.

     

    ArgoCD ingress example (Nginx)

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: argocd-ingress
      namespace: argocd
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
        nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    spec:
      rules:
        - host: "argocd.demo.com"
          http:
            paths:
              - pathType: Prefix
                path: "/"
                backend:
                  service:
                    name: argocd-server
                    port:
                      number: 80

     

    hosts 설정 (window example)

    hosts 파일에 아래 내용을 추가해준다.

    # C:\Windows\System32\drivers\etc\hosts
    127.0.0.1 argocd.demo.com

    http://argocd.demo.com 으로 접속하면 로그인창으로 이동하는것을 확인할 수있다.

     

     

     

    6. ArgoCD 로그인

    아이디 : admin

    ArgoCD 초기 비밀번호는 아래 명령어로 찾을 수 있다.

    # admin 초기 비밀번호
    kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

    로그인후 비밀번호를 변경하면된다.