서론
지금까지는 Naver Cloud Platform(이하 NCP)에서 제공해 주는 Source Series(Commit, Build,
Deploy, PipeLine)을 사용하여 CI/CD를 진행했다면, 쿠버네티스의 장점을 고루 살린 GitOps와 ArgoCd를 사용하여 CI/CD를 마이그레이션 해보려고 합니다. 간단하게 GitOps가 무엇인지, ArgoCd가 무엇인지 설명한 후에 ArgoCd를 설치해 보도록 하겠습니다.
[이전글]
[NCP] NKS로 개발환경 구성하기 Chapter 6. Loki, Promtail, Grafana를 활용한 로그 통합 모니터링 구축 - Witho
서론이전에는 loki-stack을 활용한 loki-promtail-grafana 스택을 구축해 보았다면, 이제는 loki-stack 없이 구축해 보도록 하겠습니다. Loki-Stack을 활용하여 통합 모니터링을 구축해보고 싶으신 분들은 이전...
min-nine.tistory.com
본론
1. GitOps, ArgoCd
GitOps는 Git을 활용하여 쿠버네티스 기반의 클라우드 네이티브 환경에서 소프트웨어 애플리케이션을 배포하고 인프라를 관리하는 방식을 말합니다. 즉, GitOps는 방법론으로서 애플리케이션 코드부터 시작하여 인프라, 네트워킹, CI/CD 파이프라인 등 전체적인 애플리케이션 생태계에 대한 구성들을 모두 git에 저장하여 관리하는 방식입니다.
ArgoCd는 GitOps를 구현하기 위한 도구 중 하나입니다. Kubernetes 애플리케이션의 자동 배포를 위한 오픈소스 도구로써 CI/CD 파이프라인 중 CD(지속적인 배포)를 담당하며 Git 저장소에서 변경 사항을 감지하여 자동으로 Kubernetes 클러스터에 애플리케이션을 배포해 주는 software라고 생각하면 될 것 같습니다.
2. ArgoCd 설치하기
아래 명령어로 간단하게 원하는 네임스페이스에 설치할 수 있습니다. 저의 경우 argocd 라는 네임스페이스를 생성하여 활용합니다.
2-1. 명령어로 설치하기
kn-mgt create ns argocd
kn-mgt apply -k https://github.com/argoproj/argo-cd/manifests/crds\?ref\=stable -n argocd
하지만, 명령어로 설치하게되면 히스토리 파악도 안 될뿐더러 어떻게 설치했는지, 어떻게 삭제하는지에 대한 의문도 생기기 마련이기에 저는 helm 패키지 매니저를 활용하여 설치하려 합니다. (사실 delete -k 명령어로 삭제하긴 쉽습니다)
2-2 helm 으로 설치하기
helm repo에 argocd를 추가해 줍니다.
hm-mgt repo add argo https://argoproj.github.io/argo-helm
helm 문법 검증 및 매니페스트 출력은 아래의 명령어로 진행할 수 있습니다.
hm-mgt -n argocd template argocd argo/argo-cd
helm install 명령어로 쉽게 argocd를 설치 및 삭제할 수 있습니다.
# install
hm-mgt -n argocd install argocd argo/argo-cd
# delete
hm-mgt -n argocd uninstall argocd
2-3. 접속하기
설치할 때 초기 admin 명령어를 확인할 수 있게 아래와 같은 command를 입력하라는 문구가 나옵니다.
![[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기 [NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
kn-mgt -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
kubectl port forwad 기능을 사용하여 로컬에서 접속할 수 있습니다.
kn-mgt -n argocd port-forward svc/argocd-server 8080:443
이제 local에서 접속하게 되면 아래와 같이 정상적으로 argocd 접속이 가능합니다. 위에서 찾은 admin password를 입력하고 들어가면 argocd에 접근이 가능해집니다.
![[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기 [NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기 [NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 2. ArgoCd 설치하기 - 2-3. 접속하기](https://blog.kakaocdn.net/dn/bC4SUn/btsMn6M0Jok/K6fgBI0ZGxBc6aK9ZKv4t0/img.png)
3. DNS와 Ingress를 활용하여 도메인으로 접속하기
언제까지고 local에서 포트포워드로 접속할 수 없는 노릇입니다. 때문에 DNS와 Ingress를 이용하여 도메인으로 argocd 툴에 접속할 수 있게 만들어줍니다.
3-1. alb ingress 생성
저는 alb ingress를 사용하여 로드밸런서까지 함께 생성해 줍니다. ingress 설명에 대한 부분은 이전 글을 참고해 주세요.
[Kubernetes 도입] 개발환경 없는 회사에서 NKS로 개발환경 구성하기 Chapter 4. Service, Ingress, Ingress Contr
서론이전 포스팅들을 통해 cluster 내부에 deployment로 생성된 pod들로 트래픽을 보내야 합니다. 우리는 파드로의 접근을 이전 포스팅에서 서비스라는 쿠버네티스 오브젝트를 사용하여 이미 완성시...
min-nine.tistory.com
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: argocd
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/ssl-certificate-no: "인증서번호"
alb.ingress.kubernetes.io/description: "argocd-ingress controller"
alb.ingress.kubernetes.io/ssl-redirect: "443"
alb.ingress.kubernetes.io/healthcheck-path: "/"
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "120"
spec:
ingressClassName: alb
rules:
- host: argocd.mingyu.co.kr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 80
ingress.yaml 파일을 생성하였으면, 아래 명령어를 통해 적용할 수 있습니다.
kn-mgt apply -f ingress.yaml
3-2. service를 NodePort로 변경 및 insecure 설정, 기존 파드 삭제
alb는 이전 포스팅에서도 말했지만 NodePort타입의 서비스만 지원합니다. 기본적으로 argocd-server는 ClusterIP타입이니 nodeport type으로 변경해줍니다.
kn-mgt patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
alb에서 인증서를 추가할 예정이니, 아래 명령어를 통해 server.insecure: "true" 값으로 설정합니다.
kn-mgt edit cm argocd-cmd-params-cm -n argocd
모든 값들을 변경해주었다면 기존 argocd-server가 동작하고있는 pod를 제거하여 재성생해줍니다.
kn-mgt get po -n argocd
kn-mgt delete -n argocd po argocd-server-{pod-hash}
3-3. DNS 레코드 적용
저는 ncp의 global DNS를 사용합니다. 원하는 도메인을 클릭하여 레코드 추가를 선택한 후, 원하는 호스트명을 기입합니다. 그리고 Alias 기능을 LB VPC로 사용하여 Ingress로 생성된 로드밸런서를 선택해 줍니다.
![[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 3. DNS와 Ingress를 활용하여 도메인으로 접속하기 - 3-3. DNS 레코드 적용 [NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 본론 - 3. DNS와 Ingress를 활용하여 도메인으로 접속하기 - 3-3. DNS 레코드 적용](https://blog.kakaocdn.net/dn/b2p8de/btsMpl3ppT2/rlfsjPQMImm3W5WbEO0Iw1/img.png)
번외 (같은 도메인을 사용할 경우 ingress 하나로 다른 네임스페이스의 서비스 컨트롤하기)
번외 1. External Name을 사용한 Ingress 통합하기 ( nginx Ingress의 경우)
저는 이전에 mgt-cluster의 monitoring에 alb ingress를 생성한 적이 있습니다. 로드밸런서를 생성하는 만큼 비용이 발생하게되고, 비용을 최소화하기 위해 기존에 생성한 ingress 로드밸런서에 argocd 트래픽을 넘기려합니다. 3-3 방법은 nginx 기반의 ingress에서 사용 가능한 1개의 인그레스로 여러 네임스페이스의 서비스를 적용시키는 방법입니다.
서로 다른 namespace에서 ingress를 공유하고자 할 때 service의 ExternalName Type을 활용할 수 있습니다. 우선 아래에 있는 argocd-external-service.yaml 을 사용하여 monitoring namespace에 service를 생성해줍니다.
#argocd-external-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations: {}
name: argocd-external-service
namespace: monitoring
spec:
type: ExternalName
externalName: argocd-server.argocd.svc.cluster.local
kn-mgt apply -f mgt-cluster/monitoring/argocd-external-service.yaml
기존에 생성하였던 monitoring-ingress.yaml에 아래와 같이 host를 추가합니다. 이때, servie.name은 external service의 이름으로 지정해줍니다.
- host: argocd.mingyu.co.kr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-external-service
port:
number: 80
번외 2. alb group annotations를 활용한 Ingress 통합하기
저는 alb ingress를 사용합니다. alb에서 하나의 인그레스에서 다중화된 네임스페이스의 서비스를 지원하는 기능이 있을거라 믿고 찾아봤는데 정말 있었습니다. 우선 monitoring-ingress.yaml 파일에 아래의 내용을 추가해줍니다.
metadata:
annotations:
abl.ingress.kubernetes.io/group.name: "mgt-ingress"
alb.ingress.kubernetes.io/group.order: "1"
그리고 argocd-ingress.yaml 파일에도 위 내용을 추가하여 배포해줍니다.
다만 위에서 이야기한 것과 같이 도메인이 같고 path로 설정을 나누게 될 경우에 해당 내용을 참고하시면 됩니다.
결론
아래와 같이 argocd.mingyu.co.kr 같은 설정한 도메인으로 접속하면 정상적으로 argocd에 접속되는것을 확인할 수 있습니다. 다음 포스팅에서는 기존 ncp의 source series를 활용해 구성된 CI/CD pipeline을 gitops & argocd로 전환하는 내용으로 찾아뵙겠습니다.
![[NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 결론 [NCP] NKS로 개발환경 구성하기 Chapter 7. gitops와 argocd 도입을 위한 argocd 설치하기 - 결론](https://blog.kakaocdn.net/dn/c9QbZE/btsMoi0TAdI/9rkskq5stG1IHRRkeHOUtk/img.png)
댓글