更改Kubernetes nginx-ingress-controller端口

时间:2019-09-13 15:35:03

标签: nginx kubernetes minikube kubernetes-ingress

我在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超过2d1h)kubelet,minikube(类似   事件):创建Pod沙箱失败:rpc错误:代码=未知desc =   无法启动Pod的沙盒容器   “ nginx-ingress-controller-xxxx”:来自守护程序的错误响应:驱动程序   端点上的外部连接编程失败   k8s_POD_nginx-入口控制器-xxxx_kube-system _...:启动错误   userland代理:监听tcp 0.0.0.0:443:绑定:地址已在使用中

然后,我使用这些端口检查进程并杀死它们。这样可以释放它们,并且可以正确部署入口控制器吊舱。

我试图更改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的小节,但是当我推出更改时,它们又被添加

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

3 个答案:

答案 0 :(得分:1)

请注意,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

答案 1 :(得分:0)

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

一旦启用了某些特定的minikube AddonAddon-manager就会通过将每个文件放置到主机上的minikube文件夹中来为每个组件创建模板文件,清单文件,创建相应的K8s资源;此外,插件管理器会根据模板数据连续检查与 K8s 目标资源(服务,部署等)同步的所有插件资源的实际状态。

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

答案 2 :(得分: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