이번 포스팅은 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로 세팅한 후 삭제하는 작업을 하도록 하자.
이번 포스팅에서는 간단하게 Flux에 대해서 알아보았다. ArgoCD와 거의 비슷한 기능을 제공하는데, Kustomize 사용에 조금 더 특화된 툴로 보인다. GitOps는 정말 좋은 도구 같기는 하다.
앞으로는 쿠버 운영도 혼자가 아니라 멤버가 늘어서, GitOps를 도입한다면 뭔가 좀 더 체계적인 소스관리/배포가 가능할 것 같다.