更改 Kubernetes nginx-ingress-controller 端口

Change Kubernetes nginx-ingress-controller ports

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

由于nginx-ingress-controller默认使用的端口已经被使用,我试图在部署中更改它们但没有结果。有人可以告诉我怎么做吗?

我如何知道该端口已被使用?

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

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 的子部分,但是当我推出更改时,它们又被添加了

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

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

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

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

嗯,我认为你必须修改 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

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

addonmanager.kubernetes.io/mode

  1. addonmanager.kubernetes.io/mode=Reconcile

Will be periodically reconciled. Direct manipulation to these addons through apiserver is discouraged because addon-manager will bring them back to the original state. In particular

  1. addonmanager.kubernetes.io/mode=KeepOnly

Will be checked for existence only. Users can edit these addons as they want.

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