티스토리 뷰

728x90
반응형

본 포스팅에서는 Kubernetes Ingress & Ingress Controller에 대해 살펴보겠습니다.

Kubernetes의 Ingress는 클라우드 환경으로 진입하는 Endpoint를 의미하며, 확장되는 유동성있는 환경에서 클라이언트가 접근하는 단일 접점의 역할을 수행하기도 합니다.

일반적인 Kubernetes의 내부에서는 Ingress → Service → Pod 순으로 처리 프로세스를 갖고 있으며, Ingress는 단일 접점과 서비스 라우팅, Service는 Pod 로드 밸런싱, Pod는 비즈니스 로직을 처리하는 역할을 수행한다고 볼 수 있습니다.

(물론 그 밖에도 다양한 기능이 포함되어 있습니다.)

본 포스팅에 앞서 앞선 Kubernetes 포스팅을 참고하고자 할 경우 다음을 참조하시기 바랍니다.

 

[Container Management] Kubernetes Master Node 설치

[Container Management] Kubernetes Dashboard Install & Setting

[Container Management] Kubernetes Woker Node Install & Setting

[Container Management] Kubernetes Pod 생성 가이드

[Container Management] Kubernetes Service 생성 가이드

[Container Management] Kubernetes 애플리케이션 관리

Kubernetes의 클라이언트 요청 처리 방식

앞선 포스팅 중 Dashboard 접근 방식에서도 잠시 다루었지만 Client가 서비스를 호출하기 위해서는 NodePort를 사용하거나, LoadBalancer를 사용하거나, API Server를 통해 접근하는 방식을 사용할 수 있다고 이야기했습니다.

Kubernetes의 클라이언트 요청을 처리하는 방식은 다양하며, 저희가 다룰 Ingress 역시 그 중 한가지 방식입니다.

- NodePort : NodePort는 Pod 내부에 진입하기 위한 Port를 서비스에 설정하여 대표하는 Port입니다. 해당 Port는 유동적이며, 30000대 Port로 할당되어 기억하기 어렵습니다. 다만 빠르게 구성하고 테스트 용도로 한/두번 사용하고 제거하는 용도로는 적합합니다.

- LoadBalancer : 앞단에 3rd party 로드 밸런서를 구성하는 것입니다. 대표적으로 WEBServer, CSP 3사의 로드밸런서 등이 있으며, 이를 적절히 사용할 경우 DMZ와 폐쇄망을 나눠 구성하기에 용이합니다. 다만 관리포인트가 늘어나고 비용이 발생할 수 있습니다.

- Ingress : Ingress는 Kubernetes Service와 완전 독립적인 구성으로 이루어져 있으며, 다양한 오픈소스를 제공합니다. 이를 통해 요청을 통합관리하고, 라우팅하며, 메트릭을 수집할 수 있습니다. 다만 설정이 길어질 수 있고 관리하기 어려워 이 때문에 상용 솔루션을 선정하는 경우도 있습니다.

자 지금부터는 이러한 장, 단점이 있는 Ingress 구성에 대해 본격적으로 다뤄보도록 하겠습니다.

Kubernetes의 Ingress 구성

1. Ingress Controller (Nginx-Ingress) 설치

먼저 설치할 요소는 Ingress-Nginx(Ingress Controller)입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: 192.168.56.107:13000/kdash/k8s/kubernetes-ingress-controller/nginx-ingress-controller:0.23.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
            #- --default-backend-service=default/default-http-backend
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 33
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10

위와 같이 Ingress Controller는 Ingress를 통해 정의해둔 룰들을 실제로 동작하게 해주는 역할을 수행합니다.

2. Ingress 설치

Kubernetes의 Ingress는 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할 것인지 룰을 정의합니다.

ExternalIPs를 정의하거나 Domain Host를 정의할 수 있고, 로드밸런싱 및 SSL 인증서 적용 등을 수행할 수 있습니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: test.nrson.go.kr
    http:
      paths:
      - path: /
        backend:
          serviceName: apache-docker-service
          servicePort: 80

실제로 Ingress는 어떻게 요청을 받아 처리할 것인지에 대한 설정 정보를 담고 있는 역할이며, 이를 실제로 라우팅하는 것은 Ingress Controller에서 수행합니다.

 

이번 포스팅에서는 간단히 여기까지만 알아보고 다음 포스팅에 전체적인 구성 및 OneStepBoot 방법에 대해 살펴보도록 하겠습니다.

기존에 구성한 다양한 Kubernetes Component를 기반으로 Sample Application을 디플로이 하기 위한 손쉬운 방법들을 살펴보도록 하겠습니다.

728x90
반응형