首页 > 其他分享 >Kubernetes 中使用consul-template渲染配置

Kubernetes 中使用consul-template渲染配置

时间:2023-10-27 15:15:08浏览次数:39  
标签:Kubernetes 渲染 consul template nodes ca 模板

Kubernetes 中使用consul-template渲染配置

当前公司使用consul来实现服务发现,如Prometheue配置中的target和alertmanager注册都采用了consul服务发现的方式,以此来灵活应对服务的变更。但对于其他服务,是否也有一个通用的方式来使用consul管理配置文件?本文中描述如何使用consul-template来渲染配置文件。

使用方式

consul-template是hashicorp开发的一个模板渲染工具,它采用了Go template语法。可以将其配置为守护进程模式,watch consul服务的变动,并将变动后的服务渲染到配置文件中。会虽然名字中带了consul,但它还可以对 VaultNomad 进行渲染。

简单使用方式如下,首先要创建一个模板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泄露。

整个处理方式如下图所示:

image
配置文件方式

上面通过命令行的方式(-template "in.tpl:out.txt")指定了模版和渲染结果,但这种方式只适用于渲染单个模板,如果需要渲染多个模板,可以采用配置文件的方式。

配置文件语法采用的是hcl,包含三部分:服务端(ConsulVaultNomad)、TemplatesModes,以及可选字段。服务端主要用于配置到服务端(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 ),以及一些公共函数(如trimregexMatchreplaceAll等)。

模板语法中比较重要的两点:

  • 在模板文本中,一切动态的内容和判断代码块均使用 {{}} 包括起来,在 {{}} 之外的文本均会被原封不动地拷贝到输出中
  • 为了方便格式化模板源代码,还额外提供了 {{--}} 两种语法,可以将代码块前或代码块后的空白字符均移除。空白字符包括空格符、换行符、回车符、水平制表符。

举例

下面是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"
    }
}
  1. 首先定义一个变量$nodes,用于保存最终的结果
  2. 遍历consul的service elasticsearch,获取Node字段(如dev-logging-elkclient000001.local)和Port字段(本例中只有9200)
  3. 通过内置方法regexMatchelasticsearch的节点中过滤所需的节点
  4. 通过printf方法拼接字符串,并将结果保存到$nodes
  5. 最后在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,nodes,ca,模板
From: https://www.cnblogs.com/charlieroro/p/17789053.html

相关文章

  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等。当然还有切换共享文件存储的需求,在第一次安装Rainbond时,大多数都......
  • 「译文」深入了解Kubernetes和Nomad
    ......
  • Kubernetes 迁移节点 Kubelet 数据存储目录
    1、概述默认Kubernetes节点Kubelet数据目录在/var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这可能会引发一些问题:磁盘空间限制:系统根目录通常具有较小的磁盘空间,用于操作系统文件和应用程序。将Kubelet数据与操作系统混合存储可能导致磁盘空......
  • kubernetes+docker+kubeadm快速安装
    1.Kubernetes1.27发布2023年4月13日,Kubernetes1.27正式发布,这是2023年的第一个版本。这个版本包括60项增强功能。其中18项增强功能进入Alpha、29项进入Beta,还有13项升级为Stable稳定版。2.环境准备2.1主机操作系统操作系统及版本备注CentOS7.9......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • 从Docker到Kubernetes
    1简介1.1什么是容器传统的虚拟化技术,比如VMWare,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十GB)。如图所示,由于所有的容器共享同一个HostOS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系......
  • Kubernetes 100个常用命令
    转载https://mp.weixin.qq.com/s/pWj-ni5fuHLaK2AR-4gqqQ100个Kubectl命令,这些命令对于诊断Kubernetes集群中的问题非常有用。这些问题包括但不限于:• 集群信息• Pod诊断• 服务诊断• 部署诊断• 网络诊断• 持久卷和持久卷声明诊断• 资源......
  • 微服务 – Spring Cloud – consul 安装、服务注册、服务发现
    微服务–SpringCloud–consul安装、服务注册、服务发现文章目录微服务–SpringCloud–consul安装、服务注册、服务发现whatisconsul?功能安装Consul服务注册服务发现whatisconsul?HashiCorpConsulisaservicenetworkingsolutionthatenablesteamstoman......
  • Kubernetes:kube-apiserver 之启动流程(一)
    0.前言前面两篇文章Kubernetes:kube-apiserver之scheme(一)和Kubernetes:kube-apiserver之scheme(二)重点介绍了kube-apiserver中的资源注册表scheme。这里进入正题,开始介绍kube-apiserver的核心实现。1.kube-apiserver启动流程kube-apiserver使用Cobra作为......