아무리 k8s를 잘 사용해서 pod를 띄우고 서비스를 연결하고, 인증을 시크릿으로 올려 마운트 시키고 등등 하여도 외부에 오픈을 해야 쓸모있는 시스템이 된다. 이렇게 외부에서 접근을 할 수 있도록 관리해주는 오브젝트가 인그레스이다.
아래 이미지는 쿠버네티스 공식 도큐먼트에 나와있는 그림이다.
인그레스 컨트롤러가 동반이 되어야 실제 rule을 적용시키고 트래픽을 받을 수 있으며, 인그레스 컨트롤러의 종류는 공식 홈페이지에서 찾아볼 수 있다.
https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/
인그레스 컨트롤러
인그레스 리소스가 작동하려면, 클러스터는 실행 중인 인그레스 컨트롤러가 반드시 필요하다. kube-controller-manager 바이너리의 일부로 실행되는 컨트롤러의 다른 타입과 달리 인그레스 컨트롤러
kubernetes.io
살펴보면 AWS,GCE,nginx를 지원하고, 이 외에도 F5 BIG-IP, Citrix등 굉장히 많은 것들을 지원한다.
한번 어떤방식으로 작동하는지 살펴보기 위해 nginx를 볼 예정이다.
아래 사이트를 접속하면 내 k8s 환경에 따라 여러가지 방법들을 제시한다.
https://kubernetes.github.io/ingress-nginx/deploy/
Installation Guide - NGINX Ingress Controller
Installation Guide There are multiple ways to install the NGINX ingress controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,
kubernetes.github.io
자신의 상황에 맞는 Contents를 선택하여 시작해보자. 글쓴이는 GCP의 일반 VM을 사용하기에 Bare-metal을 살펴보겠다.
접속한후 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/baremetal/deploy.yaml 부분에서 https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/baremetal/deploy.yaml 를 웹에서 접속해보면 Yaml을 볼 수 있다.
살펴보면 Role, ServiceAccount 등 여러가지 오브젝트들을 확인할 수 있고, 중간에 보면 아래와 같이 Service가 있는 것을 볼 수 있다.
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.3.1
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- appProtocol: http
name: http
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: NodePort
이것이 이제 컨트롤러 pod이며 노드포트 타입으로 열려있고 80, 443 port로 들어오는 트래픽을 앞단에서 받아주는 것을 볼 수 있다. 이것이 맨위 인그레스 이미지에서 client다음에 있는 부분이라고 볼 수 있다. 이후 backend서버와 연결하는 부분이 필요한데, 이 부분은 아래 따배런 강사님의 유튜브를 보며 해당 백엔트 서버 코드를 참고했다.
https://www.youtube.com/watch?v=9TMIetXb6Pw
해당 영상을 보고 marvel과 payment를 배포했다고 가정하고 ingress를 배포해 보자.
아래처럼 path별로 어떤 서비스와 연결할 것인지 명시하는 부분이 있다. 그리고 ingress를 배포한 후 아까 ingress-controller를 배포한 nodeport로 curl을 날려보자
curl workerIP:nodePort로 하면 /로 연결이 되기 때문에 marvel-service로 연결이 된다.
아래와 같이 잘 뜨는 것을 볼 수 있다.
curl workerIP:nodePort/pay라고 하면 ingress에 명시되어 있는 pay-service로 연결이 된다.
이처럼 ingress에서는 L7로드밸런서와 비슷하게 외부에서 접속을 할 수 있도록 도와준다.
AWS를 사용하는 경우는 아래 글을 읽어보면 좋을것 같다.
https://aws.amazon.com/ko/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
Kubernetes Ingress with AWS ALB Ingress Controller | Amazon Web Services
Note: This post has been updated in January, 2020, to reflect new best practices in container security since we launched native least-privileges support at the pod level, and the instructions have been updated for the latest controller version. You can als
aws.amazon.com