Kubernetes 中使用consul-template渲染配置
Kubernetes 中使用consul-template渲染配置
当前公司使用consul来实现服务发现,如Prometheue配置中的target和alertmanager注册都采用了consul服务发现的方式,以此来灵活应对服务的变更。但对于其他服务,是否也有一个通用的方式来使用consul管理配置文件?本文中描述如何使用consul-template来渲染配置文件。
使用方式
consul-template是hashicorp开发的一个模板渲染工具,它采用了Go template语法。可以将其配置为守护进程模式,watch consul服务的变动,并将变动后的服务渲染到配置文件中。会虽然名字中带了consul,但它还可以对 Vault和 Nomad 进行渲染。
简单使用方式如下,首先要创建一个模板in.tpl,在渲染时通过-template指定模板(in.tpl)和渲染结果(out.txt):
$ consul-template -consul-addr=<consul-address>:<consul-port> -template "in.tpl:out.txt"
SSL方式
生产环境中的consul通常会启用ssl和ACL配置,这样在连接consul的时候需要提供CA证书和token。命令行使用方式如下:
$ consul-template -log-level debug -consul-addr==<consul-address>:<consul-port> -consul-token=<token> -consul-ssl -consul-ssl-verify=false -consul-ssl-ca-cert=<ca.crt> -template "in.tpl:out.txt"
也可以使用
-consul-ssl-ca-path和-consul-token-file分别指定CA证书和token文件的路径。
获取ca证书
官方提供了一个名为consul-k8s的工具来获取consul的CA证书,并提供了容器镜像,使用方式如下:
$ consul-k8s-control-plane get-consul-client-ca -output-file=/tmp/tls.crt -server-addr=<consul-address> -server-port=<consul-port>
可以将consul-k8s配置为一个initcontainer,这样在consul-template启动之前就可以获取到ca证书:
initContainers:
- command:
- /bin/sh
- '-ec'
- |
consul-k8s-control-plane get-consul-client-ca \
-output-file=/consul/tls/client/ca/tls.crt \
-server-addr=<consul-address> \
-server-port=<consul-port> \
image: docker pull hashicorp/consul-k8s-control-plane:0.36.0
imagePullPolicy: IfNotPresent
name: get-auto-encrypt-client-ca
resources:
limits:
cpu: 50m
memory: 50Mi
requests:
cpu: 50m
memory: 50Mi
volumeMounts:
- mountPath: /consul/tls/client/ca
name: consul-auto-encrypt-ca-cert
volumes:
- emptyDir:
medium: Memory
name: consul-auto-encrypt-ca-cert
获取token
连接consul所使用的token可以以secret的形式部署在kubernetes集群中,可以通过vault注入等方式来避免token泄露。
整个处理方式如下图所示:

