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 |