쿠버네티스에 ArgoCD 설치하기

Dragony·2024년 1월 25일
0

쿠버네티스

목록 보기
7/7
post-custom-banner

Gitops, ArgoCD를 통한 Kubernetes 리소스 배포 자동화에 대해 알아봅니다.


1. GitOps

GitOps 패턴이란,
Code Repository를 중심으로 배포 프로세스를 구성하는 방식을 말합니다.
배포하기위한 Code Repository와 해당 프로그램의 환경 구성 정보 및 상태를 정의하는 GitOps Repository로 구성됩니다.
Code Repository를 기반으로 Build된 프로그램의 최신정보를 GitOps Repository에 업데이트하고, 해당 정보로 Deploy Operator를 통해 원하는 환경의 인프라에 배포시킵니다.


2. ArgoCD

GitOps 패턴은 소프트웨어나 구현체가 아닌 하나의 방법론에 가깝습니다.
ArgoCD는 위에서 설명한 GitOps의 구현체(Deploy Operator) 중 하나입니다.

GitOps Repository에 선언된 구성 정보를 최종적으로 ArgoCD에서 각 환경에 배포하게 됩니다.


3. ArgoCD 설치하기

공식 레퍼런스


argocd 네임스페이스 생성

kubectl create namespace argocd

[optional] istio injection

  • 만약 istio 가 설치되어 있다면 미리 네임스페이스에 istio-injection 작업을 해둡니다.
kubectl label ns argocd istio-injection=enabled

배포

  • 매우 간단합니다 (...)
# 설치 
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# 삭제
kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

여기까지는 기본적인 내용입니다.
저는 istio ingress -> istio gateway -> istio virtual service -> argocd service 구조로 배포할 것이기 때문에, install.yaml 파일을 아래처럼 수정했습니다.

install.yaml 파일 수정

  • curl 명령어로 파일을 다운받습니다.
curl https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml > install.yaml

  • 그 다음 아래처럼 수정합니다. 1 군데만 수정하면 됩니다.
... (생략)
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
  name: argocd-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-server
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/name: argocd-server
              topologyKey: kubernetes.io/hostname
            weight: 100
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/part-of: argocd
              topologyKey: kubernetes.io/hostname
            weight: 5
      containers:
      - args:
        - /usr/local/bin/argocd-server
        - --insecure # 이부분 수정!!!!!!(추가)
... (생략)

  • 배포도 위 파일을 배포합니다.
kubectl apply -n argocd -f install.yaml

  • 배포가 완료되면 kubectl 명령어로 배포된 리소스들을 확인할 수 있습니다.

설치는 끝입니다.

참고

저는 추가로 istio gateway와 virutal service 도 배포해주었고, 도메인도 설정해주었습니다.
잠깐 제가 설정한 파일을 보여드리면,

  • gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: argocd-gw
  namespace: argocd
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - argocd.velog.io (임의로 지어낸겁니다 ㅋ)
    port:
      name: https
      number: 443
      protocol: HTTP

  • virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: argocd-vs
  namespace: argocd
spec:
  gateways:
  - argocd-gw
  hosts:
    - argocd.velog.io (임의로 지어낸겁니다 ㅋ)
  http:
  - route:
    - destination:
        host: argocd-server.argocd.svc.cluster.local
        port:
          number: 80

설정해준 도메인이나 IP로 들어가보면 귀여운 문어 외계인이 반겨줍니다.



4. 계정 초기화 하기

  • argocd가 처음 설치되면 자동으로 admin 계정이 생성되는데, 아래 명령어로 비밀번호를 확인할 수 있습니다.
$ argocd admin initial-password -n argocd
XXIWBz97WwjINqTd
  • 기억하기 어려운 임의의 문자열이므로 바꿔봅시다.

Admin 비밀번호 변경

  • 우선 admin 계정으로 로그인합니다.
$ argocd login <argocd domain or ip>
Username: admin
Password:XXIWBz97WwjINqTd # 위에서 확인한 계정
  • 비밀번호를 업데이트 합니다. 명령어는 공식 홈에 다 나와있습니다. 검색 고고
$ argocd account update-password --account admin
*** Enter password of currently logged in user (admin): XXIWBz97WwjINqTd # 현재 비밀번호
*** Enter new password for user admin: testtest # 바꾸고자 하는 비밀번호 
*** Confirm new password for user admin: testtest # 비밀번호 확인
Password updated
Context argocd.velog.io' updated

계정 추가하기

  • 위 계정은 admin 계정이므로 일반 사용자들을 위해 계정을 추가해보겠습니다.
  • 일단 admin 계정으로 로그인합니다. (위와 동일하지만 비밀번호를 변경하셨다면 변경된 비밀번호로 하셔야겠죠?)
  • Configmap에 계정 추가
    • alice 라고 적혀있는 부분을 원하는 계정명으로 적으시면 됩니다. (ID가 됩니다.)
k edit configmap argocd-cm -n argocd

# ... (생략) 아래부분 추가 
data:
  accounts.alice: apiKey,login
  accounts.alice.enabled: "true"
  • 계정 확인 후 비밀번호 업데이트
# arogcd 사용자 목록 조회
argocd account list
# argocd 사용자 단일 조회
argocd account get --account alice
# argocd 사용자 비밀번호 변경
argocd account update-password --account alice

생성한 계정에 권한 추가하기

위에서 추가한 alice 계정에 몇가지 권한을 추가로 부여하기 위해 argocd-rbac-cm ConfigMap 을 수정합니다.

kubectl edit cm argocd-rbac-cm -n argocd
  • policy.csv 에 권한을 추가합니다.

    • 기본 제공 역할

      • role:readonly : 모든 리소스에 대한 읽기 전용 액세스
      • role:admin : 모든 리소스에 대한 무제한 액세스
    • RBAC 권한 구조

      • 애플리케이션 권한 을 제외한 모든 리소스 : p, <role/user/group>, <resource>, <action>, <object>
      • 애플리케이션(AppProject에 속함) : p, <role/user/group>, <resource>, <action>, <appproject>/<object>
    • RBAC 리소스 및 작업

      • 리소스: clusters, projects, applications, repositories, certificates, accounts, gpgkeys
      • 작업: get, create, update, delete, sync, override, action
    • 예시

    [p | g], role:<사용자 또는 권한> [cluster | projects | applications..], [get | create..], <앱일경우 project명/application명 그외 target>, allow
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  policy.csv: |
    p, role:developer, applications, *, */*, allow
    p, role:developer, projects, get, *, allow
    p, role:developer, projects, create, *, allow
    p, role:developer, projects, update, *, allow
    p, role:developer, projects, delete, *, allow
    p, role:developer, repositories, *, *, allow
    p, role:developer, clusters, *, *, allow
    p, role:developer, certificates, get, *, allow
    p, role:developer, gpgkeys, get, *, allow
    p, role:developer, clusters, create, *, allow
    g, alice, role:developer
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-rbac-cm","app.kubernetes.io/part-of":"argocd"},"name":"argocd-rbac-cm","namespace":"argocd"}}
  creationTimestamp: "2022-01-14T00:47:29Z"
  labels:
    app.kubernetes.io/name: argocd-rbac-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-rbac-cm
  namespace: argocd
  resourceVersion: "294426321"
  uid: ab37508c-656e-4481-bab3-7efc41aba69b
~

저는 developer 라는 역할(그룹)을 만들고 역할에 권한을 부여한다음, alice 를 developer 그룹에 할당시켜줬습니다. (맨 마지막라인)

이제 만든 계정으로 다시 로그인 해보세요.

profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.
post-custom-banner

0개의 댓글