본문 바로가기
DevOps/Kubernetes

Networking/Ingress, Ingress Controller

by MiteDev 2024. 1. 3.

Ingress && Ingress Controller란?

  Ingress는 쿠버네티스 클러스터 외부에서 클러스터 내부로의 HTTP(port: 80)와 HTTPS(port: 443) 요청을 클러스터 내부의 Service로 라우트 시켜줍니다. Ingress는 HTTP와 HTTPS 요청만을 다루기 때문에 다른 Port로 들어오는 서비스를 노출시키려면 Service의 Service Type을 NodePort나 LoadBalancer로 지정해 노출시킵니다.

 

  Ingress를 사용하기 위해서는 ingress-nginx와 같은 Ingress Controller 객체를 반드시 같이 생성해주어야 합니다. 대표적으로 쿠버네티스 클러스터 내부에서 직접 Pod로 배포하는 ingress-nginx와 AWS나 GCP 등 클라우드에서 제공되는 컨트롤러가 있습니다. 쿠버네티스에서 공식으로 지원하는 Ingress Controller는 AWS Load Balancer Controller와 ingress-gce, ingress-nginx가 있습니다. 

 

  클라우드 환경이 아니기 때문에 ingress-nginx를 설치해 실습을 진행했습니다. 마스터노드 1, 워커노드 2 환경에서 진행했습니다.

 

 

Test

ingress-nginx 설치

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

  ingress-nginx를 설치하면 ingress-nginx Namespace가 생성되고 ingress-nginx-contoller Service가 생성됩니다. Service type은 LoadBalancer로 지정되어있는데 실습 환경이 온프레미스 환경이므로 NodePort로 변경해주었습니다.

 

테스트용 Deployment 명세

nginx-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

 

 

nginx-deploy 노출용 Service 명세

nginx-service.yaml

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

 

ingress 생성 

ingress-nginx-pod.yaml

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

 

  • spec.ingressClassName - 사용할 ingressClass의 이름을 명시 ingress-nginx를 설치하면 nginx IngressClass가 생성됩니다.
  • spec.rules - Ingress에서 사용할 규칙을 명세
  • spec.rules.host - host를 명세, 해당 필드를 작성하지 않으면 Node의 IP가 사용됩니다. host: "*.example.com"의 wildcard도 사용 가능합니다.

클러스터 외부에서 ingress-nginx-controller Service의 NodePort를 사용해서 접속해보면 접속이 잘 되는걸 확인할 수 있습니다.

 

 

Bypass

위에 선언한 Ingress를 kubectl describe ingress <ingress name>명령어로 확인해보면 아래 사진과 같이 나오는데

노란 박스를 보면 Service로 연결된 Pod들의 EndPoints 정보가 모두 들어있는걸 볼 수 있었습니다. 구글링을 좀 해보니 Ingress를 사용하면 Pod의 Service를 거치지 않고 ingress controller에서 직접 Pod IP로 라우팅 된다고 해서 iptraf-np 패키지를 써서 확인을 해보니까 아래와 같이 나오는걸 확인할 수 있었습니다.

 노란색으로 가려진 부분은 Node의 Internal-IP입니다 . NodeIP에서 바로 ingress-controller Pod (10.40.0.2:80)로 갔다가 ingress-controller Pod(10.40.0.2:54964)에서 /video에 할당된 Service가 물고있는 Pod(10.40.0.1:80)로 바로 가는것을 볼 수 있습니다. 

 

아래는 내용 정리 겸 통신 순서를 정리한 그림입니다

 

'DevOps > Kubernetes' 카테고리의 다른 글

Jenkins on Kubernetes 두 번째 글  (0) 2024.01.23
Jenkins on Kubernetes 첫 번째 글  (0) 2024.01.23
Kubernetes/CKA 합격 및 후기  (1) 2024.01.15
Networking/NetworkPolicy  (0) 2024.01.04
Networking/Service  (0) 2023.12.28