本实战练习系列的前四篇文章:

本文继续我们的 Kubernetes 实战练习之旅。

练习1 - 将 configmap 通过环境变量注入到 pod 里

在 Kubernetes ​​官网​​​里,曾经提到 Kubernetes 里的一个最佳实践(Best Practice)就是把应用代码同配置信息分开,一种方式就是使用 Kubernetes 1.2 里引入的 ​​configmap​​ 概念。

适合 Kubernetes 初学者的一些实战练习 (五)_postgresql

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


适合 Kubernetes 初学者的一些实战练习 (五)_环境变量_02

创建一个名为 ​​test-config​​的键值对,key 为 test.type,值为 unit,key 为test.exec, 值为 always.

下面我打算创建一个 pod,消费这个名为 test-config 的 configmap.

创建一个内容如下的 yaml 文件:

apiVersion: v1

kind: Pod

metadata:

name: test-configmap

spec:

containers:

- name: test-container

image: alpine:3.8

command: [ "/bin/sh", "-c", "env" ]

env:

- name: TEST_TYPE

valueFrom:

configMapKeyRef:

name: test-config

key: test.type

- name: TEST_EXEC

valueFrom:

configMapKeyRef:

name: test-config

key: test.exec

restartPolicy: Never

这个 yaml 文件定义的 pod 基于 docker 镜像 alpine,执行 shell 命令 ​​/bin/sh -c env​​ 查看环境变量。

在 env 区域,我给该 pod 注入一个名为 TEST_TYPE 的环境变量,值从 configMap 键值对的键名称为 test.type 的值中取。

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_03

kubectl create -f 创建这个 pod:

适合 Kubernetes 初学者的一些实战练习 (五)_Kubernetes_04

使用命令 ​​kubectl logs test-configmap​​​ 查看这个 pod 运行生成的日志,发现输出的环境变量列表中,出现了 ​​TEST_TYPE=unit​​,这个 TEST_TYPE 是我在 yaml 文件里注入的环境变量名称,而 unit 就来自 configmap 里 test-config 的值 unit.

适合 Kubernetes 初学者的一些实战练习 (五)_postgresql_05

练习2 - 通过一个基于 PostgreSQL 的具体例子学习 Kubernetes Stateful Set

Stateful Set 是 Kubernetes 1.9 版本新引入的一个​​概念​​,用于管理有状态的应用。

Kubernetes StatefulSet 由以下几个部分组成:

  1. 用于定义网络标志(DNS domain)的 Headless Service
  2. 用于创建 PersistentVolumes 的 volumeClaimTemplates
  3. 定义具体应用的 StatefulSet

下面是一个实际应用中的 StatefulSet 的 yaml 文件:

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: ads-db-statefulset

labels:

component: ads

module: db

spec:

serviceName: ads-db-service

replicas: 1

selector:

matchLabels:

component: ads

module: db

template:

metadata:

labels:

component: ads

module: db

spec:

volumes:

- name: init

secret:

secretName: ads-db-secret

items:

- key: initdb.sql

path: initdb.sql

containers:

- name: ads-db-pod

image: postgres:9.6

ports:

- containerPort: 5432

name: ads-db-port

volumeMounts:

- name: ads-db-volume

mountPath: /var/lib/postgresql/data/

- name: init

mountPath: /docker-entrypoint-initdb.d/

env:

- name: PGDATA

valueFrom:

configMapKeyRef:

name: ads-db-configmap

key: pgdata_value

- name: POSTGRES_PASSWORD

valueFrom:

secretKeyRef:

name: ads-db-secret

key: postgres_password_value

volumeClaimTemplates:

- metadata:

name: ads-db-volume

labels:

component: ads

module: db

spec:

accessModes: [ "ReadWriteOnce" ]

resources:

requests:

storage: 1Gi

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_06

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_07

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_08

使用 ​​kubectl get statefulset​​ 查看生成的 statefulset:

适合 Kubernetes 初学者的一些实战练习 (五)_环境变量_09

生成的 headless service:

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_10

生成的 pod:

适合 Kubernetes 初学者的一些实战练习 (五)_环境变量_11

当我把 statefulset yaml 文件里的 replicas 从 1 改成 3 之后,果然观察到有两个新的 pod 正在启动,并且名称满足命名规范​​<stateful set name >-X​​.

适合 Kubernetes 初学者的一些实战练习 (五)_postgresql_12

使用 ​​kubectl describe​​ 查看创建的 statefulset 明细:

适合 Kubernetes 初学者的一些实战练习 (五)_Kubernetes_13

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_14

statefulSet 自动创建的 persistentVolumeClaim:

适合 Kubernetes 初学者的一些实战练习 (五)_postgresql_15

适合 Kubernetes 初学者的一些实战练习 (五)_环境变量_16

使用下面的命令登录到 statefulset 提供的 PostgreSQL 服务器上:


kubectl run tester -it --rm --image=postgres:9.6 --env=“PGCONNECT_TIMEOUT=5” --command – bash


适合 Kubernetes 初学者的一些实战练习 (五)_服务器_17

看到 root$ 之后,说明我们已经连接上 pod 了。

使用如下命令行连接 PostgreSQL 服务器:


psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads


适合 Kubernetes 初学者的一些实战练习 (五)_Kubernetes_18

当然如果不用命令行,也可以使用 pgadmin,以图形化界面连接 statefulSet 里的 postgreSQL 服务器:


sudo apt install pgadmin3


适合 Kubernetes 初学者的一些实战练习 (五)_postgresql_19

进行端口发,这样我们可以使用 ​​localhost:5432​​ 进行连接:


kubectl port-forward ads-db-statefulset-0 5432:5432


适合 Kubernetes 初学者的一些实战练习 (五)_服务器_20

适合 Kubernetes 初学者的一些实战练习 (五)_postgresql_21

也能成功连接:

适合 Kubernetes 初学者的一些实战练习 (五)_环境变量_22

适合 Kubernetes 初学者的一些实战练习 (五)_服务器_23

总结

本文介绍了如何将 ConfigMap 通过环境变量的方式注入到 Kubernetes Pod 之中,这也是 Kubernetes 官方推荐的应用代码同配置信息分离的最佳实践思路,在实际项目中的体现。本文第二部分通过将 PostgreSQL 服务器实例运行在 Stateful Set 上的例子,介绍了 Kubernetes Stateful Set 在实际项目中的一个应用场景。

本系列前四篇文章可以通过下面的链接获得:

本实战练习系列的前四篇文章: