레이블이 argo-cd인 게시물을 표시합니다. 모든 게시물 표시
레이블이 argo-cd인 게시물을 표시합니다. 모든 게시물 표시

argocd go module invalid version error

# go.mod 에 argo-cd 패키지가 됐는데 다음과 같이 -m(모든 종속성 패키지 출력) 로 모듈 리스트 출력시 에러가 발생한다.
# (재현을 위해 sudo rm -rf ~/workspace/gopath/pkg/mod/k8s.io/)

# 다음 가이드로 go.mod 에 replace 추가해야 한다.

argo-cd sync errror

# prometheus, grafana 버전업을 위해 다음과 같이 prometheus(operator) Chart.yaml > dependencies 버전업했다.
apiVersion: v2
name: ysoftman-prometheus
version: 0.0.1
description: Chart for ysoftman-prometheus
dependencies:
  - name: "kube-prometheus-stack"
    version: "65.3.2"
    repository: "https://prometheus-community.github.io/helm-charts"
  - name: "prometheus-adapter"
    version: "4.11.0"
    repository: "https://prometheus-community.github.io/helm-charts"

# Chart.lock 새로 생성
helm dependencies build

# 이제 git develop 브랜치에 커밋
# argocd 에서 해당 앱(prometheus operator)이 자동 싱크가 활성화 돼 있어 자동 싱크를 수행하는 중 다음과 같은 에러가 발생했다.

Failed to compare desired state to live state: failed to calculate diff: error calculating structured merge diff: error building typed value from config resource: .spec.scrapeConfigSelector: field not declared in schema

# 해결하기
# argocd 해당 application > detail > sync policy > automated 비활성화 상태에서 수동으로 싱크한다.
# 다시 automated 를 활성화하면 자동싱크시 에러가 발생하지 않는다.

# 버전 확인
http://ysoftman-prometheus.aaa.bbb/ > prometheus_build_info 메트릭으로 조회
http://ysoftman-grafana.aaa.bbb/api/health

# 기타 values spec 변경 사항 확인
Kind: Prometheus > spec
Kind: Alertmanger > spec

argocd sync k8tz replicaset

argocd k8tz 가 하루에 한번씩 rolling update(new replicaset, new pod) 되는 현상을 발견했다.

argocd sync policy > automated 로 되어 자동으로 싱크를 맞춘다.(디폴트 3분 마다)
repo url: https://k8tz.github.io/k8tz
chart: k8tz:0.16.0

자동/수동으로 모두 변화가 없다가 하루 중 특정 시간만 되면 checksum/config 를 변경해 rolling update 가 된다.

k8tz pod 의 로그를 확인하고 싶은데, 하루마다 재시작돼 이전 로그를 확인할 수 없는 문제가 있다.

k8tz replicaset 이 10개가 쌓여 있었고 매일 비슷한 시간에 생성되었다.
k8s event 를 보면 argocd sync 로 k8tz replicaset 가 생긴 기록이 있다.
(kube api server --event-ttl duration Default: 1h0m0s 로 1시간내 이벤트만 보임)

# 다음으로 replicaset 의 checksum/config 값이 매번 변했다는 것을 알 수 있다.
for r in $(k get rs -n k8tz | sed 1d | awk '{print $1}'); do k get rs $r -n k8tz -o json | jq '.spec.template.metadata.annotations'; done

k8tz helm chart 를 보면
admission-webhook 에서는 genSelfSignedCert 함수로 helm 실행시 마다 selfsigned 값이 새로 생성된다.

deployment 는 위 admission-webhook.yaml 을 checksum/config sha256 값으로 사용한다.
https://github.com/k8tz/k8tz/blob/a07bfbc76c4fcea972b46da4ebc26408c2dfc1a1/charts/k8tz/templates/controller.yaml#L21

# 설치시 생성되는 인증서값으로 매번 새로운 checksum 이 생성된다.
helm install k8tz k8tz/k8tz --dry-run | rg -i checksum

이렇게 deployment checksum/config annotation 는 secret 나 configmap 변경이 발생하면 pod 를 새로 시작해서 반영한다.
참고로 https://github.com/stakater/Reloader 라는 방법도 있다.

