본문 바로가기

가상화/Kubernetes

[kubernetes] 인그레스(Ingress)를 사용하여 HTTP(S) 부하 분산기 구성 #1 - HTTP 부하 분산

반응형

개요

 NGINX Ingress 컨트롤러는 NGINX를 사용하여 Kubernetes 클러스터의 HTTP 서비스에 대한 외부 액세스를 관리하는 Ingress 컨트롤러입니다. kubernetes에서 서비스를 생성하면 -service-node-port-range(default 30000~32767) 범위내에서 서비스에 포트를 할당하게 된다. 이 경우 웹서비스에 접근하기 위해서는 http://{IP}:{NodePort} 형태로 실제로 서비스하기에는 부적접한 url 입니다.  NGINX Ingress를 사용하여 일반적인 http://www.doman.com형태로 서비스하는 방법에 대해 알아 보도록 하겠습니다. 

구성환경

minikube v1.9.0, kubectl v1.18.0, CentOS 7.6

[그림] 테스트 구성

참고 문서 : https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

 

1. ingress controller 설치

 - 설치

shell> minikube addons enable ingress
* The 'ingress' addon is enabled
shell> 

 - 확인

shell> kubectl get pod -n kube-system
NAME                                              READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-c2mf6                    1/1     Running   14                   9d
coredns-66bff467f8-gsmpt                    1/1     Running   14                  9d
etcd-testsvr                                           1/1     Running   13                  9d
kube-apiserver-testsvr                          1/1     Running   13                  9d
kube-controller-manager-testsvr           1/1     Running   13                  9d
kube-proxy-4k244                                 1/1     Running   14                  9d
kube-scheduler-testsvr                          1/1     Running   14                 9d
metrics-server-7bc6d75975-t5shr         1/1     Running   6                   5d2h
nginx-ingress-controller-6d57c87cb9-4xb88   1/1     Running   0          7s
storage-provisioner                                1/1     Running   25                 9d
[root@testsvr mysql]#

2. 앱 배포

 2.1 첫번째 hello,World 배포

shell> kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080
pod/web created
shell> kubectl expose pod web --target-port=8080 
service/web exposed 
shell>

 2.2 두번째 hello,World 앱 배포

shell> kubectl run web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080 
pod/web created 
shell> kubectl expose pod web2 --target-port=8080  
service/web2 exposed  
shell>

 2.3  Pod 및 서비스 확인

shell> kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          5m20s
web2   1/1     Running   0          5m13s
shell> kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1                                     443/TCP    9d
web              ClusterIP   10.105.13.154                            8080/TCP   3m33s
web2            ClusterIP   10.105.146.106                          8080/TCP   3m36s
shell>

3. Ingress resource 생성

 3.1 example-ingress.yaml 파일

apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 8080
      - path: /v2/*
        backend:
          serviceName: web2
          servicePort: 8080

* dns 서버를 운영중이라면 host: 필드에 자신의 dns 주소로 변경하여도 된다. 여기서는 dns 대신 /etc/hosts 파일을 사용하였다.

3.2 ingress resource 생성

shell> kubectl apply -f example-ingress.yaml
ingress.networking.k8s.io/example-ingress created
shell>

 3.3 /etc/hosts 파일에 hello-world.info ip 추가

192.168.0.167     hello-world.info

 3.4 ingress의 ADDRESS IP가 정상적으로 설정되었는지 확인

shell> kubectl get ingress
NAME              CLASS    HOSTS              ADDRESS         PORTS   AGE
example-ingress      hello-world.info   192.168.0.167   80      15m
shell>

* ADDRESS 부분은 환경에 따라 결과값이 표시되는데 1~2분 정도 걸릴수 있다.

4. 테스트

 4.1 첫번째 웹에 접속

shell> curl hello-world.info/
Hello, world!
Version: 1.0.0
Hostname: web
shell>

 4.2 두번째 웹에 접속

shell> curl hello-world.info/v2/
Hello, world!
Version: 2.0.0
Hostname: web2
shell>

위와 같은 결과가 나온다면 당신은 성공한 것이다.

다음시간에는 HTTPS 트래픽에 대한 로드 분산기를 구성하는 방법에 대해서 알아 보도록 하자.

반응형