我找到了有关如何使用ConfigMap配置NginX入口控制器的文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
不幸的是,我不知道如何在我的Ingress控制器中加载ConfigMap。
我的入口控制器:
helm install --name ingress --namespace ingress-nginx --set rbac.create=true,controller.kind=DaemonSet,controller.service.type=ClusterIP,controller.hostNetwork=true stable/nginx-ingress
我的配置图:
kind: ConfigMap
apiVersion: v1
metadata:
name: ingress-configmap
data:
proxy-read-timeout: "86400s"
client-max-body-size: "2g"
use-http2: "false"
我的入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- my.endpoint.net
secretName: ingress-tls
rules:
- host: my.endpoint.net
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 443
- path: /api
backend:
serviceName: api
servicePort: 443
如何使我的Ingress从ConfigMap加载配置?
答案 0 :(得分:1)
您应该在Ingress Controller部署清单中使用它
答案 1 :(得分:1)
您拥有的是Ingress yaml,而不是Ingress Controller部署yaml,Ingress Controller是实际完成工作的Pod,通常是nginx容器本身。在您共享的文档中here可以找到这种配置的示例。
更新
使用提供的示例,您还可以使用以下方法通过配置映射将配置加载到nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: nginx-config
configMap:
name: nginx-config
nginx-config包含您的nginx配置作为配置映射的一部分
答案 2 :(得分:1)
我设法使用--dry-run --debug
命令末尾的helm install
选项来显示Helm执行的YAML。然后我注意到那里的控制器是用--configmap={namespace-where-the-nginx-ingress-is-deployed}/{name-of-the-helm-chart}-nginx-ingress-controller
执行的。
为了加载ConfigMap,您需要使用自己的ConfigMap覆盖它(检查名称空间)。
kind: ConfigMap
apiVersion: v1
metadata:
name: {name-of-the-helm-chart}-nginx-ingress-controller
namespace: {namespace-where-the-nginx-ingress-is-deployed}
data:
proxy-read-timeout: "86400"
proxy-body-size: "2g"
use-http2: "false"
可以在here中找到配置属性列表。
答案 3 :(得分:1)
当您对必要的键值数据应用ConfigMap配置时,Ingress控制器会提取此信息并将其插入嵌套的nginx-ingress-controller
Pod的原始配置文件/etc/nginx/nginx.conf
中,因此之后很容易通过检查相应Pod中的实际nginx.conf
来验证ConfigMap的值是否已成功反映。
您还可以检查来自相关nginx-ingress-controller
舱的日志,以检查ConfigMap数据是否已重新加载到后端nginx.conf
,或者是否不调查原因。
答案 4 :(得分:1)
在安装时也可以通过config mag属性:
helm install stable/nginx-ingress --name nginx-ingress --set controller.config.use-forwarded-headers='"true"'
注意:对于非字符串值,必须使用单引号将双引号引起来。
答案 5 :(得分:0)
如果您使用helm install
安装了ingress-nginx,则如果未传递nginx控制器应查看的ConfigMap的明确值,则默认值似乎为{namespace} / {release-name} -nginx-入口控制器。这是由https://github.com/helm/charts/blob/1e074fc79d0f2ee085ea75bf9bacca9115633fa9/stable/nginx-ingress/templates/controller-deployment.yaml#L67生成的。 (如果链接无效,请参见类似内容。)
要进行自我验证,请尝试查找安装了ingress-nginx图表的命令,然后将--dry-run --debug
添加到该命令中。这将向您显示由Tiller生成的yaml文件,这些文件将应用于集群。第# Source: nginx-ingress/templates/controller-deployment.yaml
行开始控制器部署,其中arg
为--configmap=
。该arg
的值就是控制器要感知并用于更新其自己的.conf
文件的ConfigMap的名称。可以显式传递它,但是如果没有传递,它将具有默认值。
如果使用正确的名称创建了ConfigMap,则控制器的日志将显示它已获取配置更改并重新加载。
可以使用kubectl logs <pod-name-of-controller> -n <namespace-arg-if-not-in-default-namespace>
进行验证。我的日志消息中包含文本Configuration changes detected, backend reload required.
。如果ConfigMap名称错误,这些日志消息将不存在。
我认为这是官方缺少的官方文档,但也许我不正确?我将尝试使用这些详细信息提交PR。知道更多的人应该帮助他们充实,这样人们就不必不必要地偶然发现这一点。
干杯,谢谢您的发帖。
答案 6 :(得分:0)
我阅读了以上答案,但无法正常工作。
对我有用的是:
release_name=tcp-udp-ic
# add the helm repo from NginX and update the chart
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo update
echo "- Installing -${release_name}- into cluster ..."
#delete the config map if already exists
kubectl delete cm tcp-udp-ic-cm
helm del --purge ${release_name}
helm upgrade --install ${release_name} \
--set controller.image.tag=1.6.0 \
--set controller.config.name=tcp-udp-ic-cm \
nginx-stable/nginx-ingress --version 0.4.0 #--dry-run --debug
# update the /etc/nginx/nginx.conf file with my attributes, via the config map
kubectl apply -f tcp-udp-ic-cm.yaml
而tcp-udp-ic-cm.yaml
是:
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-udp-ic-cm
namespace: default
data:
worker-connections : "10000"
本质上,我需要亲自掌控此发行版,并设置将要使用的配置映射的名称。 Helm创建配置映射,但为空。然后,我应用config-map文件以便使用我的值更新config-map资源。这是我唯一可以完成的步骤。
答案 7 :(得分:0)
如果要在部署nginx-ingress-controller
时提供自己的配置,则可以在原始nginx-ingress
的Helm图表上有一个包装的Helm图表,并提供自己的values.yaml
并可以进行自定义配置
在这里使用头盔3。
创建图表:
$ helm create custom-nginx
$ tree custom-nginx
所以我的图表结构如下:
custom-nginx/
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
这里还有一些额外的东西。具体来说,我不需要完整的templates/
目录及其内容,因此我将其删除:
$ rm custom-nginx/templates/*
$ rmdir custom-nginx/templates
现在,图表结构应如下所示:
custom-nginx/
├── Chart.yaml
├── charts
└── values.yaml
由于我们必须将原始nginx-ingress
图表作为依赖项,因此我的Chart.yaml
如下所示:
$ cat custom-nginx/Chart.yaml
apiVersion: v2
name: custom-nginx
description: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 1.39.1
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
appVersion: 0.32.0
dependencies:
- name: nginx-ingress
version: 1.39.1
repository: https://kubernetes-charts.storage.googleapis.com/
在这里,appVersion
是nginx-controller
码头工人镜像版本,并且version
与我正在使用的nginx-ingress
图表版本匹配。
剩下的唯一事情就是提供您的自定义配置。这是我的自定义配置的精简版本:
$ cat custom-nginx/values.yaml
# Default values for custom-nginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
nginx-ingress:
controller:
ingressClass: internal-nginx
replicaCount: 1
service:
externalTrafficPolicy: Local
publishService:
enabled: true
autoscaling:
enabled: true
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: "80"
targetMemoryUtilizationPercentage: "80"
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory : 2Gi
metrics:
enabled: true
config:
compute-full-forwarded-for: "true"
我们可以在https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/中检查可用作配置的键({{1}中的config
部分)
其余配置可在此处找到:https://github.com/helm/charts/tree/master/stable/nginx-ingress#configuration
设置好配置后,只需下载图表的依赖项即可
values.yaml
在部署图表之前,最好对图表进行基本检查:
$ helm dependency update <path/to/chart>
然后部署您的图表(它将使用您自己的自定义配置来部署$ helm lint <path/to/chart>
$ helm install --debug --dry-run --namespace <namespace> <release-name> <path/to/chart>
。
此外,由于您现在拥有图表,因此可以升级和回滚图表。
答案 8 :(得分:0)
一种更简单的方法是修改通过头盔部署的值。现在controller.config.entries
中需要更改以输入ConfigMap的值。使用helm show values nginx-stable/nginx-ingress
显示最新值,并在您正在运行的版本上查找格式。
在网上所有参考文献都说controller.config
之前,我遇到了很多问题,直到我检查了上面的命令。
输入值后,使用以下命令升级:
helm upgrade -f <PATH_TO_FILE>.yaml <NAME> nginx-stable/nginx-ingress
答案 9 :(得分:0)
仅需确认上述@NeverEndingQueue答案,nginx-controller pod规范本身中便存在配置映射的名称,因此,如果您检查nginx-controller
pod的yaml:kubectl get po release-name-nginx-ingress-controller-random-sequence -o yaml
,在spec.containers
,您会发现类似的内容:
- args:
- /nginx-ingress-controller
- --default-backend-service=default/release-name-nginx-ingress-default-backend
- --election-id=ingress-controller-leader
- --ingress-class=nginx
- --configmap=default/release-name-nginx-ingress-controller
例如,在这里,需要在命名空间release-name-nginx-ingress-controller
中创建名为default
的配置映射。
完成后,您可以通过检查日志来验证是否已进行更改。通常,您会看到类似以下内容的
:I1116 10:35:45.174127 6 event.go:278] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"default", Name:"release-name-nginx-ingress-controller", UID:"76819abf-4df0-41e3-a3fe-25445e754f32", APIVersion:"v1", ResourceVersion:"62559702", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap default/release-name-nginx-ingress-controller
I1116 10:35:45.184627 6 controller.go:141] Configuration changes detected, backend reload required.
I1116 10:35:45.396920 6 controller.go:157] Backend successfully reloaded.
答案 10 :(得分:0)
使用 enable-underscores-in-headers=true
对我没有用 enable-underscores-in-headers='"true"'
helm install nginx-ingress ingress-nginx/ingress-nginx
--namespace ingress-basic
--set controller.config.enable-underscores-in-headers=true
答案 11 :(得分:0)
我设法通过 configmap 更新了 nginx 中的“large-client-header-buffers”。这是我遵循的步骤..
kubectl -n utility describe pods/test-nginx-ingress-controller-584dd58494-d8fqr |grep configmap
--configmap=test-namespace/test-nginx-ingress-controller
注意:就我而言,命名空间是“test-namespace”,配置映射名称是“test-nginx-ingress-controller”
cat << EOF > test-nginx-ingress-controller-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: test-nginx-ingress-controller
namespace: test-namespace
data:
large-client-header-buffers: "4 16k"
EOF
注意:请按照步骤 1
namespace 和 configmap name >kubectl apply -f test-nginx-ingress-controller-configmap.yaml
然后您将看到更改在几分钟后更新到 nginx 控制器 pod
i.g.
kubectl -n test-namespace exec -it test-nginx-ingress-controller-584dd58494-d8fqr -- cat /etc/nginx/nginx.conf|grep large
large_client_header_buffers 4 16k;