본문 바로가기
서버구축 (WEB,DB)

Minikube(Kubernetes) 클러스터에서 Ingress 리소스 사용

by 날으는물고기 2023. 10. 28.

Minikube(Kubernetes) 클러스터에서 Ingress 리소스 사용

How to Setup NGINX Ingress Controller in Kubernetes

Minikube 클러스터에서 Ingress 리소스를 사용하려면 Ingress 컨트롤러를 설치하고 활성화해야 합니다.

 

아래는 Minikube에서 Nginx Ingress 컨트롤러를 설치하고 활성화하는 단계입니다.

  1. Minikube 시작:
    Minikube 클러스터를 시작하려면 터미널에서 다음 명령어를 실행합니다.
    minikube start
  2. Helm 설치:
    Helm은 Kubernetes 애플리케이션을 패키지화하고 배포하기 위한 도구입니다. Ingress 컨트롤러를 설치하는 데 사용합니다. Helm이 설치되지 않았다면 Helm을 설치하세요.
    Helm 설치 가이드: https://helm.sh/docs/intro/install/
  3. Helm 레포지토리 추가:
    Helm 레포지토리 중에서 Nginx Ingress 컨트롤러를 제공하는 레포지토리를 추가합니다.
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
  4. Helm 차트 업데이트:
    Helm 레포지토리 업데이트를 수행하여 최신 차트 정보를 가져옵니다.
    helm repo update
  5. Nginx Ingress 컨트롤러 설치:
    Helm을 사용하여 Nginx Ingress 컨트롤러를 설치합니다. 다음 명령어를 실행합니다.
    helm install ingress-nginx ingress-nginx/ingress-nginx
    이 명령은 Nginx Ingress 컨트롤러를 설치하고 활성화합니다.
  6. Ingress 컨트롤러 상태 확인:
    Ingress 컨트롤러가 올바르게 설치되었는지 확인하려면 다음 명령어를 사용합니다.
    kubectl get pods -n ingress-nginx
    모든 Ingress 컨트롤러 컨테이너가 실행 중인지 확인하십시오.

이렇게 하면 Ingress 컨트롤러가 Minikube 클러스터에 설치되고 활성화되었습니다.

이제 Ingress 리소스를 사용하여 웹 애플리케이션을 라우팅하고 관리할 수 있습니다.

Kubernetes: Nginx Ingress Controller setup – blog.ichasco.com

Ingress Controller란?
Ingress Controller는 Kubernetes 클러스터 외부에서 들어오는 요청을 관리하고 적절한 컨테이너로 라우팅하는 서비스입니다. 이를 위해 Ingress, LoadBalancer Service (또는 NodePort) 및 Ingress Controller Pod와 같은 여러 구성 요소를 사용합니다. 여러 Ingress Controllers 중에서는 Traefik, Istio, HAproxy 등이 있으며, 여기에서는 Nginx Ingress Controller를 사용합니다.

 

Ingress Controller 설치 및 활성화

  1. LoadBalancer Service 설정: 클라우드 공급자(AWS, GCP, Azure)에서만 사용 가능한 LoadBalancer 서비스를 생성합니다. 필요한 포트 (80 및 443)를 지정하고 선택적으로 NodePort로 대체할 수 있습니다.
  2. Nginx Controller RBAC 설정: Nginx Controller가 제대로 작동하려면 네임스페이스 및 클러스터 수준에서 권한을 부여해야 합니다. 이를 위해 Roles 및 ClusterRoles을 생성하고 이를 ServiceAccount와 바인딩합니다.
  3. Nginx Ingress Controller 설정: Nginx Ingress Controller를 배포합니다. 이를 Deployment로 배포하며, DaemonSet으로도 배포 가능합니다. Controller는 Ingress를 읽고 정의된 로직에 따라 프록시 역할을 수행합니다.
  4. Ingress 정의: 마지막으로 Ingress를 정의하여 도메인 및 경로에 대한 라우팅 규칙을 지정합니다. 이를 통해 요청을 적절한 서비스로 라우팅할 수 있습니다.

 

