본문 바로가기

⭐ CICD/ArgoCD + @

ArgoCD + Docker hub 를 활용하여 Kubernetes에 배포하기

# 새로운 CI 방법과 CD방법이 계속해서 등장한다. 새로운 기술들이 그것도 오픈소스로 지속적으로 등장하기 때문에 트랜드를 빨리 파악하고 테스트 해보고 적용하여 필요한 부분을 적용하는 것이 중요할거 같다.

- 대표적인? CD 방법인 요즘 핫한(나만 핫한가?) ArgoCD를 통해 Kubernetes 클러스터에 Docker 이미지를 배포하는 방법에 대해서 알아보자.

- 일단 ArgoCD란?

- CD(지속적 배포)의 배표적인 툴 이다. 직관적이고 사용성이 편리하여 최근에 가장 많이 쓰이고 있다.
그리고 ArgoCD를 사용하여 Kubernetes에 배포하면 Git에서 수정사항이 발생할 때, 자동으로 ArgoCD에서 수정하여 에러를 줄이고 지속적인 배포를 구현할 수 있다. 또한 각 버전들은 Git 저장소에 기록되어 있으며 ArgoCD를 통하여 이전 버전으로의 롤백이나 새로운 버전으로 업그레이드가 가능하다.
빌드 및 테스트가 끝나는 시점에 GitOps의 영역으로 진입하면서 Git 레포지토리에 저장되어 있는 Manifest 파일을 사용하여 ArgoCD로 Kubernetes에 배포하게 된다.

1. ArgoCD 배포

kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl create namespace argocd
namespace/argocd created
k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-redis created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-secret created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
k8s-master-node@k8smasternode-Virtual-Machine:~$

2. ArgoCD 설치 확인 (pod가 많다...)

kubectl get po -n argocd

# pod가 많이 생성 되므로 -w 옵션을 줘서 관찰을 해보자
kubectl get po -n argocd -w

- 모두 정상적으로 Running 상태 확인

k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl get po -n argocd
NAME                                 READY   STATUS    RESTARTS   AGE
argocd-application-controller-0      1/1     Running   0          2m36s
argocd-dex-server-5fc596bcdd-dgf88   1/1     Running   0          2m36s
argocd-redis-5b6967fdfc-z2dk4        1/1     Running   0          2m36s
argocd-repo-server-98598b6c7-z5xwj   1/1     Running   0          2m36s
argocd-server-5b4b7b868b-kfn9w       1/1     Running   0          2m36s

- ArgoCD로 접근하기 위해선 타입을 지정해야 한다. (나는 클라우드 서비스 환경이 아니므로 Nodeport를 사용하여 접근 하겠다.)

# CMD 환경에서는 안되고 git bash와 같은 환경에서 실행 가능하다.
# LoadBalancer 타입으로 접근 (클라우드 네이티브 환경)
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
External IP 접속

# 포트포워딩으로 접근
kubectl port-forward svc/argocd-server -n argocd 8080:443
localhost:8080 접속

# NodePort 타입으로 접근 (로컬 환경)
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
node IP:NodePort 로 접속

# Ingress 로 접근
이건 위의 공식 홈페이지에서 확인

- 명령어 입력하여 타입변경

k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'

3. ArgoCD 에 접속하자

- nodeport ip 확인

k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl get nodes -o wide
NAME                              STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8smasternode-virtual-machine     Ready    control-plane,master   2d    v1.22.3   192.168.137.50    <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7
k8sworkernode01-virtual-machine   Ready    <none>                 2d    v1.22.3   192.168.137.105   <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7
k8sworkernode02-virtual-machine   Ready    <none>                 2d    v1.22.3   192.168.137.254   <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7
k8s-master-node@k8smasternode-Virtual-Machine:~$

- 포트 번호를 확인하자 30080으로 확인이 된다. workernode ip:30080으로 접근해보자 : 192.168.137.105:30080

