背景

在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力,x现在可以满足基本的应用开发需求了。

现在我们需要更进一步,使用 k8s 提供的一些其他对象来标准化我的应用开发。

首先就是 ConfigMap,从它的名字也可以看出这是用于管理配置的对象。

ConfigMap

不管我们之前是做 JavaGo 还是 Python 开发都会使用到配置文件,而 ConfigMap 的作用可以将我们原本写在配置文件里的内容转存到 k8s 中,然后和我们的 Container 进行绑定。

存储到环境变量

绑定的第一种方式就是将配置直接写入到环境变量,这里我先定义一个 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
name: k8s-combat-configmap
data:
PG_URL: "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable"

重点是 data 部分,存储的是一个 KV 结构的数据,这里存储的是一个数据库连接。

需要注意,KV 的大小不能超过 1MB

接着可以在容器定义中绑定这个 ConfigMap 的所有 KV 到容器的环境变量:

# Define all the ConfigMap's data as container environment variables
envFrom:
- configMapRef:
name: k8s-combat-configmap

我将 ConfigMap 的定义也放在了同一个 deployment 中,直接 apply:

❯ k apply -f deployment/deployment.yaml
deployment.apps/k8s-combat created
configmap/k8s-combat-configmap created

此时 ConfigMap 也会被创建,我们可以使用

❯ k get configmap
NAME DATA AGE
k8s-combat-configmap 1 3m17s ❯ k describe configmap k8s-combat-configmap
Data
====
PG_URL:
----
postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable

拿到刚才声明的配置信息。


同时我在代码中也读取了这个环境变量:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
name, _ := os.Hostname()
url := os.Getenv("PG_URL")
fmt.Fprint(w, fmt.Sprintf("%s-%s", name, url))
})

访问这个接口便能拿到这个环境变量:

root@k8s-combat-7b987bb496-pqt9s:/# curl http://127.0.0.1:8081
k8s-combat-7b987bb496-pqt9s-postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable root@k8s-combat-7b987bb496-pqt9s:/# echo $PG_URL
postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable

存储到文件

有些时候我们也需要将这些配置存储到一个文件中,比如在 Java 中可以使用 spring 读取,Go 也可以使用 configor 这些第三方库来读取,所有配置都在一个文件中也更方便维护。



ConfigMap 中新增了一个 key:APP 存放了一个 yaml 格式的数据,然后在容器中使用 volumesvolumeMounts 将数据挂载到容器中的指定路径/go/bin/app.yaml

apply 之后我们可以在容器中查看这个文件是否存在:

root@k8s-combat-7b987bb496-pqt9s:/# cat /go/bin/app.yaml
name: k8s-combat
pulsar:
url: "pulsar://localhost:6650"
token: "abc"

配置已经成功挂载到了这个路径,我们便可以在代码中读取这些数据。

Secret

可以看到 ConfigMap 中是明文存储数据的;

k describe configmap k8s-combat-configmap

可以直接查看。

对一些敏感数据就不够用了,这时我们可以使用 Secret:

apiVersion: v1
kind: Secret
metadata:
name: k8s-combat-secret
type: Opaque
data:
PWD: YWJjCg== ---
env:
- name: PG_PWD
valueFrom:
secretKeyRef:
name: k8s-combat-secret
key: PWD

这里我新增了一个 Secret 用于存储密码,并在 container 中也将这个 key 写入到环境变量中。

❯ echo 'abc' | base64
YWJjCg==

Secret 中的数据需要使用 base64 进行编码,所以我这里存储的是 abc.

apply 之后我们再查看这个 Secret 是不能直接查看原始数据的。

❯ k describe secret k8s-combat-secret
Name: k8s-combat-secret
Type: Opaque Data
====
PWD: 4 bytes

Secret 相比 ConfigMap 多了一个 Type 选项。

我们现阶段在应用中用的最多的就是这里的 Opaque,其他的暂时还用不上。

总结

在实际开发过程中研发人员基本上是不会直接接触 ConfigMap,一般会给开发者在管理台提供维护配置的页面进行 CRUD。

由于 ConfigMap 依赖于 k8s 与我们应用的语言无关,所以一些高级特性,比如实时更新就无法实现,每次修改后都得重启应用才能生效。

类似于 Java 中常见的配置中心:Apollo,Nacos 使用上会有不小的区别,但这些是应用语言强绑定的,如果业务对这些配置中心特性有强烈需求的话也是可以使用的。

但如果团队本身就是多语言研发,想要降低运维复杂度 ConfigMap 还是不二的选择。

下一章节会更新大家都很感兴趣的服务网格 Istio,感兴趣的朋友多多点赞转发。

本文的所有源码和资源文件在这里可以访问:

https://github.com/crossoverJie/k8s-combat

五分钟k8s入门到实战-应用配置的更多相关文章

  1. 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子

    一.启动服务自动打开浏览器运行 二.配置简要说明 1.node_modules 安装好的依赖文件,中间件等,所在位置 2.package.jason 配置当前项目要安装的中间件和依赖文件 { &quo ...

  2. webpack入门和实战(一):webpack配置及技巧

    一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...

  3. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  4. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  5. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  6. Ionic 入门与实战之第三章:Ionic 项目结构以及路由配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第三章,主要对 Ionic 的项目结构作了介绍,并讲解了Ionic 中的路由概念以及相关配置. 原文发表于我的技术博客 1. Ioni ...

  7. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  8. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

  9. 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF

    1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载  链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...

  10. Nginx入门到实战

    location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上. 比如, 碰 ...

随机推荐

  1. jvm中类和对象定义存储基础知识

    1 类文件数据结构类型 Class文件结构主要有两种数据结构:无符号数和表 •无符号数:用来表述数字,索引引用.数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节, ...

  2. C++面试八股文:知道std::unordered_set/std::unordered_map吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面: 面试官:知道std::unordered_set/std::unordered_map吗? 二师兄:知道.两者都是C++11引入的新容器, ...

  3. 如何构建高效、可观的系统「GitHub 热点速览」

    经典老项目 system-design 教你如何设计一个健壮的系统,新项目 noodle 教你如何提升教育效率,而后者甚至单日获得了 1,600 star,刚开源就获得了 6k+ 的 star. 除了 ...

  4. 将mongodb注册成windows(win10)的服务

    首先参考这个大佬的文章: 下载mongodb 然后解压 为了方便路径,我改了个名字MongoDB, 然后把它拖到了c盘的Program Files文件夹中 这样他的路径就是 (这个路径在很多地方都要用 ...

  5. 2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目

    2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目 ...

  6. 七 APPIUM Android 定位方式(转)

    1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElemen ...

  7. 浏览器工作原理及V8引擎

    浏览器解析过程 当浏览器加载html资源时,会进行如下的解析过程 遇见 HTML 标记,构建 DOM 树 遇见 style/link 标记调用相应解析器处理CSS标记,并构建出CSS样式树 遇见 sc ...

  8. 论文解读(CTDA)《Contrastive transformer based domain adaptation for multi-source cross-domain sentiment classification》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Contrastive transformer based domain adaptation for m ...

  9. 2023-08-24:请用go语言编写。给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续的K个数全修改成任意一个值, 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长。 请输出

    2023-08-24:请用go语言编写.给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续的K个数全修改成任意一个值, 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长. 请输出 ...

  10. [Lua][Love] "图块集与地图" 加载显示功能 TileMap

    效果 安装库 安装两个库,分别用来读xml和csv,如果有luarocks,执行下列命令 luarocks install xml2lua luarocks install ftcsv manoelc ...