여러 인그레스 컨트롤러 중 대표적인 NginX 인그레스 컨트롤러를 사용하여 구축한다.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml
nginx ingress controller가 설치되면서 k8s object들이 배포된다.
(pod, service, delpoyment, replicaset, job.batch)
kubectl get all -n ingress-nginx
명령어를 통해 배포된 오브젝트 확인
ingress-nginx-controller service가 생성되고 Port가 할당되며,
ingress-nginx-controller pod가 running 상태이면 된다.
Ingress Controller를 설치했으면 실질적으로 동작 방식과 엔드포인트를 작성한 k8s Ingress yaml파일을 작성하여 배포해주어야한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: "ingress.test.com"
http:
paths:
- pathType: Prefix
path: /test
backend:
service:
name: service-test
port:
number: 80
ingress.test.com/test로 요청이오면 -> service-test라는 서비스에서 요청을 받고 Service에 작성된 Pod로 요청이 되어 해당 컨테이너에서 응답을 해주는 형태
nginx-ingress-controller를 설치할 경우 기본적으로 오브젝트들의 라벨명이 ingress-nginx
로 되어있다. 따라서 사용자가 배포할 Ingress의 이름을 기본적으로 ingress-nginx
로 해주어야 매핑이된다.
다른 이름으로 작성할 경우 nginx-ingress-controller 설치 시 배포될 오브젝트의 yaml파일에 Label을 전부 해당 이름에 맞게 수정해주어야 한다.
# svc-test.yaml
apiVersion: v1
kind: Service
metadata:
name: service-test
spec:
selector:
app: service_test_pod
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector를 통하여 service_test_pod에 전달한다
# deploy-test.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: service-test
spec:
replicas: 3
selector:
matchLabels:
app: service_test_pod
template:
metadata:
labels:
app: service_test_pod
spec:
containers:
- name: simple-http
image: python:2.7
imagePullPolicy: IfNotPresent
command: ["/bin/bash"]
args: ["-c", "echo '<p>Hello from $(hostname)</p>' > index.html; python -m SimpleHTTPServer 8080"]
ports:
- name: http
containerPort: 8080
8080포트를 통해 파이썬으로 간단한 문자열을 출력하는 웹서버 컨테이너를 Pod로 생성
local PC에서 /etc/hosts파일에 wokernode의 ip와 ingress에 명시한 host명을 작성해준다.
# /etc/hosts
10.0.1.82 ingress.test.com
그 후 위의 host DNS명과 nginx-ingress-controller의 서비스 port
그리고 등록된 엔드포인트 path를 웹 브라우저상에 작성해주면 라우팅된 해당 애플리케이션에 요청하여 응답을 받을 수 있다.
기본적으로 k8s-cluster에서 외부 접근을 허용하려면 pod에 연결된 service를 NodePort 타입으로 생성해주면 해당 서비스에 생성된 NodePort ex) 30001
를 통해 워커노드의 ip와 해당 port로 컨테이너에 접근이 가능해지지만 Ingress를 사용하여 단일 지점 요청을 통한 외부 접근 허용 및 라우팅이 가능해지기 때문에 현업에선 Ingress를 주로 사용한다.
WorkerNode에 대한 서버 IP와 NodePort를 통해 연결된 서비스에 요청을 보내 해당 Service에 Selector로 연결된 Pod로 라우팅한다.
사전에 선언적으로 생성한 Ingress 규칙을 적용한 nginx-ingress-controller의 서비스가 모든 요청을 받아 host와 endpoint를 통해 요청을 라우팅하여 각각 맞는 서비스에 연결지어 준다.
https://kubernetes.github.io/ingress-nginx/deploy/
https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html