【问题标题】:How to reload nginx ingress controller如何重新加载 nginx 入口控制器
【发布时间】:2022-01-16 12:06:20
【问题描述】:

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

  • 已创建新入口资源。
  • TLS 部分已添加到现有 Ingress。
  • Ingress 注释的变化不仅仅影响上游配置。例如负载平衡注释不需要重新加载。
  • 从 Ingress 添加/删除路径。
  • 已删除 Ingress、Service、Secret。
  • Ingress 中一些缺失的引用对象可用,例如 Service 或 Secret。
  • 秘密已更新。

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

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

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

【问题讨论】:

    标签: kubernetes nginx-ingress


    【解决方案1】:

    我应该怎么做才能重新加载我的入口?

    您只需要更新入口,在您的情况下,您只需将 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,几秒钟后我可以在运行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 自动重新加载 :)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        • 2021-05-21
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 2022-06-29
        相关资源
        最近更新 更多