Ingress 정리
Ingress
인그레스는 k8s 클러스터 외부에서의 요청을 k8s 클러스터 내부의 Application에 연결 하기 위한 API 오브젝트이다. 디플로이먼트 관리하의 Application을 외부 공개용 URL과 매핑하여 인터넷에 공개하는 데 사용 된다. 인그레스는 SSL/TSL 암호화나 Session Affinity 기능을 갖추고 있어, 기존 웹 Application을 쿠버네티스화하는 데 유용한 오브젝트다.
목차
- 인그레스 기능과 개요
- 공개 URL과 Application 매핑
- 가상 호스트와 서비스를 매핑하는 매니페스트 기술
- kube-keepalibed-vip에 의한 VIP 획득과 HA 구성
- 고가용성 Ingress 환경 구축
1. 인그레스 기능과 개요
- 공개 URL과 Application 매핑
- 복수의 도메인 이름을 가지는 가상 호스트 기능
- 클라이언트의 요청을 여러 파드에 분산
- SSL/TLS 암호화 통신 HTTPS
- Session Affinity
인그레스는 기존의 로드밸런서나 리버스 프록시를 대체할 수 있다. 공개용 URL의 경로에 Application을 Mapping 하여 로드밸런싱, HTTPS 통신 그리고 Session Affinity 를 사용할 수 있기 때문이다.
Ingress는 다른 controller와는 달리 마스터 상의 kube-controller-manager의 일부로 실행되지 않는다. 다양한 컨트롤러가 있지만 Nginx 컨트롤러가 대표적이다.
Public Cloud에서의 k8s 관리 서비스는 Cloud의 기능과 Ingress를 연동하여 Public IP 주소를 연결한다. On-premise 에서의 k8s 클러스터는 Public IP 주소를 노드 간에 공유하는 기능을 추가해야 한다. Github의 kube-keepalibed-vip를 이용.
공개 URL과 Application 매핑
인그레스를 사용하면 공개 URL의 경로 부분에 복수의 Application을 매핑할 수 있다. 예를 들어, http://abc.sample.com이란 URL의 reservation과 order라는 경로에 각각의 전용 Application을 Mapping할 수 있다. 사용자 입장에서는 하나의 URL이지만 내부적으로 Application이 적절히 분리되어 있어 느슨하게 결합된 Application의 집합체로 구현 가능.
3. 가상 호스트와 서비스를 매핑하는 매니페스트 기술
Ingress의 Manifest 에서 Metadata와 annotation이 중요한 역할을 수행. Annotation에 key와 value를 기재하여 Ingress controller에 명령을 전달한다고 볼 수 있다.
아래 예제의 주요 어노테이션
kubernetes.io/ingress.class: 'nginx' # 여러 인그레스 컨트롤러가 k8s 클러스터에서 동작 중인 경우에는
# 이 어노테이션을 명시적으로 지정할 필요가 있다.
nginx.ingress.kubernetes.io/rewrite-target: / # URL 경로를 바꾸도록 하는 어노테이션이다.
# 이 설정이 없으면 클라이언트로부터의 요청 경로를 파드에게 그대로 전송하여 File NotFound 에러로 연결될 수 있다.
ex) ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# v1.21 부터 추가 사항
# defaultBackend:
# service:
# name: nginx
# port:
# number: 80
rules:
- host: abc.sample.com
http:
paths:
- path: /
# v1.21 부터 변경 사항
# path: /
# pathType: Prefix
# backend:
# service:
# name: helloworld-svc
# port:
# number: 8080
backend:
serviceName: helloworld-svc
servicePort: 8080
- path: /apl2
backend:
serviceName: nginx-svc
servicePort: 9080
- host: xyz.sample.com
http:
paths:
- path: /
backend:
serviceName: java-svc
servicePort: 9080
표 1.인그레스 API(Ingress v1beta1 extensions) v.1.22 기준 Ingress reference
주요 항목 | 설명 |
---|---|
apiVersion | extensions/v1beta1 설정 |
kind | Ingress 설정 |
metadata.name | 인그레스 오브젝트의 이름 |
metadata.annotations | 인그레스 컨트롤러 설정에 사용. v.1.22 기준 Annotation 참고 자료 |
spec | 표 2 참고 |
표 2. 인그레스 사양(IngressSpec v1beta1 extensions) v.1.22 기준 인그레스 샤앙 참조
주요항목 | 설명 |
---|---|
rules | DNS명과 백엔드 서비스를 대응시키는 규치 목록. 자세한 내용은 표3 참고. 이 규칙에 맞지 않는 요청은 디폴트 백엔드라는 파드에 전송됨 |
tls | 표 7 참고 |
표 3. 인그레스 규칙(IngressRule v1beta1 extensions)
주요항목 | 설명 |
---|---|
host | FQDN(Fully Qualified Domain Name) 설정 |
http | 자세한 내용은 표 4 참고 |
표 4. URL 경로와 백엔드 서비스의 대응 배열(HTTPIngressRuleValue v1beta1 extensions) v.1.22 기준 backend 참조
주요항목 | 설명 |
---|---|
paths | URL의 경로와 백엔드 서비스를 대응시키는 목록을 기술. 표 5 참고 |
표 5. URL 경로와 백엔드 서비스의 대응(HTTPIngressPath v1beta1 extensions)
주요항목 | 설명 |
---|---|
path | URL 주소의 경로 부분을 기재 |
backend | 요청이 전달될 서비스와 포트번호 기재. 표 6 참고 |
표 6. 전송될 서비스의 이름과 포트번호(IngressBackend v1beta1 extensions)
주요항목 | 설명 |
---|---|
serviceName | 서비스 이름 |
servicePort | 서비스의 포트번호 |
표 7. TLS 인증서와 도메인(IngressTLS v1beta1 extensions)
주요항목 | 설명 |
---|---|
hosts | 도메인명 목록 |
serviceName | 서버 인증서 시크릿의 이름. 시크릿은 네임스페이스 내에 보안이 필요한 데이터를 보존하는 오브젝트로 컨테이너에서 볼륨으로 마운트 가능 |
4. kube-keepalived-vip에 의한 VIP 획득과 HA 구성
Nginx Ingress Cotroller 는 Virtual IP(VIP)를 노드 간 공유하는 기능을 가지고 있지 않다.
그래서 복수의 노드로 구성된 학습 관경 2인 멀티 노드 k8s에서는 keepalived를 사용해야 한다.
Public Cloud에서는 Ingress와 VIP를 연결하는 기능이 있어 그대로 사용하면 된다.
하지만 On-premise 환경에서는 Ingress에 VIP를 더하기 위한 작업이 필요하다.
요청이 VIP를 통해 파드에 전달되는 개념도
상세설명)
- kube-keepalived-vip는 외부에서 접근 가능한 IP 주소를 노드에 할당한다.
- nginx-ingress-svc와 인그레스 컨트롤러가 외부 네트워크 파드 네트워크를 중개한다. 인그레스 컨트롤러는 파드이기 때문에 서비스 nginx-ingress-svc를 통해 요청을 받는다.
- 그림 좌측의 인그레스는 URL과 Application을 Mapping한다.
- 이러한 동작에 의해 Application 은 k8s cluster 외부로부터 요청을 전달 받는다.
5. 고가용성 Ingress 환경 구축
- 전용 네임스페이스 작성
- Ingress configmap 작성
- Ingress service account 작성과 RBAC 설정
- Ingress default backend 배포
- Ingress controller qovh
- kube-keepalived-vip의 configmap 작성
- kube-keepalived-vip의 service account 작성과 RBAC 설정
- kube-keepalived-vip의 Daemonset 배포