해당 문서의 쿠버네티스 버전: v1.28
Kubernetes v1.28 문서는 더 이상 적극적으로 관리되지 않음. 현재 보고있는 문서는 정적 스냅샷임. 최신 문서를 위해서는, 다음을 참고. 최신 버전.
NGINX 인그레스(Ingress) 컨트롤러로 Minikube에서 인그레스 설정하기
인그레스는 클러스터의 서비스에 대한 외부 액세스를 허용하는 규칙을 정의하는 API 객체이다. 인그레스 컨트롤러는 인그레스에 설정된 규칙을 이행한다.
이 페이지에서는 HTTP URI에 따라 요청을 Service web 또는 web2로 라우팅하는 간단한 인그레스를 설정하는 방법을 보여준다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: 1.19. 버전 확인을 위해서, 다음 커맨드를 실행kubectl version
.
만약 이보다 더 이전 버전의 쿠버네티스를 사용하고 있다면,
해당 쿠버네티스 버전의 문서를 참고한다.
Minikube 클러스터 생성하기
- Katacoda 활용하기
- 로컬에서 생성하기
- 이미 로컬에 Minikube를 설치했다면,
minikube start
를 실행하여 클러스터를 생성한다.
인그레스 컨트롤러 활성화
-
NGINX 인그레스 컨트롤러를 활성화하기 위해 다음 명령을 실행한다.
minikube addons enable ingress
-
NGINX 인그레스 컨트롤러가 실행 중인지 확인한다.
kubectl get pods -n ingress-nginx
참고: 파드가 정상적으로 실행되기까지 1분 정도 소요될 수 있다.결과는 다음과 같다.
NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
kubectl get pods -n kube-system
참고: 파드가 정상적으로 실행되기까지 1분 정도 소요될 수 있다.결과는 다음과 같다.
NAME READY STATUS RESTARTS AGE default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m kube-addon-manager-minikube 1/1 Running 0 3m kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m storage-provisioner 1/1 Running 0 2m
nginx-ingress-controller-
로 시작하는 파드가 있는지 확인한다.
hello, world 앱 배포하기
-
다음 명령을 사용하여 디플로이먼트(Deployment)를 생성한다.
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
결과는 다음과 같다.
deployment.apps/web created
-
디플로이먼트를 노출시킨다.
kubectl expose deployment web --type=NodePort --port=8080
결과는 다음과 같다.
service/web exposed
-
서비스(Service)가 생성되고 노드 포트에서 사용할 수 있는지 확인한다.
kubectl get service web
결과는 다음과 같다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
-
노드포트(NodePort)를 통해 서비스에 접속한다.
minikube service web --url
결과는 다음과 같다.
http://172.17.0.15:31637
참고: Katacoda 환경만 해당: 터미널 패널 상단에서 더하기 기호를 클릭한 다음 Select port to view on Host 1을 클릭한다. 노드포트(이 경우 '31637')를 입력한 다음 Display Port를 클릭한다.결과는 다음과 같다.
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
이제 Minikube IP 주소와 노드포트를 통해 샘플 앱에 액세스할 수 있다. 다음 단계에서는 인그레스 리소스를 사용하여 앱에 액세스할 수 있다.
인그레스 생성하기
다음 매니페스트는 hello-world.info를 통해 서비스로 트래픽을 보내는 인그레스를 정의한다.
- 다음 파일을 통해
example-ingress.yaml
을 만든다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080
-
다음 명령어를 실행하여 인그레스 오브젝트를 생성한다.
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
결과는 다음과 같다.
ingress.networking.k8s.io/example-ingress created
-
IP 주소가 설정되었는지 확인한다.
kubectl get ingress
참고: 이 작업은 몇 분 정도 소요될 수 있다.
다음 예시와 같이, ADDRESS 열에서 IPv4 주소를 확인할 수 있다.
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress <none> hello-world.info 172.17.0.15 80 38s
-
호스트 컴퓨터의
/etc/hosts
파일 맨 아래에 다음 행을 추가한다 (관리자 권한 필요).172.17.0.15 hello-world.info
참고: Minikube를 로컬에서 실행하는 경우 'minikube ip'를 사용하여 외부 IP를 가져온다. 인그레스 목록에 표시되는 IP 주소는 내부 IP가 된다.이렇게 하면, 웹 브라우저가 hello-world.info URL에 대한 요청을 Minikube로 전송한다.
-
인그레스 컨트롤러가 트래픽을 전달하는지 확인한다.
curl hello-world.info
결과는 다음과 같다.
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
참고: Minikube를 로컬에서 실행하는 경우 브라우저에서 hello-world.info에 접속할 수 있다.
두 번째 디플로이먼트 생성하기
-
다음 명령을 사용하여 두 번째 디플로이먼트를 생성한다.
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
결과는 다음과 같다.
deployment.apps/web2 created
-
두 번째 디플로이먼트를 노출시킨다.
kubectl expose deployment web2 --port=8080 --type=NodePort
결과는 다음과 같다.
service/web2 exposed
기존 인그레스 수정하기
-
기존
example-ingress.yaml
매니페스트를 편집하고, 하단에 다음 줄을 추가한다.- path: /v2 pathType: Prefix backend: service: name: web2 port: number: 8080
-
변경 사항을 적용한다.
kubectl apply -f example-ingress.yaml
결과는 다음과 같다.
ingress.networking/example-ingress configured
인그레스 테스트하기
-
Hello World 앱의 첫 번째 버전에 액세스한다.
curl hello-world.info
결과는 다음과 같다.
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
-
Hello World 앱의 두 번째 버전에 액세스한다.
curl hello-world.info/v2
결과는 다음과 같다.
Hello, world! Version: 2.0.0 Hostname: web2-75cd47646f-t8cjk
참고: Minikube를 로컬에서 실행하는 경우 브라우저에서 hello-world.info 및 hello-world.info/v2에 접속할 수 있다.