노드포트 서비스는 포트를 중복 사용할 수 없어서 1개의 노드포트에 1개의 디폴로이먼트만 적용된다. 하지만 여러 개의 디플로이먼트가 있을 때 그 수만큼 노드포트 서비스를 구동해야 하는 것은 아니다 쿠버네티스에서는 이런 경우에 인그레스를 사용한다
인그레스는 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공할 수 있고, 트래픽에 대한 L4/L7 로드밸런서와 보안 인증서를 처리하는 기능을 제공한다
인그레스를 사용하려면 인그레스 컨트롤러가 필요하다. 다양한 인그레스 컨트롤러가 있지만 여기서는 쿠버네티스에서 프로젝트로 지원하는 Nginx 인그레스 컨트롤러(NGINX ingress controller)로 구성해 본다.
NGINX 인그레스 컨트롤러 작동 순서
인그레스 컨트롤러는 파드와 직접 통신할 수 없어서 노드포트 또는 로드밸런서 서비스와 연동되어야 한다. 따라서 노드포트로 이를 연동
kubectl create deployment in-hname-pod --image=sysnet4admin/echo-hname
kubectl create deployment in-ip-pod --image=sysnet4admin/echo-ip
kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
NGINX 인그레스 컨트롤러는 default 네임스페이스가 아닌 ingress-nginx 네임스페이스에 속하므로 -n ingress-nginx 옵션을 추가한다. 여기서 -n은 namespace의 약어로, default 외의 네임스페이스를 확인할 때 사용하는 옵션이다. 파드뿐만 아니라 서비스를 화인할 때도 동일한 옵션을 준다.
kubectl get pods -n ingress-nginx
kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.2/ingress-config.yaml
인그레스 설정 파일
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path:
backend:
serviceName: hname-svc-default
servicePort: 80
- path: /ip
backend:
serviceName: ip-svc
servicePort: 80
- path: /your-directory
backend:
serviceName: your-svc
servicePort: 80
이 파일은 들어오는 주소 값과 포트에 따라 노출된 서비스를 연결하는 역할을 설정. 외부에서 주소 값과 노드포트를 가지고 들어오는 것은 hname-svc-default 서비스와 연결된 파드로 넘기고, 외부에서 들어오는 주소 값, 노드포트와 함께 뒤에 /ip를 추가한 주소 값은 ip-svc 서비스와 연결된 파드로 접속하게 설정
kubectl get ingress
kubectl get ingress -o yaml
kubectl get ingress -o yaml을 실행하면 인그레스에 요청한 내용이 확실하게 적용됐는지 확인할 수 있다. 이 명령은 인그레스에 적용된 내용을 야믈 형식으로 출력해 적용된 내용을 확인할 수 있다. 우리가 적용한 내용 외에 시스템에서 자동으로 생성하는 것까지 모두 확인할 수 있으므로 이 명령을 응용하면 오브젝트 스펙 파일을 만드는 데 도움이 된다.
kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.2/ingress.yaml
적용한 yaml파일
apiVersion: v1 kind: Service metadata: name: nginx-ingress-controller namespace: ingress-nginx spec: ports: - name: http protocol: TCP port: 80 targetPort: 80 nodePort: 30100 - name: https protocol: TCP port: 443 targetPort: 443 nodePort: 30101 selector: app.kubernetes.io/name: ingress-nginx type: NodePort
기존 노드포트와 달리 http를 처리하기 위해 30100번 포트로 들어온 요청을 80번 포트로 넘기고, https를 처리하기 위해 30101번 프트로 들어온 것을 443번 포트로 넘긴다. 그리고 NGINX 인그레스 컨트롤러가 위치하는 네임스페이스를 ingress-nginx로 지정하고 NGINX 인그레스 컨트롤러의 요구 사항에 따라 셀렉터를 ingress-nginx로 지정
kubectl get services -n ingress-nginx
외부와 통신하기 위해 클러스터 내부에서만 사용하는 파드를 클러스터 외부에 노출할 수 있는 구역으로 옮기는 것이다. 비유를 들면 각 방에 있는 물건을 외부에 내보내기 전에 공용 공간인 거실로 모두 옮기는 것과 같다.
kubectl expose deployment in-hname-pod --name=hname-svc-default --port=80,443
kubectl expose deployment in-ip-pod --name=ip-svc --port=80,443