web-dev-qa-db-ja.com

nginx.confによって無視されるnginx-ingress構成マップスニペット

helm nginx-ingress chart を使用してnginxイングレスコントローラーをデプロイしたkubernetesクラスターがあります。

Nginx-controller-podで生成されたnginx.confファイルにカスタム構成を追加する必要があり、proxy-buffer-size: "512k"などの1行のオプションを追加すると、これが反映されるという問題が発生しますnginx.confファイルですべてが期待どおりに機能します。

ただし、同じことを達成するためにスニペットを追加しようとすると:

location-snippet: |
  proxy_buffer_size "512k";

これはnginx.confファイルによって無視され、proxy_buffer_size設定はデフォルト値のままであるかのようです。

http-snippetserver-snippet、およびlocation-snippetオーバーライドを追加できる必要がありますが、それらをConfigMapに追加しようとしても、Ingress.yamlファイル内の注釈としても常に無視されます。

私のイングレスyamlファイル:

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

私の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;
   }
10
Declan McNulty

私の問題は、私が適用していたスニペットの内容が原因であることがわかりました。実行するたびにkubectl apply -f myconfigmap.yaml、検証は、nginx.confに適用しようとしている変更に対して実行されます。この検証が失敗すると、黙って失敗し、ターミナルでこれを警告するものは何もありません。

実際、configmap/nginx-ingress-controller configuredメッセージ。

たとえば、これを構成マップに追加すると、nginx.confが期待どおりに更新されます。

http-snippet: |
  sendfile on;

ただし、これを追加しても何も変わりません。

http-snippet: |
  sendfile on;
  tcp_nopush on;

これは検証に失敗したためですが、それを見つける唯一の方法は、nginxイングレスコントローラーポッドのログを調べることです。この場合、私は見ます:

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

そのため、すでに存在するディレクティブを複製していました。

5
Declan McNulty

Kubernetes Ingressを変更する場合、注釈オプションは次のとおりです。

  • nginx.ingress.kubernetes.io/configuration-snippet nginxロケーションブロックスニペットの場合
  • nginx.ingress.kubernetes.io/server-snippet nginx構成サービスブロックのスニペット用

その場合、nginx.org/location-snippets:を使用しているようです。

Nginxの設定例にはYAMLの無効な構文もあり、この example に従ってserver-snippetsのように複数形も使用する必要があります。この執筆時点で docs にタイプミスがあります。開いた このチケット フォローアップする。

次のようになります。

  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;
      }

これの代わりに:

  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;
    }

最後の中括弧のインデントに注意してください。

5
Rico