argocd k8tz 특정 버전을 sync 하지만 변경사항이 없어서 deployment 변화(checksum/config)가 없어야 하는데 하루에 한번 변경이 발생된다는 것인데...

k8tz 앱 > self heal 을 비활성화 해두고 하루 지나서 sync 가 발생되면 바로 적용하지 않아 diff 로 차이점을 확인할 수 있었다.
차이는 아래 3개의 리소스에서 발생했다.
Secret

MutatingWebhookConfiguration

Deployoment

secret 이 변경이 됐고, 이로 인해 deployment checuksum/config 도 변경되었다.

24시간(1day)값과 관련된 argocd 내용중 repo cache 시간이 기본 24시로 되어있는것 발견했다.
디폴트로 24시간동안 repo를 캐싱하기 때문에 sync를 하더라도 변경이 없게 된다.
24시 이후에는 repo 캐시가 변경되고 이때 싱크하면 변경사항이 발생하게 된다.

argocd-repo-server Deployment 에 다음과 같이 repo 캐싱 시간을 짧게 줄 수 있다.
spec:
  template:
    spec:
      containers:
      - args:
        - /usr/local/bin/argocd-repo-server
        - --port=8081
        - --metrics-port=8084
        - --repo-cache-expiration=30s

k8tz hard refresh 를 한번 실행(이렇게하면 강제 재시작됨), 이후 부터 3분 마다 argocd 가 k8tz sync 하면 pod 재시작한다.

정리
- k8tz 는 helm 에서 설치시 셀프 인증서를 생성하고, k8tz deployment > checksum/config 을 변경해서 pod 를 재시작함
- argocd repo 캐시로 24시간(디폴트값) 동안 싱크해도 변화 없음(hard refresh로는 변경됨)

해결
- k8tz 재시작 방지를 위해선 자동싱크(sync policy > automated) 를 비활성화 한다.

argo-cd cilium identity

k8s: v1.26.4
argo-cd: v2.12.3+6b9cd82
에서 strimzi kafka operator 로 kafka cluster 를 설치후
argocd 에서 보면 다음과 같이 cilium identity 에 out of sync 로 보인다.

실제 CiliumIdentity 를 보면 정상적으로 리소스가 생성돼 있다.
관련 이슈가 cilium troubleshooting 이 있다.
다음과 같이 argocd 에서 CiliumIdentity 리소스를 모니터링 대상에서 제외시킨다.
kubectl edit configmap argocd-cm -n argocd
resource.exclusions: |
 - apiGroups:
     - cilium.io
   kinds:
     - CiliumIdentity
   clusters:
     - "*"

# helm 으로 반영시
# values 는 다음과 같이 수정하자.
configs:
  cm:
    resource.exclusions: |
     - apiGroups:
         - cilium.io
       kinds:
         - CiliumIdentity
       clusters:
         - "*"

# 반영
helm upgrade argocd argo/argo-cd \
--namespace argocd \
--values values-dev.yaml

#####

strimzi-ysoftman-kafka-cluster-ysoftman-kafka-cluster-kafka-init
라는 이름의 ClusterRoleBinding(crb) 도 실제 리소스가 있지만 argocd 에서는 out of sync 로 표시된다.
관련 논의가 있지만 아직 해결방법은 없는것 같다.

위 argocd cm > resource.exclusions 적용해도 out of sync 로 나온다.
차선책으로 ...kafka-init crb 에 다음을 추가하면 kafka 전체 sync 에서는 제외시켜 kafka-cluster 앱으로는 synced 로 만들 수는 있다.
metadata:
  annotations:
    argocd.argoproj.io/compare-options: IgnoreExtraneous

argocd image-updater and notification

# argocd-image-updater 설치
# 이미지가 업데이트되면 해당 이미지를 사용하는 argocd app 에 반영할 수 있다.
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

# image 확인 간격은 기본 2m 인데 변경하려면 deployment 에 아래처럼 --interval 옵션으로 변경할 수 있다.
spec:
  template:
    spec:
      containers:
      - command:
        - /usr/local/bin/argocd-image-updater
        - run
        - --interval
        - 300s
      # 또는 args 로 설정
      - args:
        - run
        - --interval
        - 300s

