본문 바로가기
Tech/Kubernetes

[AEWS_1기] 7주차 - EKS Automation (2/2) - Flux

by 구름_쟁이 2023. 6. 6.

 

 

본 시리즈는 가시다님의 AEWS(AWS EKS Workshop) 1기 진행 내용입니다. (가시다님 노션)

스터디에 사용되는 링크 (AWS EKS Workshop) 

 

목차

1. AWS Controller for Kubernetes (ACK) (링크)
2. Flux

 

 

 

EKS 클러스터 세팅 (Cloudformation)

https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick6.yaml

 

 

 


2. Flux

 

 

 

Flux란?
 GitOps 방법론을 활용하여 Kubernetes 애플리케이션의 배포와 상태 관리를 자동화하는 오픈 소스 도구이다.
Git 저장소를 통해 애플리케이션 구성을 관리하고, 변경 사항을 감지하여 클러스터에 자동으로 배포하며, 롤백과 버전 관리를 지원한다.
CNCF의 프로젝트로 활발한 개발과 지원이 이루어지고 있다.

 

Flux CLI 설치 및 Bootstrap - 링크

# Flux CLI 설치
curl -s https://fluxcd.io/install.sh | sudo bash
. <(flux completion bash)

# 버전 확인
flux --version
flux version 2.0.0-rc.5

# 자신의 Github 토큰과 유저이름 변수 지정
export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>
export GITHUB_TOKEN=ghp_###
export GITHUB_USER=gasida

# Bootstrap
## Creates a git repository fleet-infra on your GitHub account.
## Adds Flux component manifests to the repository.
## Deploys Flux Components to your Kubernetes Cluster.
## Configures Flux components to track the path /clusters/my-cluster/ in the repository.
flux bootstrap github \
  --owner=$GITHUB_USER \
  --repository=fleet-infra \
  --branch=main \
  --path=./clusters/my-cluster \
  --personal

# 설치 확인
kubectl get pods -n flux-system
kubectl get-all -n flux-system
kubectl get crd | grep fluxc
kubectl get gitrepository -n flux-system
NAME          URL                                       AGE    READY   STATUS
flux-system   ssh://git@github.com/gasida/fleet-infra   4m6s   True    stored artifact for revision 'main@sha1:4172548433a9f4e089758c3512b0b24d289e9702'
  • 자신의 Github에 private 저장소 확인 : my-cluster 폴더에 설치된 flux manifest 확인

순서대로 찾아 누르면 Token 생성
내 깃헙에 생성된 레포지토리 확인

 

 

 

gitops 도구 설치 - 링크 → flux 대시보드 설치 : admin / password

# gitops 도구 설치
curl --silent --location "https://github.com/weaveworks/weave-gitops/releases/download/v0.24.0/gitops-$(uname)-$(uname -m).tar.gz" | tar xz -C /tmp
sudo mv /tmp/gitops /usr/local/bin
gitops version

# flux 대시보드 설치
PASSWORD="password"
gitops create dashboard ww-gitops --password=$PASSWORD

# 확인
flux -n flux-system get helmrelease
kubectl -n flux-system get pod,svc
  • Ingress 설정
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# Ingress 설정
cat <<EOT > gitops-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gitops-ingress
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
    alb.ingress.kubernetes.io/group.name: study
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
    alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/success-codes: 200-399
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
  - host: gitops.$MyDomain
    http:
      paths:
      - backend:
          service:
            name: ww-gitops-weave-gitops
            port:
              number: 9001
        path: /
        pathType: Prefix
EOT
kubectl apply -f gitops-ingress.yaml -n flux-system

# 배포 확인
kubectl get ingress -n flux-system

# GitOps 접속 정보 확인 >> 웹 접속 후 정보 확인
echo -e "GitOps Web https://gitops.$MyDomain"

 

대시보드 확인

 

 

 

hello world (kubstomize) - Github(악분님)

    • github에 있는 nginx manifest를 쿠버네티스에 배포합니다. 배포할 때 kusotmize를 사용
