# networking Ingress
{{tag>k8s networking ingress}}
## Ingress
- 인그레스를 사용하기 위해서는 [[K8s]] 클러스터상에 인그레스 컨트롤러가 동작하고 있어야 한다
- 인그레스는 URL의 경로와 애플리케이션을 매핑해 주는 리버시 프록시다
- 하나의 IP 주소에 여러 개의 도메인 이름을 등록하여, 도메인 이름에 대응하는 애플리케이션을 정의할 수 있다
- 서버 인증서를 등록하면 SSL/TLS 암호화, 즉 HTTPS를 통한 접속이 가능해진다
- 인그레스의 세션 어피니티 기능은 로드밸런서에 의존하는 레거시 웹 애플리케이션을 쿠버네티스에서 돌릴 때 유용하게 사용될 수 있다
- [[NGINX]] 인그레스 컨트롤러와 kube-keppalived-vip를 사용하면 VIP를 공유하는 노드로 [[HA]] 구성이 가능하다
## YAML
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: abc.sample.com
http:
paths:
- path: /
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
### fix
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
# kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: abc.sample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: helloworld-svc
port:
number: 8080
- path: /apl2
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 9080
- host: xyz.sample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: java-svc
port:
number: 9080
### 인그레스 API
^ 주요 항목 ^ 설명 ^
| apiVersion | networking.k8s.io/v1beta1 |
| kind | Ingress 설정 |
| metadata.name | 인그레스 오브젝트의 이름 |
| metadata.annotations | 인그레스 컨트롤러 설정에 사용\\ https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/ |
| spec | 인그레스 사양 |
### 인그레스 사양
^ 주요 항목 ^ 설명 ^
| rules | DNS명과 백엔드 서비스를 대응시키는 규칙 목록\\ 이 규칙에 맞지 않는 요청은 디폴트 백엔드라는 파드에 전송됨 |
| tls | [[TLS]] 인증서와 도메인 |
### 인그레스 규칙
^ 주요 항목 ^ 설명 ^
| host | [[FQDN]] (Fully Qualified Domain Name) 설정 |
| http | URL 경로와 백엔드 서비스의 대응 배열 |
### URL 경로와 백엔드 서비스의 대응 배열
^ 주요 항목 ^ 설명 ^
| paths | URL의 경로와 백엔드 서비스를 대응시키는 목록을 기술 |
### URL 경로와 백엔드 서비스의 대응
^ 주요 항목 ^ 설명 ^
| path | URL 주소의 경로 부분을 기재 |
| backend | 요청이 전달될 서비스와 포트번호 기재 |
### 전송될 서비스의 이름과 포트번호
^ 주요 항목 ^ 설명 ^
| serviceName | 서비스 이름 |
| servicePort | 서비스의 포트번호 |
### TLS 인증서와 도메인
^ 주요 항목 ^ 설명 ^
| hosts | 도메인명 목록 |
| secretName | 서버 인증서 시크릿의 이름\\ 시크릿은 네임스페이스 내에 보안이 필요한 데이터를 보존하는 오브젝트로 컨테이너에서 볼륨으로 마운트 가능 |
## Links
- https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/