Minikube 클러스터에서 Ingress 리소스를 사용하려면 Ingress 컨트롤러를 설치하고 활성화해야 합니다.
아래는 Minikube에서 Nginx Ingress 컨트롤러를 설치하고 활성화하는 단계입니다.
- Minikube 시작:
Minikube 클러스터를 시작하려면 터미널에서 다음 명령어를 실행합니다.minikube start
- Helm 설치:
Helm은 Kubernetes 애플리케이션을 패키지화하고 배포하기 위한 도구입니다. Ingress 컨트롤러를 설치하는 데 사용합니다. Helm이 설치되지 않았다면 Helm을 설치하세요.
Helm 설치 가이드: https://helm.sh/docs/intro/install/ - Helm 레포지토리 추가:
Helm 레포지토리 중에서 Nginx Ingress 컨트롤러를 제공하는 레포지토리를 추가합니다.helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
- Helm 차트 업데이트:
Helm 레포지토리 업데이트를 수행하여 최신 차트 정보를 가져옵니다.helm repo update
- Nginx Ingress 컨트롤러 설치:
Helm을 사용하여 Nginx Ingress 컨트롤러를 설치합니다. 다음 명령어를 실행합니다.
이 명령은 Nginx Ingress 컨트롤러를 설치하고 활성화합니다.helm install ingress-nginx ingress-nginx/ingress-nginx
- Ingress 컨트롤러 상태 확인:
Ingress 컨트롤러가 올바르게 설치되었는지 확인하려면 다음 명령어를 사용합니다.
모든 Ingress 컨트롤러 컨테이너가 실행 중인지 확인하십시오.kubectl get pods -n ingress-nginx
이렇게 하면 Ingress 컨트롤러가 Minikube 클러스터에 설치되고 활성화되었습니다.
이제 Ingress 리소스를 사용하여 웹 애플리케이션을 라우팅하고 관리할 수 있습니다.
Ingress Controller란?
Ingress Controller는 Kubernetes 클러스터 외부에서 들어오는 요청을 관리하고 적절한 컨테이너로 라우팅하는 서비스입니다. 이를 위해 Ingress, LoadBalancer Service (또는 NodePort) 및 Ingress Controller Pod와 같은 여러 구성 요소를 사용합니다. 여러 Ingress Controllers 중에서는 Traefik, Istio, HAproxy 등이 있으며, 여기에서는 Nginx Ingress Controller를 사용합니다.
Ingress Controller 설치 및 활성화
- LoadBalancer Service 설정: 클라우드 공급자(AWS, GCP, Azure)에서만 사용 가능한 LoadBalancer 서비스를 생성합니다. 필요한 포트 (80 및 443)를 지정하고 선택적으로 NodePort로 대체할 수 있습니다.
- Nginx Controller RBAC 설정: Nginx Controller가 제대로 작동하려면 네임스페이스 및 클러스터 수준에서 권한을 부여해야 합니다. 이를 위해 Roles 및 ClusterRoles을 생성하고 이를 ServiceAccount와 바인딩합니다.
- Nginx Ingress Controller 설정: Nginx Ingress Controller를 배포합니다. 이를 Deployment로 배포하며, DaemonSet으로도 배포 가능합니다. Controller는 Ingress를 읽고 정의된 로직에 따라 프록시 역할을 수행합니다.
- 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 권한을 부여합니다. ClusterRole
및 Role
에 권한을 정의하고, 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 설정을 백업하고, 재설치 또는 업그레이드 후 다시 적용하는 방법은 다음과 같이 수행할 수 있습니다.
- Minikube 대시보드 백업 및 설정 저장
Minikube 대시보드 및 Ingress 설정을 백업하려면 관련 리소스의 YAML 파일을 내보내어 저장합니다.
대시보드의 경우 다음 명령을 사용할 수 있습니다.
Ingress 설정의 경우, 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 리소스를 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 리소스를 내보내려면 다음과 같이 명령어를 사용할 수 있습니다.
이렇게 하면 "ingress-resource.yaml" 파일에 Ingress 리소스의 현재 설정이 저장됩니다. 이 파일을 나중에 사용하여 Ingress 리소스를 다시 생성하거나 업데이트할 수 있습니다.kubectl get ingress my-ingress -n my-namespace -o yaml > ingress-resource.yaml
- Minikube 업그레이드 또는 재설치
Minikube를 업그레이드하거나 재설치합니다. 이 단계는 Minikube 버전 업그레이드 또는 클러스터 재설치와 관련됩니다. Minikube의 업그레이드 또는 재설치 방법은 Minikube 문서나 관련 문서를 참조하세요. - 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>
- 대시보드 설정 다시 적용
이렇게 하면 Minikube 대시보드 및 Ingress 설정을 백업하고 업그레이드 또는 재설치 후 다시 적용할 수 있습니다. 이러한 단계를 통해 클러스터 설정을 유지하면서 업그레이드나 재설치를 수행할 수 있습니다.
Kubernetes에서 서비스를 외부로 노출하는 방법으로 NodePort와 Ingress를 간단히 비교해 보겠습니다.
NodePort:
- NodePort 서비스: NodePort를 사용하면 Kubernetes 클러스터의 각 노드에서 지정된 포트로 서비스에 액세스할 수 있습니다. 즉, 모든 노드에서 서비스에 대한 동일한 포트가 열립니다.
- 포트 선택: 서비스를 만들 때 NodePort를 명시적으로 지정할 수 있지만, 이렇게 하지 않으면 Kubernetes가 자동으로 포트를 할당합니다.
- Layer 4 (Transport Layer) 레벨: NodePort는 L4 레벨에서 동작하며, HTTP 요청에 대한 경로 기반 라우팅이나 SSL 인증서 관리를 제공하지 않습니다.
- 단일 포트: 일반적으로 NodePort는 한 개의 포트만 노출하므로 여러 서비스를 하나의 포트로 노출하기 위해서는 다른 포트를 사용해야 합니다.
Ingress:
- Ingress 리소스: Ingress를 사용하면 HTTP 및 HTTPS 트래픽을 라우팅하고 관리할 수 있습니다. Ingress 리소스를 정의하여 경로 기반 라우팅 및 호스트 기반 라우팅을 설정할 수 있습니다.
- Host 및 경로 기반 라우팅: Ingress는 호스트 이름 또는 도메인 이름을 기반으로 서비스로 트래픽을 라우팅할 수 있으며, 경로에 따라 다른 서비스로 트래픽을 분배할 수 있습니다.
- SSL 인증서 관리: Ingress를 사용하여 HTTPS 트래픽을 관리할 수 있으며, SSL 인증서를 연결하고 관리하여 보안을 제공할 수 있습니다.
- Layer 7 (Application Layer) 레벨: Ingress는 L7 레벨에서 동작하므로 HTTP 요청을 분석하고 라우팅 규칙을 적용할 수 있습니다.
- 다중 포트 지원: Ingress는 여러 포트를 지원하므로 다른 서비스 및 포트를 다루는 데 유용합니다.
차이점 요약:
- NodePort는 L4 레벨에서 동작하며 단순한 포트 포워딩을 제공합니다. Ingress는 L7 레벨에서 동작하며 더 복잡한 라우팅 및 관리 기능을 제공합니다.
- Ingress는 호스트 및 경로 기반 라우팅을 지원하고 SSL 인증서 관리를 제공합니다. NodePort는 이러한 기능을 제공하지 않습니다.
- NodePort는 포트 단위로 서비스를 노출하고 Ingress는 HTTP 요청에 따라 서비스를 라우팅합니다.
- Ingress는 다중 포트를 지원하며 다양한 라우팅 규칙을 정의할 수 있습니다.
따라서 사용 사례에 따라 NodePort 또는 Ingress를 선택할 수 있으며, 서비스의 복잡성과 요구 사항에 따라 더 적합한 옵션을 선택할 수 있습니다.
NGINX를 직접 구성하여 NodePort로 프록시를 설정하는 것은 Ingress를 사용하는 것과 유사한 결과를 얻을 수 있지만 몇 가지 중요한 차이점이 있습니다.
- Ingress의 관리 및 추상화:
- Ingress는 Kubernetes에서 사용하기 위해 설계된 리소스로서 클러스터 관리와 관련된 기능을 제공합니다. Ingress 리소스를 사용하면 Ingress 컨트롤러가 백엔드 서비스 및 프록시 설정을 자동으로 관리합니다.
- NGINX를 직접 구성하면 Kubernetes에서 관리하는 Ingress 리소스를 사용하지 않으며, NGINX 서버의 설정을 직접 유지 및 업데이트해야 합니다.
- 고급 기능 및 유연성:
- Ingress 컨트롤러와 Ingress 리소스를 사용하면 복잡한 경로 기반 라우팅, 호스트 기반 라우팅, SSL 종단점 관리 등과 같은 고급 기능을 쉽게 구성할 수 있습니다.
- 직접 NGINX를 구성하면 이러한 기능을 수동으로 설정해야 하며, Kubernetes와의 통합이 제한될 수 있습니다.
- 클러스터 환경과의 통합:
- Ingress는 Kubernetes 클러스터와의 통합을 제공하며, 클러스터의 라우팅 및 관리 요구 사항에 대한 고려 사항을 처리합니다.
- 직접 NGINX를 구성하는 경우 클러스터 환경과의 통합을 관리해야 하므로 추가 작업이 필요할 수 있습니다.
- 설정 및 유지 관리의 복잡성:
- 직접 NGINX를 구성하면 서버 구성 및 유지 관리에 대한 복잡성이 증가할 수 있습니다. Ingress를 사용하면 Kubernetes의 추상화를 활용하여 관리 작업을 단순화할 수 있습니다.
따라서 Ingress를 사용하는 것이 일반적으로 Kubernetes 환경에서 더 간단하고 효율적인 방법이며, 고급 기능을 더 쉽게 활용할 수 있습니다. 하지만 특정 상황에서 NGINX를 직접 구성하여 NodePort로 프록시를 설정해야 할 수도 있습니다. 선택은 환경 및 요구 사항에 따라 달라집니다.
댓글