[k8s] Nginx Ingress Controller를 사용한 Ingress 구축

Donghyun Kim·2023년 3월 27일
0
post-thumbnail
post-custom-banner

여러 인그레스 컨트롤러 중 대표적인 NginX 인그레스 컨트롤러를 사용하여 구축한다.

Nginx Ingress Conntroller 설치

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml

nginx ingress controller가 설치되면서 k8s object들이 배포된다.
(pod, service, delpoyment, replicaset, job.batch)

kubectl get all -n ingress-nginx 명령어를 통해 배포된 오브젝트 확인
ingress-nginx-controller service가 생성되고 Port가 할당되며,
ingress-nginx-controller pod가 running 상태이면 된다.

Ingress 생성

Ingress Controller를 설치했으면 실질적으로 동작 방식과 엔드포인트를 작성한 k8s Ingress yaml파일을 작성하여 배포해주어야한다.

Ingress Sample Yaml

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

ingress.test.com/test로 요청이오면 -> service-test라는 서비스에서 요청을 받고 Service에 작성된 Pod로 요청이 되어 해당 컨테이너에서 응답을 해주는 형태

주의할 점

nginx-ingress-controller를 설치할 경우 기본적으로 오브젝트들의 라벨명이 ingress-nginx로 되어있다. 따라서 사용자가 배포할 Ingress의 이름을 기본적으로 ingress-nginx로 해주어야 매핑이된다.
다른 이름으로 작성할 경우 nginx-ingress-controller 설치 시 배포될 오브젝트의 yaml파일에 Label을 전부 해당 이름에 맞게 수정해주어야 한다.

Service Sample Yaml

# svc-test.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-test
spec:
  selector:
    app: service_test_pod
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

selector를 통하여 service_test_pod에 전달한다

Deployment Sample Yaml

# deploy-test.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: service-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: service_test_pod
  template:
    metadata:
      labels:
        app: service_test_pod
    spec:
      containers:
      - name: simple-http
        image: python:2.7
        imagePullPolicy: IfNotPresent
        command: ["/bin/bash"]
        args: ["-c", "echo '<p>Hello from $(hostname)</p>' > index.html; python -m SimpleHTTPServer 8080"]
        ports:
        - name: http
          containerPort: 8080

8080포트를 통해 파이썬으로 간단한 문자열을 출력하는 웹서버 컨테이너를 Pod로 생성

확인 작업

local PC에서 /etc/hosts파일에 wokernode의 ip와 ingress에 명시한 host명을 작성해준다.

# /etc/hosts

10.0.1.82 ingress.test.com

그 후 위의 host DNS명과 nginx-ingress-controller의 서비스 port
그리고 등록된 엔드포인트 path를 웹 브라우저상에 작성해주면 라우팅된 해당 애플리케이션에 요청하여 응답을 받을 수 있다.

확인 결과 화면

정리

기본적으로 k8s-cluster에서 외부 접근을 허용하려면 pod에 연결된 service를 NodePort 타입으로 생성해주면 해당 서비스에 생성된 NodePort ex) 30001 를 통해 워커노드의 ip와 해당 port로 컨테이너에 접근이 가능해지지만 Ingress를 사용하여 단일 지점 요청을 통한 외부 접근 허용 및 라우팅이 가능해지기 때문에 현업에선 Ingress를 주로 사용한다.

NodePort를 이용한 외부 접근 흐름

WorkerNode에 대한 서버 IP와 NodePort를 통해 연결된 서비스에 요청을 보내 해당 Service에 Selector로 연결된 Pod로 라우팅한다.

Ingress를 이용한 외부 접근 흐름

사전에 선언적으로 생성한 Ingress 규칙을 적용한 nginx-ingress-controller의 서비스가 모든 요청을 받아 host와 endpoint를 통해 요청을 라우팅하여 각각 맞는 서비스에 연결지어 준다.


참고자료

https://kubernetes.github.io/ingress-nginx/deploy/
https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html

profile
"Hello World"
post-custom-banner

0개의 댓글