共计 2694 个字符,预计需要花费 7 分钟才能阅读完成。
背景
在后面三节中曾经讲到如何将咱们的利用部署到 k8s 集群并提供对外拜访的能力,x 当初能够满足根本的利用开发需要了。
当初咱们须要更进一步,应用 k8s 提供的一些其余对象来标准化我的利用开发。
首先就是 ConfigMap
,从它的名字也能够看出这是用于治理配置的对象。
ConfigMap
不论咱们之前是做 Java
、Go
还是 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
格局的数据,而后在容器中应用 volumes
和 volumeMounts
将数据挂载到容器中的指定门路 /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