# docker.io quay.io, ghcr.io 등의 image registry 외
# 커스텀 image 저장소인 경우 configmap 에 추가
data:
  log.level: debug
  registries.conf: |
    registries:
    - name: ysoftman_images
      api_url: https://ysoftman.image.io
      prefix: ysoftman.image.io

# argocd-image-updater 재시작
kubectl -n argocd rollout restart deployment argocd-image-updater

# k8s > argocd-image-updater pod 에 ssh 접속해서 다음 명령으로 작동여부를 확인할 수 있다.
argocd-image-updater test <이미지명>

# argocd app 에 annotation 추가
# latest: 최근 이미지 태그가 생성된것으로 업데이트
# digest: 이미 이미지 태그가 있는 상태에서 태그의 이미지가 변경되면 업데이트(dev, stage, prod, latest 태그 처럼 계속 이미지가 변경되는 경우)
# helm 설정에서 image.tag 가 아닌 ysoftmanApp.image.tag 필드를 사용중인 경우
kubectl annotate app <argocd 앱이름> -n argocd \
argocd-image-updater.argoproj.io/image-list="myapp=<이미지경로:태그>" \
argocd-image-updater.argoproj.io/myapp.update-strategy=digest \
argocd-image-updater.argoproj.io/myapp.helm.image-tag=ysoftmnaApp.image.tag

# 이제 태그 이미지가 변경되면 변경된 이미지 layer(digest)를 받고
# deployment > image > 이미지경로:태그@sha256:xxxxx 로 변경돼 pod 가 재시작된다.
 
#####

# argocd-notification 로 argocd 상태를 slack, github, webhook 등으로 노티를 보내 보자.
# argocd-notification 은 argocd 설치시 기본으로 포함되어 있다.

# 우선 현재 설정된 configmap 을 가져오자.
kubectl get cm argocd-notifications-cm -o yaml -n argocd > argocd-notification-cm.yaml

# app sync 성공시 특정 URL 로 노티 보내기 위해 다음을 내용을 추가한다.
# 참고 https://argocd-notifications.readthedocs.io/en/stable/services/webhook/ 가 문서가 있는데 데 subscriptions.recipients 부분 설명이 없어 아래 예시에 추가했다.
data:
  subscriptions: |
    - recipients:
      - ysoftman

  # x-www-form-urlencoded 인 경우
  service.webhook.ysoftman: |
    url: https://ysoftman.test.com
    headers:
    - name: Content-Type
      value: application/x-www-form-urlencoded
  template.app-sync-succeeded: |
    webhook:
      ysoftman:
        method: POST
        body: key1=value1&key2=value2

  # json 인 경우
  service.webhook.ysoftman: |
    url: https://ysoftman.test.com
    headers:
    - name: Content-Type
      value: application/json
  template.app-sync-succeeded: |
    webhook:
      ysoftman:
        method: POST
        body: |
          {
            "key1":123,
            "key2":"aaa"
          }

# (kubectl.kubernetes.io/last-applied-configuration 는 삭제후) 적용
kubectl apply -f ./argocd-notification-cm.yaml

# 노티를 사용할 application 에 다음 annotations 를 추가한다.
# 또는 arogcd ui > app > summary > edit > notification subscriptions 
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    notifications.argoproj.io/subscribe.on-deployed.ysoftman: ""
    notifications.argoproj.io/subscribe.on-sync-succeeded.ysoftman: ""
    notifications.argoproj.io/subscribe.on-sync-failed.ysoftman: ""

generate bcrypt password for argocd

# argo-cd 에 admin 로그인시 패스워드는 secret 리소스의 data > "admin.password" 에 bcrpyt(해싱)된 값을 사용한다.

# argocd 설치
brew install argocd

# ysoftman 을 bycrpt 로 해싱하기
# 생성할때 마다 랜덤 salt 값이 추가되어 값이 바뀐다.(rainbow table 공격 방지할 수 있다.)
argocd account bcrypt --password ysoftman

# 또는 htpasswd 사용시
htpasswd -nbBC 10 "" ysoftman | tr -d ':\n' | sed 's/$2y/$2a/'

# 참고
https://github.com/ysoftman/enchash 에 match 기능 추가했놨다.

change grafana pod localtime

# grafana timezone 이 UTC 로 되어 있다.
kubectl exec monitoring-grafana-aaa -it -- date
Wed Mar  6 07:35:45 UTC 2024

