본문 바로가기
Data Engineering/docker, kubernetes(k8s)

Kubernetes 서비스의 개념과 인그레스

by EverReal 2024. 12. 19.

Kubernetes 서비스의 개념과 인그레스

 

※ 본 내용은 「컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 길벗」를 참고하여 작성하였습니다.

 

 

쿠버네티스 사용시에도 외부와 연결이 필요합니다.

이 때 활용할 수 있는 방법이 노드포트(Node Port)를 사용하는 것 입니다.

노드포트 서비스를 설정하면 모든 워커노드의 특정 포트(노드포트)를 열고 여기로 오는 모든 요청을 노드포트 서비스로 전달합니다. 그리고 노드포트 서비스는 해당 업무를 처리할 수 있는 파드로 요청을 전달합니다.

 

노드포트 서비스는 포트를 중복 사용할 수 없어 1개의 노드포트에 1개의 디플로이먼트만 적용됩니다.

(여러 개의 디플로이먼트가 있을 경우? → 인그레스 사용)

 

 

노드포트 서비스로 외부에서 접속

노드포트는 아래와 같은 yaml 파일을 활용해서 설정할 수 있습니다.

kubectl create -f nodeport.yaml

 

사용하는 오브젝트 스펙은 아래와 같습니다.

# nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: np-svc
spec:
  selector:
    app: np-pods
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30000
  type: NodePort

 

노드포트로 생성한 np-svc 서비스는 아래와 같이 확인할 수 있습니다.

 kubectl get services

 

파드 리스트를 보면 아래와 같이 확인할 수 있는데,

Internal-ip와 포트를 활용하여 호스트 PC의 웹브라우저에서 IP와 포트번호를 통해 접속 확인을 할 수 있습니다.

Internal-ip는 각 노드에서 ifconfig - eth1에서도 확인할 수 있습니다.


expose로 노드포트 서비스 생성

kubectl expose deployment np-pods --type=NodePort --name=np-svc-v2 --port=80

 

아래와 같이 포트번호는 임의로 지정됩니다.

 

아래와 같이 외부에서 무난히 접속됩니다.

 

인그레스(Ingress) 

  : 고유한 주소를 사용하여 사용목적에 따라 다른 응답을 제공할 수 있고, 트래픽에 대한 L4/L7 로드밸런서와 보안 인증서를 처리하는 기능을 제공합니다. 인그레스 컨트롤러와 같이 사용되어야 합니다.

순서는 정리하면 대략 아래와 같습니다.

 

1) 인그레스 컨트롤러 생성 _ kubectl apply -f ./ingress-nginx.yaml

2) 인그레스 설정 _ kubectl apply -f ./ingress-config.yaml


아래의 ingress-config.yaml 파일을 apply하여 설정을 적용합니다. 

  이 파일은 들어오는 주소값과 포트에 따라 노출된 서비스를 연결하는 역할을 설정합니다.

  - 외부에서 주소값과 노드포트를 가지고 들어오는 것은 hname-svc-default서비스와 연결된 파드로 넘기고

  - 외부에서 들어오는 주소값, 노드포트와 함께 뒤에 /ip를 추가한 주소값은 ip-svc 서비스와 연결돤 파드로 접속하게 합니다.

# 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

 

인그레스 설정 파일이 제대로 등록되었는지는 아래와 같이 확인합니다.

kubectl get ingress

 

인그레스에 요청한 내용이 확실하게 적용되었는지는 아래를 통해 확인합니다.

kubectl get ingress -o yaml

 

 

3) 노드포트 서비스로 인그레스 컨트롤러를 외부에 노출 _ kubectl apply -f ./ingress.yaml

4) 노드포트 서비스로 생성된 인그레스 컨트롤러 확인 _ kubectl get services -n ingress-nginx

5) expose로 디플로이먼트 서비스 노출

  (1) hname-svc-default 노출 _ kubectl expose deployment in-hname-pod --name=hname-svc-default --port=80,443

  (2) ip-svc 노출 _ kubectl expose deployment in-ip-pod --name=ip-svc --port=80,443

6) 웹 브라우저에서 접속 확인   (192.168.1.101:30100, 192.168.1.102:30100,  192.168.1.103:30100)

7) 웹 브라우저에서 접속 확인   (192.168.1.101:30100/ip, 192.168.1.102:30100/ip ,  192.168.1.103:30100/ip )

 

 

반응형

댓글