如何重新加载 nginx 入口控制器

How to reload nginx ingress controller

我有一个 Kubernetes 集群(1.22 版),并且在其中部署了 Nginx 入口控制器。我发现在几种情况下我可以 reload my ingress: 下一个列表描述了需要重新加载的场景:

  • New Ingress Resource Created.
  • TLS section is added to existing Ingress.
  • Change in Ingress annotations that impacts more than just upstream configuration. For instance load-balance annotation does not require a reload.
  • A path is added/removed from an Ingress.
  • An Ingress, Service, Secret is removed.
  • Some missing referenced object from the Ingress is available, like a Service or Secret.
  • A Secret is updated.

我的入口现在只使用 HTTP 流量,我想将 TLS 部分添加到现有入口。

所以,我的问题是:我到底应该怎么做才能重新加载入口?

我在文档或其他地方找不到任何信息。任何建议表示赞赏!

在所有情况下,您所要做的就是更新 Ingress 或相关资源(例如,包含证书的秘密)。您从文档中引用的更多是应用程序的技术背景,换句话说:在这种情况下需要重新加载。当控制器注意到与控制器关联的资源发生变化时,实际的重新加载由控制器本身完成。您可以重新启动 pods(或分别执行 nginx -s reload)以 强制 更新,但根据我的经验,没有这样的要求。

What should I exactly do to reload my ingress?

您只需要更新入口,在您的情况下,您只需将 TLS 部分添加到现有入口。

然后(自动)入口控制器应该找到差异(如 anemyte 在其回答中所说)并更新入口。从现在开始,您将可以使用TLS。

一般来说,这一切都应该自动发生。理论上,这也可以手动完成,但不推荐这样做。它被描述为 in this topic.


编辑:

我已经复现了这种情况。 首先,我使用以下 ingress.yaml:

创建了简单的入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ing-1
spec:
  ingressClassName: nginx
  rules:
    - host: www.example.com
      http:
        paths:
          - backend:
              service:
                name: app-1
                port:
                  number: 80
            path: /
            pathType: Prefix

然后我有 运行 kubectl get ingress 这是输出:

NAME    CLASS   HOSTS             ADDRESS        PORTS     AGE
ing-1   nginx   www.example.com   35.X.X.X       80        3m

在这一步中,我在没有 TLS 的情况下工作(仅工作端口 80)。然后我为 TLS 创建了 tls.yaml(我使用了自签名证书,您需要使用您的证书和域):

apiVersion: v1
kind: Secret
metadata:
  name: tls
data:
  tls.crt: |
    <my cert>
  tls.key: |
    <my key>
type: kubernetes.io/tls

我在 kubectl apply -f tls.yaml 中输入了 运行 然后我更改了 ingress.yaml 如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ing-1
spec:
  ingressClassName: nginx
  rules:
    - host: www.example.com
      http:
        paths:
          - backend:
              service:
                name: app-1
                port:
                  number: 80
            path: /
            pathType: Prefix
    # This section is only required if TLS is to be enabled for the Ingress
  tls:
   - hosts:
     - www.example.com
     secretName: tls

我添加了 TLS 部分。然后我有 运行 kubectl apply -f ingress.yaml 几秒钟后我可以在 运行ning kubectl get ingress:

时看到这个输出
NAME    CLASS   HOSTS             ADDRESS        PORTS     AGE
ing-1   nginx   www.example.com   35.239.7.126   80, 443   18m

TLS 正在运行。在日志中我可以看到这条消息:

Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"ing-1", UID:"84966fae-e135-47bb-8110-bf372de912c8", APIVersion:"networking.k8s.io/v1", ResourceVersion:"11306", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync

Ingress 自动重新加载:)