Ingress Nginxは、Kubernetesにおいてウェブサービスのリバースプロキシやロードバランシングを提供するために広く利用されています。状況によっては、同じIPアドレスで他のTCP/UDPサービスも提供したい場合があります。この記事では、そのような状況でIngress NginxをTCP/UDPサービスのプロキシとして利用する方法を紹介します。
用途
ほとんどの場合、Ingress Nginx は HTTP/HTTPS のリバースプロキシやロードバランシングを提供するためにのみ使用されます。しかし、GitLab や Gitea などのサービスを構築する場合、HTTP/HTTPS に加えて、Git 接続用の SSH ポートも必要になります。このような状況では、DNS によって 2 つの異なるポートが同じ IP を使用することになるため、Ingress Nginx を利用して TCP サービスのプロキシを行う必要があります。
設定
Ingress は設計上 TCP/UDP サービスをサポートしていないため、Ingress コントローラーは以下を利用する必要があります。 --tcp-services-configmap 跟 --udp-services-configmap 既存の ConfigMap を参照し、この ConfigMap にプロキシするサービスの構成設定を含めます。
以下は、ポート 22 を介してサービスを提供するための ConfigMap の例です。
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
22: “<namespace>/<service>:22"
Ingress Nginx は、対応するポートも公開する必要があります。
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
- name: proxied-tcp-22
port: 22
targetPort: 22
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
同時に、Ingress コントローラーの起動引数にも追加する必要があります。 --tcp-services-configmap
spec:
containers:
- args:
...
- --tcp-services-configmap=ingress-nginx/tcp-services
これらの設定を行うことで、Ingress Nginx を利用して TCP サービスを公開できるようになります。UDP についても同様の方法で設定可能です。
参考文献
著作権表示:特に断りのない限り、本ブログのすべての記事はCC BY-NC-SA 4.0ライセンスの下で提供されています。

