本实战练习系列的前四篇文章:
- 适宜 Kubernetes 初学者的一些实战练习 (一)
- 适宜 Kubernetes 初学者的一些实战练习 (二)
- 适宜 Kubernetes 初学者的一些实战练习 (三)
- 适宜 Kubernetes 初学者的一些实战练习 (四)
本文持续咱们的 Kubernetes 实战练习之旅。
练习1 - 将 configmap 通过环境变量注入到 pod 里
在 Kubernetes 官网里,已经提到 Kubernetes 里的一个最佳实际(Best Practice)就是把利用代码同配置信息离开,一种形式就是应用 Kubernetes 1.2 里引入的 configmap
概念。
configmap 实际上就是一系列键值对,存储于 etcd 里。etcd 的官网有这样一句话:
etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data.
etcd 是一个高性能的分布式键值对存储库,用于存储和拜访要害数据。
应用上面的命令行创立一个 Kubernetes config map:
kubectl create configmap test-config --from-literal=test.type=unit --from-literal=test.exec=always
创立一个名为 test-config
的键值对,key 为 test.type,值为 unit,key 为test.exec, 值为 always.
上面我打算创立一个 pod,生产这个名为 test-config 的 configmap.
创立一个内容如下的 yaml 文件:
apiVersion: v1kind: Podmetadata:name: test-configmapspec:containers:- name: test-containerimage: alpine:3.8command: [ "/bin/sh", "-c", "env" ]env:- name: TEST_TYPEvalueFrom:configMapKeyRef:name: test-configkey: test.type- name: TEST_EXECvalueFrom:configMapKeyRef:name: test-configkey: test.execrestartPolicy: Never
这个 yaml 文件定义的 pod 基于 docker 镜像 alpine,执行 shell 命令 /bin/sh -c env
查看环境变量。
在 env 区域,我给该 pod 注入一个名为 TEST_TYPE 的环境变量,值从 configMap 键值对的键名称为 test.type 的值中取。
kubectl create -f 创立这个 pod:
应用命令 kubectl logs test-configmap
查看这个 pod 运行生成的日志,发现输入的环境变量列表中,呈现了 TEST_TYPE=unit
,这个 TEST_TYPE 是我在 yaml 文件里注入的环境变量名称,而 unit 就来自 configmap 里 test-config 的值 unit.
练习2 - 通过一个基于 PostgreSQL 的具体例子学习 Kubernetes Stateful Set
Stateful Set 是 Kubernetes 1.9 版本新引入的一个概念,用于治理有状态的利用。
Kubernetes StatefulSet 由以下几个局部组成:
- 用于定义网络标记(DNS domain)的 Headless Service
- 用于创立 PersistentVolumes 的 volumeClaimTemplates
- 定义具体利用的 StatefulSet
上面是一个理论利用中的 StatefulSet 的 yaml 文件:
apiVersion: apps/v1kind: StatefulSetmetadata:name: ads-db-statefulsetlabels:component: adsmodule: dbspec:serviceName: ads-db-servicereplicas: 1selector:matchLabels:component: adsmodule: dbtemplate:metadata:labels:component: adsmodule: dbspec:volumes:- name: initsecret:secretName: ads-db-secretitems:- key: initdb.sqlpath: initdb.sqlcontainers:- name: ads-db-podimage: postgres:9.6ports:- containerPort: 5432name: ads-db-portvolumeMounts:- name: ads-db-volumemountPath: /var/lib/postgresql/data/- name: initmountPath: /docker-entrypoint-initdb.d/env:- name: PGDATAvalueFrom:configMapKeyRef:name: ads-db-configmapkey: pgdata_value- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: ads-db-secretkey: postgres_password_valuevolumeClaimTemplates:- metadata:name: ads-db-volumelabels:component: adsmodule: dbspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi
应用 kubectl get statefulset
查看生成的 statefulset:
生成的 headless service:
生成的 pod:
当我把 statefulset yaml 文件里的 replicas 从 1 改成 3 之后,果然察看到有两个新的 pod 正在启动,并且名称满足命名标准<stateful set name >-X
.
应用 kubectl describe
查看创立的 statefulset 明细:
statefulSet 主动创立的 persistentVolumeClaim:
应用上面的命令登录到 statefulset 提供的 PostgreSQL 服务器上:
kubectl run tester -it --rm --image=postgres:9.6 --env="PGCONNECT_TIMEOUT=5" --command -- bash
看到 root$ 之后,阐明咱们曾经连贯上 pod 了。
应用如下命令行连贯 PostgreSQL 服务器:
psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads
当然如果不必命令行,也能够应用 pgadmin,以图形化界面连贯 statefulSet 里的 postgreSQL 服务器:
sudo apt install pgadmin3
进行端口转发,这样咱们能够应用 localhost:5432
进行连贯:
kubectl port-forward ads-db-statefulset-0 5432:5432
也能胜利连贯:
总结
本文介绍了如何将 ConfigMap 通过环境变量的形式注入到 Kubernetes Pod 之中,这也是 Kubernetes 官网举荐的利用代码同配置信息拆散的最佳实际思路,在理论我的项目中的体现。本文第二局部通过将 PostgreSQL 服务器实例运行在 Stateful Set 上的例子,介绍了 Kubernetes Stateful Set 在理论我的项目中的一个利用场景。
本系列前四篇文章能够通过上面的链接取得:
本实战练习系列的前四篇文章:
- 适宜 Kubernetes 初学者的一些实战练习 (一)
- 适宜 Kubernetes 初学者的一些实战练习 (二)
- 适宜 Kubernetes 初学者的一些实战练习 (三)
- 适宜 Kubernetes 初学者的一些实战练习 (四)