Search
Duplicate
📒

[GitOps CICD] 06. GitOps와 ArgoCD 소개 및 설치

상태
완료
수업
GitOps CICD
주제
ArgoCd
4 more properties
참고

GitOps 소개

NOTE
Gitops는 Devops의 실천 방법 중 하나로, 애플리케이션의 배포와 운영에 관련된 모든 요소를 Git에서 관리한다!
Git에서 Application + Infra라 관련을 모두 관리한다.
IaC의 코드 중요성이 커짐에 따라, 코드 관리 방법의 효율화에 대한 고민이 증가했고 여러가지 요구사항이 늘어났다.
다수의 개발자/엔지니어들의 협업의 필요성 증가
로컬에서 작업한 코드의 불일치 발생 → 코드의 단일화
버저닝(Versioning) 및 롤백 기능
이런 문제를 해결하기 위해 모든 코드를 Git으로 관리하는 방법이 탄생했으며 그것이 GitOps이다.
원천 코드의 단일화를 준수한다.
코드 수정 시 리뷰 및 승인 프로세스를 적용할 수 있으므로 신뢰성 높은 코드를 유지할 수 있다. (Pull Request Review)
버저닝(Versioning)및 롤백 가능, 안전한 히스토리 보관

GitOps의 원칙

NOTE
1.
모든 시스템은 선언적으로 선언되어야 한다.
선언전이라 함은 명령어들의 집합이 아니라 사실들의 집합으로 구성된다는 것을 의미한다. 쿠버네티스의 예시를 들어보면
명령형 (run, create, expose)의 경우 실행되고 기록이 남지 않는다.
선언형 (apply - yaml을 실행시킴)의 경우 레포지토리에 기록이 남는다.
2.
시스템의 상태는 Git의 버전을 따라간다.
Git에 저장된 쿠버네티스 Manifest를 기준으로 시스템에 배포되기 때문에 이전 버전의 시스템을 배포하고 싶다면 git revert와 같은 명령어를 사용하자.
3.
승인된 변화는 자동으로 시스템에 적용된다.
한 번 선언된 Manifest가 Git에 등록되고 관리되기 시작하면 변화(ex 코드수정)이 발생할때마다 자동으로 시스템에 적용되어야 하며, 클러스터에 배포할때마다 자격증명이 필요하지 않아야한다.
4.
배포에 실패하면 경고해줘야 한다.
시스템 상태가 선언되고 버전 제어하에 유지되었을 때 배포가 실패하게되면 사용자에게 경고할 수 있는 기능이 필요하다.

ArgoCD

NOTE
ArgoCD는 쿠버네티스를 위한 CD(지속적인 배포) 도구이며, GitOps방식으로 관리되는 Manifest파일의 변경사항을 감시하며, 현재 배포와 Manifest 상태를 동일하게 유지시켜준다!
전체적인 동작흐름
앞서 말한것 처럼 ArgoCD는 선언적인 GitOps 도구이며, ArgoCD는 아래의 선언적 특성을 가진다.
1.
원하는 상태(Desired State)
yaml 코드를 활용한 원하는 상태의 명시
2.
자동 수렴
현재 상태 - 원하는 상태를 시스템이 자동으로 일치시킴 (ex Deployment 3개)
3.
상태관리
시스템이 원하는 상태로 유지되도록 변경 사항을 추적하고 관리
4.
추상화
인프라 세부사항을 추상화해서 관리하기 쉽게해줌
5.
반복 가능성
IaC를 통해서 여러 환경에서도 동일한 결과가 나온다.

ArgoCD 아키텍쳐

NOTE
실제 ArgoCD Setting GUI
ArgoCD 아키텍쳐 (다양한 요소들이 존재한다.)
API Server
ArgoCD에서 발생하는 작업 요청에 대한 API Endpoint를 제공해준다.
사용자는 이를 통해서 외부 컴포넌트 요청 처리를 진행하고 RESTful API와 gRPC를 제공한다.
Application Controller
애플리케이션 관리 및 배포를 자동화 해주는 컨트롤러
Repository Server
Manifest가 보관된 Git 레포지토리를 관리하는 역할
ApplicationSet Controller
다수의 K8s, Git 레포를 관리할 수 있도록 지원해준다.
Dex Server
SSO와 같은 인증을 위한 서버
Notification Controller
배포된 애플리케이션의 변경 사항을 유저에게 알려주는 역할

ArgoCD 실습환경 구성

NOTE
실습환경 구상도 (EKS를 구성하면 VPC + Subnet 등은 자동으로 생성된다.)

kubectl + EKS 환경구성

