Kubernetes 中的 Rancher 元数据/Confd 等价物
Rancher Metadata / Confd Equivalent in Kubernetes
在我们当前的 Rancher environment
上,我们根据对 Rancher 元数据的调用动态配置 Nginx
配置,使用容器上的标签来确定该容器是否包含在 Nginx
路由。
我们使用 confd
和 Rancher
后端来完成此元数据检查并动态 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"}}
在我们当前的 Rancher environment
上,我们根据对 Rancher 元数据的调用动态配置 Nginx
配置,使用容器上的标签来确定该容器是否包含在 Nginx
路由。
我们使用 confd
和 Rancher
后端来完成此元数据检查并动态 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"}}