쿠버네티스에서 고정 ip를 사용하고, 애플리케이션을 외부에 노출하기 위해서는 서비스를 사용해야 한다.
파드는 생성될 때마다 다른 private ip 주소를 할당받고, 여러 노드를 옮겨 다닌다.
반면 서비스는 여러 개의 파드에 접근할 수 있는 하나의 IP를 제공한다. 따라서, 서비스를 사용하면 파드의 변동에 상관 없이, 연결된 파드에 서비스 주소로 접근할 수 있다.
파드에 어떻게 접근할 것이냐에 따라 적절한 서비스의 종류를 선택해야 한다.

ClusterIP 타입의 서비스를 생성하면 내부 ip를 생성해 Selector의 라벨을 참조하여 해당하는 파드들과 연결하여 파드에 접속할 수 있게 해준다.
쿠버네티스에서는 내부 dns를 구동하고 있어서, 서비스는 ip 뿐만 아니라 서비스 이름으로 접근할 수 있다.
kubectl port-forward 를 사용하면 프록시를 통해 외부에서도 접근할 수 있다.

모든 노드의 특정 포트를 개방해 서비스에 접근하는 방식.
웹 어플리케이션에 노드포트 쓰기에는 적절하지 않음 (안쓰는 포트라 헷갈림. 웬만하면 웰노운 포트 쓰기...) 쓸거면 인그레스와 함께 쓰자.

서비스 생성과 동시에 L4 로드밸런서가 생성되어, 모든 노드에 랜덤 포트가 열림.
(쿠버네티스가 로드밸런서 직접 제공하는 것은 아니고 aws나 오픈스택 환경 구축해놓든지 해야 쓸수있음.)
인그레스란 외부에서 유입되는 트래픽을 처리하기 위해 네트워크 7계층 레벨에서 정의하는 쿠버네티스 오브젝트이다.

SSL/TLS 보안 연결 등을 구현할 때 각 서비스와 디플로이먼트에 대해 일일이 설정해야 하므로 귀찮다.

하나의 url로 접근하여 적절한 디플로이먼트로 전달될 수 있음.
라우팅 정의, 보안 연결 등 세부 설정은 인그레스에 의해 수행되므로 편리함
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: alicek106.example.com # [1]
http:
paths:
- path: /echo-hostname # [2]
pathType: Prefix
backend:
service:
name: hostname-service # [3]
port:
number: 80
[1] 해당 도메인 이름으로 접근하는 요청에 대해 규칙 적용 (ip 혹은 다른 도메인으로 접속하면 접속 되지 않음)
[2], [3] /echo-hostname 경로로 들어온 요청을 hostname-service 서비스의 80번 포트로 전달하겠다.
annotation : 세부 기능
쿠버네티스 api 에는 특정 오브젝트의 상태 변화를 지켜보고 있는 watch api 가 있는데, 인그레스 컨트롤러는 인그레스 리소스에 대해 watch api 를 사용하여 모든 네임스페이스의 인그레스 리소스를 읽어와 규칙을 적용한다.
시작하세요! 도커/쿠버네티스