JUST WRITE

[Ingress] ArgoCD UI 헷갈리지 않고 쉽게 접근하기 본문

MLOps/Kubernetes

[Ingress] ArgoCD UI 헷갈리지 않고 쉽게 접근하기

천재보단범재 2023. 6. 4. 17:03

ArgoCD 설치, Ingress 세팅

ArgoCD UI 헷갈리지 않고 쉽게 접근하기

Kubernetes내 Service를 외부에서 접근하도록 설정하는 가장 쉬운 방식은 NodePort 방법입니다.

Service Port를 Control Plane의 Port에 포트포워딩을 통해 접근하게 해주는 방식입니다.

service-nodeport-range(default: 30000~32767)내에서 Control Plane의 Port로 포트포워딩이 가능합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007

NodePort가 쉬운 방식이긴 하지만 Kubernetes 모든 Service타입을 NodePort로 하면 혼동이 올 수 있습니다.

어떤 Service가 몇 번 Port로 설정했는지 따로 관리 해야 합니다.

이런 관리 포인트를 줄이는 방법은 Service를 Ingress 통해 외부로 노출하는 것입니다.

이번 포스팅에서는 ArgoCD를 설치하면서 UI Service를 Ingress를 통해 접근하는 것을 정리해 보도록 하겠습니다.

Ingress

Ingress는 Kubernetes API Object 중 하나로 Cluster Serivce를 외부에서 접근할 때 Router 역할을 해줍니다.

출처: https://kubernetes.io/docs/concepts/services-networking/ingress/

Ingress를 통해 Routing, SSL/TLS 설정, Load Balancing이 가능합니다.

다만 Ingress Object 자체는 설정에 불가하며 실제 동작은 Ingress Controller에서 진행합니다.

Ingress Controller에는 종류가 많으며 적절한 Controller를 사용하면 됩니다.

등 이외에도 다양한 Ingress Controller가 존재합니다.

NGINX Ingress Controller

Ingress 사용을 위해 Ingress Controller를 설치해야 합니다.

이번 포스팅에서는 가장 보편적으로 사용하는 NGINX Ingress Controller로 설치를 진행합니다.

Document에 다양한 환경에서 설치하는 방법들이 정리되어 있습니다.

이전에 ubuntu 환경에 설치했던 Kubernetes Cluster에 설치해 보겠습니다.

AWS환경이지만 AWS LoadBalancer를 사용하지 않고 Bare-metal 환경이라 생각하고 설치해 보겠습니다.

Bare-metal 버전의 yaml로 설치합니다.

$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/baremetal/deploy.yaml
$ mv deploy.yaml nginx-ingress-controller-1.7.1.yaml
$ kubectl apply -f nginx-ingress-controller-1.7.1.yaml

설정값을 굳이 바꾸지 않고 기본으로 해도 이번 포스팅에서는 문제없습니다.

NGNIX Controller 설치가 완료되었습니다.

controller pod이 실행되고 Ingressclass가 생성된 것을 확인할 수 있습니다.

$ kubectl get all -n ingress-nginx 
NAME                                           READY   STATUS      RESTARTS       AGE
pod/ingress-nginx-admission-create-r5tkl       0/1     Completed   0              11d
pod/ingress-nginx-admission-patch-2f88n        0/1     Completed   1              11d
pod/ingress-nginx-controller-bd5bb9d6f-29qlt   0/1     Completed   0              23h
pod/ingress-nginx-controller-bd5bb9d6f-8l8p7   1/1     Running     0              134m
pod/ingress-nginx-controller-bd5bb9d6f-9hpn6   0/1     Completed   0              18h
pod/ingress-nginx-controller-bd5bb9d6f-bnzs6   0/1     Completed   0              41h
pod/ingress-nginx-controller-bd5bb9d6f-c9q8b   0/1     Completed   0              34h
pod/ingress-nginx-controller-bd5bb9d6f-c9qq4   0/1     Completed   0              10h
pod/ingress-nginx-controller-bd5bb9d6f-j4khw   0/1     Completed   0              14h
pod/ingress-nginx-controller-bd5bb9d6f-jcvx6   0/1     Completed   0              5h21m
pod/ingress-nginx-controller-bd5bb9d6f-vss4q   0/1     Completed   0              32h
pod/ingress-nginx-controller-bd5bb9d6f-w9rgw   0/1     Completed   4 (2d2h ago)   11d
pod/ingress-nginx-controller-bd5bb9d6f-wtbbj   0/1     Completed   0              26h

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.100.177.33   <none>        80:31150/TCP,443:32072/TCP   11d
service/ingress-nginx-controller-admission   ClusterIP   10.109.48.177   <none>        443/TCP                      11d

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           11d

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-bd5bb9d6f   1         1         1       11d

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           4s         11d
job.batch/ingress-nginx-admission-patch    1/1           5s         11d

