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

KubernetesBeginner
지금 연습하기

소개

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

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

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 94%입니다.학습자들로부터 98%의 긍정적인 리뷰율을 받았습니다.

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 네트워킹으로 할 수 있는 일의 시작일 뿐이며, 더 자세히 탐구해 보시기를 권장합니다.