# 그래서 로그가 UTC 로 기록된다.
kubectl logs --tail=3 monitoring-grafana-aaa | rg -i "t="
... t=2024-03-06T07:45:00.515393518Z ...

# 이를 KST 로 변경하기 위해 deployment 에서
env > TZ 의 값을 Asia/Seoul 로 변경하면된다.

# 또는 아래와 같이 노드의 timezone 을 container 의 /etc/localtime 을 마운트되도록 설정한다.
kubectl edit deploy monitoring-grafana

spec > template > spec > containers > env > volumeMounts
volumeMounts:
- mountPath: /etc/localtime
  name: localtime-volume

spec > template > spec > containers > env > volumes
volumes:
- hostPath:
    path: /usr/share/zoneinfo/Asia/Seoul
  name: localtime-volume

# pod 가 다시 시작하고 나면 KST 로 변경되어 있다.
kubectl exec monitoring-grafana-aaa -it -- date
Wed Mar  6 16:45:55 KST 2024

# 이제 로그도 KST 로 기록된다.
kubectl logs --tail=3 monitoring-grafana-aaa | rg -i "t="
... t=2024-03-06T16:54:49.939479809+09:00 ...

# k8tz 을 사용하면 pod 에 편한게 적용할 수 있다.
# 배포되면 기본 k8tz 네임스페이스에 service,deployment,pod 등이 뜬다.
# install k8tz
helm repo add k8tz https://k8tz.github.io/k8tz/
helm install k8tz k8tz/k8tz --set timezone=Asia/Seoul

# deploy 등을 재시작해보자.
# 새로 뜨는 파드는 k8tz container 를 사이드카로 해서 locatime 이 반영된다. 

# k8tz 명령어를 사용하는 경우
# install k8tz cli command 
wget -c https://github.com/k8tz/k8tz/releases/download/v0.16.0/k8tz_0.16.0_darwin_amd64.tar.gz -O - | tar zx
./k8tz version

# 수동으로 현재 네임스페이스의 모든 deployment 에 반영하기
kubectl get deploy -oyaml | k8tz inject --timezone=Asia/Seoul -| kubectl apply -f -

# 참고로 grafana dashboard 디폴트 타임존은 다음 값으로 설정하면 된다.
grafana:
  defaultDashboardsTimezone: Asia/Seoul

#####

# argocd 로 등록하기
# --parameter namespace= 를 명시하지 않으면 k8tz 네임스페이스에 pod 가 뜬다.
argocd app create ysoftman-k8tz \
--dest-server https://kubernetes.default.svc \
--sync-option CreateNamespace=true \
--sync-policy automated \
--project ysoftman \
--repo https://k8tz.github.io/k8tz \
--helm-chart k8tz \
--revision "0.16.0" \
--dest-namespace ysoftman-k8tz \
--parameter namespace=ysoftman-k8tz \
--parameter timezone=Asia/Seoul

argocd cli

# argocd cli 를 사용해서 application 을 등록할 수 있다.
# argocd cli 설치
brew install argocd

# argocd 로그인
# 참고로 kubectl(namespace:argocd) 연결 가능한 상태라면 --core 옵션을 사용하면 로그인 필요 없이 argocd api 대신 k8s 와 직접 통신할 수 있다.
argocd login --insecure --username ysoftman --password abc123 argocd.ysoftman.net

#####
# 참고
# http:// 를 붙이면 port 를 찾을 수 없다는에러가 발생한다.
argocd login http://argocd.ysoftman.net
FATA[0000] dial tcp: lookup tcp///argocd.ysoftman.net: unknown port

# 그래서 :80 처럼 포트를 명시하면 colon 이 많다는 에러가 발생한다.
argocd login http://argocd.ysoftman.net:80
FATA[0000] dial tcp: address http://argocd.ysoftman.net:80: too many colons in address

# 관련 이슈가 2년 넘게 오픈되어 있다.
#####

# argocd 에 vecotor application 을 추가해보자.
# repository 추가 및 확인
# --proxy http://ysoftman.proxy.dev:8080 # 필요시에만
argocd repo add https://helm.vector.dev --name vector --type helm
argocd repo list