# 소스 생성 : 유형 - git, helm, oci, bucket
# flux create source {소스 유형}
# 악분(최성욱)님이 준비한 repo로 git 소스 생성
GITURL="https://github.com/sungwook-practice/fluxcd-test.git"
flux create source git nginx-example1 --url=$GITURL --branch=main --interval=30s

# 소스 확인
flux get sources git
kubectl -n flux-system get gitrepositories
    • flux 애플리케이션 생성 : 유형(kustomization) , 깃 소스 경로( —path ./nginx) → gitops 웹 대시보드에서 확인

 

# [터미널] 모니터링
watch -d kubectl get pod,svc nginx-example1

# flux 애플리케이션 생성 : nginx-example1
flux create kustomization nginx-example1 --target-namespace=default --interval=1m --source=nginx-example1 --path="./nginx" --health-check-timeout=2m

# 확인
kubectl get pod,svc nginx-example1
kubectl get kustomizations -n flux-system
flux get kustomizations

    • 애플리케이션 삭제
# [터미널] 모니터링
watch -d kubectl get pod,svc nginx-example1

# flux 애플리케이션 삭제 >> 파드와 서비스는? flux 애플리케이션 생성 시 --prune 옵션 false(default 값)
flux delete kustomization nginx-example1
flux get kustomizations
kubectl get pod,svc nginx-example1

# flux 애플리케이션 다시 생성 :  --prune 옵션 true
flux create kustomization nginx-example1 \
  --target-namespace=default \
  --prune=true \
  --interval=1m \
  --source=nginx-example1 \
  --path="./nginx" \
  --health-check-timeout=2m

# 확인
flux get kustomizations
kubectl get pod,svc nginx-example1

# flux 애플리케이션 삭제 >> 파드와 서비스는? 
flux delete kustomization nginx-example1
flux get kustomizations
kubectl get pod,svc nginx-example1

# flux 소스 삭제
flux delete source git nginx-example1

# 소스 확인
flux get sources git
kubectl -n flux-system get gitrepositories

 

첫 번째 배포 후 삭제하는 실습

pod와 service가 그대로 남아있다

 

두 번째 배포는 --prune=true 옵션을 추가하여 배포

flux delete 명령 실행 시 pod와 service까지 잘 삭제됨을 확인

 

 

 

결론

앞서 GitOps 때 학습했던 ArgoCD와 다른 GitOps 도구인 Flux를 실습해보았다.

그 차이점을 간략하게 알아보자면,

 

핵심 목표

  • Flux는 Kubernetes 클러스터에 대한 애플리케이션 배포 및 상태 관리에 초점
  • Argo CD는 Kubernetes 클러스터를 포함한 다양한 환경에 대한 애플리케이션 배포 및 상태 관리를 지원

배포 전략

  • Flux는 롤링 업데이트 및 Canary 배포와 같은 일부 배포 전략을 지원하지만, 주로 단일 배포 전략을 사용
  • Argo CD는 더 많은 배포 전략을 제공하고, 블루/그린 배포, 플루언트 롤링 업데이트, 스태틱 배포 등의 고급 배포 전략을 사용

UI 및 CLI

  • Flux는 주로 CLI 도구를 통해 작업을 수행
  • Argo CD는 사용하기 쉬운 웹 기반 UI와 CLI 도구를 모두 제공하여 시각적인 작업 및 관리 용이

관리 대상

  • Flux는 Kubernetes 애플리케이션 및 클러스터 상태를 관리
  • Argo CD는 Kubernetes를 비롯한 다양한 환경, 서버리스 애플리케이션, VM 등 다양한 리소스 유형을 관리

추적 및 롤백

  • Flux는 롤백 기능은 제공하지 않으며, Git의 이전 상태로 되돌려서 롤백을 수행
  • Argo CD는 배포된 애플리케이션의 변경 사항 추적과 롤백 기능을 내장

알림 및 이벤트 처리

  • Flux는 이벤트 처리 기능은 제한적이며, 다양한 알림 메커니즘은 제공하지 않음
  • Argo CD는 Slack, 이메일 등의 다양한 알림 메커니즘을 지원하며, 이벤트 기반으로 작업 수행 가능

 

결론을 내보자면... 

ArgoCD 쓰자

 

댓글