인그레스 컨트롤러는 내부의 파드를 외부에 노출시키기 위해 사용하는 방법 중 하나이다. 인그레스 리소스가 작동하려면, 클러스터는 실행 중인 인그레스 컨트롤러가 반드시 필요하다. 인그레스 리소스를 생성하더라도 작동시키는 것은 인그레스 컨트롤러이다. 따라서, 인그레스를 작동시키기 위해선 인그레스 컨트롤러를 설치해야 한다. 인그레스는 서비스와는 다르게 주로 L7 로드 밸런서이다.
인그레스 컨트롤러의 종류는 많지만, 주로 Nginx의 것을 사용한다. (ingress-nginx)
클러스터 내의 서비스에 대한 외부 접근을 관리하는 L7 프록시이다.
L4의 서비스의 타입은 기본적으로 NodePort이어야 한다. 인그레스는 Pod이고, 외부 클라이언트에서 해당되는 트래픽을 받아 실제 서비스로 보내준다. 인그레스는 L7 로드 밸런서 이므로 L4 로드 밸런서로 라우팅을 해줄 수 있다. 따라서 반드시 필요하다. (EKS를 기준으로 한다면 ALB)
인그레스의 타겟은 NodePort 혹은 LoadBalancer 타입의 서비스이다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules: #중요!
- http:
paths #경로
- path: /testpath #경로가 testpath이면
pathType: Prefix #패스 타입
backend: # 인그레스 리소스가 바라보고 있는 백엔드 서비스
service:
name: test #서비스 이름
port:
number: 80 #서비스 포트 주소
rules는 인그레스 리소스를 어떤 서비스로 연결해줄지에 대한 규칙이다. 리스트 형식이므로, 여러 개를 지정해 줄 수 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
spec:
rules:
- host: "foo.bar.com" #들어오는 도메인
http:
paths:
- pathType: Prefix
path: "/bar" #bar로 시작하는 어느 경로든
backend:
service:
name: service1
port:
number: 80 #그러면 서비스1의 80포트로 연결
- host: "*.foo.com" # *.foo.com의 어느 도메인이든 (foo.com은안됨)
http:
paths:
- pathType: Prefix
path: "/foo" #/foo로 시작하는 어느 경로든
backend:
service:
name: service2 #service2의
port:
number: 80 # 80번 포트로 연결
정책을 설정할 때는 작은 범위의 정책을 위에, 큰 정책을 아래에 둬야 한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com #host는 같다.
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
레플리카셋, 노드포트 서비스, 인그레스 리소스를 생성한다.
cat myapp-ing.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ing
spec:
defaultBackend: #아무런 rules에도 매칭되지 않을 경우 이쪽으로 라우팅
service:
name: myapp-svc-np
port:
number:80
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc-np
port:
number: 80
curl --resolve www.example.com:80:192.168.56.21 http:www.example.com #편법 접속
sudo vi /etc/hosts
192.168.56.21 www.example.com
curl http://www.example.com