# repo  삭제시 
# 만약 연결 failed repo 삭제가 안되다면 k8s 에서 해당 repo 를 사용하는 secret 를 삭제해야 한다.
argocd repo rm vector

# (기존에 없다면) project 생성 및 확인
argocd proj create ysoftman
argocd proj list

# application 생성
# --values values.yaml 는 vector helm chart 의 values.yaml
# argocd server / client 버전이 다르면 --values-literal-file(helm > values 설정부분) 에러가 발생한다.
# 비슷한 이슈가 있었다.
# argocd server 2.6.7 을 사용하고 있어 argocd(client)도 같은 버전을 사용하자.
wget https://github.com/argoproj/argo-cd/releases/download/v2.6.7/argocd-darwin-arm64
chmod +x argocd-darwin-arm64
argocd-darwin-arm64 app create vector \
--repo https://helm.vector.dev \
--path vector \
--revision 0.31.1 \
--sync-policy auto \
--dest-namespace vector \
--dest-server https://kubernetes.default.svc \
--helm-chart vector \
--values values.yaml \
--values-literal-file vector_override_values.yaml \
--project ysoftman \
--upsert

# application 상태 보기
argocd app get vector

# application 삭제
argocd app delete vector

# 참고

#####

# argocd troubleshooting
# argocd > app > target revision 을 특정 브랜치로 변경하면 특정브랜치로 됐다가 원래(master)브랜치로 롤백된다.
# app 히스토리를 보면 특정브랜치로 배포는 됐는데 바로 원래(master) 브랜로 다시 배포한 이력이 있다.
# 특정 브랜치의 values.yaml > target revision 를 master 로 설정이 원인으로 master->브랜치 이름으로 변경하면 된다.(master머지시엔 다시 master로 변경)

install argocd

# argo-cd 설치해보자.
# helm chart 준비
helm repo add argo https://argoproj.github.io/argo-helm

# latest 버전을 가져오기 위해 업데이트
helm repo update

# helm chart 다운로드 받아 압축풀기
helm fetch argo/argo-cd
tar zxvf argo-cd-7.5.2.tgz
cd argo-cd

# 네임스페이스 생성
kubectl create namespace argocd

# bycrpt 로 패스워드 생성
password=$(htpasswd -nbBC 10 "" ysoftman | tr -d ':\n' | sed 's/$2y/$2a/')

# 설치
# argocdServerAdminPassword 는 설치되면 argocd secret 으로 생성됨
helm install argocd argo/argo-cd \
--namespace argocd \
--values values.yaml \
--set "server.ingress.enabled=true" \
--set "server.ingress.ingressClassName=nginx" \
--set "server.ingress.annotations.ingress\.kubernetes\.io/rewrite-target: /" \
--set "server.ingress.annotations.nginx\.ingress\.kubernetes\.io/backend-protocol=HTTP" \
--set "server.ingress.annotations.nginx\.ingress\.kubernetes\.io/ssl-redirect=false" \
--set "server.ingress.hostname=argocd-ysofmtan.domain" \
--set "configs.params.server.insecure=true" \
--set "configs.secret.argocdServerAdminPassword=$password" \
--set "configs.secret.argocdServerAdminPasswordMtime=2006-01-02T15:04:05Z" \
--set "configs.repositories.prometheus-community.name=prometheus-community" \
--set "configs.repositories.prometheus-community.type=helm" \
--set "configs.repositories.prometheus-community.url=https://prometheus-community.github.io/helm-charts/"

# port-forward 으로 로컬에서 접속 확인
kubectl port-forward service/argocd-server -n argocd 8080:443

kubectl top node error

# 설치
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# node 를 조회하면 다음 에러가 발생한다.(kubectl top pods 는 정상동작)
kubectl top node
error: metrics not available yet

# kube-system > metrics-server deployment 가 제대로 동작하고 있지 않았다.
kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   0/1     1            0           26h

# 이슈1 - 이미지 다운로드 실패
# 원인은 registry.k8s.io 에 대해서 방화벽 설정으로 이미지를 받아오지 못해서였다.
Pulling image "registry.k8s.io/metrics-server/metrics-server:v0.6.3"

# 우선 로컬에 이미지를 다운로드 받자.
docker pull registry.k8s.io/metrics-server/metrics-server:v0.6.3

