Ingress 컨트롤러
Ingress 컨트롤러는 NodePort, LoadBalancer 서비스 타입처럼 서비스를 외부에 노출시키는 방법 중 하나이다. NodePort, LoadBalancer와 다른점은, NodePort, LoadBalancer는 Layer 4 (UPT/TCP) 에서 작동하는 반면, Ingress 는 Layer 7 (HTTP/HTTPS) 에서 로드밸런싱을 제공한다는 점이다.
Ingress 컨트롤러는 요청이 왔을 때, 어플리케이션이 사용하는 프로토콜(HTTP/HTTPS) , 서버 주소, 어플리케이션이 구체적으로 접근하고자 하는 리소스의 경로를 보고 특정한 어플리케이션에 요청을 전달해주게 된다. Layer 4 이하의 헤더의 정보들만으로는 이러한 트래픽 요청 사항을 처리할 수 없어서 Layer 7 수준까지의 정보가 필요한 것이며 이를 바탕으로 요청을 처리해주는 것이 Ingress 컨트롤러인 것이다. Ingress라는 단어 그자체는 '들어오는 요청 (트래픽)' 이라는 의미를 가지고 있다.
하나의 서버에서 여러개의 웹서버를 제공하는 경우에 Ingress 컨트롤러로 요청을 처리할 수 있다. 예를 들어서, www.minjee.com 이라는 도메인 주소가 메인 웹페이지이고, www.minjee.com/mypage 는 회원정보 수정 서비스를 제공하는 웹페이지, www.minjee.com/email 는 이메일 서비스를 제공하는 웹페이지라고 할 때 인그레스 컨트롤러는 접근하고자 하는 리소스 경로인 /mypage, /email 를 보고 각각 다른 서비스를 제공해 줄 수 있다.
또한 하나의 서버라고 하더라도 실제 물리적으로 서버의 위치가 다를 수 있는데, 이러한 경우에도 클라이언트의 요청에 따라 서버의 주소 및 경로를 보고, 어떤 어플리케이션쪽으로 요청을 전달해 줄지 인그레스 컨트롤러가 처리해준다.
NodePort와 LoadBalancer의 한계
NodePort의 구성방법은 간단하다. 외부로 노출되는 포트를 제공하여 서비스로 접근할 수 있도록 제공한다. 하지만 이 포트 번호가 30000번대로 사용자에게 불편할 것이며, 포트 넘버가 노출되는 것은 보안상 좋지 않다. 또한 각 서비스를 외부에 노출시킬 때마다 포트 넘버를 새롭게 할당해야 하며, 이 포트 넘버들을 관리하는 것 또한 번거롭다.
LoadBalancer는 LoadBalancer를 작동시키는 비용이 크다. 외부 LoadBalancer 가 각 서비스마다 요구 사항에 맞게 할당, 배치, 배포 해서 서비스를 사용할 수 있도록 시스템을 구축하는 비용이 드는 점이 단점이다.
아래의 서비스의 종류 참고..
https://sinclairstudio.tistory.com/435
Ingress Controller 구성 파일
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: testapp-ing
spec:
defaultBackend: # rules에 매칭되지 않는 트래픽은 디폴트 벡엔드로 전송됨
service:
name: testapp-svc-np
port: # 라우팅할 기본 벡엔드 서비스의 포트
number: 80
rules: # 라우팅 규칙
- host: testapp.test.com # URL host (FQDN 주소)
http:
paths:
- path: / # URL 경로
pathType: Prefix # URL 경로 유형 '/'를 기준으로 일치시킨다. testapp.test.com/ ~
backend: # 라우팅할 벡인드 서비스
service:
name: testapp-svc-np # 라우팅할 서비스 이름
port: # 라우팅할 서비스의 포트
number: 80
연결될 NodePort 서비스와 서비스에 의해 관리될 레플리카셋을 생성한다.
'testapp-svc-np' NodePort 서비스 manifest file
apiVersion: v1
kind: Service
metadata:
name: testapp-svc-np
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31234
selector:
app: testapp-rs
'testapp-rs' 레플리카셋 manifest file
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: testapp-rs
spec:
replicas: 3
selector:
matchLabels:
app: testapp-rs
template:
metadata:
labels:
app: testapp-rs
spec:
containers:
- name: testapp
image: ghcr.io/c1t1d0s7/go-myweb:alpine
ports:
- containerPort: 8080
yaml 파일로 인그레스 컨트롤러를 생성후, 인그레스 목록을 확인한다. testapp.test.com FQDN과 할당된 노드의 IP 주소를 확인할 수 있다.
외부 DNS 서버가 없으므로 임시로 host PC의 /etc/hosts 파일에 testapp.test.com 호스트 이름으로 ip 주소를 저장해 두었다.
$ sudo vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 cccr03-350XCJ-350XCR
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.56.21 testapp.test.com ## 추가한 부분
NodePort의 외부 접근용 포트 번호를 확인한다. 32011 가 할당되었다.
vagrant@kube-control1:~/work/minjee$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
testapp-svc-np NodePort 10.106.72.193 <none> 80:32011/TCP 7m52s
curl 명령어로 접속이 되는 것을 확인한다.
$ curl http://testapp.test.com:32011
Hello World!
testapp-rs-c6bnc
브라우저를 통해 외부에서 접근되는지도 확인한다.
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] ConfigMap 오브젝트 생성하기 (0) | 2023.02.21 |
---|---|
[Kubernetes] Persistent Volume 과 Persistent Volume Claim (0) | 2023.02.20 |
[Kubernetes] 쿠버네티스 Volume의 종류와 특징 (0) | 2023.02.17 |
[Kubernetes] Service 의 종류 (0) | 2023.02.16 |
[Kubernetes] Jobs (잡)과 CronJob (0) | 2023.02.13 |