Kubernetes 中的 Rancher 元数据/Confd 等价物

Rancher Metadata / Confd Equivalent in Kubernetes

在我们当前的 Rancher environment 上,我们根据对 Rancher 元数据的调用动态配置 Nginx 配置,使用容器上的标签来确定该容器是否包含在 Nginx 路由。
我们使用 confdRancher 后端来完成此元数据检查并动态 change/reload 新的 Nginx 配置。

我们已经开始着手迁移到 Kubernetes (AWS EKS)。 Kubernetes 是否有与此 confd/Rancher 等效的?

由于某些技术原因和时间范围原因,我们目前无法用 ingress 等效项替换此 nginx,因此正在考虑在 [=29] 上使用注释或标签=] 保持动态配置能力。

托管 Kubernetes 提供商通常不会让您直接访问支持 etcd,因此您最好和最理想的选择是挖掘 Kubernetes API 以获取您感兴趣的资源并生成您的配置。

这正是入口控制器的作用 - 监视 Kubernetes 资源的变化并为 nginx 等负载均衡器生成配置。

其中一个 nginx 控制器让您 completely replace the template that it uses with one of your own.

The NGINX template is located in the file /etc/nginx/template/nginx.tmpl.

Using a Volume it is possible to use a custom template. This includes using a Configmap as source of the template

        volumeMounts:
      - mountPath: /etc/nginx/template
        name: nginx-template-volume
        readOnly: true
  volumes:
    - name: nginx-template-volume
      configMap:
        name: nginx-template
        items:
        - key: nginx.tmpl
          path: nginx.tmpl

您可以部署 nginx 入口控制器 under a custom class 的一个版本,例如 nginx-legacy 这样它就不会尝试公开期望正常 nginx 入口的服务。

To do this, the option --ingress-class must be changed to a value unique for the cluster within the definition of the replication controller.

spec:
  template:
     spec:
       containers:
         - name: nginx-ingress-legacy-controller
           args:
             - /nginx-ingress-controller
             - '--election-id=ingress-controller-leader-internal'
             - '--ingress-class=nginx-legacy'
             - '--configmap=ingress/nginx-ingress-internal-controller'

然后注释遗留服务以使用以下方式将资源分配给该入口:

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "nginx-legacy"

根据斯科特·安德森 (Scott Anderson) 的回答,进一步详细说明我们最终发现的内容。

使用 nginx 自定义模板技术,我们能够通过在 Ingress 资源中使用注释并在 nginx 自定义模板中引用它们来动态配置 nginx 配置。

Ingress 资源元数据定义为:

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "nginx-legacy"
    mycompany/bar: "path_to_service"

在自定义 Nginx 模板(位置块)中,查看注释是否存在:

{{if index $ing.Annotations "mycompany/bar"}}

从注释中获取值:

{{$bar:= index $ing.Annotations "mycompany/bar"}}