web-dev-qa-db-ja.com

Kubernetes:非HTTP要求をイングレス経由でコンテナーにルーティングする

  1. Mac OSのdockerにバンドルされているローカルkubernetesを使用します。
  2. nginx-ingress-controller をインストールしました。
  3. 外部http ingress経由のリクエスト をkubernetes管理コンテナーに送信するように管理しました(たとえば、ローカルブラウザーから)。すべてのリクエストは、nginxポート80または443を介して送信されます。

問題は、httpまたはhttpsリクエストをngnixコントローラー経由でしかルーティングできないことです。コンテナへのイングレス経由で非HTTPリクエスト(データベースやcorbaなど)を送信するにはどうすればよいですか?

8
Matthias M

これは、イングレスメカニズムでは十分にサポートされておらず、 未解決の問題 です。
configmapを使用して公開ポートをkubernetesサービスにマッピングするnginx-ingressを使用したtcpまたはudpトラフィックの回避策があります。
このドキュメント を参照してください。

tcp-services-configmap(および/またはudp-services-configmap)引数を使用して入力コントローラーを開始します。

args: 
- "/nginx-ingress-controller"
- "--tcp-services-configmap=default/nginx-tcp-configmap"
- "--v=2"

configmapをデプロイします:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-tcp-configmap
data:
  9000: "default/example-service:8080"

9000は公開されたポート、8080はサービスポートです

13
stacksonstacks

ベアメタルサーバーでnginx-ingress-controllerを使用しています。すべてのノードからホストされたサイトにアクセスするために、展開ではなくDaemonSetとして作成しました( ベアメタルの考慮事項 )。

このソリューションはうまく機能し、イングレス仕様の更新は完全に統合されています。

TSサーバーを利用可能にするために、stacksonstacksで言及されているように、nginx-ingress-controller.ymlのポッドの引数を変更しました。

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io
  --tcp-services-configmap=default/tcp-ingress-configmap
  --udp-services-configmap=default/udp-ingress-configmap

残念ながら、変更された仕様を適用するとき、DaemonSetはポッドを自動的に再作成しなかったため、ポッドを検査するとき、古い引数がまだありました。

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io

kubectl --namespace ingress-nginx delete pod --allを使用してingress-nginx名前空間内のPodを削除すると、コントローラーで新しいPodが作成され、最終的にホストネットワークでポートが使用可能になりました。

状況は少し異なるかもしれませんが、誰かがこれで数分節約できることを願っています。

2
Fabian Witte