k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl get svc -n argocd
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-dex-server       ClusterIP   10.97.29.59     <none>        5556/TCP,5557/TCP,5558/TCP   8m9s
argocd-metrics          ClusterIP   10.106.11.109   <none>        8082/TCP                     8m9s
argocd-redis            ClusterIP   10.98.252.91    <none>        6379/TCP                     8m9s
argocd-repo-server      ClusterIP   10.96.112.66    <none>        8081/TCP,8084/TCP            8m9s
argocd-server           NodePort    10.104.57.40    <none>        80:30080/TCP,443:31774/TCP   8m9s
argocd-server-metrics   ClusterIP   10.105.118.7    <none>        8083/TCP                     8m9s

- 접속확인 - 문어 나온거 보니까 정상적으로 접근 한거 같다.

- 초기 관리자 계정은 admin이고, 비밀번호를 따로 지정하지 않았으므로, 비밀번호를 알아내자.

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

- 비밀번호 확인

k8s-master-node@k8smasternode-Virtual-Machine:~$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
LGV9qZbI2Y-o8pcP

- 정상 로그인 확인

4. Git 레포지토리를 연동해보자.

설정 > 레포지토리 클릭

- HTTPS 방식으로 해보자

- 타입은 Git이고, Repository URL에는 본인이 사용할 레포지토리 주소를 넣어주면 된다.

- 연동 성공

* 만약 argocd에서 Github Repository가 연동이 되지 않는다면, sudo reboot 및 서버를 재부팅 하여 다시 시도하는것이 필요하다.

Github의 Repository 연동은 어려운것이 아니기 때문에 연동이 되어야 한다.

5. 애플리케이션 배포하기

ArgoCD의 Applications 탭에서 NEW APP 을 클릭하자

간단하게 nginx를 배포하는 Manifest 파일을 git 레포지토리에 올려두고 ArgoCD로 배포해보자

- 2개의 파일이 생성 되어 있어야 한다.

- deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: mynginx
  template:
    metadata:
      labels:
        run: mynginx
    spec:
      containers:
      - image: nginx
        name: mynginx
        ports:
        - containerPort: 80

- service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mynginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: mynginx

- Application Name : nginx를 배포할거니까 간단하게 nginx라고 지정
- Project : ArgoCD에서 애플리케이션을 구분하고 관리하기 위한 논리적인 그룹
- SYNC POLICY : Git의 환경과 비교하는 것을 수동으로 할지 자동으로 할지 선택
- Prune Resources : 변경 사항에 기준 리소스를 업데이트할 때, 기존의 리소스를 삭제하고 새로운 리소스를 생성
- Self Heal : ArgoCD가 지속적으로 Git 레포지토리의 설정값과 싱크를 맞춤

- Repository URL : 사용할 레포지토리 URL
- Revision : Git의 Revision (HEAD , Master branch 등)을 선택
- Path : Git의 저장소의 주소
- Cluster URL  : Kubernetes의 어느 클러스터에 배포할지 결정
- Namespace : Kubernetes 클러스터의 어느 Namespace에 배포할지 결정

모든것을 설정하고 나서 Create 를 클릭해주면, 아래와 같이 Kubernetes 클러스터의 리소스들을 시각화하여 한눈에 알기 쉽도록 볼수 있다. nginx 라는 애플리케이션에 나의 Git 레포지토리에 올려두었던 deployment.yaml와 service.yaml이 배포되어 한개의 pod가 생성되어 있는 모습이다.

deployment의 replicas를 1에서 5으로 수정해보았다.

그 결과, ArgoCD에서도 파드가 5개로 늘어나는 모습을 보여주었다.

메뉴의 HISTORY AND ROLLBACK을 클릭하면 git의 수정사항도 볼 수 있고 이전 버전으로 롤백까지 쉽게 할 수 잇다.
ArgoCD를 사용하여 Kubernetes를 관리함으로써 더욱 쉽게 배포하고 관리할 수 있다.

- 결론, 편하다. 너무 좋은거 같다.

- 끝 -

'⭐ CICD > ArgoCD + @' 카테고리의 다른 글

argocd와 helm chart Repository 연동  (0) 2023.03.10