J'ai un cluster kubernetes, où j'ai déployé un contrôleur d'entrée nginx en utilisant Helm nginx-ingress chart .
J'ai besoin d'ajouter une configuration personnalisée au fichier nginx.conf qui est généré dans le nginx-controller-pod, et je vois un problème où si j'ajoute une option d'une ligne telle que proxy-buffer-size: "512k"
Je peux voir cela reflété dans le fichier nginx.conf et tout fonctionne comme prévu.
Cependant, si j'essaye d'ajouter un extrait pour accomplir la même chose:
location-snippet: |
proxy_buffer_size "512k";
C'est comme si cela était ignoré par le fichier nginx.conf et le proxy_buffer_size
le paramètre reste à sa valeur par défaut.
Je dois pouvoir ajouter http-snippet
, server-snippet
et location-snippet
remplace mais si j'essaye de les ajouter au ConfigMap ou en tant qu'annotation dans le fichier Ingress.yaml, ils sont toujours ignorés.
Mon fichier yaml Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/secure-backends: "true"
ingress.kubernetes.io/force-ssl-redirect: "true"
ingress.kubernetes.io/location-snippet: |
proxy_buffer_size 512k; --This does not update the nginx.conf
spec:
tls:
- hosts:
- my.app.co.uk
secretName: tls-secret
rules:
- Host: my.app.co.uk
http:
paths:
- path: /
backend:
serviceName: myappweb-service
servicePort: 80
Ma carte de configuration nginx:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: nginx-ingress
chart: nginx-ingress-0.28.3
component: controller
heritage: Tiller
release: nginx-ingress
name: nginx-ingress-controller
namespace: default
data:
proxy-buffer-size: "512k" -- this works and updates the nginx.conf
location-snippet: |
proxy_buffers 4 512k; -- this does not update the nginx.conf
server-snippet: | -- this does not update the nginx.conf
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_Host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $Host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
Il s'avère que mon problème était dû au contenu de l'extrait de code que j'appliquais. Chaque fois que vous exécutez kubectl apply -f myconfigmap.yaml
, une validation est exécutée par rapport aux modifications que vous essayez d'appliquer au nginx.conf. Lorsque cette validation échoue, elle échoue silencieusement et il n'y a rien pour vous en avertir dans le terminal.
En fait, vous obtenez toujours le configmap/nginx-ingress-controller configured
message.
Par exemple, lorsque j'ajoute cela à la carte de configuration, il met à jour le nginx.conf comme prévu:
http-snippet: |
sendfile on;
Cependant, lorsque j'ajoute cela, rien ne change:
http-snippet: |
sendfile on;
tcp_nopush on;
La raison en est que la validation a échoué, mais la seule façon de le savoir est de consulter les journaux du pod du contrôleur d'entrée nginx. Dans ce cas, je vois:
Error: exit status 1
2018/10/16 07:45:49 [emerg] 470#470: "tcp_nopush" directive is duplicate in
/tmp/nginx-cfg468835321:245
nginx: [emerg] "tcp_nopush" directive is duplicate in /tmp/nginx-cfg468835321:245
nginx: configuration file /tmp/nginx-cfg468835321 test failed
Je reproduisais donc une directive qui existait déjà.
Si vous souhaitez modifier votre Kubernetes Ingress
les options d'annotation sont les suivantes:
nginx.ingress.kubernetes.io/configuration-snippet
pour un extrait de bloc d'emplacement nginxnginx.ingress.kubernetes.io/server-snippet
pour un extrait dans le bloc de service de configuration nginxOn dirait que vous utilisez nginx.org/location-snippets:
pour ce cas.
Il existe également une syntaxe non valide YAML sur l'exemple de configuration nginx et vous devez également utiliser des pluriels comme dans server-snippets
selon ceci exemple . Il y a une faute de frappe dans les docs au moment de la rédaction de cet article. Ouvert ce ticket pour le suivi.
Cela devrait être quelque chose comme ceci:
server-snippets: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_Host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $Host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
au lieu de cela:
server-snippet: |
location /messagehub {
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $http_Host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $Host;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
}
Notez l'indentation de la dernière accolade.