情感测试简介

首页 » 常识 » 问答 » k8s学习之路04配置应用程序
TUhjnbcbe - 2021/5/4 7:41:00
设计求职招聘微信群 http://www.91np.cn/chaoliu/xinchao/459.html

这是一份个人学习k8s的学习笔记,打算是做成一个系列,分享是最好的学习方式。

k8s学习之路系列:k8s学习之路k8s学习之路k8s学习之路附录:设计模式——基于容器的分布式系统

使用Docker部署应用程序时,一般常用的配置方式有:

配置内嵌启动传参配置环境变量

经过前面容器持久化存储的介绍,我们很容易能想到是以挂载卷的形式,比如:

gitRepohostPathNFS

再结合边车模式来进行配置文件的管控是可行的,然而有一种更加简便的方法能将配置数据置于Kubernetes的顶级资源对象中,那就是ConfigMap。

传递命令行参数

在上一节容器持久化存储的emptyDir概念介绍部分,我们引入了一个fortune-pod的例子,再回顾一下之前的配置文件吧,如下:

apiVersion:v1kind:Podmetadata:name:fortunespec:containers:-image:luksa/fortunename:html-generatorvolumeMounts:-name:htmlmountPath:/var/htdocs-image:nginx:alpinename:web-servervolumeMounts:-name:htmlmountPath:/usr/share/nginx/htmlreadOnly:trueports:-containerPort:80protocol:TCPvolumes:-name:htmlemptyDir:{}

此应用程序设定了每隔10s就会自动生成输出到html,现在我们要做的是通过命令行参数,自行设定隔多少秒自动生成内容。

创建文件fortune-pod-args.yaml,输入以下内容:

apiVersion:v1kind:Podmetadata:name:fortune2sspec:containers:-image:luksa/fortune:argsargs:["2"]name:html-generatorvolumeMounts:-name:htmlmountPath:/var/htdocs-image:nginx:alpinename:web-servervolumeMounts:-name:htmlmountPath:/usr/share/nginx/htmlreadOnly:trueports:-containerPort:80protocol:TCPvolumes:-name:htmlemptyDir:{}

看到配置文件中的args字段了么?这个就是传给镜像luksa/fortune:args控制时间的参数,让我们启动看看吧。

kubectlcreate-ffortune-pod-args.yaml#输出pod/fortune2screated#查看状态kubectlgetpods#输出NAMEREADYSTATUSRESTARTSAGEfortune2/2Running02m27s#暂时服务化kubectlport-forwardfortune2s:80

访问.0.0.1:就会发现输出的频率变成了2s:

curl.0.0.1:Stayawayfromflyingsaucerstoday.设置环境变量

与容器的命令和参数设置相同,环境变量列表无法在pod创建后被修改

设置环境变量非常简单,我们只需要在pod中指定环境变量即可;当然,这里有个前提是你需要将修改镜像让其支持读取环境变量。

我们直接使用书中的例子:vimfortune-pod-env.yaml:

apiVersion:v1kind:Podmetadata:name:fortune-envspec:containers:-image:luksa/fortune:envenv:-name:INTERVALvalue:"30"name:html-generatorvolumeMounts:-name:htmlmountPath:/var/htdocs-image:nginx:alpinename:web-servervolumeMounts:-name:htmlmountPath:/usr/share/nginx/htmlreadOnly:trueports:-containerPort:80protocol:TCPvolumes:-name:htmlemptyDir:{}

可以看到配置中声明了INTERVAL环境变量值为30,在终端中实践一下:

kubectlcreate-ffortune-pod-env.yaml#输出pod/fortune-envcreated#查看状态kubectlgetpods#输出NAMEREADYSTATUSRESTARTSAGEfortune-env2/2Runnings#暂时服务化kubectlport-forwardfortune-env:80

访问.0.0.1:就会发现输出的频率变成了30s。