NOTE
# Amazon EKS용 kubectl 다운로드 curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.25.9/2023-05-11/bin/linux/amd64/kubectl # kubectl의 SHA-256 체크섬 파일 다운로드 curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.25.9/2023-05-11/bin/linux/amd64/kubectl.sha256 # 다운로드한 kubectl 파일의 체크섬을 검증 sha256sum -c kubectl.sha256 # 성공하면 "kubectl: OK" 출력 # 다운로드한 kubectl 파일에 실행 권한 부여 chmod +x ./kubectl # $HOME/bin 디렉토리를 생성하고 kubectl을 이동시킨 후 PATH에 추가 mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH # PATH 변경을 사용자의 .bashrc 파일에 영구적으로 추가 echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc # bashrc에 추가하면, 세션변경에도 유지 # 설치된 kubectl 버전 확인 kubectl version
Bash
복사
아마존 OS EC2환경에서 작업진행 - 필자는 Cloud9 IDE Shell에서 진행한다.
# ARM 시스템용으로, ARCH를 `arm64`, `armv6` 또는 `armv7`로 설정하세요 ARCH=amd64 PLATFORM=$(uname -s)_$ARCH # eksctl의 최신 버전을 다운로드 curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz" # (선택 사항) 체크섬으로 파일 무결성 확인 curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check # 다운로드한 tar.gz 파일 압축 해제 후 원본 파일 삭제 tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz # 압축 해제된 eksctl을 시스템 경로로 이동 sudo mv /tmp/eksctl /usr/local/bin
Bash
복사
eksctl(EKS 명령어 설치)
# 사용할 정보 입력 export AWS_ACCESS_KEY_ID=[IAM 사용자 공개키값] export AWS_SECRET_ACCESS_KEY=[IAM 사용자 바밀키값] export AWS_DEFAULT_REGION=ap-northeast-2 # 목록확인 (설치에서 사용되는 변수확인) env | grep AWS # EKS 설치 (학습환경 버전이 1.25) eksctl create cluster --name gitops --region ap-northeast-2 --version 1.25 # 단순한 교육용 프로젝트이니 가벼운 노드그룹으로 변환(비용이 저렴) eksctl create nodegroup --config-file=dev-cluster.yml # 기존 노드그룹 삭제 eksctl delete nodegroup --cluster=[클러스터 명(gitops)] --name=[노드그룹 명] # 확인 작업 kubectl get node kubectl get pods -n kube-system
Bash
복사
EKS 설치

EKS 추가기능 + Helm + LoadBlancer 설치

NOTE
EKS 추가기능에서 위의 기능들을 설치.
# Helm 3 설치 스크립트 다운로드 curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # 스크립트 파일에 실행 권한 부여 chmod 700 get_helm.sh # 스크립트 실행하여 Helm 설치 ./get_helm.sh
Bash
복사
Helm 설치 (리소스를 패키지화해서 손쉽게 관리가능)
# 클러스터 이름을 환경 변수로 설정 export cluster_name=<클러스터명> # 클러스터의 OIDC 식별자를 조회하고, 'oidc_id' 변수에 저장 oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5) # OIDC 식별자 출력 echo $oidc_id # OIDC 식별자가 없는 경우, OIDC 자격증명 공급자를 클러스터에 연결 # 출력된 결과가 없다면 실행 eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve # AWS Load Balancer Controller의 IAM 정책 JSON 파일을 다운로드 curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json # 다운로드한 IAM 정책 파일을 사용하여 AWS IAM 정책 생성 aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json # IAM 서비스 계정을 생성합니다. # <클러스터명>과 <ACCOUNT_ID>는 실제 값으로 대체해야 합니다. eksctl create iamserviceaccount \ --cluster=gitops \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::<ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \ --approve # 현재 AWS 사용자의 보안 자격증명 정보를 가져옵니다. aws sts get-caller-identity # aws-load-balancer-controller 서비스 계정의 세부 정보를 Kubernetes에서 조회합니다. kubectl describe sa aws-load-balancer-controller -n kube-system # Helm 차트 리포지토리를 추가하고 업데이트합니다. helm repo add eks https://aws.github.io/eks-charts helm repo update eks # Helm을 사용하여 aws-load-balancer-controller를 설치합니다. # clusterName은 실제 클러스터 이름으로 대체해야 합니다. helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=<클러스터명> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller # aws-load-balancer-controller 배포의 상태를 확인합니다. kubectl get deployment -n kube-system aws-load-balancer-controller
Bash
복사
LoadBalancer 설치(RABC 역할 생성, 역할을 통한 LB 생성)

ArgoCD 설치 및 네임스페이스/네트워크 설정

NOTE
# argocd 네임스페이스 생성 kubectl create namespace argocd # Argo CD를 Kubernetes 클러스터에 설치합니다. # 이 명령은 Argo CD의 공식 GitHub 리포지토리에서 최신 설치 매니페스트를 가져와서 적용합니다. kubectl apply \ -n argocd \ -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # Argo CD 서버의 배포를 수정하여 'insecure' 모드로 실행합니다. # 이는 TLS 인증을 사용하지 않고 서버를 실행하기 위한 설정입니다. kubectl -n argocd patch deployment argocd-server \ --type json \ -p='[{"op": "replace", "path":"/spec/template/spec/containers/0/args", "value": ["/usr/local/bin/argocd-server","--insecure"]}]'
Bash
복사
네임스페이스 + 네트워크 설정 (443 인증이 아닌 80인증으로 가능하게 설정)
apiVersion: v1 kind: Service metadata: labels: app: argocd-server-nodeport name: argocd-server-nodeport namespace: argocd spec: ports: - name: "80" port: 80 protocol: TCP targetPort: 8080 selector: app.kubernetes.io/name: argocd-server sessionAffinity: None type: NodePort
YAML
복사
argocd-server-nodeport.yaml (외부 통신 규약설정)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: argocd namespace: argocd annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]' alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/healthcheck-path: /healthz alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/success-codes: '200' alb.ingress.kubernetes.io/security-groups: [보안그룹 입력] alb.ingress.kubernetes.io/subnets: [서브넷 그룹들 입력] ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: argocd-server-nodeport port: number: 80
YAML
복사
ingress.yaml (NodePort 여러개의 라우팅 보안을 설정한다.)
k apply -f argocd-server-nodeport.yaml k apply -f ingress.yaml # 초기 ArgoCD 비밀번호 확인 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
Bash
복사
LoadBalancer 네트워크 설치완료

ArgoCD 접속 테스트, 비번변경

NOTE
# ArgoCD의 인그레스 주소 복사후, 브라우저에 접속하면 ArgoCD 페이지 나옴. # 초기 ArgoCD 비밀번호 확인(이후 변경진행) kubectl -n argocd get secret argocd-initial-admin-secret \ -o jsonpath="{.data.password}" | base64 -d
Bash
복사