如何在Helm NginX Ingress控制器上使用ConfigMap配置-Kubernetes

时间:2019-02-26 11:41:11

标签: kubernetes kubernetes-helm kubernetes-ingress nginx-ingress

我找到了有关如何使用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加载配置?

12 个答案:

答案 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/ 

在这里,appVersionnginx-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”。这是我遵循的步骤..

  1. 在 nginx 入口控制器 pod 描述中找到 configmap 名称
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”

  1. 创建一个configmap yaml
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 >
  1. 部署 configmap yaml
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;