쿠버네티스/도커(사용 목적별로 연결하는 인그레스)

맹민재·2022년 10월 20일
1

노드포트 서비스는 포트를 중복 사용할 수 없어서 1개의 노드포트에 1개의 디폴로이먼트만 적용된다. 하지만 여러 개의 디플로이먼트가 있을 때 그 수만큼 노드포트 서비스를 구동해야 하는 것은 아니다 쿠버네티스에서는 이런 경우에 인그레스를 사용한다

인그레스는 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공할 수 있고, 트래픽에 대한 L4/L7 로드밸런서와 보안 인증서를 처리하는 기능을 제공한다

인그레스를 사용하려면 인그레스 컨트롤러가 필요하다. 다양한 인그레스 컨트롤러가 있지만 여기서는 쿠버네티스에서 프로젝트로 지원하는 Nginx 인그레스 컨트롤러(NGINX ingress controller)로 구성해 본다.

NGINX 인그레스 컨트롤러 작동 순서

  1. 사용자는 노드마다 설정된 노드포트를 통해 노드포트 서비스로 접속 이때 노드포트 서비스를 NGINX 인그레스 컨트롤러로 구성
  2. NGINX 인그레스 컨트롤러는 사용자의 접속 경로에 따라 적합한 클러스터 IP 서비스로 경로를 제공
  3. 클러스터 IP 서비스는 사용자를 해당 파드로 연결해 준다.

인그레스 컨트롤러는 파드와 직접 통신할 수 없어서 노드포트 또는 로드밸런서 서비스와 연동되어야 한다. 따라서 노드포트로 이를 연동

1. 테스트용으로 디플로이먼트 2개(in-hname-pod, in-ip-pod)를 배포 및 확인

kubectl create deployment in-hname-pod --image=sysnet4admin/echo-hname

kubectl create deployment in-ip-pod --image=sysnet4admin/echo-ip

2. NGINX 인그레스 컨트롤러 설치 및 확인

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

3. 인그레스를 사용자 요구 사항에 맞게 설정하려면 경로와 작동을 정의해야 한다. 파일로도 설정할 수 있으므로 미리 정의해 둔 설정을 적용

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 서비스와 연결된 파드로 접속하게 설정

4. 인그레스 설정 파일이 제대로 등록됐는지 확인

kubectl get ingress
kubectl get ingress -o yaml

kubectl get ingress -o yaml을 실행하면 인그레스에 요청한 내용이 확실하게 적용됐는지 확인할 수 있다. 이 명령은 인그레스에 적용된 내용을 야믈 형식으로 출력해 적용된 내용을 확인할 수 있다. 우리가 적용한 내용 외에 시스템에서 자동으로 생성하는 것까지 모두 확인할 수 있으므로 이 명령을 응용하면 오브젝트 스펙 파일을 만드는 데 도움이 된다.

5. 외부에서 NGINX 인그레스 컨트롤러에 접속할 수 있게 노드포트 서비스로 NGINX 인그레스 컨트롤러를 외부에 노출

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로 지정

6. 노드포트 서비스로 생성된 NGINX 인그레스 컨트롤러 확인

kubectl get services -n ingress-nginx

7. expose 명령으로 디플로이먼트(in-hname-pod, in-ip-pod)도 서비스로 노출, 확인

외부와 통신하기 위해 클러스터 내부에서만 사용하는 파드를 클러스터 외부에 노출할 수 있는 구역으로 옮기는 것이다. 비유를 들면 각 방에 있는 물건을 외부에 내보내기 전에 공용 공간인 거실로 모두 옮기는 것과 같다.

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

192.168.1.101:30100에 접속해 외부에서 접속되는 경로에 따라 다르게 작동하는지 확인

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글