五分钟k8s入门到实战-应用配置

五分钟,k8s,入门,实战,应用,配置 · 浏览次数 : 43

小编点评

## ConfigMap 的定义 ConfigMap 是一个用于管理配置的对象,它可以将我们原本写在配置文件里的内容转存到 k8s 中,并和我们的 Container 进行绑定。 **配置选项:** * **apiVersion:v1**:表示该资源的 API 版本。 * **kind:ConfigMap**:表示该资源是配置对象的类型。 * **metadata:**表示该资源的元数据。 * **data:**表示该资源中的配置数据。 **示例:** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: k8s-combat-configmap data: PG_URL: "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable" ``` **使用 ConfigMap 的优点:** * 将配置数据从配置文件中加载到容器中。 * 避免手动配置多个容器。 * 提高应用程序的可靠性。 **使用 ConfigMap 的缺点:** * 配置数据只能是字符串类型。 * 配置数据大小不能超过 1MB。 **其他用途:** * 可以使用 Secret 来存储敏感数据。 * 可以使用 Secret 来存储配置数据。

正文

ConfigMap.png

背景

在前面三节中已经讲到如何将我们的应用部署到 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 这些第三方库来读取,所有配置都在一个文件中也更方便维护。

image.png
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入门到实战-应用配置相似的内容:

五分钟k8s入门到实战-应用配置

背景 在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力,x现在可以满足基本的应用开发需求了。 现在我们需要更进一步,使用 k8s 提供的一些其他对象来标准化我的应用开发。 首先就是 ConfigMap,从它的名字也可以看出这是用于管理配置的对象。 ConfigMap 不管

五分钟 k8s入门到实战--跨服务调用

![service.png](https://s2.loli.net/2023/09/05/GbZ1vKQNHY32wzD.png) # 背景 在做传统业务开发的时候,当我们的服务提供方有多个实例时,往往我们需要将对方的服务列表保存在本地,然后采用一定的算法进行调用;当服务提供方的列表变化时还得及时

五分钟k8s实战-使用Ingress

背景 前两章中我们将应用部署到了 k8s 中,同时不同的服务之间也可以通过 service 进行调用,现在还有一个步骤就是将我们的应用暴露到公网,并提供域名的访问。 这一步类似于我们以前配置 Nginx 和绑定域名,提供这个能力的服务在 k8s 中成为 Ingress。 通过这个描述其实也能看出 I

K8S 实用工具之五-kompose

开篇 📜 引言: 磨刀不误砍柴工 工欲善其事必先利其器 第一篇:《K8S 实用工具之一 - 如何合并多个 kubeconfig?》 第二篇:《K8S 实用工具之二 - 终端 UI K9S》 第三篇:《K8S 实用工具之三 - 图形化 UI Lens》 第四篇:《K8S 实用工具之四 - kubec

【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决

问题描述 创建Azure Kubernetes Service服务后,需要升级AKS集群的 kubernetes version。在AKS页面的 Cluster configuration 页面中,选择新的版本 1.25.5,确认升级。等待50分钟左右,却等到了升级失败的消息: Failed to

五分钟教你使用GitHub寻找优质项目

前言 经常会有同学会问如何使用GitHub找到自己想要的项目,今天咱们就出一期快速入门教程五分钟教你使用GitHub寻找优质项目。GitHub作为世界上最大的项目开源平台之一,上面有着无数优质的开源项目。善于使用它能够让你获得很多意想不到的惊喜。 首先解决访问慢的问题 FastGithub是GitH

一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队

责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加Code Review 的成本。

[转帖]Linux实用技巧——find查找指定时间内修改过的文件或目录

https://cloud.tencent.com/developer/article/1694949 解决方案 例:查找出五分钟内修改过的文件 [root@mobius ~]$ find ./* -mmin -5 加上-mmin 参数即可, 其中后面的 -5 即表示五分钟内修改过的, 如果是+5

Ansible 学习笔记 - 批量巡检站点 URL 状态

前言 不拖泥带水,不东拉西扯。 速战速决,五分钟学到一个工作用得上的技巧。 通过一个个具体的实战案例,来生动演示 Ansible 的用法。 需求 我需要定期巡检或定时监控我公司的所有站点的首页的可用性状态。 Ansible Playbook 实战脚本 check_url_status.yml 如下:

用【游乐场】说清楚“硬件、操作系统、跨平台、应用软件、开发语言、代码”的关系

经常有小伙伴对一些计算机技术和概念不太清楚,产生很多误区,甚至张冠李戴,在一起聊天时又很难给对方解释清楚,经过苦思冥想,终于想到一些比喻,能够很好地阐述了“硬件、操作系统、跨平台、应用软件、开发语言、代码”之间的关系。 硬件 陆地(Intel)与海洋(AMD):硬件就像是一个广阔的自然环境,其中In