透過 Ingress Nginx 公開 TCP/UDP 服務

Auto Draft

Ingress Nginx 在 Kubernetes 中常被利用來提供網頁服務的反向代理和 load balancing。在一些狀況下,你可能會需要同一個 IP 也能夠提供其他 TCP/UDP 服務。這篇文章將會介紹在這種狀況下如何透過 Ingress Nginx 來作為 TCP/UDP 服務的 proxy。

用途

在大部分狀況下,Ingress Nginx 只會用來提供 HTTP/HTTPS 的反向代理和 load balancing,但是在架設 GitLab、Gitea 等服務時,除了 HTTP/HTTPS 外,也會需要 SSH port 提供 git 連結。在這種狀況下,又因 DNS 只能讓兩個不同的 port 使用的同一個 IP,所以將會需要利用 Ingress Nginx 進行 TCP 服務的 proxy。

設定

Ingress 在設計上不支援 TCP/UDP 服務,因此 Ingress controller 會需要利用 --tcp-services-configmap--udp-services-configmap 指向現有的 ConfigMap,而這 ConfigMap 將會包含要進行 proxy 的服務設定。

以下是一個要透過 22 port 提供服務的 ConfigMap 範例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  22: “<namespace>/<service>:22"

Ingress Nginx 同時也需要公開對應的 port

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 controller 的啟動參數上加上 --tcp-services-configmap

    spec:
      containers:
      - args:
...
        - --tcp-services-configmap=ingress-nginx/tcp-services

經過這些設定後就能利用 Ingress Nginx 公開 TCP 服務了,而 UDP 也是利用類似的方法。

Reference


Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Leave a Reply