

适合 Kubernetes 初学者的一些实战练习 (五)
source link: https://xie.infoq.cn/article/361a86fd7bd0f5c2bbbeeac39
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本实战练习系列的前四篇文章:
本文继续我们的 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: 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 的值中取。
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/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
使用 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 在实际项目中的一个应用场景。
本系列前四篇文章可以通过下面的链接获得:
本实战练习系列的前四篇文章:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK