更改Kubernetes nginx-ingress-controller端口

4

我在我的RedHat EC2实例上安装了Minikube v1.3.1进行一些测试。

由于nginx-ingress-controller默认使用的端口已经被占用,我尝试在部署中更改它们但没有成功。请问有人能指导如何操作吗?

如何确定端口已经被占用?

当我使用命令kubectl -n kube-system get deployment | grep nginx列出系统pod时,我得到:

nginx-ingress-controller 0/1 1 0 9d

这意味着我的容器未启动。当我使用命令kubectl -n kube-system describe pod nginx-ingress-controller-xxxxx描述它时,我得到:

Type Reason Age From
Message ---- ------ ----
---- ------- Warning FailedCreatePodSandBox 42m (x163507 over 2d1h) kubelet, minikube (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "nginx-ingress-controller-xxxx": Error response from daemon: driver failed programming external connectivity on endpoint k8s_POD_nginx-ingress-controller-xxxx_kube-system_...: Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use

然后我检查了使用这些端口的进程并将它们杀掉。这样可以释放它们,使ingress-controller pod成功部署。

我尝试更改nginx-ingress-controller端口的操作是什么?

kubectl -n kube-system get deployment | grep nginx

> NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
> nginx-ingress-controller   0/1     1            0           9d

kubectl -n kube-system edit deployment nginx-ingress-controller

我的部署内容中相关部分如下:

部署的关键步骤如下:

name: nginx-ingress-controller
        ports:
        - containerPort: 80
          hostPort: 80
          protocol: TCP
        - containerPort: 443
          hostPort: 443
          protocol: TCP
        - containerPort: 81
          hostPort: 81
          protocol: TCP
        - containerPort: 444
          hostPort: 444
          protocol: TCP
        - containerPort: 18080
          hostPort: 18080
          protocol: TCP

我先移除了端口为443和80的子部分,但是当我推出更改后,它们又被添加回来了

现在我的服务通过Ingress无法访问。


你好AR1, 能否分享完整的NGINX部署YAML文件?这将有助于完全理解情况。另外,您是否使用K8s文档[1]或其他指南?[1] https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/ - Luis Javier Alvarez Rodriguez
嗨,Luis,谢谢您的回答。由于长度原因,我没有将完整的YAML发布出来。我发布的部分是与默认部分唯一不同的地方。我已经按照文档进行操作了,而且Ingress也可以正常工作,除非我按照问题中指定的更改NGINX端口。 - AR1
3个回答

1
请注意,minikube随附addon-manager,其作用是监视特定的插件模板文件(默认位置:/etc/kubernetes/addons/),并根据所管理资源的标签值执行两种特定操作之一。

addonmanager.kubernetes.io/mode

  1. addonmanager.kubernetes.io/mode=Reconcile

将会定期进行调整。不建议通过API服务器直接操作这些插件,因为插件管理器会将它们恢复到原始状态。特别地

  1. addonmanager.kubernetes.io/mode=KeepOnly

仅检查是否存在。用户可以根据自己的需求编辑这些插件。

因此,为了保留您自定义的默认Ingress服务监听端口版本,请先将 Ingress部署模板配置更改为在minikube VM上的KeepOnly


0

基本上,minikube 作为单独的插件引导 Nginx Ingress Controller,因此根据设计,您可能需要启用它以便在 minikube 集群中传播特定的 Ingress Controller 资源。

一旦您启用了某些特定的 minikube AddonAddon-manager 就会将每个组件的模板文件放置到主机上的 /etc/kubernetes/addons/ 文件夹中,并旋转每个清单文件,创建相应的 K8s 资源;此外,Addon-manager 不断检查所有插件资源的实际状态,根据模板数据同步 K8s 目标资源(服务、部署等)。

因此,您可以考虑通过修改Ingress插件模板数据来影响位于/etc/kubernetes/addons/目录下的ingress-*.yaml文件,并将所需值传播到目标k8s对象;这可能需要一些时间,直到K8s引擎反映更改并重新生成基于 ReplicaSet的相关资源。

感谢您的反馈。那是通用的过程,但它并没有回答问题。Ingress已经启用,并且正常工作,除非我尝试将端口更改为问题中指定的NGINX。 - AR1
我刚刚解释了如何在 minikube 中更改默认的 Nginx Ingress 控制器端口,以及为什么在您部署自定义端口后这些值会恢复为默认值。至少,您可以从 Ingress 控制器 Pod 的日志中检查是否到达了目标应用服务的最初请求。 - Nick_Kh

0

嗯,我认为你需要修改Ingress,它引用了你正在尝试在自定义端口上公开的服务。

这可以通过自定义注释来完成。以下是针对端口444的示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myservice
  namespace: mynamespace
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.org/listen-ports-ssl: "444"

spec:
  tls:
  - hosts:
    - host.org
    secretName: my-host-tls-cert
  rules:
  - host: host.org
    http:
      paths:
      - path: /
        backend:
          serviceName: my-service
          servicePort: 444

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接