본문 바로가기

리눅스

쿠버네티스에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법

반응형

쿠버네티스(Kubernetes)에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법

Kubernetes Ingress는 HTTP(S) 트래픽을 클러스터 내의 서비스로 라우팅하는 강력한 방법입니다. Ingress를 설정하면 하나의 IP 주소 또는 도메인 이름을 통해 여러 서비스를 관리할 수 있습니다. Ingress를 사용하려면 Ingress Controller를 설치하고 Ingress 리소스를 정의하여 외부 트래픽을 적절한 서비스로 전달할 수 있습니다.

1. Ingress Controller 설치

Ingress Controller는 Ingress 리소스의 정의를 실제 트래픽 라우팅으로 변환해주는 역할을 합니다. 대표적인 Ingress Controller로는 NGINX Ingress Controller가 있습니다.

NGINX Ingress Controller 설치

NGINX Ingress Controller 배포

  • cloud
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
  • baremetal
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/baremetal/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

Ingress Controller 상태 확인

  • ingress-nginx-controller 파드가 Running 상태인지 확인하고 EXTERNAL-IP가 할당된 LoadBalancer 서비스의 외부 IP 주소를 확인합니다.
kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2lbd5        0/1     Completed   0          83s
ingress-nginx-admission-patch-gv4tw         0/1     Completed   0          83s
ingress-nginx-controller-7d4db76476-p7cjh   1/1     Running     0          83s
kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.109.67.167   <pending>     80:31119/TCP,443:30372/TCP   107s
ingress-nginx-controller-admission   ClusterIP      10.109.245.96   <none>        443/TCP                      106s

2.  NGINX 웹 서버 테스트 파드 및 서비스 배포

NGINX 웹 서버를 쿠버네티스 클러스터에 배포하고 Ingress를 통해 접근할 수 있도록 설정합니다.

 

NGINX Deployment 생성

vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Deployment 적용

kubectl apply -f nginx-deployment.yaml

배포 상태 확인

kubectl get deployments
kubectl get pods

또는

kubectl get pods -o wide

NGINX Service 생성

vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Service 적용

kubectl apply -f nginx-service.yaml

서비스 상태 확인

kubectl get services

3. Ingress 리소스 설정

Ingress 리소스를 설정하여 외부에서 NGINX 서비스에 접근할 수 있도록 합니다.

nginx.local 도메인으로 들어오는 HTTP 요청을 nginx 서비스로 라우팅합니다.

 

Ingress 리소스 생성

vim nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: nginx.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80

Ingress 리소스 적용

kubectl apply -f nginx-ingress.yaml

Ingress 리소스 상태 확인

kubectl get ingress

3. 외부 접근 설정

온프레미스 환경에서 Ingress Controller의 외부 접근을 설정합니다.

 

서비스 타입 확인

kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.103.80.149    <pending>     80:30552/TCP,443:32662/TCP   6m
ingress-nginx-controller-admission   ClusterIP      10.110.126.222   <none>        443/TCP                      6m

서비스 타입 변경

  • ingress-nginx-controller 서비스의 타입을 NodePort로 변경합니다.
kubectl edit svc ingress-nginx-controller -n ingress-nginx

NodePort 확인

  • 변경된 서비스의 NodePort를 확인합니다.
kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.103.80.149    <none>        80:30552/TCP,443:32662/TCP   6m56s
ingress-nginx-controller-admission   ClusterIP   10.110.126.222   <none>        443/TCP                      6m56s

Ingress Controller의 External IP 설정

NodePort 또는 LoadBalancer 사용

  • Ingress Controller의 서비스가 LoadBalancer 또는 NodePort로 설정되어 있어야 외부에서 접근할 수 있습니다.
  • EXTERNAL-IP가 <pending>상태일 수 있습니다. NodePort로 설정되어 있어야 외부에서 접근할 수 있습니다.
kubectl get svc -n ingress-nginx

NodePort 확인

  • NodePort를 확인하여 외부에서 접근할 수 있는 포트를 확인합니다.
  • PORT(S) 항목에서 80:<NodePort>/TCP와 같은 형식으로 NodePort가 할당된 것을 확인합니다.
kubectl get svc ingress-nginx-controller -n ingress-nginx

로컬 DNS 설정

호스트 파일 수정

  • 로컬 시스템에서 /etc/hosts 파일을 수정하여 도메인 이름을 클러스터의 노드 IP로 매핑합니다.
  • <NodeIP>는 클러스터 노드의 IP 주소입니다.
echo "<NodeIP> nginx.local" | sudo tee -a /etc/hosts
echo "$(hostname -I | grep -o '192.168.0.[0-9]\{1,3\}') nginx.local" | sudo tee -a /etc/hosts

웹 브라우저 테스트

  • 브라우저에서 http://nginx.local으로 접근하여 NGINX 웹 서버의 페이지가 표시되는지 확인합니다.
http://nginx.local

파드 내부에서 쉘을 실행하여 명령어 실행

nginx 파드 목록 조회

kubectl get pods -l app=nginx
NAME                    READY   STATUS    RESTARTS   AGE
nginx-576c6b7b6-l5qlx   1/1     Running   0          26m
nginx-576c6b7b6-mmrlc   1/1     Running   0          26m

또는

kubectl get pods -l app=nginx -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
nginx-576c6b7b6-l5qlx   1/1     Running   0          56m   10.0.3.87    k8s-worker1   <none>           <none>
nginx-576c6b7b6-mmrlc   1/1     Running   0          56m   10.0.3.235   k8s-worker1   <none>           <none>
curl -fsSL http://10.0.3.87

파드 내부에서 여러 명령어를 실행하고자 한다면 파드 내에서 쉘을 실행할 수 있습니다.

kubectl exec -it <pod-name> -- /bin/sh
kubectl exec -it nginx-576c6b7b6-l5qlx -- /bin/bash
curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

728x90
반응형