# 이미지를 tar 로 만든다.
docker save -o metrics-server-v0.6.3.tar registry.k8s.io/metrics-server/metrics-server:v0.6.3

# 워커 노드에 tar 파일 전송
rsync -avz ./metrics-server-v0.6.3.tar ysoftman@worker1/home/ysoftman/
rsync -avz ./metrics-server-v0.6.3.tar ysoftman@worker2/home/ysoftman/
rsync -avz ./metrics-server-v0.6.3.tar ysoftman@worker3/home/ysoftman/

# 노드의 tar 이미지 파일을 로딩한다.
ssh ysoftman@worker1 "sudo docker load -i /home/ysoftman/metrics-server-v0.6.3.tar"
ssh ysoftman@worker2 "sudo docker load -i /home/ysoftman/metrics-server-v0.6.3.tar"
ssh ysoftman@worker3 "sudo docker load -i /home/ysoftman/metrics-server-v0.6.3.tar"

# metrics-server deployment 명세에 다음이 설정되어 있기 때문에
# imagePullPolicy: IfNotPresent
# pod 가 running 된다.

# 이슈2 - tls 비활성화
# metrics 로그를 보면 아래와같이 노드(kubelet)의 메트릭 수집시 실패한다고 나온다.
scraper.go:140] "Failed to scrape node" err="Get \"https://10.10.10.100:10250/metrics/resource\": read tcp 10.10.1.10:40752->10.10.10.100:10250: read: connection reset by peer" node="ysoftman-cpu1"

# metrics-server deployment> containers args 에 다음을 추가하면 위 에러는 발행하지 않고 정상 동작(scraping node ... scrap finished)한다.
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls  # 추가옵션
- --v=6 # 추가옵션 (Scraping node "node=xxxx" 노드 수집 성공 메시지 확인용)

# 이슈3 - apiservice 적용 안되는 이슈
# 아직도 error:metrics not available yet 이 발생한다.
# 찾아보니 kubectl 에서 top 커맨드 사용시 발생하는 에러 메시지였다.

# k8s api 로 node 메트릭을 다음과 같이 실행하면 결과가 나온다.
NODE_NAME="ysoftman-cpu1"
kubectl get --raw /api/v1/nodes/$NODE_NAME/proxy/metrics/resource | grep -i -E "node_cpu|node_mem"

# metrics api 에서 pods 응답은 나온다.
kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods | jq 

# 하지만 nodes 응답을 보면 items: [] 로 빈값으로 나온다.
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes | jq 

# metrics-server pod log 는 다음과 같이 노드로부터 정보를 받아 저장했다고 나온다.
round_trippers.go:553] GET https://10.10.10.10:10250/metrics/resource 200 OK in 2 millisecond
server.go:139] "Storing metrics"
server.go:144] "Scraping cycle complete"

# metrics-server 를 삭제했는데, k top nodes/pods 에러가 발행하지 않는다.
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/downl
oad/components.yaml

# top 명령을 받고 있는 별도의 pod 가 있는것으로 의심된다.
# v1beta1.metrics.k8s.io 를 사용하는 api 서비를 조회하면
kubectl get apiservices | grep -i v1beta1.metrics.k8s.io

# 다음과 같이 prometheus-adapter 서비스가 나온다.
v1beta1.metrics.k8s.io     prometheus-adapter/prometheus-adapter

# kubectl top nodes 동작하는 클러스터는 다음과 같다.
v1beta1.metrics.k8s.io     kube-system/metrics-server

# metrics-server (kind:APIService) 부분이 반영이 안되는게 문제였다.
# prometheus-adapter > v1beta1.metrics.k8s.io 를 사용하고 있고, 이를 argo-cd 에서 항상 sync 하고 있어 삭제해도 다시 생성된다.

argo-cd git sync interval

argo-cd 가 git 의 변경사항을 감지해 싱크하는게 바로 안되는것 같아 찾아보니
application details > sync policy 에는 다음과 같이 3가지 항목만 설정만 보인다.
application 별로 sync interval 은 설정할 수 없는것 같다.
대신 application 구분 없이 github 을 기본 3분단위로 polling 한다.

argo-cm(configmap) 에 timeout.reconciliation: 180s 등으로 설정할 수 있다.