설치 및 확인
모든 설정을 마치고 나면 다음과 같이 Ingress Controller 및 Ingress를 확인할 수 있습니다:

  • kubectl -n production get ingresses: 정의한 Ingress를 확인합니다.
  • kubectl -n production get svc: LoadBalancer 서비스 및 그 외 서비스를 확인합니다.
  • kubectl -n production get pods: 모든 Pod 상태를 확인합니다.

이제 Ingress Controller가 작동하며, 외부로부터의 요청을 적절하게 관리하고 라우팅합니다. 마지막으로, 공개 IP 주소에 대한 DNS 레코드를 설정하여 외부에서 클러스터에 액세스할 수 있게 됩니다.

 

샘플을 기반으로 Ingress Controller 설정 코드를 설명해보겠습니다.

 

LoadBalancer Service 설정 (92-ingress-service.yaml):

---
kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: production
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: http

이 서비스는 LoadBalancer 유형으로 정의되며, 클라우드 공급자에게 외부로 요청을 노출하도록 지시합니다. 포트 80과 443을 열어 HTTP 및 HTTPS 트래픽을 처리합니다.

 

Nginx Controller RBAC 설정 (90-ingress-rbac.yaml):

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: production
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  # 권한 설정 예시
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  # 다른 권한 설정을 추가할 수 있음
  ...

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: production
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  # 권한 설정 예시
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  # 다른 권한 설정을 추가할 수 있음
  ...

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: production
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: production

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-production-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: production

이 설정은 Nginx Ingress Controller에 필요한 RBAC 권한을 부여합니다. ClusterRoleRole에 권한을 정의하고, ServiceAccount에 연결하여 Pod에 이 권한을 부여합니다. 여기서 예시 권한만 포함되어 있으며 필요한 권한을 추가로 설정할 수 있습니다.

 

Nginx Ingress Controller 설정 (93-ingress-deployment.yaml):

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: production
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
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
          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
            - --force-namespace-isolation
            - --watch-namespace=$(POD_NAMESPACE)
          ...

이 설정은 Nginx Ingress Controller를 배포합니다. 이 컨트롤러는 Ingress 리소스를 읽고 요청을 적절한 서비스로 라우팅합니다. 여기서 사용되는 이미지와 인수 등을 설정할 수 있습니다.

 

Ingress 정의 (91-ingress.yaml):

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: production
spec:
 rules:
 - host: test.info
   http:
     paths:
     - path: /
       backend:
         serviceName: nginx
         servicePort: 80

마지막으로, Ingress를 정의하여 도메인(test.info) 및 경로(/)에 대한 라우팅 규칙을 지정합니다. 이를 통해 요청을 적절한 서비스(nginx)로 라우팅합니다. 필요에 따라 추가 Ingress 정의를 생성하여 다른 경로 또는 도메인에 대한 라우팅 규칙을 추가할 수 있습니다.

 

위 코드를 기반으로 Kubernetes에서 Nginx Ingress Controller를 설정하고 활성화할 수 있습니다.

 

