K8S-volume存储之configmap

ConfigMap顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。

ConfigMaps允许你将配置构件与映像内容解耦,以保持容器化应用程序的可移植性。configmap 可以从文件、目录或者 key-value 字符串创建等创建 ConfigMap。也可以通过 kubectl create -f从描述文件创建。可以使用 kubectl create创建命令。创建ConfigMap的方式有4种:

从key-value字符串创建,官方翻译是从字面值中创建ConfigMap。

语法规则

案例

在使用kubectl get获取资源信息的时候,可以通过-o(--output简写形式)指定信息输出的格式,如果 指定的是yaml或者json输出的是资源的完整信息,实际工作中,输出内容过少则得不到我们想要的信息,输 出内容过于详细又不利于快速定位的我们想要找到的内容,其实-o输出格式可以指定为go-template然后 指定一个template,这样我们就可以通过go-template获取我们想要的内容.go-template与 kubernetes无关,它是go语言内置的一种模板引擎.这里不对go-template做过多解释,仅介绍在 kubernetes中获取资源常用的语法,想要获取更多内容,大家可以参考相关资料获取帮助。大家记住是固 定语法即可。

创建一个配置文件:jdbc.properties

语法规则如下:当 --from-file指向一个目录,每个目录中的文件直接用于填充ConfigMap中的 key,key的名称是文件名称,value的值是这个文件的内容。下面的命令读取/data目录下的所有文件

kubectl create configmap cumulx-test --from-file=/data/

kubectl create configmap myjdbcconfigmap --from-file=/data/jdbc.properties

查看configmap详细信息

kubectl describe configmaps myjdbcmap

data/mariadbconfigmap.yml

configmap/mariadbsecret.yml

configmap/mariadb.yml--需要再次整理,加入私服镜像信息

注意修改pod的端口号为3307,service的targetPort端口号为3307

freemarker生成go语言

主要通过以下几个过程生成:

(一)编写模板文件

(二)配置FreeMarker

(三)统一文件生成工具

(四)数据库操作

(五)封装填充数据

FreeMarker是一款模板引擎:即一种基于模板和动态数据,用于输出文本的通用工具。

FreeMarker模板使用FreeMarker Template Language(FTL)编写,它是一种简单的、专用的语言。

代码生成器的实现原理十分简单,就是根据数据库的某一个或多个业务表的结构,生成对应的Entity.java、Dao.java、Service.java、Controller.java、Mapper.xml文件

golang模板引擎动态读取sql

可以。golang模板引擎动态可以读取sql。text/template是Go语言标准库,实现数据驱动模板以生成文本输出,可以理解为一组文字按照特定格式动态嵌入另一组文字中。

用docker搭建一个高可用可扩展的服务支撑系统怎么做

一种方案为Haproxy+etcd+confd,采用松散式的组织结构,但各个组件之间的通讯是非常严密的,且扩展性更强,定制也更加灵活。

一、架构优势

约定由Haproxy+etcd+confd+Docker构建的基础服务平台简称“HECD” 架构,整合了多种开源组件,看似松散的结构,事实上已经是一个有机的整体,它们互相联系、互相作用,是Docker生态圈中最理想的组合之一,具有以下优势:

自动、实时发现及无感知服务刷新;

支持任意多台Docker主宿机;

支持多种APP接入且打散至不分主宿机;

采用Etcd存储信息,集群支持可靠性高;

采用Confd配置引擎,支持各类接入层,如Nginx;

支持负载均衡、故障迁移;

具备资源弹性,伸缩自如(通过生成、销毁容器实现);

二、架构说明

在HECD架构中,首先管理员操作Docker Client,除了提交容器(Container)启动与停止指令外,还通过REST-API方式向Etcd(K/V)存储组件注册容器信息,包括容器名称、主宿机IP、映射端口等。Confd配置组件会定时查询Etcd组件获取最新的容器信息,根据定义好的配置模板生成Haproxy配置文件Haproxy.cfg,并且自动reload haproxy服务。用户在访问业务服务时,完全没有感知后端APP的上线、下线、切换及迁移,达到了自动发现、高可用的目的。详细架构图见图1-1。

图1-1 平台架构图

为了方便大家理解各组件间的关系,通过图1-2进行架构流程梳理,首先管理员通过Shell或API操作容器,下一步将容器信息注册到Etcd组件,Confd组件会定时查询Etcd,获取已经注册到Etcd中容器信息,最后通过Confd的模板引擎生成Haproxy配置,整个流程结束。

