외부에서 들어온 HTTP, HTTPS 를 Cluster 내부의 Service로 라우트 시켜준다.
Traffic은 Ingress resource 에서 정의된 방식으로 route 되게 된다.
인그레스는 외부에서 서비스로 접속이 가능한 URL, 로드밸런스 트래픽, SSL/TLS 그리고 이름기반의 가상 호스팅을 구성할 수 있다.
하지만 Ingress 는 HTTP/HTTPS 요청만을 다루고 그외에 다른 요청에 대해 서비스를 오픈하기 위해서는 Service.Type = NodePort, LoadBalancer를 설정해 주어야한다.
Ingress를 정의한다고해서 그 기능을 바로 사용할 수 있지는 않다.
IngressController가 존재해야 Ingress가 제 기능을 할 수 있게 된다.
Kubernetes에서 공식 지원하고 있는 Ingress Controller는 AWS, GCP 그리고 Nginx가 있다.
IngressController는 각자 사용자의 상황에 맞게 설치해서 사용하면 된다.
하나의 클러스터에 여러개의 IngressController를 사용할 수도 있는데 이 때는 IngressClass 에 controller를 명시하고 Ingress.spec.ingressClassName 을 명시하는 방식으로 싱크를 맞출 수 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- host: "foo.bar.com"
http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
Ingress.metadata.name 은 DNS 도메인 룰을 따라서 영숫자, -, . 만으로 구성되어야 한다. 해당 이름이 DNS 역할을 하기 때문
spec 에는 사용할 ingressClassName 을 명시할 수 있다. 만약 따로 명시하지 않으면 default ingressController를 사용하게 된다.
rules를 살펴보면 host, http 필드가 있다.
host 필드는 해당 hostname을 host의 value 값으로 지정함을 의미한다. 와일드 카드를 적용할 수도 있지만 와일드 카드는 . 을 기준으로 구분 된다.
http 필드는 paths 아래로 여러 path 들을 지정할 수 있게 된다. 해당 path 를 지정하고 pathType 을 통해서 Prefix, Exact, ImplementationSpecific 3가지 타입으로 정의할 수 있다.
그리고 해당 path 와 연결되는 backend를 service.name, service.port.number 를 정의하여 연결지을 수 있다.
만약 다중일치가 일어나는 경우 같은 조건에서는 긴 일치값으로 routing 되게 되고 Prefix 보다는 Exact가 더 높은 우선순위를 갖게 된다.
위에서 잠깐 설명한 IngressClass는 여러 Ingress Controller를 사용할 때 사용할 수 있다.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
를 통해서 Ingress Controller를 정의할 수 있다.
IngressClass 에 대한 추가 환경설정 값들이 정의되어 있는 값을 참조하기 위해서 사용된다.
해당 apiGroup, kind, name 을 정의하여 참조하게 된다.
parameter에 대한 scope도 지정이 가능한데 Cluster, Namespace 두 가지로 설정이 가능하다.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-2
spec:
controller: example.com/ingress-controller
parameters:
# 이 인그레스클래스에 대한 파라미터는
# "external-configuration" 네임스페이스에 있는
# "external-config" 라는 IngressParameter(API 그룹 k8s.example.com)에 기재되어 있다.
scope: Namespace
apiGroup: k8s.example.com
kind: IngressParameter
namespace: external-configuration
name: external-config
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb-1
spec:
controller: example.com/ingress-controller
parameters:
# 이 인그레스클래스에 대한 파라미터는 "external-config-1" 라는
# ClusterIngressParameter(API 그룹 k8s.example.net)에 기재되어 있다.
# 이 정의는 쿠버네티스가
# 클러스터 범위의 파라미터 리소스를 검색하도록 한다.
scope: Cluster
apiGroup: k8s.example.net
kind: ClusterIngressParameter
name: external-config-1
IngressClass의 metadata.annotation 에 다음과 같은 표현을 사용하여 ingressClassName이 명시되지 않은 ingress 에 대하여 기본 ingressClass를 적용시킬 수 있다.
만양 default 설정이된 ingressClass가 2개 이상이라면 ingressClassName을 명시하지 않았을 때 ingress 가 생성되지 않는다.
ingressclass.kubernetes.io/is-default-class: "true"
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
AWS 에서도 여러 ingressClass 가 존재한다.
그 중에서 alb ( application load balancer ) 에서 알아두면 좋을 것 같은 annotation 들을 정리
alb.ingress.kubernetes.io/scheme: internet-facing / internal
alb.ingress.kubernetes.io/target-type: ip / instance
alb.ingress.kubernetes.io/load-balancer-name: foo
alb.ingress.kubernetes.io/group.name: bar
alb.ingress.kubernetes.io/group.order: '2'
alb ingressClass 를 사용하기 위해서 ingressClassName: alb 로 지정해줘야함!
https://kubernetes.io/ko/docs/concepts/services-networking/ingress/