现在应用程序的所有配置基本上可以说是硬编码的形式进行配置,并且yaml配置文件总是有配置相关的字段,有没有办法让镜像和配置文件解耦呢?

k8s提供了名为ConfigMap的资源对象解决这个问题。

ConfigMap

资源对象Con?gMap提供了向容器中注入配置信息的机制,它本质上就是一个键/值对映射,可以用来保存单个值或者配置文件。

Con?gMap是不需要被读取的,它映射的内容通过环境变量或者卷文件的形式传给容器。一般直接在pod的定义里面就可以声明Con?gMap,这样就可以根据不同的环境创建不同的配置,流程交互如下图所示:

image-创建

还是用之前应用程序为例,配置专注于环境变量INTERVAL,创建命令如下所示:

kubectlcreateconfigmapfortune-config--from-literal=sleep-interval=25#输出configmap/fortune-configcreated#获取相关描述kubectlgetconfigmapfortune-config-oyaml#查看configmapkubectlgetconfigmap#删除kubectldeleteconfigmapfortune-config

此外,k8s还可以直接填写配置文件来进行创建vimfortune-config.yaml,输入如下内容:

apiVersion:v1kind:ConfigMapmetadata:name:fortune-configdata:sleep-interval:"25"

然后执行:

kubectlcreate-ffortune-config.yaml#输出configmap/fortune-configcreated

其实还有更多的创建方式,大概提一下:

#从文件内容创建ConfigMap条目kubectlcreateconfigmapmy-config--from-file=config-file.conf#从文件夹创建ConfigMapkubectlcreateconfigmapmy-config--from-file=/path/to/dir#合并不同选项kubectlcreateconfigmapmy-config--from-file=foo.json--from-file=bar=foobar.conf--from-file=config-opts/--from-literal=some=thing作为环境变量传入容器

如何将映射中的值传递给pod的容器?最简单的方法是给容器设置环境变量,通过在配置中声明valueFrom,具体操作vimfortune-pod-env-configmap.yaml:

apiVersion:v1kind:Podmetadata:name:fortune-env-from-configmapspec:containers:-image:luksa/fortune:envenv:-name:INTERVALvalueFrom:configMapKeyRef:name:fortune-configkey:sleep-intervalname:html-generatorvolumeMounts:-name:htmlmountPath:/var/htdocs-image:nginx:alpinename:web-servervolumeMounts:-name:htmlmountPath:/usr/share/nginx/htmlreadOnly:trueports:-containerPort:80protocol:TCPvolumes:-name:htmlemptyDir:{}

让我们启动pod实践看看:

kubectlcreate-ffortune-pod-env-configmap.yaml#输出pod/fortune-env-from-configmapcreated#查看状态kubectlgetpods#输出NAMEREADYSTATUSRESTARTSAGEfortune-env-from-configmap2/2Runnings#暂时服务化kubectlport-forwardfortune-env-from-configmap:80#删除podkubectldeletepodsfortune-env-from-configmap

现在我们已经成功在pod中使用了ConfigMap资源,不过这种使用方式是比较低效的,考虑这样一个情况:如果环境变量比较多,这样单独一个个环境变量的设置方式是个程序员都没法忍受的。

一般在框架里面加载一些环境变量都会利用前缀机制来进行批量加载,比如Sanic框架会读取SANIC_开头的环境变量自动加载。

k8s也提供了这样类似的机制,配置声明如下图示:

image-ConfigMap卷

环境变量或者命令行参数值作为配置值通常适用于变量值较短的场景。由于ConfigMap中可以包含完整的配置文件内容,当你想要将其暴露给容器时,可以借助前面章节提到过的一种称为configMap卷的特殊卷格式。

首先删除前面声明建立的cf资源:kubectldeleteconfigmapfortune-config。然后建立文件夹configmap-files,首先建立Nginx配置文件:vimmy-nginx-config.conf:

server{listen80;server_name

1
查看完整版本: k8s学习之路04配置应用程序