본문 바로가기

리눅스

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

728x90

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

Ingress Controller는 클러스터 외부의 HTTP/HTTPS 요청을 클러스터 내부의 서비스로 라우팅하는 역할을 합니다.

1. Ingress Controller 설치

NGINX를 웹 서비스로 배포하고 Ingress Controller를 사용하여 외부에서 접근할 수 있도록 합니다.

 

NGINX Ingress Controller 배포

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-mlftk        0/1     Completed   0          2m45s
ingress-nginx-admission-patch-479c6         0/1     Completed   1          2m45s
ingress-nginx-controller-54cf9c8856-h2wpg   1/1     Running     0          2m45s
kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.109.46.206    <none>        80:32551/TCP,443:30242/TCP   2m25s
ingress-nginx-controller-admission   ClusterIP   10.104.139.145   <none>        443/TCP                      2m25s

2. NGINX 웹 서버 배포

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

 

NGINX Deployment 생성

vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  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
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           74s
kubectl get pods
NAME                    READY   STATUS    RESTARTS        AGE
nginx-576c6b7b6-nkkpl   1/1     Running   0               94s
nginx-576c6b7b6-wzpzv   1/1     Running   0               94s

또는

kubectl get pods -o wide

NGINX Service 생성

vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30002  # 노드의 30002 포트를 사용

Service 적용

kubectl apply -f nginx-service.yaml

서비스 상태 확인

kubectl get services
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        3h49m
nginx-service   NodePort    10.109.201.123   <none>        80:30002/TCP   23m

3. Ingress 리소스 설정

Ingress 리소스를 설정하여 외부에서 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-service
            port:
              number: 80

Ingress 리소스 적용

kubectl apply -f nginx-ingress.yaml

Ingress 리소스 상태 확인

kubectl get ingress
NAME            CLASS    HOSTS         ADDRESS   PORTS   AGE
nginx-ingress   <none>   nginx.local             80      22m

3. 외부 접근 설정

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

 

서비스 타입 확인

kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.109.46.206    <none>        80:32551/TCP,443:30242/TCP   6m59s
ingress-nginx-controller-admission   ClusterIP   10.104.139.145   <none>        443/TCP                      6m59s

서비스 타입 변경(선택 사항)

  • 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>

 

참고URL

- Kubernetes github : Ingress-Nginx Controller(Bare-metal)

- Kubernetes Documentation : Ingress

 

kubectl은 svc ingress-nginx-controller -n ingress-nginx를 얻습니다.
 
728x90