Minikube 대시보드 및 Ingress 설정을 백업하고, 재설치 또는 업그레이드 후 다시 적용하는 방법은 다음과 같이 수행할 수 있습니다.

  1. Minikube 대시보드 백업 및 설정 저장
    Minikube 대시보드 및 Ingress 설정을 백업하려면 관련 리소스의 YAML 파일을 내보내어 저장합니다.
    대시보드의 경우 다음 명령을 사용할 수 있습니다.
    kubectl get deployment/kubernetes-dashboard -n kube-system -o yaml > dashboard-deployment.yaml
    kubectl get service/kubernetes-dashboard -n kube-system -o yaml > dashboard-service.yaml
    Ingress 설정의 경우, Ingress 리소스의 YAML 파일을 내보내고 저장합니다.
    Ingress 리소스를 YAML 파일로 내보내는 명령어는 다음과 같습니다.
    kubectl get ingress <ingress-name> -n <namespace> -o yaml > ingress-resource.yaml
    위 명령어에서 다음을 변경해야 합니다.
     a. <ingress-name> : Ingress 리소스의 이름을 지정합니다.
     b. <namespace> : Ingress 리소스가 속한 네임스페이스를 지정합니다.
    예를 들어, 네임스페이스 "my-namespace"에 있는 "my-ingress" Ingress 리소스를 내보내려면 다음과 같이 명령어를 사용할 수 있습니다.
    kubectl get ingress my-ingress -n my-namespace -o yaml > ingress-resource.yaml
    이렇게 하면 "ingress-resource.yaml" 파일에 Ingress 리소스의 현재 설정이 저장됩니다. 이 파일을 나중에 사용하여 Ingress 리소스를 다시 생성하거나 업데이트할 수 있습니다.
  2. Minikube 업그레이드 또는 재설치
    Minikube를 업그레이드하거나 재설치합니다. 이 단계는 Minikube 버전 업그레이드 또는 클러스터 재설치와 관련됩니다. Minikube의 업그레이드 또는 재설치 방법은 Minikube 문서나 관련 문서를 참조하세요.
  3. Minikube 대시보드 및 Ingress 설정 다시 적용
    업그레이드 또는 재설치 후에는 백업한 대시보드 및 Ingress 설정을 다시 적용할 수 있습니다.
    • 대시보드 설정 다시 적용
      kubectl apply -f dashboard-deployment.yaml -n kube-system
      kubectl apply -f dashboard-service.yaml -n kube-system
    • Ingress 설정 다시 적용 (Ingress 리소스 파일을 사용)
      kubectl apply -f ingress-resource.yaml -n <namespace>
    필요에 따라 Ingress 리소스를 해당 네임스페이스에 적용합니다. Ingress 리소스 파일에는 대상 서비스, 경로 및 기타 설정이 포함됩니다.

이렇게 하면 Minikube 대시보드 및 Ingress 설정을 백업하고 업그레이드 또는 재설치 후 다시 적용할 수 있습니다. 이러한 단계를 통해 클러스터 설정을 유지하면서 업그레이드나 재설치를 수행할 수 있습니다.

 

Kubernetes에서 서비스를 외부로 노출하는 방법으로 NodePort와 Ingress를 간단히 비교해 보겠습니다.

 

NodePort:

  1. NodePort 서비스: NodePort를 사용하면 Kubernetes 클러스터의 각 노드에서 지정된 포트로 서비스에 액세스할 수 있습니다. 즉, 모든 노드에서 서비스에 대한 동일한 포트가 열립니다.
  2. 포트 선택: 서비스를 만들 때 NodePort를 명시적으로 지정할 수 있지만, 이렇게 하지 않으면 Kubernetes가 자동으로 포트를 할당합니다.
  3. Layer 4 (Transport Layer) 레벨: NodePort는 L4 레벨에서 동작하며, HTTP 요청에 대한 경로 기반 라우팅이나 SSL 인증서 관리를 제공하지 않습니다.
  4. 단일 포트: 일반적으로 NodePort는 한 개의 포트만 노출하므로 여러 서비스를 하나의 포트로 노출하기 위해서는 다른 포트를 사용해야 합니다.

