Kubernetes Nginx 인그레스 컨트롤러 생성 및 샘플 애플리케이션에 대한 규칙 생성

13497 단어 kubernetesnode


외부 세계에 노출하려는 애플리케이션을 생성할 때마다 그 뒤에 있는 애플리케이션으로의 흐름을 제어하는 ​​것이 항상 현명합니다. 이것이 Kubernetes에 Kubernetes Ingress라는 것이 있는 이유입니다. 그러나 그것은 무엇입니까?

쿠버네티스 인그레스



Kubernetes Ingress 클러스터 외부에서 클러스터 내의 서비스로 HTTP 및 HTTPS 경로를 노출할 수 있습니다. 그런 다음 트래픽 라우팅은 인그레스 소스에 정의된 규칙에 의해 제어됩니다.

이 기사에서는 자신만의 Nginx Ingress Controller 생성을 시작하는 방법을 설명합니다. 물론 이것이 유일한 가능성은 아닙니다. so feel free to check other ingress controllers such as Istio, HAProxy, Traefik, ...

수신 컨트롤러 사용의 몇 가지 이점:
  • 속도 제한, 시간 초과, ...
  • 인증
  • 콘텐츠 기반 라우팅

  • 샘플 Hello World 애플리케이션



    컨트롤러를 만들기 전에 간단한 데모 애플리케이션 만들기를 시작하겠습니다. 애플리케이션이 수행하는 유일한 작업은 HTTP 요청을 처리하고 몇 초간 기다린 후 "Hello World"응답을 반환하는 것입니다.

    샘플 앱 만들기



    Node.js에서 이 애플리케이션을 만들기로 결정했습니다. 따라서 npmnode가 설치되어 있으면 다음 명령을 실행하십시오.

    npm init -y
    npm i express --save
    


    그런 다음 다음 내용이 포함된 index.js 파일을 만들 수 있습니다.

    const express = require('express')
    const app = express()
    const port = 3000
    
    app.get('/', async (req, res) => {
      console.log('Got request, waiting a bit');
      await delay(10 * 1000);
      res.send('Hello World!')
    })
    
    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
    })
    
    const delay = async (timeout = 1000) => {
      return new Promise((resolve, reject) => setTimeout(resolve, 1000));
    }
    


    용기로 포장



    모든 것이 애플리케이션 코드 측면에서 생성되기 때문에 Dockerfile을 생성하여 모든 것을 Docker 컨테이너로 패키징할 수 있습니다.

    도커파일

    FROM node:latest
    
    WORKDIR /usr/src/app
    
    # Install deps
    RUN apt-get update
    
    # Create Certificate
    RUN apt-get install ca-certificates
    
    # Install Package.json dependendencies
    COPY package.json .
    RUN npm install
    
    # Copy Source Code
    ADD . /usr/src/app
    
    CMD [ "npm", "run", "start" ]
    EXPOSE 3000
    


    다음과 같이 구축할 수 있습니다(사용 사례에 따라 하나 선택).

    # Local build (for local use)
    # Note: when using minikube, make sure to run `eval $(minikube docker-env)` to build images in minikube context
    docker build -t local/node-sample-helloworld .
    
    # Remote build (to push to docker repository)
    docker build -t thebillkidy/node-sample-helloworld .
    docker push thebillkidy/node-sample-helloworld
    


    Kubernetes에서 실행



    빌드가 완료되면 이제 Kubernetes 클러스터에서 실행할 수 있습니다. 이를 위해 배포 YAML 파일을 만듭니다.

    kubernetes.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: d-node-sample-helloworld
    spec:
      selector:
        matchLabels:
          app: node-sample-helloworld
      replicas: 1
      template:
        metadata:
          labels:
            app: node-sample-helloworld
        spec:
          containers:
          - name: main
            image: thebillkidy/node-sample-helloworld:latest # if local, utilize local/node-sample-helloworld
            imagePullPolicy: Always # if local, utilize Never
            ports:
            - containerPort: 3000
    

    kubectl apply -f kubernetes.yaml로 적용할 수 있으며 이제 kubectl get deployments -A를 실행한 후 다음을 표시해야 합니다.

    NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
    d-node-sample-helloworld   1/1     1            1           37s
    


    Kubernetes는 매일 점점 더 인기를 얻고 있으며 그 이유는 당연합니다! 온프레미스 또는 클라우드 내에서 애플리케이션을 실행할 때 애플리케이션을 이식 가능한 방식으로 보유할 가능성이 높습니다! 준비가 되었을 때 애플리케이션을 확장하거나 버스트 시나리오에 대한 마찰을 제거합니다.

    Nginx 인그레스 컨트롤러



    이제 간단한 Hello World 애플리케이션이 실행되지만 내부적으로만 사용할 수 있습니다! 지금 우리가 할 수 있는 것은 Kubernetes와 LoadBalancer를 통해 이를 노출하는 것이지만 여기에서 Ingress Controller를 실제로 활용해 봅시다! 이제 이 인그레스 컨트롤러 생성을 시작하겠습니다.

    설치



    우리가 해야 할 첫 번째 단계는 NGINX 인그레스 컨트롤러를 생성하는 것입니다. 이를 위해 다음 단계를 따를 수 있습니다.

    Note: before the stable/nginx-ingress chart was utilized. But this is now deprecated!



    # ref: https://github.com/kubernetes/ingress-nginx (repo)
    # ref: https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx (chart)
    
    # 1. Create namespace
    kubectl create namespace ingress-nginx
    
    # 2. Add the repository
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    
    # 3. Update the repo
    helm repo update
    
    # 4. Install nginx-ingress through Helm
    helm install ingress-controller ingress-nginx/ingress-nginx --namespace ingress-nginx
    


    위의 내용을 실행하고 나면 이제 외부 IP( kubectl -n ingress-nginx get svc )를 로드하여 수신 컨트롤러에 액세스할 수 있습니다.

    Note: when working with Minikube or others, we can utilize kubectl port-forward svc/ingress-controller-ingress-nginx-controller --namespace ingress-nginx --address 0.0.0.0 8000:80 and access it on http://localhost:8000



    이제 애플리케이션을 노출할 준비가 되었습니다!

    애플리케이션 노출



    인그레스 컨트롤러가 생성되면 애플리케이션을 내부적으로 노출해야 합니다.

    kubectl expose deployment d-node-sample-helloworld --name svc-node-sample-helloworld
    


    Kubernetes Ingress API에 정의된 대로 트래픽을 라우팅하도록 인그레스 컨트롤러를 구성합니다. YAML 파일 생성:

    수신-노드-샘플-helloworld.yaml

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-node-sample-helloworld
      annotations:
        # Target URI where the traffic must be redirected
        # More info: https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md
        nginx.ingress.kubernetes.io/rewrite-target: /
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
        # Uncomment the below to only allow traffic from this domain and route based on it
        # - host: my-host # your domain name with A record pointing to the nginx-ingress-controller IP
        - http:
            paths:
            - path: / # Everything on this path will be redirected to the rewrite-target
              backend:
                serviceName: svc-node-sample-helloworld # the exposed svc name and port
                servicePort: 3000
    


    응모하는 것kubectl apply -f ingress-node-sample-helloworld.yaml
    이제 이것이 적용되면 cURL 요청을 실행하여 애플리케이션에 액세스할 수 있어야 합니다! 그래서 이것을 시도해 봅시다:

    # Execute a GET request with the specified host and IP
    # Note: the Host should match what is written in spec.rules.host
    curl -k -X "GET" -H "Host: my-host" http://YOUR_IP
    


    또는 브라우저에서 열어 http://YOUR_IP으로 이동할 수도 있습니다.

    Note: If this is not working, check kubectl describe ing and make sure that the configuration is correct



    결론



    이 기사에서는 Kubernetes용 인그레스 컨트롤러를 설정하는 방법에 대한 데모를 만들었습니다. 이것은 물론 속도 제한 또는 모니터링과 같은 더 많은 작업을 수행하려는 전체 사용 사례 체인의 작은 단계입니다.

    Prometheus를 통해 방금 설정한 것을 모니터링하고 Grafana에서 모든 것을 시각화할 수 있는 방법에 대해 자세히 설명합니다.

    Note: feel free to check the original post at my blog https://xaviergeerinck.com

    좋은 웹페이지 즐겨찾기