gpt4 book ai didi

nginx - 如何通过 NGINX Ingress Controller 暴露端口 22?

转载 作者:行者123 更新时间:2023-12-05 03:44:38 25 4
gpt4 key购买 nike

我有一个带有 NGINX 入口 Controller 的 Kubernetes 集群。在集群中我部署了一个 Gitea荚。 Web UI 和 HTTPS 访问通过 Ingress 对象公开,如下所示:

---
kind: Service
apiVersion: v1
metadata:
name: gitea-service
namespace: gitea-repo
spec:
selector:
app: gitea
ports:
- name: gitea-http
port: 3000
- name: gitea-ssh
port: 22
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: git-tls
namespace: gitea-repo
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- git.foo.com
secretName: tls-gitea
rules:
- host: git.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gitea-service
port:
number: 3000

这适用于 HTTPS。

但 Gitea 还通过端口 22 提供 SSH 访问。我的问题是,我如何告诉 NGINX Ingress Controller 将端口 22 也路由到我的 pod?

据我所知,我应该用类似的东西修补我的 NGINX Controller 部署:

spec:
template:
spec:
containers:
- name: controller
# defind cusotm tcp/udp configmap
args:
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-configmap-giteassh

ports:
- name: ssh
containerPort: 22
protocol: TCP

并提供指向我的 gitea 服务的配置映射:

apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-configmap-giteassh
namespace: ingress-nginx
data:
22: "gitea-repo/gitea-service:22"

我现在是否还需要在我的 Gitea POD 中进行额外的 Ingress 配置?

我想知道这是否是正确的方法。为什么我被迫在 NGINX Controller 中定义它,而不是像我为 HTTP 所做的那样在我的 POD 命名空间中定义它?这是否意味着对于每个暴露 HTTP 以外的 TCP 端口的 POD,我必须调整我的 Ingress NGINX Controller ?

最佳答案

我决定通过添加更多细节和解释来改进我的答案。
我找到了你的 blog post其中包含重现此问题所需的所有信息。

在您的示例中,您需要TCP 流量 通过端口 22 (是TCP协议(protocol))
NGINX Ingress Controller 不支持 TCP 协议(protocol),因此需要额外的配置,可以在 documentation 中找到。 .
您可以按照以下步骤公开 TCP 服务:

  1. 创建 ConfigMap具有指定的 TCP 服务配置。
  2. 添加 --tcp-services-configmap Ingress Controller 配置的标志。
  3. 公开端口22Service为 Ingress 定义。

广告 1。 我们需要创建一个 ConfigMap使用作为要使用的外部端口的键和指示要公开的服务的值(格式为 <namespace/service name>:<service port>:[PROXY]:[PROXY] )。
注意:您可能需要更改 Namespace取决于 NGINX Ingress Controller 的部署位置。

$ cat ingress-nginx-tcp.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-tcp
namespace: default
data:
"22": gitea-repo/gitea-service:22

广告 2。 创建 ConfigMap 之后, 我们可以使用 --tcp-services-configmap 指向它Ingress Controller 配置中的标志。
注意:此外,如果您想在端口定义中使用名称(例如 22-tcp),然后在 targetPort 中引用此名称一个服务的属性,你需要定义端口22 (参见:Defining a Service 文档)。

$ kubectl get deployment ingress-nginx-controller -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: default
spec:
...
template:
...
spec:
containers:
- args:
- /nginx-ingress-controller
- --tcp-services-configmap=$(POD_NAMESPACE)/ingress-nginx-tcp
...

广告 3. 然后我们需要公开端口 22在为 Ingress 定义的服务中。

$ kubectl get svc -oyaml ingress-nginx-controller
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: default
spec:
ports:
- name: 22-tcp
nodePort: 30957
port: 22
protocol: TCP
targetPort: 22
...
type: LoadBalancer
...

最后,我们可以通过在命令行上创建一个新的存储库来检查它是否按预期工作:
注意:我们需要一个 gitea 用户,该用户具有与此帐户关联的正确 SSH key 。

$ git add README.md
$ git commit -m "first commit"
[master (root-commit) c6fa042] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
$ git remote add origin git@<PUBLIC_IP>:<USERNAME>/repository.git
$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 211 bytes | 211.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To <PUBLIC_IP>:<USERNAME>/repository.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

此外,我们可以登录到 NGINX Ingress Controller Pod 并检查它是否正在监听端口 22 :

$ kubectl exec -it ingress-nginx-controller-784d4c9d9-jhvnm -- bash
bash-5.1$ netstat -tulpn | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 :::22 :::* LISTEN -

关于nginx - 如何通过 NGINX Ingress Controller 暴露端口 22?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66367867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com