일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kubernetes
- Trino
- java
- OS
- EC2
- ip
- MAC address
- PostgreSQL
- Operating System
- log
- grafana
- helm
- Packet
- Network
- Spring
- airflow
- Python
- CVAT
- AWS
- zookeeper
- Vision
- kubectl
- aws s3
- Kafka
- jvm
- docker
- tcp
- kubeadm
- CSV
- JavaScript
- Today
- Total
JUST WRITE
[Ingress] ArgoCD UI 헷갈리지 않고 쉽게 접근하기 본문
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 역할을 해줍니다.
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관리도 편한 게 할 수 있습니다.
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
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입니다.
[참고사이트]
'MLOps > Kubernetes' 카테고리의 다른 글
[Error Reporting] Worker Node join 에러 - CNI 이슈 (0) | 2023.06.26 |
---|---|
손쉽게 동적으로 Persistent Volume 생성하기 (0) | 2023.06.15 |
명령어 한 번에 Kubernetes 설치하기 - Terraform으로 Kubernetes 설치 (4) | 2023.05.23 |
Kubernetes에 CVAT 설치하기 - Helm으로 CVAT 설치 (8) | 2023.05.05 |
특정 Node에 Pod 스케줄링 (0) | 2023.02.26 |