【问题标题】:Change Kubernetes nginx-ingress-controller ports更改 Kubernetes nginx-ingress-controller 端口
【发布时间】:2020-01-15 12:03:07
【问题描述】:

我在我的 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 描述它时,我得到:

输入原因年龄来自
留言 ---- ------ ----
---- ------- 警告 FailedCreatePodSandBox 42m (x163507 over 2d1h) kubelet, minikube (组合自相似 事件):创建 pod 沙箱失败:rpc 错误:代码 = 未知描述 = 无法为 pod 启动沙箱容器 “nginx-ingress-controller-xxxx”:来自守护进程的错误响应:驱动程序 在端点上编程外部连接失败 k8s_POD_nginx-ingress-controller-xxxx_kube-system_...:启动错误 用户态代理:监听 tcp 0.0.0.0:443:绑定:地址已在使用中

然后我检查使用这些端口的进程并杀死它们。这释放了它们,并且 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 的子部分,但是当我推出更改时,它们会再次添加

现在我的服务无法通过入口访问了。

【问题讨论】:

  • 你好 AR1,你能分享完整的 NGINX 部署 YAML 吗?完全理解场景会很有帮助。另一方面,您使用的是 K8s 文档[1] 还是其他指南? [1]kubernetes.io/docs/tasks/access-application-cluster/…
  • 嗨,路易斯,感谢您的回答。由于篇幅原因,我没有发布完整的 YAML。我发布的部分是与默认部分的唯一区别。我已经按照文档进行了操作,除非我按照问题中的说明更改 NGINX 端口,否则 ingress 工作正常。

标签: nginx kubernetes minikube kubernetes-ingress


【解决方案1】:

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

一旦你启用了一些特定的minikubeAddonAddon-manager 会为每个组件创建模板文件,将它们放在主机上的/etc/kubernetes/addons/ 文件夹中,然后启动每个清单文件,创建相应的 K8s 资源;此外,Addon-manager根据模板数据持续检查所有同步K8s目标资源(服务、部署等)的插件资源的实际状态。

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

【讨论】:

  • 感谢您的反馈。这是通用过程,但它没有回答问题。 Ingress 已经启用并且工作正常,除非我尝试按照问题中的说明将端口更改为 NGINX。
  • 我刚刚解释了如何在minikube 中更改默认 Nginx Ingress 控制器的端口,以及为什么在推出自定义端口后这些值会变为默认值。至少您可以检查来自 Ingress 控制器 Pod 的日志,以确定缩写请求是否到达目标应用程序服务。
【解决方案2】:

好吧,我认为您必须修改 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

【讨论】:

    【解决方案3】:

    请注意 minikube 附带 addon-manager,其作用是关注特定的插件模板文件(默认位置:/etc/kubernetes/addons/)并根据托管资源的标签值:

    addonmanager.kubernetes.io/mode

    1. addonmanager.kubernetes.io/mode=Reconcile

    将定期对帐。直接操作这些插件 不鼓励通过 apiserver,因为 addon-manager 会带来 他们回到原来的状态。特别是

    1. addonmanager.kubernetes.io/mode=KeepOnly

    将仅检查是否存在。用户可以将这些插件编辑为 他们想要。

    因此,为了保留您自定义版本的默认 Ingress 服务侦听端口,请先将 minikube VM 上的 Ingress deployment template configuration 更改为 KeepOnly

    【讨论】:

      猜你喜欢
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多