$ kubectl get ingressclass
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       11d

위에서 보면 Controller Service가 31150으로 포트포워딩된 것을 확인할 수 있습니다.

이번 실습에서는 Domain을 활용하지 않기 때문에 해당 Port를 기억합니다.

ArgoCD

Ingress Controller가 준비되었으니 ArgoCD를 설치하고 Ingress 세팅을 해보겠습니다.

ArgoCD는 Argo에서 제공하는 Kubernetes 환경 Deploy 관리 Tool입니다.

Kubernetes를 CLI로 관리하는 것을 WEB UI로 간편하게 관리하게 해주는 Tool입니다.

Git과 연동이 돼서 History관리도 편한 게 할 수 있습니다.

출처 :&nbsp;https://argo-cd.readthedocs.io/en/stable/

ArgoCD에 대한 자세한 사용은 다른 포스팅에서 정리해 보겠습니다.

일단 ArgoCD를 설치합니다.

ArgoCD 역시 Helm Chart를 지원합니다.

Helm Chart를 다운로드합니다.

$ helm repo add argo-cd https://argoproj.github.io/argo-helm
"argo-cd" has been added to your repositories

$ helm repo list
NAME    URL                                  
argo-cd https://argoproj.github.io/argo-helm

$ helm search repo argo-cd
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
argo-cd/argo-cd                 5.34.4          v2.7.2          A Helm chart for Argo CD, a declarative, GitOps...
argo-cd/argo                    1.0.0           v2.12.5         A Helm chart for Argo Workflows                   
argo-cd/argo-ci                 1.0.0           v1.0.0-alpha2   A Helm chart for Argo-CI                          
argo-cd/argo-events             2.3.3           v1.7.6          A Helm chart for Argo Events, the event-driven ...
argo-cd/argo-lite               0.1.0                           Lighweight workflow engine for Kubernetes         
argo-cd/argo-rollouts           2.30.0          v1.5.0          A Helm chart for Argo Rollouts                    
argo-cd/argo-workflows          0.28.0          v3.4.7          A Helm chart for Argo Workflows                   
argo-cd/argocd-applicationset   1.12.1          v0.4.1          A Helm chart for installing ArgoCD ApplicationSet 
argo-cd/argocd-apps             1.2.0                           A Helm chart for managing additional Argo CD Ap...
argo-cd/argocd-image-updater    0.9.1           v0.12.2         A Helm chart for Argo CD Image Updater, a tool ...
argo-cd/argocd-notifications    1.8.1           v1.2.1          A Helm chart for ArgoCD notifications, an add-o...

$ helm pull argo-cd/argo-cd
$ ll
-rw-r--r-- 1 ubuntu ubuntu 140171 May 24 04:46 argo-cd-5.34.4.tgz
$ tar xzf argo-cd-5.34.4.tgz

이번 포스팅에서 ArgoCD에 대한 설정은 기본값으로 합니다.

다만 Ingress 설정을 진행합니다.

Helm에 Ingress에 대한 부분이 있습니다.