Ingress:

  1. Ingress 리소스: Ingress를 사용하면 HTTP 및 HTTPS 트래픽을 라우팅하고 관리할 수 있습니다. Ingress 리소스를 정의하여 경로 기반 라우팅 및 호스트 기반 라우팅을 설정할 수 있습니다.
  2. Host 및 경로 기반 라우팅: Ingress는 호스트 이름 또는 도메인 이름을 기반으로 서비스로 트래픽을 라우팅할 수 있으며, 경로에 따라 다른 서비스로 트래픽을 분배할 수 있습니다.
  3. SSL 인증서 관리: Ingress를 사용하여 HTTPS 트래픽을 관리할 수 있으며, SSL 인증서를 연결하고 관리하여 보안을 제공할 수 있습니다.
  4. Layer 7 (Application Layer) 레벨: Ingress는 L7 레벨에서 동작하므로 HTTP 요청을 분석하고 라우팅 규칙을 적용할 수 있습니다.
  5. 다중 포트 지원: Ingress는 여러 포트를 지원하므로 다른 서비스 및 포트를 다루는 데 유용합니다.

차이점 요약:

  • NodePort는 L4 레벨에서 동작하며 단순한 포트 포워딩을 제공합니다. Ingress는 L7 레벨에서 동작하며 더 복잡한 라우팅 및 관리 기능을 제공합니다.
  • Ingress는 호스트 및 경로 기반 라우팅을 지원하고 SSL 인증서 관리를 제공합니다. NodePort는 이러한 기능을 제공하지 않습니다.
  • NodePort는 포트 단위로 서비스를 노출하고 Ingress는 HTTP 요청에 따라 서비스를 라우팅합니다.
  • Ingress는 다중 포트를 지원하며 다양한 라우팅 규칙을 정의할 수 있습니다.

 

따라서 사용 사례에 따라 NodePort 또는 Ingress를 선택할 수 있으며, 서비스의 복잡성과 요구 사항에 따라 더 적합한 옵션을 선택할 수 있습니다.

 

NGINX를 직접 구성하여 NodePort로 프록시를 설정하는 것은 Ingress를 사용하는 것과 유사한 결과를 얻을 수 있지만 몇 가지 중요한 차이점이 있습니다.

  1. Ingress의 관리 및 추상화:
    • Ingress는 Kubernetes에서 사용하기 위해 설계된 리소스로서 클러스터 관리와 관련된 기능을 제공합니다. Ingress 리소스를 사용하면 Ingress 컨트롤러가 백엔드 서비스 및 프록시 설정을 자동으로 관리합니다.
    • NGINX를 직접 구성하면 Kubernetes에서 관리하는 Ingress 리소스를 사용하지 않으며, NGINX 서버의 설정을 직접 유지 및 업데이트해야 합니다.
  2. 고급 기능 및 유연성:
    • Ingress 컨트롤러와 Ingress 리소스를 사용하면 복잡한 경로 기반 라우팅, 호스트 기반 라우팅, SSL 종단점 관리 등과 같은 고급 기능을 쉽게 구성할 수 있습니다.
    • 직접 NGINX를 구성하면 이러한 기능을 수동으로 설정해야 하며, Kubernetes와의 통합이 제한될 수 있습니다.
  3. 클러스터 환경과의 통합:
    • Ingress는 Kubernetes 클러스터와의 통합을 제공하며, 클러스터의 라우팅 및 관리 요구 사항에 대한 고려 사항을 처리합니다.
    • 직접 NGINX를 구성하는 경우 클러스터 환경과의 통합을 관리해야 하므로 추가 작업이 필요할 수 있습니다.
  4. 설정 및 유지 관리의 복잡성:
    • 직접 NGINX를 구성하면 서버 구성 및 유지 관리에 대한 복잡성이 증가할 수 있습니다. Ingress를 사용하면 Kubernetes의 추상화를 활용하여 관리 작업을 단순화할 수 있습니다.

따라서 Ingress를 사용하는 것이 일반적으로 Kubernetes 환경에서 더 간단하고 효율적인 방법이며, 고급 기능을 더 쉽게 활용할 수 있습니다. 하지만 특정 상황에서 NGINX를 직접 구성하여 NodePort로 프록시를 설정해야 할 수도 있습니다. 선택은 환경 및 요구 사항에 따라 달라집니다.

728x90

댓글