图1-2架构流程图

了解架构流程后,我们逐一对流程中各组件进行详细介绍。

1、Etcd介绍

Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。

简单:支持 curl 方式的用户 API (HTTP+JSON)

安全:可选 SSL 客户端证书认证

快速:单实例可达每秒 1000 次写操作

可靠:使用 Raft 实现分布式

2、Confd介绍

Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。

3、Haproxy介绍

HAProxy是提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。(来源百科) 

三、架构部署

平台环境基于Centos6.5+Docker1.2构建,其中Etcd的版本为etcd version 0.5.0-alpha,Confd版本为confd 0.6.2,Haproxy版本为HA-Proxy version 1.4.24。下面对平台的运行环境、安装部署、组件说明等进行详细说明,环境设备角色表如下:

1、组件安装

1.1 Docker安装

SSH终端登录192.168.1.22服务器,执行以下命令:

# yum -y install docker-io   

# service docker start   

# chkconfig docker on  

1.2 Haproxy、confd安装

SSH终端登录192.168.1.20服务器,执行以下命令:

1、haproxy   

# yum –y install haproxy   

2、confd   

# wget   

# mv confd /usr/local/bin/confd   

# chmod +x /usr/local/bin/confd   

# /usr/local/bin/confd -version   

confd 0.6.2  

1.3 Etcd安装

SSH终端登录192.168.1.21服务器,执行以下命令: 

# yum -y install golang   

# mkdir -p /home/install cd /home/install   

# git clone   

# cd etcd   

# ./build   

# cp bin/etcd /bin/etcd   

# /bin/etcd -version   

etcd version 0.5.0-alpha  

2、组件配置   

2.1 Etcd配置

由于etcd是一个轻量级的K/V存储平台,启动时指定相关参数即可,无需配置。

# /bin/etcd -peer-addr 192.168.1.21:7001 -addr 192.168.1.21:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001  

由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。    

由于etcd是通过REST-API方式进行交互,常见操作如下:

1) 设置(set) key操作  

# curl -L  -d value="this is awesome"   

{"action":"set","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 

2) 获取(get) key信息

# curl -L   

{"action":"get","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}  

3) 删除key信息

# curl -L          {"action":"delete","node":{"key":"/mykey","modifiedIndex":29,"createdIndex":28},"prevNode":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}}   更多操作API见。 

2.2 Confd+Haproxy配置

由于Haproxy的配置文件是由Confd组件生成,要求Confd务必要与haproxy安装在同一台主机上,Confd的配置有两种,一种为Confd资源配置文件,默认路径为“/etc/confd/conf.d”目录,另一种为配置模板文件,默认路径为“/etc/confd/templates”。具体配置如下:

创建配置文件目录

# mkdir -p /etc/confd/{conf.d,templates}

(1)配置资源文件   

详细见以下配置文件,其中“src”为指定模板文件名称(默认到路径/etc/confd/templates中查找);“dest”指定生成的Haproxy配置文件路径;“keys”指定关联Etcd中key的URI列表;“reload_cmd”指定服务重载的命令,本例中配置成haproxy的reload命令。

【/etc/confd/conf.d/ haproxy.toml】 

[template]  

src = "haproxy.cfg.tmpl"  

dest = "/etc/haproxy/haproxy.cfg"  

keys = [  

 "/app/servers",  

]  

reload_cmd = "/etc/init.d/haproxy reload"  

(2)配置模板文件  

Confd模板引擎采用了Go语言的文本模板,更多见,具备简单的逻辑语法,包括循环体、处理函数等,本示例的模板文件如下,通过range循环输出Key及Value信息。

【/etc/confd/templates/haproxy.cfg.tmpl】 

global  

       log 127.0.0.1 local3  

       maxconn 5000  

       uid 99  

       gid 99  

       daemon  

 

defaults  

       log 127.0.0.1 local3  

       mode http  

       option dontlognull  

       retries 3  

       option redispatch  

       maxconn 2000  

       contimeout  5000  

       clitimeout  50000  

       srvtimeout  50000  

 

