Flux

kimchigood·2023년 6월 9일
0

AEWS Study

목록 보기
11/11
post-thumbnail

이번 포스팅은 https://velog.io/@kubernetes/EKS-Automation에 이어서 GitOps도구인 Flux에 대해 다뤄보겠다.

GitOps하면 유명한 ArgoCD는 경험이 있는데, Flux는 또 처음이다. 어떻게 다른지 한 번 실습을 통해 알아보자.

설치

flux CLI 설치
Flux CLI 설치를 위해서 Github 유저이름과 토큰값을 미리 준비해두자.

# 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

(kimchigood:default) [root@myeks-bastion ~]# kubectl get gitrepository -n flux-system

NAME          URL                                        AGE   READY   STATUS
flux-system   ssh://git@github.com/nowjean/fleet-infra   94s   True    stored artifact for revision 'main@sha1:2aa87fd72161d4566e6b4c7ef45e7ebefc265fb4'

설치가 완료되면, GitHub에 private Repo가 생성된 것을 확인할 수 있다.

GitOps 도구설치

# 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

(kimchigood:default) [root@myeks-bastion ~]# kubectl -n flux-system get pod,svc
NAME                                           READY   STATUS    RESTARTS   AGE
pod/helm-controller-fbdd59577-v8n9w            1/1     Running   0          5m52s
pod/kustomize-controller-6b67b54cf8-kwpgj      1/1     Running   0          5m52s
pod/notification-controller-78f4869c94-7fkbx   1/1     Running   0          5m52s
pod/source-controller-75db64d9f7-4kk86         1/1     Running   0          5m52s
pod/ww-gitops-weave-gitops-89bf585f4-smr8s     1/1     Running   0          77s

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/notification-controller   ClusterIP   10.100.131.105   <none>        80/TCP     5m52s
service/source-controller         ClusterIP   10.100.79.18     <none>        80/TCP     5m52s
service/webhook-receiver          ClusterIP   10.100.182.179   <none>        80/TCP     5m52s
service/ww-gitops-weave-gitops    ClusterIP   10.100.153.194   <none>        9001/TCP   77s

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

NAME             CLASS   HOSTS                    ADDRESS                                                         PORTS   AGE
gitops-ingress   alb     gitops.kimchigood.link   myeks-ingress-alb-1303763223.ap-northeast-2.elb.amazonaws.com   80      3s

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

Ingress 세팅 시 자신의 도메인으로 값을 지정해줘야한다. (없으면 AWS통해 구매해야함)


이제 GitOps화면까지 잘 연결되었다.

실습하기

악분님께서 제공해주신 실습코드로 테스트를 해보자. 시나리오는 github의 nginx manifest를 Kubernetes에 배포하는 작업이다.

# 소스 생성 : 유형 - 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

(kimchigood:default) [root@myeks-bastion ~]# kubectl -n flux-system get gitrepositories
NAME             URL                                                    AGE   READY   STATUS
flux-system      ssh://git@github.com/nowjean/fleet-infra               11m   True    stored artifact for revision 'main@sha1:2aa87fd72161d4566e6b4c7ef45e7ebefc265fb4'
nginx-example1   https://github.com/sungwook-practice/fluxcd-test.git   11s   True    stored artifact for revision 'main@sha1:4478b54cb7a8eaf1ee2665e2b3dd5bcfd55e9da9'

flux 애플리케이션 생성 : 유형(kustomization)

# [터미널] 모니터링
watch -d kubectl get pod,svc nginx-example1
NAME                 READY   STATUS    RESTARTS   AGE
pod/nginx-example1   1/1     Running   0          14s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/nginx-example1   ClusterIP   10.100.59.127   <none>        80/TCP    14s


# 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


어플리케이션 삭제

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

최초 kustomization 세팅 시 prune값이 false이기 때문에, kustomizaiton을 지워도 자원삭제가 되지 않는다. 따라서 다시 prune을 true로 세팅한 후 삭제하는 작업을 하도록 하자.

Wrap up

이번 포스팅에서는 간단하게 Flux에 대해서 알아보았다. ArgoCD와 거의 비슷한 기능을 제공하는데, Kustomize 사용에 조금 더 특화된 툴로 보인다. GitOps는 정말 좋은 도구 같기는 하다.

앞으로는 쿠버 운영도 혼자가 아니라 멤버가 늘어서, GitOps를 도입한다면 뭔가 좀 더 체계적인 소스관리/배포가 가능할 것 같다.

profile
Shout out to Kubernetes⎈

0개의 댓글