JUST WRITE

포트 번호 쓰기도 귀찮네(1) 본문

MLOps/Kubernetes

포트 번호 쓰기도 귀찮네(1)

천재보단범재 2023. 7. 11. 21:02

NGINX로 포트 포워딩 하기

포트 번호 쓰기도 귀찮네(1)

예전 포스팅에서 Ingress를 통해서 Kubernetes의 Service를 원하는 URL로 설정을 해보았습니다.

 

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

ArgoCD UI 헷갈리지 않고 쉽게 접근하기 Kubernetes내 Service를 외부에서 접근하도록 설정하는 가장 쉬운 방식은 NodePort 방법입니다. Service Port를 Control Plane의 Port에 포트포워딩을 통해 접근하게 해주는

developnote-blog.tistory.com

Nginx Ingress Controller를 통해서 URL를 설정하였습니다.

다만 Nginx Ingress Controller로 세팅한 Service의 Port 번호를 알아야 했습니다.

Port 번호도 입력하기 귀찮습니다.

Google, Naver처럼 Domain으로만 Kubernetes Service로 접근하는 게 가장 편합니다.

오늘 포스팅에서 Port번호 기억할 필요 없이 Domain으로 Service에 접근하는 방법을 정리하였습니다.

Nginx Ingress Controller

저번 포스팅에서 Kubernetes Cluster에 Nginx Ingress Controller를 통해 Router 역할을 하였습니다.

32058 Port를 통해서 Ingress Controller에 접근이 가능합니다. 

$ kubectl get all -n ingress-nginx 
NAME                                           READY   STATUS      RESTARTS       AGE
pod/ingress-nginx-admission-create-rbdjj       0/1     Completed   0              6d7h
pod/ingress-nginx-admission-patch-k74l8        0/1     Completed   1              6d7h
pod/ingress-nginx-controller-bd5bb9d6f-88jrx   1/1     Running     6 (3h5m ago)   6d7h

NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.106.85.113    <none>        80:32058/TCP,443:32272/TCP   6d7h
service/ingress-nginx-controller-admission   ClusterIP   10.101.135.200   <none>        443/TCP                      6d7h

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

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-bd5bb9d6f   1         1         1       6d7h

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           7s         6d7h
job.batch/ingress-nginx-admission-patch    1/1           7s         6d7h

해당 Controller로 Routing을 원하는 Service를 Ingress로 설정합니다.

$ 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: ""

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

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

argocd라는 path가 설정되지만 32058이라는 Port번호를 기억해야 합니다.

Domain 세팅

Domain으로 접근하기 위해서는 dns 세팅

가비아를 통해서 domain 세팅을 진행하였습니다.

(보안 문제로 풀 Domain명은 해당 포스팅에서 *로 처리하였습니다)

 

가비아: 대한민국 도메인 점유율 1위

대한민국 100만 도메인 등록 업체

domain.gabia.com

저번 포스팅에서 진행한 ArgoCD Web UI를 아래 도메인으로 세팅해 보겠습니다.

Control-plane의 IP를 ArgoCD Domain(argocd.****.***)으로 세팅하였습니다.

Control-plane의 IP와 Nginx Ingress Controller Service Port가 아닌 Domain으로 접근가능합니다.

http://argocd.****.***

Ingress 설정 수정

저번 포스팅에서 ArgoCD Ingress 설정은 rootpath가 '/argocd'로 설정되어 있습니다.

저번에 설정한 ArgoCD Helm Chart Ingress 부분입니다.

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

이번에는 하위 경로 없이 바로 ArgoCD Web에 접근하도록 설정합니다.

어떤 host명으로 접근했을 시 해당 Service로 Routing 되는지 설정합니다.

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

그럼 이제 아래 URL로 ArgoCD Web으로 접근이 가능합니다.

아직 Port번호가 남았습니다.

http://argocd.****.***:32058

Nginx 설정

http의 기본 Port는 80입니다.

기본 Port이기 때문에 생략이 가능해 host명만 명시해 주면 됩니다.

그래서 위 32058 Port를 포트포워딩해주면 됩니다.

Nginx을 통해서 포트포워딩을 하였습니다.

Nginx 설치

Kubernetes Cluster의 Control-Plane에 Nginx을 설치하였습니다.

Ubuntu에서 Nginx는 apt 명령어로 설치가 가능합니다.

$ sudo apt-get install nginx -y

$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

Nginx 설정

다음은 Nginx 포트포워딩 설정을 합니다.

nginx path내 sites-available/default 파일을 수정하였습니다.

$ vi /etc/nginx/sites-available/default 

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        
        root /var/www/html;
        server_name _;

        location / {
                resolver 168.126.63.1;
                proxy_pass http://$host:32058;
                
                proxy_set_header    Host                $host:$server_port;
                proxy_set_header    X-Real-IP           $remote_addr;
                proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
                proxy_set_header    X-Forwarded-Proto   $scheme;
                proxy_set_header    X-Forwarded-Port    $server_port;
                proxy_set_header    Connection "";
                proxy_http_version  1.1;
        }

}
  • resolver -> 168.126.63.1은 KT DNS Server IP
  • proxy_pass -> 80 port로 들어온 접근을 32058 Port로 포워딩

Control-Plane Server 80 Port로 접근하면 32058 Port로 포워딩하도록 설정하였습니다.

설정이 끝나면 nginx service를 시작합니다.

$ sudo systemctl enable --now nginx

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-07-11 10:02:49 UTC; 3h 7min ago
       Docs: man:nginx(8)
    Process: 36146 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 36148 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 57514 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
   Main PID: 36149 (nginx)
      Tasks: 3 (limit: 9384)
     Memory: 4.8M
        CPU: 339ms
     CGroup: /system.slice/nginx.service
             ├─36149 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─57515 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─57516 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Jul 11 10:02:49 k8smaster systemd[1]: Starting A high performance web server and a reverse proxy server...
Jul 11 10:02:49 k8smaster systemd[1]: Started A high performance web server and a reverse proxy server.
Jul 11 10:12:08 k8smaster systemd[1]: Reloading A high performance web server and a reverse proxy server...
Jul 11 10:12:08 k8smaster systemd[1]: Reloaded A high performance web server and a reverse proxy server.
Jul 11 10:12:41 k8smaster systemd[1]: Reloading A high performance web server and a reverse proxy server...
Jul 11 10:12:41 k8smaster systemd[1]: Reloaded A high performance web server and a reverse proxy server.
Jul 11 10:13:50 k8smaster systemd[1]: Reloading A high performance web server and a reverse proxy server...

그럼 이제 아래 URL로 ArgoCD Web 접근이 가능합니다.

http://argocd.****.***

ArgoCD WEB UI

정리

Nginx Ingress Controller와 Nginx을 통해서 Kubernetes Service를 Domain으로 접근하도록 하였습니다.

해당 방법 말고도 LoadBalancer를 통해서도 가능합니다.

다음 포스팅에서는 MetalLB를 통해 Domain으로 접근하도록 해보겠습니다.

728x90
반응형
Comments