listen frontend 0.0.0.0:80  

       mode http  

       balance roundrobin  

       maxconn 2000  

       option forwardfor  

       {{range gets "/app/servers/*"}}  

       server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2  

       {{end}}  

 

       stats enable  

       stats uri /admin-status  

       stats auth admin:123456  

       stats admin if TRUE  

(3)模板引擎说明  

本小节详细说明Confd模板引擎基础语法与示例,下面为示例用到的KEY信息。

# curl -XPUT  value="192.168.1.22:49156"   

# curl -XPUT  value="192.168.1.22:49158"   

# curl -XPUT  value="192.168.1.22:49160"   

# curl -XPUT  value="192.168.1.22:49162"1、base   

作为path.Base函数的别名,获取路径最后一段。 

{{ with get "/app/servers/prickly_blackwell"}}

server {{base .Key}} {{.Value}} check 

{{end}}

prickly_blackwell 192.168.1.22:49162

2、get

返回一对匹配的KV,找不到则返回错误。

{{with get "/app/servers/prickly_blackwell"}}

key: {{.Key}}

value: {{.Value}} 

{{end}}

/app/servers/prickly_blackwell 192.168.1.22:49162  

3、gets  

{{range gets "/app/servers/*"}}

{{.Key}} {{.Value}}

{{end}} 

/app/servers/backstabbing_rosalind 192.168.1.22:49156  

/app/servers/cocky_morse 192.168.1.22:49158  

/app/servers/goofy_goldstine 192.168.1.22:49160  

app/servers/prickly_blackwell 192.168.1.22:49162

4、getv

返回一个匹配key的字符串型Value,找不到则返回错误。

{{getv "/app/servers/cocky_morse"}}

192.168.1.22:49158  

5、getvs

返回所有匹配key的字符串型Value,找不到则返回错误。

{{range getvs "/app/servers/*"}}

value: {{.}}

{{end}} 

value: 192.168.1.22:49156  

value: 192.168.1.22:49158  

value: 192.168.1.22:49160  

value: 192.168.1.22:49162  

6、split

对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。

{{ $url := split (getv "/app/servers/cocky_morse") ":" }}

host: {{index $url 0}}

port: {{index $url 1}}

host: 192.168.1.22  

port: 49158  

7、ls

返回所有的字符串型子key,找不到则返回错误。 

{{range ls "/app/servers/"}}

subkey: {{.}} 

{{end}}

subkey: backstabbing_rosalind  

subkey: cocky_morse  

subkey: goofy_goldstine  

subkey: prickly_blackwell  

8、lsdir

返回所有的字符串型子目录,找不到则返回一个空列表。 

{{range lsdir "/app/"}}

subdir: {{.}} 

{{end}}

subdir: servers

(4)启动confd及haproxy服务

下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址,以便获取容器信息。 

# /usr/local/bin/confd -verbose -interval 10 -node '192.168.1.21:4001' -confdir /etc/confd /var/log/confd.log  

# /etc/init.d/haproxy start nbsp;

golang 使用twig模板引擎,站在php的肩膀上!

和有些小伙伴一样,本人是从php转到了go,从事php时使用symfony框架一直享受其丰富的功能带来的便利,转到其他语言时比较直观的感觉就是twig真强,为什么其他语言没有扩展twig呢?

虽然前后端的开发模式,让模板引擎这个东西慢慢淡去,但是有时候还是需要用到这种东西,所以就有了,go调用php实现twig模板引擎的想法。

原理,go 通过exec.Command调用php,通过STDIN,STDOUT 方式进行数据交互

go在初始化阶段提供一些配置参数,比如模板引擎的为止,是否为开发环境等,php接收数据并初始化

初始换环境完毕后,当需要渲染模板,go再讲模板文件和数据以json字符串的形式写入STDIN告知php,

php接收到数据后,解析数据,选取指定的模板并渲染,然后通过STDOUT返回给go

这样一次渲染就结束了

整理好的文件打包在github上了

如果喜欢就动动你的小手指点个赞,star一下吧!

golang web开发页面传值怎么传

如果你是指两个页面之间的传值,那么可以这么做:

简单的话,可以通过URL传值,比如

可以通过读取url的参数name获得gem。

也可以通过session,cookie等方法,这两种方法就有一些限制,比如换个浏览器,session和cookie就不一样了,那么你传的值就不存在了。

所以第一种会比较通用。

如果是传值给模板(一般是模板引擎之类的,比如html/template),这些教程很多,搜一下比较快速解决