如何重新加载 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 自动重新加载:)
我有一个 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 自动重新加载:)