공부/Kubernetes

ingress nginx controller port(tcp) based routing

토고미 2022. 2. 24. 12:36

Ingress는 기본적으로 L7 레이어 즉, http기반의 라우팅을 해준다.

 

아래 yaml 예시 처럼 path 하나가 이미 특정 서비스의 "포트"까지 바인딩 되어있다.

...
spec:
  rules:
  - http:
      paths:
      - path: /togomi/
        backend:
          serviceName: my-service
          servicePort: 11037
...

하지만 port를 직접 명시하길 원하는 경우가 있을 수도 있다.

 

나의 경우에는 redis-cli를 이용해 클러스터링을 하는데에 필요했다.

깊게 따져보면 redis-cli의 잘못이긴 하지만, 옵션으로 넘겨주는 호스트 형식이 반드시 {IP}:{PORT}여서 L7 라우팅으로는 할 수 없었다.

 

아무튼 port based routing을 해보자. TCP routing을 예시로 한다.

 

1. 노출할 pod의 서비스 생성

포트 라우팅을 하고싶은 pod를 서비스로 노출시킨다.

이미 만들어놨으면 넘어가면 된다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: my-namespace
spec:
  ports:
  - port: 1234
    targetPort: 1234
    name: myport
  - port: 11037
    targetPort: 11037
    name: yourport
  selector:
    mykey: myvalue
  type: ClusterIP

 

2. Port Routing을 위한 ConfigMap 생성

ingress nginx에게 포트 정보를 넘겨주기위한 configmap을 생성한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-tcp-services
  namespace: ingress-nginx
data:
  1234: "my-namespace/my-service:1234"
  11037: "my-namespace/my-service:11037"

data 절 밑에

포트: "네임스페이스/서비스 이름:포트"

의 형식으로 적어주면 된다.

3. Ingress nginx 설정에 옵션 추가

ingress deployment의 .spec.containers[0].args에

- --tcp-services-configmap={컨피그맵이 존재하는 네임스페이스}/{컨피그맵 이름} 

옵션을 추가한다.

apiVersion: apps/v1
kind: Deployment
metadata:
...  
spec:
  template:
    metadata:
	...
    spec:
      containers:
      - args:
      	...
        - --tcp-services-configmap=ingress-nginx/my-tcp-services     
...

만약 udp 라우팅을 하고싶다면

--udp-services-configmap

옵션을 사용하면 된다.

 

deployment의 스펙을 수정하면 알아서 pod가 재기동될 것이다.

 

4. Ingress nginx 서비스 수정

마지막으로 ingress nginx의 서비스에 해당 포트 정보를 추가하면 된다.

apiVersion: v1
kind: Service
metadata:
...
spec:
...
  ports:
  ...
  - name: myport
    port: 1234
    protocol: TCP
    targetPort: 1234
  - name: yourport
    port: 11037
    protocol: TCP
    targetPort: 11037
...
status:
  loadBalancer:
    ingress:
    - ip: 123.456.7.89

 

모든 설정이 끝났다.

 

엔드포인트는 {ingress-nginx 주소}:{라우팅된 포트 번호} 이다.

 

즉 이 글을 예시로 들자면,

my-service의 myport라는 서비스를 호출하고싶다면 123.456.7.89:1234

my-service의 yourport라는 서비스를 호출하고싶다면 123.456.7.89:11037

이 될 것이다.

 

 

참고

https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

'공부 > Kubernetes' 카테고리의 다른 글

kubectl copy multiple files pod to local  (0) 2022.05.24
Kubernetes Local PV  (0) 2022.03.07
k8s dockerhub imagePullSecrets 만들기 및 적용  (0) 2022.02.08
ubuntu에 특정 k8s, crio 버전 설치하기  (0) 2022.01.03
k8s QoS Class  (0) 2022.01.03