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.