favicon Jay Lee DevLog

728x90
300x250

이제 수동배포하던 부분을 ArgoCD를 이용하여,

자동으로 배포하도록 수정해보자. 

 


 

먼저, 뭐 하다보니 이것 저것 꼬여서 vm에 설치했던 worker node들을 모두 정리해야하는 상황이여서

정리했더니, argocd가 노드가 부족해서 설치가 되지 않는 현상이 있었다.

 

 

그럴 땐 아래의 방법대로 하면 단일노드로 테스트가 가능하다.

마스터노드에서도 pod가 실행되도록 하는 테스트용 환경을 만드는 방법이다.

kubectl taint nodes $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') node-role.kubernetes.io/control-plane-

 

해당 명령 실행 후에 다시 확인해보면,

 

설치가 진행되는 모습이다.


1. ArgoCD 설치

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

 

 

2. ArgoCD 초기 관리자 로그인

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

 

해당 명령 실행하면 PW가 나오는데,

기억하고 있다가,

 

kubectl port-forward svc/argocd-server -n argocd 8080:443

argocd 웹페이지로 접속하기 위한 포트포워딩 해주고,

https://localhost:8080 접속하자.

 

만약,

 

이렇게 에러가 난다면, socat이 설치가 안되어 있어서 그렇다.

sudo apt install socat

하고 다시 포트포워딩하고 웹페이지 접속하면,

귀여운 오징어인지 문어인지가 반겨준다.

 

이제 로그인하면 되는데,

아까 저장해둔 pw가 초기 비밀번호다.

id : admin

로그인하면 위처럼 된다.

이건 그냥 argocd 접속하면 이렇다 라고 알려주기 위해서 해봤다.

 

3. 애플리케이션 등록

등록을 하기 위해선 크게 2개의 파일이 필요한데,

하나는 저번 글에서 작성했던 deployment 관련된 yaml 파일,

다른 하나는 service.yaml 파일이다.

 

둘 다 이름 그대로의 기능을 한다.

일단 service.yaml과 deployment.yaml은 하나의 폴더에 있는게 좋다고 생각한다.

그래서 하나의 폴더에 만들어준다.

내용은 이러하다.

 

최소한의 것들만 집어넣어놨다.

여기서 중요한 점은 deployment의 name과 service의 name이 같아야 한다.

나같은 경우는 my-app 으로 맞춰줬다.

 

argocd app으로 등록하기 위한

yaml 파일도 만들어줘야 하는데,

해당 yaml 파일은 위의 파일과 다른 경로에 있어야 문제가 안생긴다.

나는 아래의 경로에 만들어뒀다.

 

파일 안의 내용은 이렇다.

spec에 path 부분을 보면 아까 만들어둔 두 파일의 경로로 되어 있는 모습을 볼 수 있다.

이를 주의해서 작업하자.

kubectl apply -f argocd-application.yaml

 

이제 위의 명령어 실행하면 애플리케이션 등록은 끝난다.

UI로 직접 확인해보고 싶으면,

아까 사이트로 접속해서 확인해보면 된다.

저기서 sync를 누르면 관련 설정 옵션이 뭐가 있는지 확인이 가능하다.

 

cli를 통해 하는 방법도 있는데,

VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v([^"]+)".*/\1/')

curl -sSL -o argocd "https://github.com/argoproj/argo-cd/releases/download/v${VERSION}/argocd-linux-amd64"
chmod +x argocd
sudo mv argocd /usr/local/bin/argocd

 

설치하고, argocd version 입력해서 잘나오면 설치끝난거고,

포트포워딩이 되어 있는 상태에서

argocd login localhost:8080

위처럼 로그인하면 된다. 1회 로그인은 필수이니 설치할때 해두자.

 

이후 아래 명령어를 실행

argocd app set my-app   --sync-policy automated   --sync-option Prune=true   --sync-option SelfHeal=true

잘되면 좋겠지만,

잘 안될 확률이 높다. 

나 같은 경우 아래와 같은 에러가 발생했는데,

unable to ls-remote HEAD on repository

원인은 argocd DNS 설정이 내부 설정으로 되어 있어서 그렇다.

 

해결 방법은 여러개가 있겠지만,

나 같은 경우는 강제로 argocd의 dns를 8.8.8.8로 바꿔줬다.

kubectl edit deploy argocd-repo-server -n argocd

명령을 실행하면 argocd 관련 설정을 바꿔줄 수 있는데,

복잡하다. 간단한건 직접 찾아서 하고, 좀 애매한건 cli 사용해서 하자.

kubectl patch deployment argocd-repo-server -n argocd \
  --type='json' \
  -p='[
    {
      "op": "add",
      "path": "/spec/template/spec/containers/0/env/-",
      "value": { "name": "GODEBUG", "value": "netdns=go" }
    },
    {
      "op": "add",
      "path": "/spec/template/spec/containers/0/env/-",
      "value": { "name": "RES_OPTIONS", "value": "nameserver 8.8.8.8" }
    }
  ]'

위 명령 실행하면, 일단 DNS 설정은 된거다.

 

이렇게 하고 나서 container 재생성까지 30초정도 기다려 준 후에

다시 argocd app set my-app   --sync-policy automated   --sync-option Prune=true   --sync-option SelfHeal=true 명령 실행해보자.

 

만약 이래도 똑같은 에러가 발생했다면,

이건 기존에 설정되어 있던 DNS가 디폴트로 사용되도록 되어 있는거다.

이런 경우 강제로 새로 생성한 DNS로 바꿔줘야 하는데,

dnsPolicy: None
      dnsConfig:
        nameservers:
          - 8.8.8.8
          - 1.1.1.1
        searches:
          - default.svc.cluster.local
        options:
          - name: ndots
            value: "5"

해당 내용을 spec.template.spec 아래 추가해주면 되는데,

말로하면 어렵다.. 혹시 몰라서 참고하라고 내 위치를 알려주면,

나는 해당 위치에 추가해뒀다.

 

이후 다시 rgocd app set my-app   --sync-policy automated   --sync-option Prune=true   --sync-option SelfHeal=true  명령 실행. 또 에러가 발생한다..

rpc error: code = Unknown desc = NOAUTH Authentication required.

해당 에러는 redis의 인증 실패 문제다.

패스워드가 일치하지 않거나, 설정되어 있지 않거나 해서 발생하는 문제인데,

나는 그냥 패스워드 확인 안하게 수정해서 넘어갔다.

kubectl edit deploy argocd-redis -n argocd

명령 실행해서 argocd-redis 설정파일 연 다음에,

args:
  - --requirepass

을 찾은 다음에 --requirepass를 주석처리 해주면 해결된다.

패스워드 자체를 사용하지 않는다는 거라, 나중에 문제가 될 수 있으니 참고하자.

 

이제 거의 다왔다.

이후 다시 명령을 실행했는데, 또 에러 발생. 쉽지 않다.

rpc error: code = Unknown desc = main/kubernetes: app path does not exist

이건 경로가 뭔가 이상하다는게 눈에 보인다.

argocd는 시작 경로가 root 경로가 된다.

즉 내 기준 시작 경로는 /main 이 되는데

지금 설정으로만 보면 /main/main/kubernetes 라는 경로로 설정이 되어 있는거다.

해결 방법은 main 하나를 빼주면 끝이다.

argocd app set my-app --path kubernetes

드디어 끝났다.

 

이제 app이 배포가 됐는지 확인해보면,

기존에는 없던 my-app이 추가되어 있는 모습을 확인할 수 있다.

이제 뭔가를 수정하면 자동으로 my-app이 배포되면서 업데이트 되는 모습을 확인할 수 있을 거다.

 

* 글 다쓰고 나서 보니깐 argocd-application.yaml 파일안에 path가 잘못들어가 있는 부분을 확인했다. 이를 수정하자.

보니깐 sync 옵션도 넣어놨었다..몇일에 나눠서 쓴 글이라 까먹었나보다.

 

다음글에는 image에 태그를 주고,

tag를 통해 argocd가 배포를 하도록 수정해보자.

728x90
반응형

+ Recent posts

/ /

Contact

📧 dlwjdwls60@naver.com


블로그에 내용이 있으면 해당 글을 보여주며, 없으면 내용이 복사된 채로 ChatGPT로 연결됩니다.