ingress는 L7에서 동작하며 service는 L4에서 동작한다.
L7로 작동하는 Ingress는 헤더 조작이 가능하여 원하는 URL param으로 라우팅이 가능하다.
ingress service -> ingress pod -> app service -> app pod
Ingress Install
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/baremetal/deploy.yaml
$ kubectl config use-context ingress-admin@kubernetes
$ k create deploy nginx1 --image=nginx
$ k create deploy nginx2 --image=nginx
$ k expose deployment nginx1 --name=svc1 \
--port=80 --type=NodePort
$ k expose deployment nginx2 --name=svc2 \
--port=80 --type=NodePort
$ k get svc -o wide
1. ingress nginx를 통해 접속에 성공한 클라이언트가 도메인 기반 nginx 페이지에 접속하도록 각 nginx 기반 svc1과 svc2 그리고 Pod를 두 개씩 생성하고
2. 이를 Service 포트 접속을 통해 nginx가 정상적으로 동작 중인지 확인한다. 그러나 이 경우 svc1과 svc2서비스가 제공하는 NodePort 로 접속하면 그 결과가 같으므로 만약 그 결과의 차이를 확인할 경우 각 nginx의 index.html 파일을 다르게 생성해서 테스트를 진행한다.
3. 이 소스코드는 ingress nginx를 설치하기 위해 다운로드해서 실행하면 여러 오브젝트와 컨테이너가 생성되는 것을 확인한다.
4. 위의 코드가 정상적으로 동작했는지 그 결과를 확인하는데 Service ingress nginx controlle의 ExternalIP가 Pending 으로 나오는데 이는 IP 할당을 기다리기 때문이며 계속 이 상태에서도 테스트는 성공한다.
5. IngressClass의 경우 Ingress 생성시에 필요하므로 그 이름을 확인한다.
Ingress 생성하기
$ vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: svc1
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: svc2
port:
number: 80
$ k apply -f ingress.yaml
$ k get ingress
$ k describe ingress