# ingress template 파일 존재
$ ll argo-cd-5.34.4/templates/argocd-server/
total 96
drwxrwxr-x  5 ubuntu ubuntu  4096 May 24 04:47 ./
drwxrwxr-x 11 ubuntu ubuntu  4096 May 24 04:47 ../
drwxrwxr-x  2 ubuntu ubuntu  4096 May 24 04:47 aws/
-rw-r--r--  1 ubuntu ubuntu  1204 May 23 20:29 certificate.yaml
-rw-r--r--  1 ubuntu ubuntu  1051 May 23 20:29 clusterrole.yaml
-rw-r--r--  1 ubuntu ubuntu   676 May 23 20:29 clusterrolebinding.yaml
-rw-r--r--  1 ubuntu ubuntu 16529 May 23 20:29 deployment.yaml
drwxrwxr-x  2 ubuntu ubuntu  4096 May 24 04:47 gke/
-rw-r--r--  1 ubuntu ubuntu  1560 May 23 20:29 hpa.yaml
-rw-r--r--  1 ubuntu ubuntu  2520 May 23 20:29 ingress-grpc.yaml
-rw-r--r--  1 ubuntu ubuntu  3294 May 23 20:29 ingress.yaml
-rw-r--r--  1 ubuntu ubuntu  1412 May 23 20:29 metrics.yaml
-rw-r--r--  1 ubuntu ubuntu   540 May 23 20:29 networkpolicy.yaml
drwxrwxr-x  2 ubuntu ubuntu  4096 May 24 04:47 openshift/
-rw-r--r--  1 ubuntu ubuntu   895 May 23 20:29 pdb.yaml
-rw-r--r--  1 ubuntu ubuntu  1007 May 23 20:29 role.yaml
-rw-r--r--  1 ubuntu ubuntu   543 May 23 20:29 rolebinding.yaml
-rw-r--r--  1 ubuntu ubuntu  2044 May 23 20:29 service.yaml
-rw-r--r--  1 ubuntu ubuntu   760 May 23 20:29 serviceaccount.yaml
-rw-r--r--  1 ubuntu ubuntu  1832 May 23 20:29 servicemonitor.yaml

ArgoCD의 Helm Chart values.yaml 내용이 엄청 깁니다.

다 살펴볼 수는 없기에 바꾸는 부분만 values-override.yaml로 작성합니다.

configs:
  params:
    server.insecure: true
server:
  extraArgs:
    # - --basehref
    - --rootpath
    - /argocd
  ingress:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/backend-protocol: HTTP
    ingressClassName: nginx
    paths:
      - "/argocd"

Ingress 관련 설정

ArgoCD는 기본으로 TLS 설정이 되어 있습니다.

그래서 Ingress에 HTTP로 들어와도 HTTPS로 redirection 하는 것을 막기 위해 TLS 설정을 disable 합니다.

(물론 Ingress단에서 TLS 설정을 해주면 되지만 이번에는 패스)

configs:
  params:
    server.insecure: true

두 번째 Ingress 내부적으로 rootpath가 '/'로 되어 있습니다.

근데 저희는 Ingress path 방식을 통해 '/argocd'로 설정하려고 합니다.

ArgoCD 내부적으로 rootpath가 argocd가 되도록 설정합니다.

  extraArgs:
    # - --basehref
    - --rootpath
    - /argocd

Ingress path 방식으로 '/argocd'로 argocd-server service와 매핑합니다.

IngressClass는 설치한 Ingress Controller인 nginx로 설정합니다.

설치 후 ArgoCD내 Ingress Object를 살펴보면 해당 결과가 어떻게 되는지 확인할 수 있습니다.

  ingress:
    enabled: true
    annotations:
      nginx.ingress.kubernetes.io/backend-protocol: HTTP
    ingressClassName: nginx
    paths:
      - "/argocd"

ArgoCD 설치

Helm 명령어를 통해 ArgoCD를 설치합니다.

$ helm install argocd --create-namespace -n argocd ./ -f values-override.yaml

$ kubectl get all -n argocd 
NAME                                                    READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0                     1/1     Running   0          9m29s
pod/argocd-applicationset-controller-775b847c8d-kjtpr   1/1     Running   0          9m29s
pod/argocd-dex-server-b769574c5-55b84                   1/1     Running   0          9m29s
pod/argocd-notifications-controller-5654f8457f-rmt6j    1/1     Running   0          9m29s
pod/argocd-redis-7cff55499d-95dp2                       1/1     Running   0          9m29s
pod/argocd-repo-server-f6696c89f-cfv2r                  1/1     Running   0          9m29s
pod/argocd-server-598c644bb-ll4lw                       1/1     Running   0          9m29s

NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/argocd-applicationset-controller   ClusterIP   10.105.118.44    <none>        7000/TCP            9m29s
service/argocd-dex-server                  ClusterIP   10.110.137.20    <none>        5556/TCP,5557/TCP   9m29s
service/argocd-redis                       ClusterIP   10.106.211.197   <none>        6379/TCP            9m29s
service/argocd-repo-server                 ClusterIP   10.98.12.127     <none>        8081/TCP            9m29s
service/argocd-server                      ClusterIP   10.97.188.162    <none>        80/TCP,443/TCP      9m29s

NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-applicationset-controller   1/1     1            1           9m29s
deployment.apps/argocd-dex-server                  1/1     1            1           9m29s
deployment.apps/argocd-notifications-controller    1/1     1            1           9m29s
deployment.apps/argocd-redis                       1/1     1            1           9m29s
deployment.apps/argocd-repo-server                 1/1     1            1           9m29s
deployment.apps/argocd-server                      1/1     1            1           9m29s

NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-applicationset-controller-775b847c8d   1         1         1       9m29s
replicaset.apps/argocd-dex-server-b769574c5                   1         1         1       9m29s
replicaset.apps/argocd-notifications-controller-5654f8457f    1         1         1       9m29s
replicaset.apps/argocd-redis-7cff55499d                       1         1         1       9m29s
replicaset.apps/argocd-repo-server-f6696c89f                  1         1         1       9m29s
replicaset.apps/argocd-server-598c644bb                       1         1         1       9m29s

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     9m29s

$ kubectl get ing -n argocd 
NAME            CLASS   HOSTS   ADDRESS        PORTS   AGE
argocd-server   nginx   *       172.31.33.58   80      19m

ArgoCD 메인 Service는 WEB UI를 제공하는 argocd-server입니다.

해당 Service 타입은 ClusterIP로 외부로 노출이 되어 있지 않습니다.

ArgoCD Ingress를 살펴보면 argocd-server와 '/argocd'로 매핑된 것을 확인할 수 있습니다.

$ kubectl get ingress -n argocd -o yaml
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      meta.helm.sh/release-name: argocd
      meta.helm.sh/release-namespace: argocd
      nginx.ingress.kubernetes.io/backend-protocol: HTTP
    creationTimestamp: "2023-05-24T05:56:18Z"
    generation: 1
    labels:
      app.kubernetes.io/component: server
      app.kubernetes.io/instance: argocd
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: argocd-server
      app.kubernetes.io/part-of: argocd
      helm.sh/chart: argo-cd-5.34.4
    name: argocd-server
    namespace: argocd
    resourceVersion: "1961411"
    uid: 72f7febd-f5dc-449b-a609-f4a1fd349675
  spec:
    ingressClassName: nginx
    rules:
    - http:
        paths:
        - backend:
            service:
              name: argocd-server
              port:
                number: 80
          path: /argocd
          pathType: Prefix
  status:
    loadBalancer:
      ingress:
      - ip: 172.31.33.58
kind: List
metadata:
  resourceVersion: ""

그럼 어떻게 외부에서 접근하면 될까요?

아까 NGINX Controller Service Port는 31150이었습니다.

아래 주소로 들어가면 ArgoCD WEB UI에 접근하는 것을 확인할 수 있습니다.

http://{control-plane IP}:31150/argocd

ArgoCD WEB UI

Domain을 따로 가지고 있다면 Domain을 통해 해당 Service로 들어오는 것이 가능합니다.

Domain을 활용한 Ingress 세팅은 다른 포스팅에서 정리해 보겠습니다.

참고로 ArgoCD Admin init-password는 아래 명령어로 확인 가능합니다.

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

정리

이번 포스팅에서 Ingress 세팅과 더불어 ArgoCD를 설치해 보았습니다.

NodePort는 세팅이 쉽기는 하지만 NodePort 타입의 Service가 많아지면 Service와 Port 관리가 필요해집니다.

Ingress 설정을 하면 관리가 편하도록 원하는 대로 Service URL 설정이 가능합니다.

이번은 Ingress가 메인이라 ArgoCD는 소개만 하였지만 다른 포스팅에서 정리해 보도록 하겠습니다.

정말 편리한 Tool입니다.

[참고사이트]

728x90
반응형
Comments