Kubernetes 에서 Ingress 를 사용한 네트워킹

KubernetesBeginner
지금 연습하기

소개

이 랩에서는 Kubernetes 클러스터에서 실행 중인 서비스로 외부 트래픽을 라우팅하기 위해 Ingress 를 사용하는 방법을 배우게 됩니다.

Kubernetes Ingress 는 Kubernetes 클러스터에서 서비스에 대한 외부 액세스를 관리하기 위한 강력한 도구입니다. Ingress 는 레이어 7 로드 밸런서 (load balancer) 역할을 하며, 들어오는 URL 경로 또는 호스트 이름을 기반으로 트래픽을 다른 서비스로 라우팅할 수 있도록 합니다.

이 랩에서는 샘플 애플리케이션을 생성하고 Ingress 를 사용하여 외부 세계에 노출시킬 것입니다. Kubernetes Ingress 에 대한 인기 있고 널리 사용되는 솔루션인 nginx-ingress를 Ingress 컨트롤러 (controller) 로 사용할 것입니다.

Minikube 클러스터 시작

리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다.

    cd /home/labex/project
    
  2. Minikube 시작:

    Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다.

    minikube start
    
    • 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다.

    minikube status
    
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

Nginx Ingress Controller 설치

먼저, 클러스터에 nginx-ingress 컨트롤러를 설치해야 합니다. Ingress 컨트롤러를 실행하는 데 사용될 Deployment 와 Service 를 생성하여 이를 수행할 수 있습니다.

Ingress 컨트롤러를 위한 네임스페이스 (namespace) 를 생성합니다.

kubectl create namespace ingress-nginx

kubectl을 사용하여 ingress-nginx 차트 (chart) 를 설치합니다.

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

ingress-nginx 컨트롤러 파드 (pod) 가 실행 중인지 확인합니다.

kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS              RESTARTS   AGE
ingress-nginx-admission-create-zjfqx        0/1     ContainerCreating   0          2s
ingress-nginx-admission-patch-8rvzw         0/1     ContainerCreating   0          2s
ingress-nginx-controller-6bdb654777-qz8fb   0/1     ContainerCreating   0          2s

샘플 애플리케이션 생성

다음으로, Ingress 를 사용하여 노출할 샘플 애플리케이션을 생성합니다.

샘플 애플리케이션을 위한 Deployment 를 생성합니다.

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

sample-app.yaml이라는 YAML 파일입니다. 다음 명령을 사용하여 Deployment 를 클러스터에 적용합니다.

kubectl apply -f sample-app.yaml

샘플 애플리케이션을 위한 Service 를 생성합니다.

apiVersion: v1
kind: Service
metadata:
  name: sample-app
spec:
  selector:
    app: sample-app
  ports:
  - name: http
    port: 80
    targetPort: 80

service-sample-app.yaml이라는 YAML 파일입니다. 다음 명령을 사용하여 Deployment 를 클러스터에 적용합니다.

kubectl apply -f service-sample-app.yaml

Ingress 리소스 생성

이제 Ingress 컨트롤러가 설정되었고 백엔드 서비스가 실행 중이므로 Ingress 리소스에 대한 규칙을 생성할 수 있습니다.

이 예제에서는 test.local 도메인에 대한 트래픽을 백엔드 서비스로 라우팅하는 간단한 규칙을 생성합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: test.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sample-app
            port:
              name: http

ingress.yaml이라는 YAML 파일입니다. Ingress 리소스를 클러스터에 적용합니다.

kubectl apply -f ingress.yaml

Ingress 리소스 테스트

마지막으로, Ingress 리소스가 올바르게 작동하는지 확인하기 위해 테스트할 수 있습니다.

먼저, 노드의 IP 주소를 확인합니다.

kubectl get node -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
minikube   Ready    control-plane   93s   v1.26.1   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   5.15.0-56-generic   docker://20.10.23

이 명령은 Kubernetes 노드 주소를 가져오며, INTERNAL-IP로 레이블된 IP 주소를 확인합니다.

다음으로, /etc/hosts 파일에 test.local 도메인을 노드의 IP 주소에 매핑하는 항목을 추가합니다.

echo "<IP_ADDRESS> test.local" | sudo tee -a /etc/hosts

<IP_ADDRESS>를 노드 주소의 내부 IP 주소로 바꿉니다. 예를 들어:

echo "192.168.49.2 test.local" | sudo tee -a /etc/hosts

그런 다음, ingress-nginx에 대한 서비스 NodePort 를 가져옵니다.

kubectl get services -n ingress-nginx

이 명령은 ingress-nginx 네임스페이스의 서비스 목록을 표시합니다. nginx-ingress-controller 서비스를 찾고 해당 NodePort를 기록해 둡니다.

NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.104.99.158   <pending>     80:32518/TCP,443:31620/TCP   2m45s
ingress-nginx-controller-admission   ClusterIP      10.100.46.109   <none>        443/TCP                      2m45s

마지막으로, curl을 사용하여 Ingress 엔드포인트에 HTTP 요청을 보냅니다.

curl test.local:NodePort

예를 들어:

curl test.local:32518

<NodePort>nginx-ingress-controller 서비스의 NodePort로 바꿉니다.

모든 것이 올바르게 설정되었다면 Nginx 환영 페이지가 표시되어야 합니다.

웹 브라우저를 사용하여 test.local:<NodePort>/nginx를 방문하여 Ingress 를 테스트할 수도 있습니다.

축하합니다. Kubernetes 에서 Ingress 리소스를 성공적으로 설정하고 올바르게 작동하는지 테스트했습니다.

요약

이 랩에서는 Kubernetes 에서 Nginx Ingress 컨트롤러를 설정하고 구성하는 과정을 살펴보았습니다. 또한 샘플 애플리케이션을 생성하고 Ingress 를 사용하여 외부 트래픽을 Nginx 서비스로 라우팅했습니다. 이는 Kubernetes 네트워킹으로 할 수 있는 일의 시작일 뿐이며, 더 자세히 탐구해 보시기를 권장합니다.