配置文件方式
上面通过命令行的方式(-template "in.tpl:out.txt")指定了模版和渲染结果,但这种方式只适用于渲染单个模板,如果需要渲染多个模板,可以采用配置文件的方式。
配置文件语法采用的是hcl,包含三部分:服务端(Consul、Vault和Nomad)、Templates和Modes,以及可选字段。服务端主要用于配置到服务端(Consul、Vault和Nomad)的连接;Templates可以指定多个模板(source)和渲染结果(destination);Modes用于配置consul-template的运行模式,通过once mode可以配置为非守护进程模式,通过exec mode可以启动额外的子进程。Modes字段可选,默认是守护进程模式。
配置文件的例子如下:
consul {
address = "127.0.0.1:8500"
auth {
enabled = true
username = "test"
password = "test"
}
}
log_level = "warn"
template {
contents = "{{key \"hello\"}}"
destination = "out.txt"
exec {
command = "cat out.txt"
}
}
后续就可以通过consul-template -config <config>的方式运行。
编写模板
consul-template使用的Go template的语法,除此之外,它还提供了丰富的内置方法,用于支持Consul(文章中搜索关键字Query Consul )、Vault(文章中搜索关键字Query Vault )和Nomad(文章中搜索关键字Query Nomad ),以及一些公共函数(如trim、regexMatch、replaceAll等)。
模板语法中比较重要的两点:
- 在模板文本中,一切动态的内容和判断代码块均使用
{{和}}包括起来,在{{和}}之外的文本均会被原封不动地拷贝到输出中。 - 为了方便格式化模板源代码,还额外提供了
{{-和-}}两种语法,可以将代码块前或代码块后的空白字符均移除。空白字符包括空格符、换行符、回车符、水平制表符。
举例
下面是logstash的output配置,用于将logstash处理的消息发送到elasticsearch.hosts中。如果hosts中的节点发生变动(如扩缩容),此时就需要联动修改logstash的配置:
output {
elasticsearch {
hosts => ['dev-logging-elkclient000001.local:9200', 'dev-logging-elkclient000002.local:9200', 'elkclient000003.local:9200']
index => "logstash-infra-%{es_index}"
resurrect_delay => 2
retry_max_interval => 30
sniffing => false
action => "create"
}
}
为了避免上述修改,可以通过consul-template对该配置进行渲染(当然前提是hosts中的节点都已经注册到了Consul中)。
{{- $nodes := "" }}
{{ range service "elasticsearch" }} {{- $node := .Node }} {{- $port := .Port }}
{{ if $node | regexMatch "(dev|prd)-logging-elkclient.*" }}
{{ if eq $nodes "" }}
{{$nodes = (printf "'%s:%d'" $node $port)}}
{{else}}
{{$nodes = (printf "%s,'%s:%d'" $nodes $node $port)}}
{{- end -}}
{{- end -}}
{{- end }}
output {
elasticsearch {
hosts => [{{$nodes}}]
index => "logstash-%{es_index}"
resurrect_delay => 2
retry_max_interval => 30
sniffing => false
action => "create"
}
}
- 首先定义一个变量
$nodes,用于保存最终的结果 - 遍历consul的
serviceelasticsearch,获取Node字段(如dev-logging-elkclient000001.local)和Port字段(本例中只有9200) - 通过内置方法
regexMatch从elasticsearch的节点中过滤所需的节点 - 通过
printf方法拼接字符串,并将结果保存到$nodes中 - 最后在
output.elasticsearch.hosts中使用上面的结果$nodes即可,由于$nodes是动态输出,因此需要加上双大括号{{$nodes}}
参考
Tips
有时候一个文件因为要经过多个服务的渲染而添加了多个模板,例如先使用vault注入secrets,再使用consul注入services。这样就会导致vault在处理时候会尝试解析consul的模板,但由于vault缺少连接consul所需的配置,会导致vault一直尝试连接consul。可以通过将其他服务的模版作为raw string的方式规避该问题,这样在vault解析模板的时候就会输出consul的模板:
{{- $consulTemplate := `
{{- $nodes := "" }}
{{ range service "elasticsearch" }} {{- $node := .Node }} {{- $port := .Port }}
{{ if $node | regexMatch "(dev|prd)-logging-elkclient.*" }}
{{ if eq $nodes "" }}
{{$nodes = (printf "'%s:%d'" $node $port)}}
{{else}}
{{$nodes = (printf "%s,'%s:%d'" $nodes $node $port)}}
{{- end -}}
{{- end -}}
{{- end }} output {
elasticsearch {
hosts => [{{$nodes}}]
index => "logstash-%{es_index}"
resurrect_delay => 2
retry_max_interval => 30
sniffing => false
action => "create"
}
}
` }} {{ $consulTemplate }}
Kubernetes 中使用consul-template渲染配置的更多相关文章
- 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务
搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...
- 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储
容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...
- Kubernetes中的亲和性与反亲和性
通常情况下,Pod分配到哪些Node是不需要管理员操心的,这个过程会由scheduler自动实现.但有时,我们需要指定一些调度的限制,例如某些应用应该跑在具有SSD存储的节点上,有些应用应该跑在同一个 ...
- Kubernetes中StatefulSet介绍
StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11.如何搭建环境可以参考kubeadm安装kubernetes V1.11.1 集群 ...
- SpringCloud使用Consul作为分布式配置中心
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36027670/article/de ...
- [转帖]Kubernetes中安装Helm及使用
Kubernetes中安装Helm及使用 2018年07月02日 17:41:09 灬勿忘丶心安 阅读数 3699更多 分类专栏: K8S 版权声明:本文为博主原创文章,遵循CC 4.0 BY-S ...
- Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring C ...
- Kubernetes中分布式存储Rook-Ceph部署快速演练
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些.项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整 ...
- 教你在Kubernetes中快速部署ES集群
摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...
- # k8s-jenkins在kubernetes中持续部署
k8s-jenkins在kubernetes中持续部署 1. k8s-jenkins在kubernetes中持续部署 Kubernetes Continuous Deploy插件:用于将资源配置部署到 ...
随机推荐
- 堆栈式 CMOS、背照式 CMOS 和传统 CMOS 传感器的区别
光电效应 光电效应的现象是赫兹(频率的单位就是以他命名的)发现的,但是是爱因斯坦正确解释的.简单说,光或某一些电磁波,照射在某些光敏物质会产生电子,这就是光电效应. 这就将光变为了电,光信号的改变会带 ...
- Hexo博客Next6.0版本主题配置(站内搜索、新建404界面、静态资源压缩、底部信息隐藏、各版块透明度修改、字数统计、推荐阅读、博文置顶、阅读进度、在线评论、运行时间)
新建404界面 在站点根目录下,输入hexo new page 404,在默认Hexo站点下/source/404/index.md 打开新建的404界面,编辑属于自己的404界面,可以显示腾讯公益4 ...
- C标准库 操作文件
C标准库 操作文件 数据持久化的两种方法:文件和数据库 文本文件和二进制文件 举个例子,写C++的代码,源代码为文本文件.编译出来的可执行文件(.exe)文件是二进制文件 文本文件 以文本的编码(AS ...
- ChatGPT帮助工程师写代码:从功能模块完善到成功执行,实现需求
在软件开发过程中,经常会遇到需要完善功能模块.调试代码和解决问题的情况.为了提高效率,我们可以借助人工智能技术,例如OpenAI的ChatGPT语言模型,来协助我们进行代码编写和调试.本文将介绍一个案 ...
- 如何使用CCXT交易数字货币现货
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 数字货币现货标准化接口 数字货币市场与股票.期货市场最大的不同点在于数字货币主流交易所数量很多.举个例子 ...
- 为什么Python是数据科学家的首选语言
这篇文章全面探讨了Python作为数据科学领域首选语言的原因.从Python的历史.特性,到在数据科学中的应用实例,再到与其他数据科学语言的比较,以及在实际企业中的应用,我们深入剖析了Python的优 ...
- C# LinearGradientBrush使用报错
今天在学习C#时使用 LinearGradientBrush 属性发生了如上错误,发现引用其时并没有提示 在添加了此命名空间后恢复正常
- VSCode中的快捷键
VS Code中的快捷键 文件和编辑操作 Ctrl+S:保存文件 Ctrl+K S:保存全部文件 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+X:剪切 Ctrl+F:查找 Ctrl+H:替换 C ...
- 【游戏开发笔记】编程篇_C#面向对象 {下}
@ 目录 7.定义类 7.1 C#中的类定义 7.1.1 接口的定义 7.1.2 修饰符 7.2 System.Object 7.3 构造函数和析构函数 7.4 结构类型 7.5 浅度和深度复制 8. ...
- python:map函数
参考示例 def test(x): return x * 2 mylist = [1, 2, 3, 4, 5] result = list(map(test, mylist)) print(resul ...